def test_change_cls_method(self): class Child(object): def a(self): return 'child' self.assertTrue(check_cls_has_attr(Child, 'a', method=True, overriden=True)) self.assertEqual(Child().a(), 'child') change_cls_method(Child, 'a', 'new_a') self.assertFalse(check_cls_has_attr(Child, 'a', method=True, overriden=True)) self.assertTrue(check_cls_has_attr(Child, 'new_a', method=True, overriden=True)) self.assertEqual(Child().new_a(), 'child')
def test_change_cls_method_replaces_with_new(self): class Child(object): def a(self): return 'child' self.assertTrue(check_cls_has_attr(Child, 'a', method=True, overriden=True)) self.assertEqual(Child().a(), 'child') change_cls_method(Child, 'a', 'new_a', lambda self: 'child2') self.assertTrue(check_cls_has_attr(Child, 'a', method=True, overriden=True)) self.assertTrue(check_cls_has_attr(Child, 'new_a', method=True, overriden=True)) self.assertEqual(Child().new_a(), 'child') self.assertEqual(Child().a(), 'child2')
def _check_cls_method_error(cls, methods_config): if 'replacements' in methods_config: for replacement, is_method in methods_config['replacements']: if check_cls_has_attr(cls, replacement, method=is_method, overriden=True): return None if not any([check_cls_has_attr(cls, method_name, method=True, overriden=True) for method_name in methods_config['methods']]): # log_msg("[%s] ERROR. Class method `%s` not found" % (cls.__name__, str(methods_config['methods']))) return "Class method `%s` not found" % str(methods_config['methods']) if 'requirements' in methods_config: for requirement, is_method in methods_config['requirements']: if not check_cls_has_attr(cls, requirement, method=is_method, overriden=True): # log_msg("[%s] ERROR. Requirement for class method `%s` not found: %s" % (cls.__name__, str(methods_config['methods']), requirement)) return "Requirement for class method `%s` not found: %s" % (str(methods_config['methods']), requirement) return None
def test_true_if_checkoverriden_and_base_class_not_have_attr(self): class Parent(object): pass class Child(Parent): attr = 'Child' self.assertTrue(check_cls_has_attr(Child, 'attr', overriden=True))
def test_true_if_checkoverriden_and_overriden_in_child(self): class Parent(object): attr = 'Parent' class Child(Parent): attr = 'Child' self.assertTrue(check_cls_has_attr(Child, 'attr', overriden=True))
def test_false_if_checkoverriden_and_base_class_has_attr(self): class Parent(object): attr = 'Parent' class Child(Parent): pass self.assertFalse(check_cls_has_attr(Child, 'attr', overriden=True))
def test_true_if_base_class_has_attr(self): class Parent(object): attr = 'Parent' class Child(Parent): pass self.assertTrue(check_cls_has_attr(Child, 'attr', overriden=False))
def _bsm_check_cls_attributes(cls): errors = [] # should have mandatory attributes (not methods) mandatory_attrs = ['name', 'allowed_domains', 'start_urls'] for attr_name in mandatory_attrs: if not check_cls_has_attr(cls, attr_name, method=False, overriden=True): # log_msg("[%s] ERROR. Class attribute not found: %s" % (cls.__name__, attr_name)) errors.append("Class attribute not found: %s" % attr_name) return errors
def test_true_if_base_class_has_method(self): class Parent(object): def attr(self): print 'Parent' class Child(Parent): pass self.assertTrue(check_cls_has_attr(Child, 'attr', method=True, overriden=False))
def _bsm_check_cls_overrides(cls): # should not override specific methods methods_should_not_be_changes = [ '_metadata_enabled', '_get_prev_crawl_file', '_get_prev_crawl_meta_file', 'spider_idle', 'spider_closed', 'full_run_required', '_get_matches_new_system_request', '_get_matches_old_system_request', 'parse_matches_new_system', 'parse_matches_old_system', 'bsm_retry_download', # '_start_requests_full', '_start_requests_simple' ] overrides = [] for method_name in methods_should_not_be_changes: if check_cls_has_attr(cls, method_name, method=True, overriden=True): # log_msg("[%s] ERROR. Method override found: %s" % (cls.__name__, method_name)) overrides.append("Method override found: %s" % method_name) return overrides
def test_false_if_not_have(self): class Child(object): pass self.assertFalse(check_cls_has_attr(Child, 'attr'))
def test_true_if_has_method(self): class Child(object): def attr(self): print 'Child' self.assertTrue(check_cls_has_attr(Child, 'attr', method=True))
def test_false_if_has_nonmethod_with_the_same_name(self): class Child(object): attr = 'Child' self.assertFalse(check_cls_has_attr(Child, 'attr', method=True))
def test_true_if_has_attr(self): class Child(object): attr = 'Child' self.assertTrue(check_cls_has_attr(Child, 'attr'))
def test_false_if_has_method_with_the_same_name(self): class Child(object): def attr(self): print 'Child' self.assertFalse(check_cls_has_attr(Child, 'attr'))