def __call__(self, parser, namespace, values, option_string=None): if (self.requires_action is not None and namespace.action != self.requires_action): error("invalid option") if self.arg_as_opts: if values: if " " in values: raise argparse.ArgumentError(self, "invalid options") # FIXME parser.frontend.unhandled_opts += map(lambda v: "-" + v, values) namespace.action = self.capability
def print_package(self, package, **kwargs): if self.config.output_desc_wrap != -1: wrap = self.config.output_desc_wrap indent = " " * self.config.output_desc_indent package.metadata["description"] = "\n".join(textwrap.wrap( package.metadata["description"], width=wrap, initial_indent=indent, subsequent_indent=indent)) kwargs.update(package.metadata) try: string = self._output_fmt.format(**kwargs) if package.installed and self.current_action != CAPABS.QUERY: string = self.config.output_fmt_installed.format( fmt=string, fmt_lines=string.split("\\n"), installed_diff={ -1: self.config.output_fmt_installed_old, 0: self.config.output_fmt_installed_same, 1: self.config.output_fmt_installed_new }[package.version.__cmp__(package.installed_version)], **kwargs) string = string.replace("\\n", "\n") cprint(string) except KeyError: error("invalid format string")
def parse_arguments(self): # TODO: use getopt instead of argparse. argparse is convenient, but a # horrible choice for wrapping an application that uses getopt. parser = argparse.ArgumentParser(add_help=False) parser.frontend = self parser.add_argument("packages", nargs="*", default=[]) sync = parser.add_argument_group("sync") sync.add_argument("-S", "--sync", action=OperationAction, capability=CAPABS.SYNC) sync.add_argument("-s", "--search", action=OperationAction, capability=CAPABS.SEARCH, requires_action=CAPABS.SYNC) query = parser.add_argument_group("query") sync.add_argument("-Q", "--query", action=OperationAction, capability=CAPABS.QUERY, arg_as_opts=True) parser.add_argument("-h", "--help", action="store_true") parser.add_argument("--default-config", action="store_true") self.parsed_args = parser.parse_known_args() self.parsed_args[1].extend(self.unhandled_opts) arguments, remaining = self.parsed_args if remaining: remaining = ( [self.get_switch_for_action(arguments.action)] + remaining + arguments.packages ) print remaining arguments, discard = parser.parse_known_args(remaining) del discard if arguments.default_config: self.print_default_config() sys.exit(0) else: self.parse_config() action = None if arguments.help: self.generate_help() sys.exit(0) if arguments.action: # if any backend operator handler has an optional parameter, # don't warn about not supplying any on the command line. args_are_optional = False for backend in self.backends: method = backend.get_method(arguments.action) if method: if inspect.getargspec(method).defaults: args_are_optional = True if not args_are_optional and not arguments.packages: error("no targets specified (use -h for help)") elif args_are_optional and not arguments.packages: arguments.packages = [None] self.dispatch(arguments.action, arguments.packages) else: error("no operation specified (use -h for help)")