示例#1
0
    def test_classes_in_namespaces_converter_5(self):
        n = Namespace()
        n.add_option(
            'kls_list',
            default=('socorro.unittest.lib.test_converters.Alpha, '
                     'socorro.unittest.lib.test_converters.Alpha, '
                     'socorro.unittest.lib.test_converters.Alpha'),
            from_string_converter=str_to_classes_in_namespaces_converter(
                '%(name)s_%(index)02d'))

        cm = ConfigurationManager(n, [{
            'kls_list': ('socorro.unittest.lib.test_converters.Alpha, '
                         'socorro.unittest.lib.test_converters.Beta, '
                         'socorro.unittest.lib.test_converters.Beta, '
                         'socorro.unittest.lib.test_converters.Alpha'),
            'Alpha_00.a':
            21,
            'Beta_01.b':
            38,
        }])
        config = cm.get_config()

        self.assertEqual(len(config.kls_list.subordinate_namespace_names), 4)
        for i, (a_class_name, a_class,
                ns_name) in (enumerate(config.kls_list.class_list)):
            self.assertTrue(isinstance(a_class_name, str))
            self.assertEqual(a_class_name, a_class.__name__)
            self.assertEqual(ns_name, "%s_%02d" % (a_class_name, i))
示例#2
0
    def test_classes_in_namespaces_converter_4(self):
        n = Namespace()
        n.add_option(
            'kls_list',
            default=(
                'socorro.unittest.lib.test_converters.Alpha, '
                'socorro.unittest.lib.test_converters.Alpha, '
                'socorro.unittest.lib.test_converters.Alpha'
            ),
            from_string_converter=str_to_classes_in_namespaces_converter(
                '%(name)s_%(index)02d'
            )
        )

        cm = ConfigurationManager(
            n,
            [{
                'kls_list': (
                    'socorro.unittest.lib.test_converters.Alpha, '
                    'socorro.unittest.lib.test_converters.Beta, '
                    'socorro.unittest.lib.test_converters.Beta, '
                    'socorro.unittest.lib.test_converters.Alpha'
                ),
                'Alpha_00.a': 21,
                'Beta_01.b': 38,
            }]
        )
        config = cm.get_config()


        self.assertEqual(len(config.kls_list.subordinate_namespace_names), 4)
        for x in config.kls_list.subordinate_namespace_names:
            self.assertTrue(x in config)
        self.assertEqual(config.Alpha_00.a, 21)
        self.assertEqual(config.Beta_01.b, 38)
示例#3
0
 def test_classes_in_namespaces_converter_2(self):
     converter_fn = str_to_classes_in_namespaces_converter(
         'class_%(name)s'
     )
     class_sequence = (Foo, Bar)
     # ought to raise TypeError because 'class_sequence' is not a string
     self.assertRaises(TypeError, converter_fn, class_sequence)
    def test_classes_in_namespaces_converter_5(self):
        n = Namespace()
        n.add_option(
            'kls_list',
            default=(
                'socorro.unittest.lib.test_converters.Alpha, '
                'socorro.unittest.lib.test_converters.Alpha, '
                'socorro.unittest.lib.test_converters.Alpha'
            ),
            from_string_converter=str_to_classes_in_namespaces_converter(
                '%(name)s_%(index)02d'
            )
        )

        cm = ConfigurationManager(
            n,
            [{
                'kls_list': (
                    'socorro.unittest.lib.test_converters.Alpha, '
                    'socorro.unittest.lib.test_converters.Beta, '
                    'socorro.unittest.lib.test_converters.Beta, '
                    'socorro.unittest.lib.test_converters.Alpha'
                ),
                'Alpha_00.a': 21,
                'Beta_01.b': 38,
            }]
        )
        config = cm.get_config()

        self.assertEqual(len(config.kls_list.subordinate_namespace_names), 4)
        for i, (a_class_name, a_class, ns_name) in \
            enumerate(config.kls_list.class_list):
            self.assertTrue(isinstance(a_class_name, str))
            self.assertEqual(a_class_name, a_class.__name__)
            self.assertEqual(ns_name, "%s_%02d" % (a_class_name, i))
