Source code for kvalikirstu2.arg_parser
"""A module for the argument parser class in Kvalikirstu."""
import argparse
import codecs
import glob
import os
import configargparse
_CONF_ENCODING = 'utf-8'
DEFAULT_CONF_FILES = [os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config.conf')]
[docs]class ConfigFileParsingException(Exception):
"""Raised when parsing args fails (during gui run)"""
[docs]class Kvalikirstu2ConfigArgParser(configargparse.ArgParser):
"""A class derived from configargparse.ArgumentParser for parsing arguments. Adds support for custom encoding.
"""
def __init__(self, *args, config_files=[], encoding=_CONF_ENCODING, **kwargs):
"""
:param encoding: The config file encoding.
"""
self.encoding = encoding
super().__init__(*args, **kwargs, default_config_files=config_files)
[docs] def error(self, message): # pylint: disable=E0202
""" Overwrites argparse error method so that systemexit is not called within gui
:param str message: The error message.
"""
raise ConfigFileParsingException("\n%s\n\n%s" % ("Error while reading configuration file!", message))
def _open_config_files(self, command_line_args):
"""Same functionality as super _open_config_files method, but uses codecs.open for opening config files.
"""
config_files = []
for files in map(glob.glob, map(os.path.expanduser, self._default_config_files)):
for file in files:
config_files.append(codecs.open(file, encoding=self.encoding))
user_config_file_arg_actions = [a for a in self._actions if getattr(a, "is_config_file_arg", False)]
if not user_config_file_arg_actions:
return config_files
for action in user_config_file_arg_actions:
# try to parse out the config file path by using a clean new
# ArgumentParser that only knows this one arg/action.
arg_parser = argparse.ArgumentParser(
prefix_chars=self.prefix_chars,
add_help=False)
# pylint: disable=protected-access
# calling protected method of argparse, don't see a way around this
arg_parser._add_action(action)
# pylint: enable=protected-access
# check whether the user provided a value
parsed_arg = arg_parser.parse_known_args(args=command_line_args)
if not parsed_arg:
continue
namespace, _ = parsed_arg
user_config_file = getattr(namespace, action.dest, None)
if not user_config_file:
continue
# validate the user-provided config file path
user_config_file = os.path.expanduser(user_config_file)
if not os.path.isfile(user_config_file):
super().error('File not found: %s' % user_config_file)
config_files += [codecs.open(user_config_file, encoding=self.encoding)]
return config_files