def docopt(doc, argv=None, help=True, version=None, options_first=False): # @ReservedAssignment help """Re-implementation of docopt.docopt() function to parse ANYTHING at the end (for proxying django options).""" if argv is None: argv = sys.argv[1:] DocoptExit.usage = printable_usage(doc) options = parse_defaults(doc) pattern = parse_pattern(formal_usage(DocoptExit.usage), options) argv = parse_argv(TokenStream(argv, DocoptExit), list(options), options_first) pattern_options = set(pattern.flat(Option)) for ao in pattern.flat(AnyOptions): doc_options = parse_defaults(doc) ao.children = list(set(doc_options) - pattern_options) extras(help, version, argv, doc) __matched, __left, collected = pattern.fix().match(argv) # if matched and left == []: # better error message if left? if collected: # better error message if left? result = Dict((a.name, a.value) for a in (pattern.flat() + collected)) collected_django_options = len(result.get("DJANGO_OPTIONS", [])) result["DJANGO_OPTIONS"] = ( result.get("DJANGO_OPTIONS", []) + sys.argv[len(collected) + (collected_django_options or 1) :] ) # If any of the collected arguments are also in the DJANGO_OPTIONS, # then exit because we don't want users to have put options for kalite # at the end of the command if any(map(lambda x: x.name in map(lambda x: x.split("=")[0], result["DJANGO_OPTIONS"]), collected)): sys.stderr.write( "Cannot mix django manage command options with kalite options. " "Always put django management options last.\n\n" ) raise DocoptExit() return result raise DocoptExit()
def __init__(self, docopt_str, base_descriptor): with open(base_descriptor, "r") as base_desc: self.descriptor = collections.OrderedDict(json.load(base_desc)) del self.descriptor['groups'] del self.descriptor['inputs'] del self.descriptor['output-files'] self.docopt_str = docopt_str self.dependencies = collections.OrderedDict() self.all_desc_and_type = collections.OrderedDict() self.unique_ids = [] try: # docopt code snippet to extract args tree (pattern) # should run if docopt script is valid options = parse_defaults(docopt_str) self.pattern = parse_pattern( formal_usage(self._parse_section('usage:', docopt_str)[0]), options) argv = parse_argv(TokenStream(sys.argv[1:], DocoptLanguageError), list(options), False) pattern_options = set(self.pattern.flat(Option)) for options_shortcut in self.pattern.flat(AnyOptions): doc_options = parse_defaults(docopt_str) options_shortcut.children = list( set(doc_options) - pattern_options) matched, left, collected = self.pattern.fix().match(argv) except Exception: os.remove(base_descriptor) raise_error(ImportError, "Invalid docopt script")
def test_parse_argv(): o = [Option("-h"), Option("-v", "--verbose"), Option("-f", "--file", 1)] TS = lambda s: Tokens(s, error=DocoptExit) assert parse_argv(TS(""), options=o) == [] assert parse_argv(TS("-h"), options=o) == [Option("-h", None, 0, True)] assert parse_argv(TS("-h --verbose"), options=o) == [ Option("-h", None, 0, True), Option("-v", "--verbose", 0, True) ] assert parse_argv(TS("-h --file f.txt"), options=o) == [ Option("-h", None, 0, True), Option("-f", "--file", 1, "f.txt") ] assert parse_argv(TS("-h --file f.txt arg"), options=o) == [ Option("-h", None, 0, True), Option("-f", "--file", 1, "f.txt"), Argument(None, "arg") ] assert parse_argv(TS("-h --file f.txt arg arg2"), options=o) == [ Option("-h", None, 0, True), Option("-f", "--file", 1, "f.txt"), Argument(None, "arg"), Argument(None, "arg2"), ] assert parse_argv(TS("-h arg -- -v"), options=o) == [ Option("-h", None, 0, True), Argument(None, "arg"), Argument(None, "--"), Argument(None, "-v") ]
def test_parse_argv(): o = [Option("-h"), Option("-v", "--verbose"), Option("-f", "--file", 1)] TS = lambda s: TokenStream(s, error=DocoptExit) assert parse_argv(TS(""), options=o) == [] assert parse_argv(TS("-h"), options=o) == [Option("-h", None, 0, True)] assert parse_argv(TS("-h --verbose"), options=o) == [ Option("-h", None, 0, True), Option("-v", "--verbose", 0, True), ] assert parse_argv(TS("-h --file f.txt"), options=o) == [ Option("-h", None, 0, True), Option("-f", "--file", 1, "f.txt"), ] assert parse_argv(TS("-h --file f.txt arg"), options=o) == [ Option("-h", None, 0, True), Option("-f", "--file", 1, "f.txt"), Argument(None, "arg"), ] assert parse_argv(TS("-h --file f.txt arg arg2"), options=o) == [ Option("-h", None, 0, True), Option("-f", "--file", 1, "f.txt"), Argument(None, "arg"), Argument(None, "arg2"), ] assert parse_argv(TS("-h arg -- -v"), options=o) == [ Option("-h", None, 0, True), Argument(None, "arg"), Argument(None, "--"), Argument(None, "-v"), ]
def test_docopt_ng_more_magic_spellcheck_and_expansion(): o = [Option("-h"), Option("-v", "--verbose"), Option(None, "--file", 1)] TS = lambda s: Tokens(s, error=DocoptExit) assert parse_argv(TS(""), options=o) == [] assert parse_argv(TS("-h"), options=o) == [Option("-h", None, 0, True)] assert parse_argv(TS("-h --File f.txt"), options=o, more_magic=True) == [ Option("-h", None, 0, True), Option(None, "--file", 1, "f.txt") ] assert parse_argv(TS("-h --fiLe f.txt arg"), options=o, more_magic=True) == [ Option("-h", None, 0, True), Option(None, "--file", 1, "f.txt"), Argument(None, "arg"), ] assert parse_argv(TS("-h -f f.txt arg arg2"), options=o, more_magic=True) == [ Option("-h", None, 0, True), Option(None, "--file", 1, "f.txt"), Argument(None, "arg"), Argument(None, "arg2"), ]
def settable_options(doc, argv, ignore, options_first): """Determine which options we can set, which ones are boolean, and which ones are repeatable. All set items are option long names. :param str doc: Docstring from docoptcfg(). :param iter argv: CLI arguments from docoptcfg(). :param iter ignore: Options to ignore from docoptcfg(). :param bool options_first: docopt argument from docoptcfg(). :return: Settable options, boolean options, repeatable options, and short to long option name mapping. :rtype: tuple """ settable, booleans, repeatable, short_map = set(), set(), set(), dict() # Determine which options are settable by docoptcfg and which ones are flags/booleans. options = docopt.parse_defaults(doc) short_map.update((o.short, o.long) for o in options) parsed_argv = docopt.parse_argv( docopt.TokenStream(argv, docopt.DocoptExit), list(options), options_first) overridden = [o.long for o in parsed_argv if hasattr(o, 'long')] for option in options: if option.long in overridden or (option.long in ignore or option.short in ignore) or option.long is None: continue if option.argcount == 0: booleans.add(option.long) settable.add(option.long) # Determine which options are repeatable. if settable and '...' in doc: pattern = docopt.parse_pattern( docopt.formal_usage(docopt.DocoptExit.usage), options) for option in pattern.fix().flat(): if not hasattr(option, 'long'): continue # Positional argument or sub-command. if getattr(option, 'long') not in settable: continue # Don't care about this if we can't set it. if getattr(option, 'long') in booleans and getattr( option, 'value') == 0: repeatable.add(getattr(option, 'long')) elif hasattr(getattr(option, 'value'), '__iter__'): repeatable.add(getattr(option, 'long')) return settable, booleans, repeatable, short_map
def docopt(doc, argv=None, help=True, version=None, options_first=False): # @ReservedAssignment help """Re-implementation of docopt.docopt() function to parse ANYTHING at the end (for proxying django options).""" if argv is None: argv = sys.argv[1:] DocoptExit.usage = printable_usage(doc) options = parse_defaults(doc) pattern = parse_pattern(formal_usage(DocoptExit.usage), options) argv = parse_argv(TokenStream(argv, DocoptExit), list(options), options_first) pattern_options = set(pattern.flat(Option)) for ao in pattern.flat(AnyOptions): doc_options = parse_defaults(doc) ao.children = list(set(doc_options) - pattern_options) extras(help, version, argv, doc) __matched, __left, collected = pattern.fix().match(argv) # if matched and left == []: # better error message if left? if collected: # better error message if left? result = Dict((a.name, a.value) for a in (pattern.flat() + collected)) collected_django_options = len(result.get('DJANGO_OPTIONS', [])) result['DJANGO_OPTIONS'] = (result.get('DJANGO_OPTIONS', []) + sys.argv[len(collected) + (collected_django_options or 1):]) # If any of the collected arguments are also in the DJANGO_OPTIONS, # then exit because we don't want users to have put options for kalite # at the end of the command if any( map( lambda x: x.name in map(lambda x: x.split("=")[0], result[ 'DJANGO_OPTIONS']), collected)): sys.stderr.write( "Cannot mix django manage command options with kalite options. " "Always put django management options last.\n\n") raise DocoptExit() return result raise DocoptExit()
def settable_options(doc, argv, ignore, options_first): """Determine which options we can set, which ones are boolean, and which ones are repeatable. All set items are option long names. :param str doc: Docstring from docoptcfg(). :param iter argv: CLI arguments from docoptcfg(). :param iter ignore: Options to ignore from docoptcfg(). :param bool options_first: docopt argument from docoptcfg(). :return: Settable options, boolean options, repeatable options, and short to long option name mapping. :rtype: tuple """ settable, booleans, repeatable, short_map = set(), set(), set(), dict() # Determine which options are settable by docoptcfg and which ones are flags/booleans. options = docopt.parse_defaults(doc) short_map.update((o.short, o.long) for o in options) parsed_argv = docopt.parse_argv(docopt.TokenStream(argv, docopt.DocoptExit), list(options), options_first) overridden = [o.long for o in parsed_argv if hasattr(o, 'long')] for option in options: if option.long in overridden or (option.long in ignore or option.short in ignore): continue if option.argcount == 0: booleans.add(option.long) settable.add(option.long) # Determine which options are repeatable. if settable and '...' in doc: pattern = docopt.parse_pattern(docopt.formal_usage(docopt.DocoptExit.usage), options) for option in pattern.fix().flat(): if not hasattr(option, 'long'): continue # Positional argument or sub-command. if getattr(option, 'long') not in settable: continue # Don't care about this if we can't set it. if getattr(option, 'long') in booleans and getattr(option, 'value') == 0: repeatable.add(getattr(option, 'long')) elif hasattr(getattr(option, 'value'), '__iter__'): repeatable.add(getattr(option, 'long')) return settable, booleans, repeatable, short_map
def test_parse_argv(): o = [Option('-h'), Option('-v', '--verbose'), Option('-f', '--file', 1)] assert parse_argv('', options=o) == [] assert parse_argv('-h', options=o) == [Option('-h', None, 0, True)] assert parse_argv('-h --verbose', options=o) == \ [Option('-h', None, 0, True), Option('-v', '--verbose', 0, True)] assert parse_argv('-h --file f.txt', options=o) == \ [Option('-h', None, 0, True), Option('-f', '--file', 1, 'f.txt')] assert parse_argv('-h --file f.txt arg', options=o) == \ [Option('-h', None, 0, True), Option('-f', '--file', 1, 'f.txt'), Argument(None, 'arg')] assert parse_argv('-h --file f.txt arg arg2', options=o) == \ [Option('-h', None, 0, True), Option('-f', '--file', 1, 'f.txt'), Argument(None, 'arg'), Argument(None, 'arg2')] assert parse_argv('-h arg -- -v', options=o) == \ [Option('-h', None, 0, True), Argument(None, 'arg'), Argument(None, '--'), Argument(None, '-v')]
def test_parse_argv(): o = [Option('-h'), Option('-v', '--verbose'), Option('-f', '--file', 1)] TS = lambda s: Tokens(s, error=DocoptExit) assert parse_argv(TS(''), options=o) == [] assert parse_argv(TS('-h'), options=o) == [Option('-h', None, 0, True)] assert parse_argv(TS('-h --verbose'), options=o) == \ [Option('-h', None, 0, True), Option('-v', '--verbose', 0, True)] assert parse_argv(TS('-h --file f.txt'), options=o) == \ [Option('-h', None, 0, True), Option('-f', '--file', 1, 'f.txt')] assert parse_argv(TS('-h --file f.txt arg'), options=o) == \ [Option('-h', None, 0, True), Option('-f', '--file', 1, 'f.txt'), Argument(None, 'arg')] assert parse_argv(TS('-h --file f.txt arg arg2'), options=o) == \ [Option('-h', None, 0, True), Option('-f', '--file', 1, 'f.txt'), Argument(None, 'arg'), Argument(None, 'arg2')] assert parse_argv(TS('-h arg -- -v'), options=o) == \ [Option('-h', None, 0, True), Argument(None, 'arg'), Argument(None, '--'), Argument(None, '-v')]