示例#5
0
    def test_classes_in_namespaces_converter_4(self):
        n = Namespace()
        n.add_option(
            'kls_list',
            default=('socorro.unittest.lib.test_converters.Alpha, '
                     'socorro.unittest.lib.test_converters.Alpha, '
                     'socorro.unittest.lib.test_converters.Alpha'),
            from_string_converter=str_to_classes_in_namespaces_converter(
                '%(name)s_%(index)02d'))

        cm = ConfigurationManager(n, [{
            'kls_list': ('socorro.unittest.lib.test_converters.Alpha, '
                         'socorro.unittest.lib.test_converters.Beta, '
                         'socorro.unittest.lib.test_converters.Beta, '
                         'socorro.unittest.lib.test_converters.Alpha'),
            'Alpha_00.a':
            21,
            'Beta_01.b':
            38,
        }])
        config = cm.get_config()

        self.assertEqual(len(config.kls_list.subordinate_namespace_names), 4)
        for x in config.kls_list.subordinate_namespace_names:
            self.assertTrue(x in config)
        self.assertEqual(config.Alpha_00.a, 21)
        self.assertEqual(config.Beta_01.b, 38)
示例#6
0
class TransformRuleSystem(RequiredConfig):
    """A collection of TransformRules that can be applied together"""
    required_config = Namespace()
    required_config.add_option(
        name='rules_list',
        default=[],
        from_string_converter=str_to_classes_in_namespaces_converter())
    required_config.add_option(
        'chatty_rules',
        doc='should the rules announce what they are doing?',
        default=False,
    )

    def __init__(self, config=None, quit_check=None):
        if quit_check:
            self._quit_check = quit_check
        else:
            self._quit_check = self._null_quit_check
        self.rules = []
        if not config:
            config = DotDict()
        if 'chatty_rules' not in config:
            config.chatty_rules = False
        self.config = config
        if "rules_list" in config:
            self.tag = config.tag
            self.act = getattr(self, config.action)
            list_of_rules = config.rules_list.class_list

            for a_rule_class_name, a_rule_class, ns_name in list_of_rules:
                try:
                    self.rules.append(a_rule_class(config[ns_name]))
                except KeyError, x:
                    self.rules.append(a_rule_class(config))
    class ProcessorRuleSets(RequiredConfig):
        # why do rules come in sets?  Why not just have a big list of rules?
        # rule sets are containers for rules with a similar purpose and
        # execution mode.  For example, there are rule sets for adjusting the
        # raw_crash, transforming raw to processed, post processing the
        # processed_crash and then all the different forms of classifiers.
        # Some rule sets have different execution modes: run all the rules,
        # run the rules until one fails, run the rules until one succeeds,
        # etc.
        required_config = Namespace()

        names = []
        for (name, tag, rule_set_class_str, action_str, default_rules_str) \
            in rule_sets:
            names.append(name)
            required_config.namespace(name)
            required_config[name].add_option(
                name='tag',
                doc='the lookup tag associated with this rule set',
                default=tag
            )
            required_config[name].add_option(
                name='rule_system_class',
                default=rule_set_class_str,
                doc='the fully qualified name of the rule system class',
                from_string_converter=str_to_python_object,
                likely_to_be_changed=True,
            )
            required_config[name].add_option(
                name='action',
                default=action_str,
                doc=(
                    'the name of the rule set method to run to processes '
                    'these rules'
                ),
                likely_to_be_changed=True,
            )
            required_config[name].add_option(
                name='rules_list',
                doc='a list of fully qualified class names for the rules',
                default=default_rules_str,
                from_string_converter=str_to_classes_in_namespaces_converter(
                    name_of_class_option='rule_class'
                ),
                likely_to_be_changed=True,
            )

        @classmethod
        def to_str(klass):
            return "'%s'" % rule_sets_as_string
示例#8
0
 def test_classes_in_namespaces_converter_1(self):
     converter_fn = str_to_classes_in_namespaces_converter('class_%(name)s')
     class_list_str = ('socorro.unittest.lib.test_converters.Foo,'
                       'socorro.unittest.lib.test_converters.Bar')
     result = converter_fn(class_list_str)
     self.assertTrue(hasattr(result, 'required_config'))
     req = result.required_config
     self.assertEqual(len(req), 2)
     self.assertTrue('class_Foo' in req)
     self.assertEqual(len(req.class_Foo), 1)
     self.assertTrue('class_Bar' in req)
     self.assertEqual(len(req.class_Bar), 1)
     self.assertEqual(
         sorted([x.strip() for x in class_list_str.split(',')]),
         sorted([x.strip() for x in to_str(result).strip("'").split(',')]))
