Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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)
Esempio n. 8
0
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()
Esempio n. 9
0
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)
Esempio n. 10
0
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)
Esempio n. 11
0
def apply_augmentations(linter):
    augment_visit(linter, BasicChecker.visit_discard, allow_attribute_comments)