Source code for coalib.parsing.CliParsing

import os
from argparse import ArgumentParser
from collections import OrderedDict

from coalib.parsing.DefaultArgParser import default_arg_parser
from coalib.parsing.LineParser import LineParser
from coalib.settings.Section import Section, append_to_sections

[docs]def parse_cli(arg_list=None, origin=os.getcwd(), arg_parser=None, args=None, key_value_delimiters=('=', ':'), comment_seperators=(), key_delimiters=(',',), section_override_delimiters=('.',), key_value_append_delimiters=('+=',)): """ Parses the CLI arguments and creates sections out of it. :param arg_list: The CLI argument list. :param origin: Directory used to interpret relative paths given as argument. :param arg_parser: Instance of ArgParser that is used to parse none-setting arguments. :param args: Alternative pre-parsed CLI arguments. :param key_value_delimiters: Delimiters to separate key and value in setting arguments where settings are being defined. :param comment_seperators: Allowed prefixes for comments. :param key_delimiters: Delimiter to separate multiple keys of a setting argument. :param section_override_delimiters: The delimiter to delimit the section from the key name (e.g. the '.' in sect.key = value). :param key_value_append_delimiters: Delimiters to separate key and value in setting arguments where settings are being appended. :return: A dictionary holding section names as keys and the sections themselves as value. """ assert not (arg_list and args), ( 'Either call parse_cli() with an arg_list of CLI arguments or ' 'with pre-parsed args, but not with both.') if args is None: arg_parser = default_arg_parser() if arg_parser is None else arg_parser args = arg_parser.parse_args(arg_list) origin += os.path.sep sections = OrderedDict(cli=Section('cli')) line_parser = LineParser(key_value_delimiters, comment_seperators, key_delimiters, {}, section_override_delimiters, key_value_append_delimiters) for arg_key, arg_value in sorted(vars(args).items()): if arg_key == 'settings' and arg_value is not None: parse_custom_settings(sections, arg_value, origin, line_parser) else: if isinstance(arg_value, list): arg_value = ','.join([str(val) for val in arg_value]) append_to_sections(sections, arg_key, arg_value, origin, section_name='cli', from_cli=True) return sections
[docs]def parse_custom_settings(sections, custom_settings_list, origin, line_parser): """ Parses the custom settings given to coala via ``-S something=value``. :param sections: The Section dictionary to add to (mutable). :param custom_settings_list: The list of settings strings. :param origin: The originating directory. :param line_parser: The LineParser to use. """ for setting_definition in custom_settings_list: (_, key_tuples, value, append, _) = line_parser._parse( setting_definition) for key_tuple in key_tuples: append_to_sections(sections, key=key_tuple[1], value=value, origin=origin, to_append=append, section_name=(key_tuple[0] or 'cli'), from_cli=True)
[docs]def check_conflicts(sections): """ Checks if there are any conflicting arguments passed. :param sections: The ``{section_name: section_object}`` dictionary to check conflicts for. :return: True if no conflicts occur. :raises SystemExit: If there are conflicting arguments (exit code: 2) """ for section in sections.values(): if ( section.get('no_config', False) and (section.get('save', False) or section.get('find_config', False))): ArgumentParser().error( "'no_config' cannot be set together 'save' or 'find_config'.") if ( not section.get('json', False) and (str(section.get('output', '')) or section.get('relpath', False))): ArgumentParser().error( "'output' or 'relpath' cannot be used without `--json`.") return True