def apply_augmentations(linter): if hasattr(BasicChecker, 'visit_expr'): expr_meth = getattr(BasicChecker, 'visit_expr') else: expr_meth = getattr(BasicChecker, 'visit_discard') augment_visit(linter, expr_meth, allow_attribute_comments)
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, TypeChecker.visit_getattr, foreign_key_sets) suppress_message(linter, TypeChecker.visit_getattr, 'E1101', is_model_field_display_method) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, MisdesignChecker.visit_class, 'R0901', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, ClassChecker.visit_class, 'W0232', is_class('django.forms.models.ModelForm')) # forms implement __getitem__ but not __len__, thus raising a "Badly implemented container" warning which # we will suppress. suppress_message(linter, MisdesignChecker.leave_class, 'R0924', is_class('django.forms.forms.Form')) suppress_message(linter, MisdesignChecker.leave_class, 'R0924', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_meta_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_meta_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_meta_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_meta_subclass) # Media suppress_message(linter, NameChecker.visit_assname, 'C0103', is_model_media_valid_attributes) suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_media_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_media_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_media_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_media_subclass) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase MisdesignChecker.config.max_public_methods to this value to count only user' methods. #nb_public_methods = 0 #for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, MisdesignChecker.leave_class, 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, MisdesignChecker.leave_class, 'R0904', is_model_test_case_subclass) # View suppress_message(linter, ClassChecker.leave_function, 'R0201', is_model_view_subclass_method_shouldnt_be_function) # Method could be a function (get, post) suppress_message(linter, VariablesChecker.leave_function, 'W0613', is_model_view_subclass_unused_argument) # Unused argument 'request' (get, post) # django-mptt suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_mpttmeta_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_mpttmeta_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_mpttmeta_subclass) # ForeignKey and OneToOneField VariablesChecker.leave_module = wrap(VariablesChecker.leave_module, ignore_import_warnings_for_related_fields)
def apply_augmentations(linter): augment_visit(linter, TypeChecker.visit_getattr, foreign_key_sets) augment_visit(linter, TypeChecker.visit_getattr, related_field_attributes) supress_message(linter, TypeChecker.visit_getattr, 'E1101', is_model_field_display_method) # formviews have too many ancestors, there's nothing the user of the library can do about that supress_message(linter, MisdesignChecker.visit_class, 'R0901', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases supress_message(linter, MisdesignChecker.leave_class, 'R0924', is_class('django.forms.forms.Form')) supress_message(linter, ClassChecker.visit_class, 'W0232', is_class('django.forms.models.ModelForm')) supress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_meta_subclass) supress_message(linter, ClassChecker.visit_class, 'W0232', is_model_meta_subclass) supress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_meta_subclass)
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, TypeChecker.visit_attribute, foreign_key_sets) augment_visit(linter, TypeChecker.visit_attribute, foreign_key_ids) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_model_field_display_method) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_style_attribute) suppress_message(linter, NameChecker.visit_assignname, 'invalid-name', is_urls_module_valid_constant) # supress errors when accessing magical class attributes suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_manager_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_admin_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_model_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_field_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_charfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_datefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_decimalfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_filefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_imagefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_ipfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_slugfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_foreignkeyfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_manytomanyfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_onetoonefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_form_attribute) for parents, attrs in VIEW_ATTRS: suppress_message(linter, TypeChecker.visit_attribute, 'no-member', generic_is_view_attribute(parents, attrs)) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, MisdesignChecker.visit_classdef, 'too-many-ancestors', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, ClassChecker.visit_classdef, 'W0232', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, DocStringChecker.visit_classdef, 'missing-docstring', is_model_meta_subclass) pylint_newstyle_classdef_compat(linter, 'old-style-class', is_model_meta_subclass) suppress_message(linter, ClassChecker.visit_classdef, 'no-init', is_model_meta_subclass) suppress_message(linter, MisdesignChecker.leave_classdef, 'too-few-public-methods', is_model_meta_subclass) suppress_message(linter, ClassChecker.visit_attribute, 'protected-access', allow_meta_protected_access) # Media suppress_message(linter, NameChecker.visit_assignname, 'C0103', is_model_media_valid_attributes) suppress_message(linter, DocStringChecker.visit_classdef, 'missing-docstring', is_model_media_subclass) pylint_newstyle_classdef_compat(linter, 'old-style-class', is_model_media_subclass) suppress_message(linter, ClassChecker.visit_classdef, 'no-init', is_model_media_subclass) suppress_message(linter, MisdesignChecker.leave_classdef, 'too-few-public-methods', is_model_media_subclass) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase # MisdesignChecker.config.max_public_methods to this value to count only user' methods. # nb_public_methods = 0 # for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, MisdesignChecker.leave_classdef, 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, MisdesignChecker.leave_classdef, 'R0904', is_model_test_case_subclass) # View # Method could be a function (get, post) suppress_message(linter, ClassChecker.leave_functiondef, 'no-self-use', is_model_view_subclass_method_shouldnt_be_function) # Unused argument 'request' (get, post) suppress_message(linter, VariablesChecker.leave_functiondef, 'unused-argument', is_model_view_subclass_unused_argument) suppress_message(linter, VariablesChecker.leave_functiondef, 'unused-argument', is_argument_named_request) # django-mptt suppress_message(linter, DocStringChecker.visit_classdef, 'missing-docstring', is_model_mpttmeta_subclass) pylint_newstyle_classdef_compat(linter, 'old-style-class', is_model_mpttmeta_subclass) suppress_message(linter, ClassChecker.visit_classdef, 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, MisdesignChecker.leave_classdef, 'too-few-public-methods', is_model_mpttmeta_subclass) # factory_boy's DjangoModelFactory suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_model_factory) suppress_message(linter, ClassChecker.visit_functiondef, 'no-self-argument', is_factory_post_generation_method) # ForeignKey and OneToOneField # Must update this in a thread safe way to support the parallel option on pylint (-j) current_leave_module = VariablesChecker.leave_module if current_leave_module.__name__ == 'leave_module': # current_leave_module is not wrapped # Two threads may hit the next assignment concurrently, but the result is the same VariablesChecker.leave_module = wrap( current_leave_module, ignore_import_warnings_for_related_fields) # VariablesChecker.leave_module is now wrapped # else VariablesChecker.leave_module is already wrapped # wsgi.py suppress_message(linter, NameChecker.visit_assignname, 'invalid-name', is_wsgi_application)
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, _visit_attribute(TypeChecker), foreign_key_sets) augment_visit(linter, _visit_attribute(TypeChecker), foreign_key_ids) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_model_field_display_method) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_style_attribute) # supress errors when accessing magical class attributes suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_manager_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_admin_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_model_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_field_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_charfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_datefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_decimalfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_filefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_imagefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_ipfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_slugfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_foreignkeyfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_manytomanyfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_onetoonefield_attribute) for parents, attrs in VIEW_ATTRS: suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', generic_is_view_attribute(parents, attrs)) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, _visit_class(MisdesignChecker), 'too-many-ancestors', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, _visit_class(ClassChecker), 'W0232', is_class('django.forms.models.ModelForm')) # forms implement __getitem__ but not __len__, thus raising a "Badly implemented container" warning which # we will suppress. NOTE: removed from pylint, https://github.com/PyCQA/pylint/issues/112 # keeping here in case it gets re-implemented # suppress_message(linter, _leave_class(MisdesignChecker), 'R0924', is_class('django.forms.forms.Form')) # suppress_message(linter, _leave_class(MisdesignChecker), 'R0924', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_meta_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_meta_subclass) suppress_message(linter, _visit_class(ClassChecker), 'no-init', is_model_meta_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_meta_subclass) suppress_message(linter, _visit_attribute(ClassChecker), 'protected-access', allow_meta_protected_access) # Media suppress_message(linter, _visit_assignname(NameChecker), 'C0103', is_model_media_valid_attributes) suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_media_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_media_subclass) suppress_message(linter, _visit_class(ClassChecker), 'no-init', is_model_media_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_media_subclass) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase # MisdesignChecker.config.max_public_methods to this value to count only user' methods. # nb_public_methods = 0 # for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, _leave_class(MisdesignChecker), 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, _leave_class(MisdesignChecker), 'R0904', is_model_test_case_subclass) # View # Method could be a function (get, post) suppress_message(linter, _leave_function(ClassChecker), 'R0201', is_model_view_subclass_method_shouldnt_be_function) # Unused argument 'request' (get, post) suppress_message(linter, _leave_function(VariablesChecker), 'W0613', is_model_view_subclass_unused_argument) # django-mptt suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_mpttmeta_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_mpttmeta_subclass) suppress_message(linter, _visit_class(ClassChecker), 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_mpttmeta_subclass) # factory_boy's DjangoModelFactory suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_factory_meta_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_factory_meta_subclass) suppress_message(linter, _visit_class(ClassChecker), 'W0232', is_model_factory_meta_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_factory_meta_subclass) suppress_message(linter, _visit_attribute(TypeChecker), 'no-member', is_model_factory) # ForeignKey and OneToOneField # Must update this in a thread safe way to support the parallel option on pylint (-j) current_leave_module = VariablesChecker.leave_module if current_leave_module.__name__ == 'leave_module': # current_leave_module is not wrapped # Two threads may hit the next assignment concurrently, but the result is the same VariablesChecker.leave_module = wrap( current_leave_module, ignore_import_warnings_for_related_fields) # VariablesChecker.leave_module is now wrapped # else VariablesChecker.leave_module is already wrapped # supress not-an-iterable for model_utils.managers. See #117 suppress_message(linter, IterableChecker._check_iterable, 'not-an-iterable', is_model_manager) # wsgi.py suppress_message(linter, _visit_assignname(NameChecker), 'invalid-name', is_wsgi_application)
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, _visit_attribute(TypeChecker), foreign_key_sets) augment_visit(linter, _visit_attribute(TypeChecker), foreign_key_ids) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_model_field_display_method) # supress errors when accessing magical class attributes suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_manager_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_admin_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_model_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_field_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_charfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_datefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_decimalfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_filefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_imagefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_ipfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_slugfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_foreignkeyfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_manytomanyfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_onetoonefield_attribute) for parents, attrs in VIEW_ATTRS: suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', generic_is_view_attribute(parents, attrs)) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, _visit_class(MisdesignChecker), 'R0901', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, _visit_class(ClassChecker), 'W0232', is_class('django.forms.models.ModelForm')) # forms implement __getitem__ but not __len__, thus raising a "Badly implemented container" warning which # we will suppress. suppress_message(linter, _leave_class(MisdesignChecker), 'R0924', is_class('django.forms.forms.Form')) suppress_message(linter, _leave_class(MisdesignChecker), 'R0924', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_meta_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_meta_subclass) suppress_message(linter, _visit_class(ClassChecker), 'no-init', is_model_meta_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_meta_subclass) # Media suppress_message(linter, _visit_assignname(NameChecker), 'C0103', is_model_media_valid_attributes) suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_media_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_media_subclass) suppress_message(linter, _visit_class(ClassChecker), 'no-init', is_model_media_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_media_subclass) # Too few public methods started appearing for Views and Models as part of Pylint>=1.4 / astroid>=1.3.3 # Not sure why, suspect this is a failure to get the parent classes somewhere # For now, just suppress it on models and views suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_class('.Model')) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_class('.View')) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase # MisdesignChecker.config.max_public_methods to this value to count only user' methods. #nb_public_methods = 0 #for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, _leave_class(MisdesignChecker), 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, _leave_class(MisdesignChecker), 'R0904', is_model_test_case_subclass) # View # Method could be a function (get, post) suppress_message(linter, _leave_function(ClassChecker), 'R0201', is_model_view_subclass_method_shouldnt_be_function) # Unused argument 'request' (get, post) suppress_message(linter, _leave_function(VariablesChecker), 'W0613', is_model_view_subclass_unused_argument) # django-mptt suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_mpttmeta_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_mpttmeta_subclass) suppress_message(linter, _visit_class(ClassChecker), 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_mpttmeta_subclass) # ForeignKey and OneToOneField VariablesChecker.leave_module = wrap(VariablesChecker.leave_module, ignore_import_warnings_for_related_fields)
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, TypeChecker.visit_getattr, foreign_key_sets) suppress_message(linter, TypeChecker.visit_getattr, 'E1101', is_model_field_display_method) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, MisdesignChecker.visit_class, 'R0901', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, ClassChecker.visit_class, 'W0232', is_class('django.forms.models.ModelForm')) # forms implement __getitem__ but not __len__, thus raising a "Badly implemented container" warning which # we will suppress. suppress_message(linter, MisdesignChecker.leave_class, 'R0924', is_class('django.forms.forms.Form')) suppress_message(linter, MisdesignChecker.leave_class, 'R0924', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_meta_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_meta_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_meta_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_meta_subclass) # Media suppress_message(linter, NameChecker.visit_assname, 'C0103', is_model_media_valid_attributes) suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_media_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_media_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_media_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_media_subclass) # Too few public methods started appearing for Views and Models as part of Pylint>=1.4 / astroid>=1.3.3 # Not sure why, suspect this is a failure to get the parent classes somewhere # For now, just suppress it on models and views suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_class('django.db.models.base.Model')) # TODO: why does this not work with the fqn of 'View'? Must be something to do with the overriding and transforms suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_class('.View')) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase # MisdesignChecker.config.max_public_methods to this value to count only user' methods. #nb_public_methods = 0 #for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, MisdesignChecker.leave_class, 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, MisdesignChecker.leave_class, 'R0904', is_model_test_case_subclass) # View # Method could be a function (get, post) suppress_message(linter, ClassChecker.leave_function, 'R0201', is_model_view_subclass_method_shouldnt_be_function) # Unused argument 'request' (get, post) suppress_message(linter, VariablesChecker.leave_function, 'W0613', is_model_view_subclass_unused_argument) # django-mptt suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_mpttmeta_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_mpttmeta_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_mpttmeta_subclass) # ForeignKey and OneToOneField VariablesChecker.leave_module = wrap( VariablesChecker.leave_module, ignore_import_warnings_for_related_fields)
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, TypeChecker.visit_attribute, foreign_key_sets) augment_visit(linter, TypeChecker.visit_attribute, foreign_key_ids) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_model_field_display_method) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_style_attribute) suppress_message(linter, NameChecker.visit_assignname, 'invalid-name', is_urls_module_valid_constant) # supress errors when accessing magical class attributes suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_manager_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_admin_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_model_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_field_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_charfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_datefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_decimalfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_filefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_imagefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_ipfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_slugfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_foreignkeyfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_manytomanyfield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_onetoonefield_attribute) suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_form_attribute) for parents, attrs in VIEW_ATTRS: suppress_message(linter, TypeChecker.visit_attribute, 'no-member', generic_is_view_attribute(parents, attrs)) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, MisdesignChecker.visit_classdef, 'too-many-ancestors', is_class('django.views.generic.edit.FormView')) # class-based generic views just have a longer inheritance chain suppress_message(linter, MisdesignChecker.visit_classdef, 'too-many-ancestors', is_class('django.views.generic.detail.BaseDetailView')) suppress_message(linter, MisdesignChecker.visit_classdef, 'too-many-ancestors', is_class('django.views.generic.edit.ProcessFormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, ClassChecker.visit_classdef, 'W0232', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, DocStringChecker.visit_classdef, 'missing-docstring', is_model_meta_subclass) pylint_newstyle_classdef_compat(linter, 'old-style-class', is_model_meta_subclass) suppress_message(linter, ClassChecker.visit_classdef, 'no-init', is_model_meta_subclass) suppress_message(linter, MisdesignChecker.leave_classdef, 'too-few-public-methods', is_model_meta_subclass) suppress_message(linter, ClassChecker.visit_attribute, 'protected-access', allow_meta_protected_access) # Media suppress_message(linter, NameChecker.visit_assignname, 'C0103', is_model_media_valid_attributes) suppress_message(linter, DocStringChecker.visit_classdef, 'missing-docstring', is_model_media_subclass) pylint_newstyle_classdef_compat(linter, 'old-style-class', is_model_media_subclass) suppress_message(linter, ClassChecker.visit_classdef, 'no-init', is_model_media_subclass) suppress_message(linter, MisdesignChecker.leave_classdef, 'too-few-public-methods', is_model_media_subclass) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase # MisdesignChecker.config.max_public_methods to this value to count only user' methods. # nb_public_methods = 0 # for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, MisdesignChecker.leave_classdef, 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, MisdesignChecker.leave_classdef, 'R0904', is_model_test_case_subclass) # View # Method could be a function (get, post) suppress_message(linter, ClassChecker.leave_functiondef, 'no-self-use', is_model_view_subclass_method_shouldnt_be_function) # django-mptt suppress_message(linter, DocStringChecker.visit_classdef, 'missing-docstring', is_model_mpttmeta_subclass) pylint_newstyle_classdef_compat(linter, 'old-style-class', is_model_mpttmeta_subclass) suppress_message(linter, ClassChecker.visit_classdef, 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, MisdesignChecker.leave_classdef, 'too-few-public-methods', is_model_mpttmeta_subclass) # factory_boy's DjangoModelFactory suppress_message(linter, TypeChecker.visit_attribute, 'no-member', is_model_factory) suppress_message(linter, ClassChecker.visit_functiondef, 'no-self-argument', is_factory_post_generation_method) # wsgi.py suppress_message(linter, NameChecker.visit_assignname, 'invalid-name', is_wsgi_application) apply_wrapped_augmentations()
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, TypeChecker.visit_getattr, foreign_key_sets) augment_visit(linter, TypeChecker.visit_getattr, related_field_attributes) suppress_message(linter, TypeChecker.visit_getattr, 'E1101', is_model_field_display_method) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, MisdesignChecker.visit_class, 'R0901', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, ClassChecker.visit_class, 'W0232', is_class('django.forms.models.ModelForm')) # forms implement __getitem__ but not __len__, thus raising a "Badly implemented container" warning which # we will suppress. suppress_message(linter, MisdesignChecker.leave_class, 'R0924', is_class('django.forms.forms.Form')) suppress_message(linter, MisdesignChecker.leave_class, 'R0924', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_meta_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_meta_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_meta_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_meta_subclass) # Media suppress_message(linter, NameChecker.visit_assname, 'C0103', is_model_media_valid_attributes) suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_media_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_media_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_media_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_media_subclass) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase MisdesignChecker.config.max_public_methods to this value to count only user' methods. #nb_public_methods = 0 #for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, MisdesignChecker.leave_class, 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, MisdesignChecker.leave_class, 'R0904', is_model_test_case_subclass) # View suppress_message(linter, ClassChecker.leave_function, 'R0201', is_model_view_subclass_method_shouldnt_be_function ) # Method could be a function (get, post) suppress_message(linter, VariablesChecker.leave_function, 'W0613', is_model_view_subclass_unused_argument ) # Unused argument 'request' (get, post) # django-mptt suppress_message(linter, DocStringChecker.visit_class, 'C0111', is_model_mpttmeta_subclass) suppress_message(linter, NewStyleConflictChecker.visit_class, 'C1001', is_model_mpttmeta_subclass) suppress_message(linter, ClassChecker.visit_class, 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, MisdesignChecker.leave_class, 'R0903', is_model_mpttmeta_subclass)
def apply_augmentations(linter): """Apply augmentation and suppression rules.""" augment_visit(linter, _visit_attribute(TypeChecker), foreign_key_sets) augment_visit(linter, _visit_attribute(TypeChecker), foreign_key_ids) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_model_field_display_method) # supress errors when accessing magical class attributes suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_manager_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_admin_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_model_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_field_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_charfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_datefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_decimalfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_filefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_imagefield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_ipfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_slugfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_foreignkeyfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_manytomanyfield_attribute) suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', is_onetoonefield_attribute) for parents, attrs in VIEW_ATTRS: suppress_message(linter, _visit_attribute(TypeChecker), 'E1101', generic_is_view_attribute(parents, attrs)) # formviews have too many ancestors, there's nothing the user of the library can do about that suppress_message(linter, _visit_class(MisdesignChecker), 'R0901', is_class('django.views.generic.edit.FormView')) # model forms have no __init__ method anywhere in their bases suppress_message(linter, _visit_class(ClassChecker), 'W0232', is_class('django.forms.models.ModelForm')) # forms implement __getitem__ but not __len__, thus raising a "Badly implemented container" warning which # we will suppress. suppress_message(linter, _leave_class(MisdesignChecker), 'R0924', is_class('django.forms.forms.Form')) suppress_message(linter, _leave_class(MisdesignChecker), 'R0924', is_class('django.forms.models.ModelForm')) # Meta suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_meta_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_meta_subclass) suppress_message(linter, _visit_class(ClassChecker), 'no-init', is_model_meta_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_meta_subclass) suppress_message(linter, _visit_attribute(ClassChecker), 'protected-access', allow_meta_protected_access) # Media suppress_message(linter, _visit_assignname(NameChecker), 'C0103', is_model_media_valid_attributes) suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_media_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_media_subclass) suppress_message(linter, _visit_class(ClassChecker), 'no-init', is_model_media_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_media_subclass) # Too few public methods started appearing for Views and Models as part of Pylint>=1.4 / astroid>=1.3.3 # Not sure why, suspect this is a failure to get the parent classes somewhere # For now, just suppress it on models and views suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_class('.Model')) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_class('.View')) # Admin # Too many public methods (40+/20) # TODO: Count public methods of django.contrib.admin.options.ModelAdmin and increase # MisdesignChecker.config.max_public_methods to this value to count only user' methods. #nb_public_methods = 0 #for method in node.methods(): # if not method.name.startswith('_'): # nb_public_methods += 1 suppress_message(linter, _leave_class(MisdesignChecker), 'R0904', is_model_admin_subclass) # Tests suppress_message(linter, _leave_class(MisdesignChecker), 'R0904', is_model_test_case_subclass) # View # Method could be a function (get, post) suppress_message(linter, _leave_function(ClassChecker), 'R0201', is_model_view_subclass_method_shouldnt_be_function) # Unused argument 'request' (get, post) suppress_message(linter, _leave_function(VariablesChecker), 'W0613', is_model_view_subclass_unused_argument) # django-mptt suppress_message(linter, _visit_class(DocStringChecker), 'missing-docstring', is_model_mpttmeta_subclass) suppress_message(linter, _visit_class(NewStyleConflictChecker), 'old-style-class', is_model_mpttmeta_subclass) suppress_message(linter, _visit_class(ClassChecker), 'W0232', is_model_mpttmeta_subclass) suppress_message(linter, _leave_class(MisdesignChecker), 'too-few-public-methods', is_model_mpttmeta_subclass) # ForeignKey and OneToOneField # Must update this in a thread safe way to support the parallel option on pylint (-j) current_leave_module = VariablesChecker.leave_module if current_leave_module.__name__ == 'leave_module': # current_leave_module is not wrapped # Two threads may hit the next assignment concurrently, but the result is the same VariablesChecker.leave_module = wrap(current_leave_module, ignore_import_warnings_for_related_fields)
def apply_augmentations(linter): augment_visit(linter, BasicChecker.visit_discard, allow_attribute_comments)