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