1import sys
2import optparse
3from django_manage_commands_provider import _xml
4
5
6class Option:
7    def __init__(self):
8        self.long = []
9        self.short = []
10        self.arg = None
11        self.help = None
12
13    def dump(self, dumper):
14        dumper.add_command_option(self.long, self.short, self.help, self.arg)
15
16
17def parse_option_desc(option_desc):
18    option = Option()
19    option.short = option_desc._short_opts
20    option.long = option_desc._long_opts
21    option.help = option_desc.help
22    if option_desc.nargs > 0:
23        option.arg = (option_desc.nargs, option_desc.type)
24    return option
25
26
27def get_options(options_parser):
28    return map(parse_option_desc, options_parser.option_list)
29
30
31def dump_actions(dumper, app):
32    common_options = get_options(app._GetOptionParser())
33
34    for name, action in app.actions.iteritems():
35        dumper.start_command(name, action.short_desc)
36
37        args = action.usage.split(name.split(' ')[0])[-1].strip()
38        dumper.set_arguments(args)
39
40        for option in common_options:
41            option.dump(dumper)
42
43        if action.options:
44            parser = optparse.OptionParser(conflict_handler='resolve')
45            action.options(app, parser)
46            for option in get_options(parser):
47                option.dump(dumper)
48        dumper.close_command()
49
50
51if __name__ == "__main__":
52    sys.path.append(sys.argv[1])
53    import appcfg
54
55    try:
56        appcfg.run_file('appcfg.py', globals())
57    finally:
58        app = AppCfgApp(['appcfg.py', 'help'])
59        dumper = _xml.XmlDumper()
60        dump_actions(dumper, app)
61        print(dumper.xml)
62        sys.exit(0)
63