def _parse(self): # create the settings tree and preserve the order in which arguments # are passed. Convert all args into an ordered tree so that # --foo fooz --too moo --foo-bar baaz --foo-arg vali # will be like the ordered tree below # foo: # <special-key>: fooz # bar: ### <-- foo-bar is not foo/bar # <special-key>: baaz # arg: ### <-- arg comes after bar # <special-key>: val # too: # <special-key>: moo logger.debug("Parsing: %s", self.args) logger.debug("DocString for Generate: %s", self._doc_string) try: self.parsed = docopt(self._doc_string, options_first=True, argv=self.args) except DocoptExit: logger.error(self._doc_string) return False logger.info("Parsed \n%s", self.parsed) self._prepare_defaults() if not self._apply_rules(): logger.error("Error while validating rules: check args %s", ' \n'.join(self.args)) return False logger.debug("New Args: %s", self.args) logger.info("After applying rules Parsed: \n%s", self.parsed) self.output_file = utils.extract_value(self.parsed, '<output-file>', optional=False) self.extra_vars = utils.extract_value(self.parsed, '--extra-vars') # filter only options; [ --foo, fooz, --bar baz ] -> [--foo, --bar] options = [x for x in self.args + self.defaults if x.startswith('--')] settings = OrderedTree(delimiter='-') for option in options: # iterate options to preserve order of args option = option.split('=')[0] value = self.parsed.get(option) if not value: continue key = option[2:] + settings.delimiter + VALUES_KEY settings[key] = value logger.debug("%s: %s", key, value) logger.debug( yaml_utils.to_yaml("Directory structure from args:", settings)) self.settings = settings return True
def _apply_rules(self): self.rules_file = utils.extract_value(self.parsed, '--rules-file') if not self.rules_file: return True # No rules to be applied self.rules_file = os.path.abspath(self.rules_file) logger.debug('Rule file: %s', self.rules_file) self._rules = load_configuration(self.rules_file, os.path.curdir) # create --key=value pairs from the rules.args args_in_rules = self._rules.get('args', {}) extra_vars = utils.extract_value(args_in_rules, 'extra-vars') args = ['--%s=%s' % (k, v) for k, v in args_in_rules.iteritems()] if extra_vars: extra_vars = utils.to_list(extra_vars) args.extend(['--extra-vars=%s' % x for x in extra_vars]) logger.debug('Args in rules file: %s', args) # prepend the args from the rules file and re-parse the args if args: self.args = args + self.args try: self.parsed = docopt(self._doc_string, options_first=True, argv=self.args) except DocoptExit: logger.error(self._doc_string) return False # remove rules-file from the parse tree del self.parsed['--rules-file'] # validate args return self._validate_args()
def _parse(self): # create the settings tree and preserve the order in which arguments # are passed. Convert all args into an ordered tree so that # --foo fooz --too moo --foo-bar baaz --foo-arg vali # will be like the ordered tree below # foo: # <special-key>: fooz # bar: ### <-- foo-bar is not foo/bar # <special-key>: baaz # arg: ### <-- arg comes after bar # <special-key>: val # too: # <special-key>: moo logger.debug("Parsing: %s", self.args) logger.debug("DocString for Generate: %s", self._doc_string) try: self.parsed = docopt(self._doc_string, options_first=True, argv=self.args) except DocoptExit: logger.error(self._doc_string) return False logger.info("Parsed \n%s", self.parsed) self._prepare_defaults() if not self._apply_rules(): logger.error("Error while validating rules: check args %s", ' \n'.join(self.args)) return False logger.debug("New Args: %s", self.args) logger.info("After applying rules Parsed: \n%s", self.parsed) self.output_file = utils.extract_value( self.parsed, '<output-file>', optional=False) self.extra_vars = utils.extract_value(self.parsed, '--extra-vars') # filter only options; [ --foo, fooz, --bar baz ] -> [--foo, --bar] options = [x for x in self.args + self.defaults if x.startswith('--')] settings = OrderedTree(delimiter='-') for option in options: # iterate options to preserve order of args option = option.split('=')[0] value = self.parsed.get(option) if not value: continue key = option[2:] + settings.delimiter + VALUES_KEY settings[key] = value logger.debug("%s: %s", key, value) logger.debug(yaml_utils.to_yaml( "Directory structure from args:", settings)) self.settings = settings return True
def _apply_rules(self): self.rules_file = utils.extract_value(self.parsed, '--rules-file') if not self.rules_file: return True # No rules to be applied self.rules_file = os.path.abspath(self.rules_file) logger.debug('Rule file: %s', self.rules_file) self._rules = load_configuration(self.rules_file, os.path.curdir) # create --key=value pairs from the rules.args args_in_rules = self._rules.get('args', {}) extra_vars = utils.extract_value(args_in_rules, 'extra-vars') args = ['--%s=%s' % (k, v) for k, v in args_in_rules.iteritems()] if extra_vars: extra_vars = utils.to_list(extra_vars) args.extend(['--extra-vars=%s' % x for x in extra_vars]) logger.debug('Args in rules file: %s', args) logger.debug('Args in self: %s', self.args) logger.debug('Args in rules: %s', args_in_rules) # get the key part without first two -- from --key=value def _key(x): return x.split('=')[0][2:] # filter out all args present in rules file conflicting_keys = [_key(x) for x in self.args if _key(x) in args_in_rules] if conflicting_keys: logger.error( ("Error command line args '%s' conflicts with those " "in rules file %s"), ', '.join(conflicting_keys), ', '.join(args)) return False # prepend the args from the rules file and re-parse the args if args: self.args = args + self.args try: self.parsed = docopt(self._doc_string, options_first=True, argv=self.args) except DocoptExit: logger.error(self._doc_string) return False # remove rules-file from the parse tree del self.parsed['--rules-file'] # validate args return self._validate_args()
def _apply_rules(self): self.rules_file = utils.extract_value(self.parsed, '--rules-file') if not self.rules_file: return True # No rules to be applied self.rules_file = os.path.abspath(self.rules_file) logger.debug('Rule file: %s', self.rules_file) self._rules = load_configuration(self.rules_file, os.path.curdir) # create --key=value pairs from the rules.args args_in_rules = self._rules.get('args', {}) extra_vars = utils.extract_value(args_in_rules, 'extra-vars') args = ['--%s=%s' % (k, v) for k, v in args_in_rules.iteritems()] if extra_vars: extra_vars = utils.to_list(extra_vars) args.extend(['--extra-vars=%s' % x for x in extra_vars]) logger.debug('Args in rules file: %s', args) logger.debug('Args in self: %s', self.args) logger.debug('Args in rules: %s', args_in_rules) # get the key part without first two -- from --key=value def _key(x): return x.split('=')[0][2:] # filter out all args present in rules file conflicting_keys = [ _key(x) for x in self.args if _key(x) in args_in_rules ] if conflicting_keys: raise ArgsConflictError( "Command line args: '{0}' are in conflict with args defined " "in the rules file.".format(', '.join(conflicting_keys))) # prepend the args from the rules file and re-parse the args if args: self.args = args + self.args try: self.parsed = docopt(self._doc_string, options_first=True, argv=self.args) except DocoptExit: logger.error(self._doc_string) return False # remove rules-file from the parse tree del self.parsed['--rules-file'] # validate args return self._validate_args()