示例#9
0
 def test_classes_in_namespaces_converter_1(self):
     converter_fn = str_to_classes_in_namespaces_converter()
     class_list_str = ('socorro.unittest.lib.test_converters.Foo,'
                       'socorro.unittest.lib.test_converters.Bar')
     result = converter_fn(class_list_str)
     assert hasattr(result, 'required_config')
     req = result.required_config
     assert len(req) == 2
     assert 'Foo' in req
     assert len(req.Foo) == 1
     assert 'Bar' in req
     assert len(req.Bar) == 1
     expected = sorted(
         [x.strip() for x in to_str(result).strip("'").split(',')])
     assert sorted([x.strip()
                    for x in class_list_str.split(',')]) == expected
示例#10
0
 def test_classes_in_namespaces_converter_1(self):
     converter_fn = str_to_classes_in_namespaces_converter()
     class_list_str = (
         'socorro.unittest.lib.test_converters.Foo,'
         'socorro.unittest.lib.test_converters.Bar'
     )
     result = converter_fn(class_list_str)
     assert hasattr(result, 'required_config')
     req = result.required_config
     assert len(req) == 2
     assert 'Foo' in req
     assert len(req.Foo) == 1
     assert 'Bar' in req
     assert len(req.Bar) == 1
     expected = sorted([x.strip() for x in to_str(result).strip("'").split(',')])
     assert sorted([x.strip() for x in class_list_str.split(',')]) == expected
示例#11
0
    def test_classes_in_namespaces_converter_3(self):
        n = Namespace()
        n.add_option(
            'kls_list',
            default=('socorro.unittest.lib.test_converters.Foo, '
                     'socorro.unittest.lib.test_converters.Foo, '
                     'socorro.unittest.lib.test_converters.Foo'),
            from_string_converter=str_to_classes_in_namespaces_converter(
                '%(name)s_%(index)02d'))

        cm = ConfigurationManager(n, argv_source=[])
        config = cm.get_config()

        self.assertEqual(len(config.kls_list.subordinate_namespace_names), 3)
        self.assertTrue('Foo_00' in config)
        self.assertTrue('Foo_01' in config)
        self.assertTrue('Foo_02' in config)
示例#12
0
    def test_classes_in_namespaces_converter_3(self):
        n = Namespace()
        n.add_option(
            'kls_list',
            default=(
                'socorro.unittest.lib.test_converters.Foo, '
                'socorro.unittest.lib.test_converters.Foo, '
                'socorro.unittest.lib.test_converters.Foo'
            ),
            from_string_converter= str_to_classes_in_namespaces_converter(
                '%(name)s_%(index)02d'
            )
        )

        cm = ConfigurationManager(n, argv_source=[])
        config = cm.get_config()

        self.assertEqual(len(config.kls_list.subordinate_namespace_names), 3)
        self.assertTrue('Foo_00' in config)
        self.assertTrue('Foo_01' in config)
        self.assertTrue('Foo_02' in config)
示例#13
0
 def test_classes_in_namespaces_converter_1(self):
     converter_fn = str_to_classes_in_namespaces_converter(
         'class_%(name)s'
     )
     class_list_str = (
         'socorro.unittest.lib.test_converters.Foo,'
         'socorro.unittest.lib.test_converters.Bar'
     )
     result = converter_fn(class_list_str)
     self.assertTrue(hasattr(result, 'required_config'))
     req = result.required_config
     self.assertEqual(len(req), 2)
     self.assertTrue('class_Foo' in req)
     self.assertEqual(len(req.class_Foo), 1)
     self.assertTrue('class_Bar' in req)
     self.assertEqual(len(req.class_Bar), 1)
     self.assertEqual(
         sorted([x.strip() for x in class_list_str.split(',')]),
         sorted([
             x.strip() for x in
             to_str(result).strip("'").split(',')
         ])
     )
示例#14
0
 def test_classes_in_namespaces_converter_2(self):
     converter_fn = str_to_classes_in_namespaces_converter()
     class_sequence = (Foo, Bar)
     # ought to raise TypeError because 'class_sequence' is not a string
     with pytest.raises(TypeError):
         converter_fn(class_sequence)
