Files
novelWriter/nw/__init__.py
T

202 lines
5.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""novelWriter Init
novelWriter Init File
=========================
Application initialisation
File History:
Created: 2018-09-22 [0.0.1]
"""
import logging
import getopt
from os import path, remove, rename
from PyQt5.QtWidgets import QApplication
from nw.gui.winmain import GuiMain
from nw.config import Config
__package__ = "novelWriter"
__author__ = "Veronica Berglyd Olsen"
__copyright__ = "Copyright 20182019, Veronica Berglyd Olsen"
__license__ = "GPLv3"
__version__ = "0.3.1"
__date__ = "2019-10-20"
__maintainer__ = "Veronica Berglyd Olsen"
__email__ = "code@vkbo.net"
__status__ = "Development"
__url__ = "https://github.com/vkbo/novelWriter"
__docurl__ = "https://novelwriter.readthedocs.io"
__credits__ = [
"Veronica Berglyd Olsen (developer)",
"Marian Lückhof (contributor, tester)"
]
#
# Logging
# =========
# Standard used for logging levels in novelWriter:
# CRITICAL Use for errors that result in termination of the program
# ERROR Use when an action fails, but execution continues
# WARNING When something unexpected, but non-critical happens
# INFO Any useful user information like open, save, exit initiated
# ----------- SPAM Threshold : Output above should be minimal -----------------
# DEBUG Use for descriptions of main program flow
# VERBOSE Use for outputting values and program flow details
#
# Adding verbose logging levels
VERBOSE = 5
logging.addLevelName(VERBOSE, "VERBOSE")
def logVerbose(self, message, *args, **kws):
if self.isEnabledFor(VERBOSE):
self._log(VERBOSE, message, args, **kws)
logging.Logger.verbose = logVerbose
# Initiating logging
logger = logging.getLogger(__name__)
#
# Main Program
# ==============
#
# Load the main config as a global object
CONFIG = Config()
def main(sysArgs):
"""Parses command line, sets up logging, and launches main GUI.
"""
# Valid Input Options
shortOpt = "hdDqtl:v"
longOpt = [
"help",
"debug",
"verbose",
"debuggui",
"quiet",
"time",
"logfile=",
"version",
"config=",
"testmode",
"spell=",
]
helpMsg = (
"{appname} {version} ({status})\n"
"{copyright}\n"
"\n"
"Usage:\n"
" -h, --help Print this message.\n"
" -v, --version Print program version and exit.\n"
" -d, --debug Print debug output.\n"
" --verbose Increase verbosity of debug output.\n"
" -D, --debuggui Shows additional debug GUI elements. Includes -d.\n"
" -q, --quiet Disable output to command line. Does not affect log file.\n"
" -t, --time Shows time stamp in logging output. Adds milliseconds when --verbose.\n"
" -l, --logfile Specify log file.\n"
" --config Alternative config file.\n"
" --headless Do not display GUI. Useful for testing scripts.\n"
).format(
appname = __package__,
version = __version__,
status = __status__,
copyright = __copyright__
)
# Defaults
debugLevel = logging.WARN
debugStr = "{levelname:8} {message:}"
timeStr = "[{asctime:}] "
logFile = ""
toFile = False
toStd = True
showTime = False
confPath = None
testMode = False
debugGUI = False
spellTool = None
# Parse Options
try:
inOpts, inArgs = getopt.getopt(sysArgs,shortOpt,longOpt)
except getopt.GetoptError:
print(helpMsg)
exit(2)
for inOpt, inArg in inOpts:
if inOpt in ("-h","--help"):
print(helpMsg)
exit()
elif inOpt in ("-v", "--version"):
print("%s %s Version %s" % (__package__,__status__,__version__))
exit()
elif inOpt in ("-d", "--debug"):
debugLevel = logging.DEBUG
debugStr = "{name:>22}:{lineno:<4d} {levelname:8} {message:}"
elif inOpt in ("-l","--logfile"):
logFile = inArg
toFile = True
elif inOpt in ("-q","--quiet"):
toStd = False
elif inOpt in ("--verbose"):
debugLevel = VERBOSE
timeStr = "[{asctime:}.{msecs:03.0f}] "
elif inOpt in ("-t","--time"):
showTime = True
elif inOpt in ("--config"):
confPath = inArg
elif inOpt in ("--testmode"):
testMode = True
elif inOpt in ("--spell"):
spellTool = inArg
elif inOpt in ("-D","--debuggui"):
debugLevel = logging.DEBUG
debugStr = "{name:>20}:{lineno:<4d} {levelname:8} {message:}"
debugGUI = True
# Set Config Options
CONFIG.showGUI = not testMode
CONFIG.debugGUI = debugGUI
CONFIG.debugInfo = debugLevel < logging.INFO
CONFIG.spellTool = spellTool
# Set Logging
if showTime: debugStr = timeStr+debugStr
logFmt = logging.Formatter(fmt=debugStr,datefmt="%Y-%m-%d %H:%M:%S",style="{")
if not logFile == "" and toFile:
if path.isfile(logFile+".bak"):
remove(logFile+".bak")
if path.isfile(logFile):
rename(logFile,logFile+".bak")
fHandle = logging.FileHandler(logFile)
fHandle.setLevel(debugLevel)
fHandle.setFormatter(logFmt)
logger.addHandler(fHandle)
if toStd:
cHandle = logging.StreamHandler()
cHandle.setLevel(debugLevel)
cHandle.setFormatter(logFmt)
logger.addHandler(cHandle)
logger.setLevel(debugLevel)
CONFIG.initConfig(confPath)
if testMode:
nwGUI = GuiMain()
return nwGUI
else:
nwApp = QApplication([__package__])
nwGUI = GuiMain()
exit(nwApp.exec_())
return