Beispiel #1
0
    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
Beispiel #2
0
    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()
Beispiel #3
0
    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()
Beispiel #4
0
    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
Beispiel #5
0
    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()
Beispiel #6
0
    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()