示例#15
0
class TransformRuleSystem(RequiredConfig):
    """A collection of TransformRules that can be applied together"""
    required_config = Namespace()
    required_config.add_option(
        name='rules_list',
        default=[],
        from_string_converter=str_to_classes_in_namespaces_converter()
    )
    required_config.add_option(
        'chatty_rules',
        doc='should the rules announce what they are doing?',
        default=False,
    )

    #--------------------------------------------------------------------------
    def __init__(self, config=None, quit_check=None):
        if quit_check:
            self._quit_check = quit_check
        else:
            self._quit_check = self._null_quit_check
        self.rules = []
        if not config:
            config = DotDict()
        if 'chatty_rules' not in config:
            config.chatty_rules = False
        self.config = config
        if "rules_list" in config:
            self.tag = config.tag
            self.act = getattr(self, config.action)
            list_of_rules = config.rules_list.class_list

            for a_rule_class_name, a_rule_class, ns_name in list_of_rules:
                try:
                    self.rules.append(
                        a_rule_class(config[ns_name])
                    )
                except KeyError:
                    self.rules.append(
                        a_rule_class(config)
                    )

    #--------------------------------------------------------------------------
    def _null_quit_check(self):
        "a no-op method to do nothing if no quit check method has been defined"
        pass

    #--------------------------------------------------------------------------
    def load_rules(self, an_iterable):
        """cycle through a collection of Transform rule tuples loading them
        into the TransformRuleSystem"""
        self.rules = [
            TransformRule(*x, config=self.config) for x in an_iterable
        ]

    #--------------------------------------------------------------------------
    def append_rules(self, an_iterable):
        """add rules to the TransformRuleSystem"""
        self.rules.extend(
            TransformRule(*x, config=self.config) for x in an_iterable
        )

    #--------------------------------------------------------------------------
    def apply_all_rules(self, *args, **kwargs):
        """cycle through all rules and apply them all without regard to
        success or failure

        returns:
             True - since success or failure is ignored"""
        for x in self.rules:
            self._quit_check()
            if self.config.chatty_rules:
                self.config.logger.debug(
                    'apply_all_rules: %s',
                    to_str(x.__class__)
                )
            predicate_result, action_result = x.act(*args, **kwargs)
            if self.config.chatty_rules:
                self.config.logger.debug(
                    '               : pred - %s; act - %s',
                    predicate_result,
                    action_result
                )
        return True

    #--------------------------------------------------------------------------
    def apply_until_action_succeeds(self, *args, **kwargs):
        """cycle through all rules until an action is run and succeeds

        returns:
           True - if an action is run and succeeds
           False - if no action succeeds"""
        for x in self.rules:
            self._quit_check()
            if self.config.chatty_rules:
                self.config.logger.debug(
                    'apply_until_action_succeeds: %s',
                    to_str(x.__class__)
                )
            predicate_result, action_result = x.act(*args, **kwargs)
            if self.config.chatty_rules:
                self.config.logger.debug(
                    '                           : pred - %s; act - %s',
                    predicate_result,
                    action_result
                )
            if action_result:
                return True
        return False

    #--------------------------------------------------------------------------
    def apply_until_action_fails(self, *args, **kwargs):
        """cycle through all rules until an action is run and fails

        returns:
            True - an action ran and it failed
            False - no action ever failed"""
        for x in self.rules:
            self._quit_check()
            if self.config.chatty_rules:
                self.config.logger.debug(
                    'apply_until_action_fails: %s',
                    to_str(x.__class__)
                )
            predicate_result, action_result = x.act(*args, **kwargs)
            if self.config.chatty_rules:
                self.config.logger.debug(
                    '                        : pred - %s; act - %s',
                    predicate_result,
                    action_result
                )
            if not action_result:
                return True
        return False

    #--------------------------------------------------------------------------
    def apply_until_predicate_succeeds(self, *args, **kwargs):
        """cycle through all rules until a predicate returns True

        returns:
            True - an action ran and it succeeded
            False - an action ran and it failed
            None - no predicate ever succeeded"""
        for x in self.rules:
            self._quit_check()
            if self.config.chatty_rules:
                self.config.logger.debug(
                    'apply_until_predicate_succeeds: %s',
                    to_str(x.__class__)
                )
            predicate_result, action_result = x.act(*args, **kwargs)
            if self.config.chatty_rules:
                self.config.logger.debug(
                    '                              : pred - %s; act - %s',
                    predicate_result,
                    action_result
                )
            if predicate_result:
                return action_result
        return None

    #--------------------------------------------------------------------------
    def apply_until_predicate_fails(self, *args, **kwargs):
        """cycle through all rules until a predicate returns False

        returns:
            False - a predicate ran and it failed
            None - no predicate ever failed"""
        for x in self.rules:
            self._quit_check()
            if self.config.chatty_rules:
                self.config.logger.debug(
                    'apply_until_predicate_fails: %s',
                    to_str(x.__class__)
                )
            predicate_result, action_result = x.act(*args, **kwargs)
            if self.config.chatty_rules:
                self.config.logger.debug(
                    '                           : pred - %s; act - %s',
                    predicate_result,
                    action_result
                )
            if not predicate_result:
                return False
        return None
