Commit 57cd999f authored by mathieui's avatar mathieui

refactor: move argument parsing away from config.py

global state--
parent 29a7c6ec
"""
Module related to the argument parsing
There is a fallback to the deprecated optparse if argparse is not found
"""
import pkg_resources
import stat
import sys
from argparse import ArgumentParser, SUPPRESS, Namespace
from pathlib import Path
from argparse import ArgumentParser, SUPPRESS
from shutil import copy2
from typing import Tuple
from poezio.version import __version__
from poezio import xdg
def parse_args(CONFIG_PATH: Path):
......@@ -47,5 +51,36 @@ def parse_args(CONFIG_PATH: Path):
metavar="VERSION",
default=__version__
)
options = parser.parse_args()
return options
return parser.parse_args()
def run_cmdline_args() -> Tuple[Namespace, bool]:
"Parse the command line arguments"
options = parse_args(xdg.CONFIG_HOME)
firstrun = False
# Copy a default file if none exists
if not options.filename.is_file():
try:
options.filename.parent.mkdir(parents=True, exist_ok=True)
except OSError as e:
sys.stderr.write(
'Poezio was unable to create the config directory: %s\n' % e)
sys.exit(1)
default = Path(__file__).parent / '..' / 'data' / 'default_config.cfg'
other = Path(
pkg_resources.resource_filename('poezio', 'default_config.cfg'))
if default.is_file():
copy2(str(default), str(options.filename))
elif other.is_file():
copy2(str(other), str(options.filename))
# Inside the nixstore and possibly other distributions, the reference
# file is readonly, so is the copy.
# Make it writable by the user who just created it.
if options.filename.exists():
options.filename.chmod(options.filename.stat().st_mode
| stat.S_IWUSR)
firstrun = True
return (options, firstrun)
......@@ -12,16 +12,12 @@ to remove our ugly custom I/O methods.
import logging.config
import os
import stat
import sys
import pkg_resources
from configparser import RawConfigParser, NoOptionError, NoSectionError
from pathlib import Path
from shutil import copy2
from typing import Callable, Dict, List, Optional, Union, Tuple, cast, Any
from poezio.args import parse_args
from poezio import xdg
......@@ -617,43 +613,11 @@ def check_config():
print(' \033[31m%s\033[0m' % option)
def run_cmdline_args():
"Parse the command line arguments"
global options
options = parse_args(xdg.CONFIG_HOME)
# Copy a default file if none exists
if not options.filename.is_file():
try:
options.filename.parent.mkdir(parents=True, exist_ok=True)
except OSError as e:
sys.stderr.write(
'Poezio was unable to create the config directory: %s\n' % e)
sys.exit(1)
default = Path(__file__).parent / '..' / 'data' / 'default_config.cfg'
other = Path(
pkg_resources.resource_filename('poezio', 'default_config.cfg'))
if default.is_file():
copy2(str(default), str(options.filename))
elif other.is_file():
copy2(str(other), str(options.filename))
# Inside the nixstore and possibly other distributions, the reference
# file is readonly, so is the copy.
# Make it writable by the user who just created it.
if options.filename.exists():
options.filename.chmod(options.filename.stat().st_mode
| stat.S_IWUSR)
global firstrun
firstrun = True
def create_global_config():
def create_global_config(filename):
"Create the global config object, or crash"
try:
global config
config = Config(options.filename, DEFAULT_CONFIG)
config = Config(filename, DEFAULT_CONFIG)
except:
import traceback
sys.stderr.write('Poezio was unable to read or'
......@@ -662,11 +626,13 @@ def create_global_config():
sys.exit(1)
def setup_logging():
def setup_logging(debug_file=''):
"Change the logging config according to the cmdline options and config"
global LOG_DIR
LOG_DIR = config.get('log_dir')
LOG_DIR = Path(LOG_DIR).expanduser() if LOG_DIR else xdg.DATA_HOME / 'logs'
from copy import deepcopy
logging_config = deepcopy(LOGGING_CONFIG)
if config.get('log_errors'):
try:
LOG_DIR.mkdir(parents=True, exist_ok=True)
......@@ -674,8 +640,8 @@ def setup_logging():
# We can’t really log any error here, because logging isn’t setup yet.
pass
else:
LOGGING_CONFIG['root']['handlers'].append('error')
LOGGING_CONFIG['handlers']['error'] = {
logging_config['root']['handlers'].append('error')
logging_config['handlers']['error'] = {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': str(LOG_DIR / 'errors.log'),
......@@ -683,18 +649,18 @@ def setup_logging():
}
logging.disable(logging.WARNING)
if options.debug:
LOGGING_CONFIG['root']['handlers'].append('debug')
LOGGING_CONFIG['handlers']['debug'] = {
if debug_file:
logging_config['root']['handlers'].append('debug')
logging_config['handlers']['debug'] = {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': options.debug,
'filename': debug_file,
'formatter': 'simple',
}
logging.disable(logging.NOTSET)
if LOGGING_CONFIG['root']['handlers']:
logging.config.dictConfig(LOGGING_CONFIG)
if logging_config['root']['handlers']:
logging.config.dictConfig(logging_config)
else:
logging.disable(logging.ERROR)
logging.basicConfig(level=logging.CRITICAL)
......@@ -737,9 +703,6 @@ config = Config(Path('/dev/null'))
# The logger object for this module
log = logging.getLogger(__name__) # type: logging.Logger
# The command-line options
options = None
# delayed import from common.py
safeJID = None # type: Optional[Callable]
......
......@@ -27,7 +27,7 @@ from slixmpp.util import FileSystemCache
from poezio import common
from poezio import fixes
from poezio import xdg
from poezio.config import config, options
from poezio.config import config
class Connection(slixmpp.ClientXMPP):
......@@ -37,7 +37,7 @@ class Connection(slixmpp.ClientXMPP):
"""
__init = False
def __init__(self):
def __init__(self, custom_version=''):
keyfile = config.getstr('keyfile')
certfile = config.getstr('certfile')
......@@ -169,7 +169,7 @@ class Connection(slixmpp.ClientXMPP):
self.register_plugin('xep_0172')
if config.getbool('send_poezio_info'):
info = {'name': 'poezio', 'version': options.custom_version}
info = {'name': 'poezio', 'version': custom_version}
if config.getbool('send_os_info'):
info['os'] = common.get_os_info()
self.plugin['xep_0030'].set_identities(identities={('client',
......
......@@ -18,7 +18,7 @@ from poezio import common
from poezio import tabs
from poezio import multiuserchat as muc
from poezio.bookmarks import Bookmark
from poezio.config import config, DEFAULT_CONFIG, options as config_opts
from poezio.config import config, DEFAULT_CONFIG
from poezio.contact import Contact, Resource
from poezio.decorators import deny_anonymous
from poezio.plugin import PluginConfig
......@@ -1346,7 +1346,7 @@ class CommandCore:
info = ('Your JID is %s\nYour current status is "%s" (%s)'
'\nYour default nickname is %s\nYou are running poezio %s' %
(jid, message if message else '', show
if show else 'available', nick, config_opts.custom_version))
if show else 'available', nick, self.core.custom_version))
self.core.information(info, 'Info')
@command_args_parser.ignored
......
......@@ -73,7 +73,6 @@ from poezio.core.structs import (
from poezio.ui.types import (
Message,
InfoMessage,
PersistentInfoMessage,
)
......@@ -81,12 +80,15 @@ log = logging.getLogger(__name__)
T = TypeVar('T', bound=tabs.Tab)
class Core:
"""
“Main” class of poezion
"""
def __init__(self):
custom_version: str
def __init__(self, custom_version: str):
self.completion = CompletionCore(self)
self.command = CommandCore(self)
self.handler = HandlerCore(self)
......@@ -100,7 +102,8 @@ class Core:
status = POSSIBLE_SHOW.get(status, None)
self.status = Status(show=status, message=config.getstr('status_message'))
self.running = True
self.xmpp = connection.Connection()
self.custom_version = custom_version
self.xmpp = connection.Connection(custom_version)
self.xmpp.core = self
self.keyboard = keyboard.Keyboard()
roster.set_node(self.xmpp.client_roster)
......
......@@ -79,17 +79,16 @@ def main():
sys.stdout.write("\x1b]0;poezio\x07")
sys.stdout.flush()
from poezio.args import run_cmdline_args
options, firstrun = run_cmdline_args()
from poezio import config
config.run_cmdline_args()
config.create_global_config()
config.setup_logging()
config.create_global_config(options.filename)
config.setup_logging(options.debug)
config.post_logging_setup()
import logging
logging.raiseExceptions = False
from poezio.config import options
if options.check_config:
config.check_config()
sys.exit(0)
......@@ -109,7 +108,7 @@ def main():
from poezio.core.core import Core
signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore ctrl-c
cocore = Core()
cocore = Core(options.custom_version)
signal.signal(signal.SIGUSR1, cocore.sigusr_handler) # reload the config
signal.signal(signal.SIGHUP, cocore.exit_from_signal)
signal.signal(signal.SIGTERM, cocore.exit_from_signal)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment