def setup_commands(self): self.worker_cmd = WorkerCommand() self.worker_parser = self.worker_cmd.setup_parser( self.subparsers, CONFIG_PARSER, VERBOSE_PARSER ) self.parsers.append(self.worker_parser) self.commands = OrderedDict([ ('install-db', InstallDbCommand), ('install-worker', InstallWorkerCommand), ('migrate', MigrateCommand), ('upload-json', UploadJsonCommand), ('dns-import', ImportDnsCommand), ('dns-ldifplain', LdifPlainDnsCommand), ('dns-export-powerdns', PowerdnsExportCommand), ('dns-rebuild-powerdns', PowerdnsRebuildCommand), ('invoices-create', CreateInvoicesCommand), ('service-import', ImportServiceCommand), ('service-query', QueryServiceCommand), ]) for command_name, command in self.commands.items(): name_snake = to_snake_case(command.__name__) command_instance = command() command_parser = command_instance.setup_parser( self.subparsers, CONFIG_PARSER ) self.commands[command_name] = command_instance setattr(self, '%s_cmd' % name_snake, command_instance) setattr(self, '%s_parser' % name_snake, command_parser) self.parsers.append(command_parser)
class SetupWorkerParser(object): def __init__(self, pass_args=None): """create the command line parser / config file reader """ self.main_parser = argparse.ArgumentParser() self.pass_args = pass_args self.subparsers = self.main_parser.add_subparsers( dest='command', title="subcommands", description="available subcommands", help="all commands" ) self.parsers = [] self.commands_map = {} self.setup_commands() self.merge_configfile() self.update_parser() def setup_commands(self): self.worker_cmd = WorkerCommand() self.worker_parser = self.worker_cmd.setup_parser( self.subparsers, CONFIG_PARSER, VERBOSE_PARSER ) self.parsers.append(self.worker_parser) self.commands = OrderedDict([ ('install-db', InstallDbCommand), ('install-worker', InstallWorkerCommand), ('migrate', MigrateCommand), ('upload-json', UploadJsonCommand), ('dns-import', ImportDnsCommand), ('dns-ldifplain', LdifPlainDnsCommand), ('dns-export-powerdns', PowerdnsExportCommand), ('dns-rebuild-powerdns', PowerdnsRebuildCommand), ('invoices-create', CreateInvoicesCommand), ('service-import', ImportServiceCommand), ('service-query', QueryServiceCommand), ]) for command_name, command in self.commands.items(): name_snake = to_snake_case(command.__name__) command_instance = command() command_parser = command_instance.setup_parser( self.subparsers, CONFIG_PARSER ) self.commands[command_name] = command_instance setattr(self, '%s_cmd' % name_snake, command_instance) setattr(self, '%s_parser' % name_snake, command_parser) self.parsers.append(command_parser) def merge_configfile(self): if self.pass_args: args = self.main_parser.parse_args(self.pass_args) else: args = self.main_parser.parse_args() # load config files with settings # puts them into a dict format "section_option" merged_defaults = DEFAULTS.copy() if hasattr(args, 'config') and args.config: config = SafeConfigParser() config.readfp(codecs.open(args.config, "r", "utf8")) if not config: print("Can't open file '{}'".format(args.config)) sys.exit(0) else: for section in CONF_SECTIONS: conf = {} if config.has_section(section): for k, v in config.items(section): prop = '{}_{}'.format(section, k) if prop in BOOLEAN_TYPES: conf[prop] = config.getboolean(section, k) else: conf[prop] = config.get(section, k) merged_defaults.update(conf) self.merged_defaults = merged_defaults def update_parser(self): for parser in self.parsers: parser.set_defaults(**self.merged_defaults) if self.pass_args: self.settings = self.main_parser.parse_args(self.pass_args) else: self.settings = self.main_parser.parse_args()