示例#16
0
class TransformRuleSystem(RequiredConfig):
    """A collection of TransformRules that can be applied together"""
    required_config = Namespace()
    required_config.add_option(
        name='rules_list',
        default=[],
        from_string_converter=str_to_classes_in_namespaces_converter())

    #--------------------------------------------------------------------------
    def __init__(self, config=None):
        self.rules = []
        self.config = config
        if config:
            if "rules_list" in config:
                for a_rule_class in config.rules_list:
                    try:
                        self.rules.append(
                            a_rule_class(config[a_rule_class.__name__]))
                    except KeyError:
                        self.config.logger.debug(
                            'Rule %s configuration is missing',
                            a_rule_class.__name__)

    #--------------------------------------------------------------------------
    def load_rules(self, an_iterable):
        """cycle through a collection of Transform rule tuples loading them
        into the TransformRuleSystem"""
        self.rules = [
            TransformRule(*x, config=self.config) for x in an_iterable
        ]

    #--------------------------------------------------------------------------
    def append_rules(self, an_iterable):
        """add rules to the TransformRuleSystem"""
        self.rules.extend(
            TransformRule(*x, config=self.config) for x in an_iterable)

    #--------------------------------------------------------------------------
    def apply_all_rules(self, *args, **kwargs):
        """cycle through all rules and apply them all without regard to
        success or failure

        returns:
             True - since success or failure is ignored"""
        # print 'args:', args, 'kwargs:', kwargs
        for x in self.rules:
            x.act(*args, **kwargs)
        return True

    #--------------------------------------------------------------------------
    def apply_until_action_succeeds(self, *args, **kwargs):
        """cycle through all rules until an action is run and succeeds

        returns:
           True - if an action is run and succeeds
           False - if no action succeeds"""
        for x in self.rules:
            predicate_result, action_result = x.act(*args, **kwargs)
            if action_result:
                return True
        return False

    #--------------------------------------------------------------------------
    def apply_until_action_fails(self, *args, **kwargs):
        """cycle through all rules until an action is run and fails

        returns:
            True - an action ran and it failed
            False - no action ever failed"""
        for x in self.rules:
            predicate_result, action_result = x.act(*args, **kwargs)
            if not action_result:
                return True
        return False

    #--------------------------------------------------------------------------
    def apply_until_predicate_succeeds(self, *args, **kwargs):
        """cycle through all rules until a predicate returns True

        returns:
            True - an action ran and it succeeded
            False - an action ran and it failed
            None - no predicate ever succeeded"""
        for x in self.rules:
            predicate_result, action_result = x.act(*args, **kwargs)
            if predicate_result:
                return action_result
        return None

    #--------------------------------------------------------------------------
    def apply_until_predicate_fails(self, *args, **kwargs):
        """cycle through all rules until a predicate returns False

        returns:
            False - a predicate ran and it failed
            None - no predicate ever failed"""
        for x in self.rules:
            predicate_result, action_result = x.act(*args, **kwargs)
            if not predicate_result:
                return False
        return None
示例#17
0
 def test_classes_in_namespaces_converter_2(self):
     converter_fn = str_to_classes_in_namespaces_converter()
     class_sequence = (Foo, Bar)
     # ought to raise TypeError because 'class_sequence' is not a string
     with pytest.raises(TypeError):
         converter_fn(class_sequence)
示例#18
0
 def test_classes_in_namespaces_converter_2(self):
     converter_fn = str_to_classes_in_namespaces_converter('class_%(name)s')
     class_sequence = (Foo, Bar)
     # ought to raise TypeError because 'class_sequence' is not a string
     self.assertRaises(TypeError, converter_fn, class_sequence)