Example #1
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    suppress_message(linter, BasicChecker.visit_discard,
                     'W0104', is_manifest_file)
Example #2
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    suppress_message(linter, BasicChecker.visit_discard, 'W0104',
                     is_manifest_file)
def register(linter):
    sys.path.insert(0, '.')

    old_out = sys.stdout
    old_err = sys.stderr
    sys.stdout = open(os.devnull, 'w')
    sys.stderr = open(os.devnull, 'w')

    fixture_collector = FixtureCollector()

    pytest.main(['--fixtures'], plugins=[fixture_collector])
    sys.stdout = old_out
    sys.stderr = old_err

    def attr_in_fixtures_list(node, fixtures=fixture_collector.fixtures):
        """
        Checks that node is get or post method of the View class and it has valid arguments.
        """
        """Checks that node is get or post method of the View class."""
        funcs = [k for k, v in node.items() if k in fixtures]
        if funcs:
            return True

        return False

    suppress_message(linter, VariablesChecker.visit_functiondef, 'W0621',
                     attr_in_fixtures_list)
Example #4
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    discard = hasattr(BasicChecker, 'visit_discard') and \
        BasicChecker.visit_discard or BasicChecker.visit_expr
    suppress_message(linter, discard, 'W0104', is_manifest_file)
Example #5
0
def register(linter: "PyLinter"):  # noqa
    try:
        from pylint_plugin_utils import suppress_message
    except ImportError:
        print("Cannot suppress message. 'pylint_plugin_utils' not installed.")
        return

    print("Registered custom plugin. Some checks will be disabled for tests.")
    for msg, checks in SUPPRESS_CHECKS.items():
        for checker_method in checks:
            suppress_message(linter, checker_method, msg, is_node_in_tests)
Example #6
0
def register(linter):
    """Required method to auto register this checker."""
    linter.register_checker(NewDbFieldWithDefaultChecker(linter))
    linter.register_checker(MissingBackwardsMigrationChecker(linter))
    if not compat.LOAD_CONFIGURATION_SUPPORTED:
        load_configuration(linter)

    # apply augmentations for migration checkers
    # Unused arguments for migrations
    suppress_message(linter, checkers.variables.VariablesChecker.leave_functiondef,
                     'unused-argument', is_in_migrations)
Example #7
0
def suppress_fields_messages(linter):
    suppress_message(linter, IterableChecker.visit_for, 'not-an-iterable',
                     _is_complex_field_for)

    suppress_message(linter, TypeChecker.visit_compare,
                     'unsupported-membership-test', _is_complex_field_compare)
    suppress_message(linter, TypeChecker.visit_subscript,
                     'unsupported-assignment-operation',
                     _is_complex_field_subscript)
    suppress_message(linter, TypeChecker.visit_subscript,
                     'unsupported-delete-operation',
                     _is_complex_field_subscript)
Example #8
0
def suppress_qs_decorator_messages(linter):
    suppress_message(linter, TypeChecker.visit_call, 'unexpected-keyword-arg',
                     _is_call2custom_manager)
    suppress_message(linter, TypeChecker.visit_call, 'no-value-for-parameter',
                     _is_call2custom_manager)
    suppress_message(linter, TypeChecker.visit_attribute, 'no-member',
                     _is_custom_manager_attribute)
def suppress_doc_messages(linter):
    suppress_message(linter, TypeChecker.visit_attribute, 'no-member',
                     _is_document_field)
    suppress_message(linter, TypeChecker.visit_attribute, 'no-member',
                     node_is_default_qs)
    suppress_message(linter, TypeChecker.visit_call, 'not-callable',
                     _is_doc_call)
Example #10
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    discard = hasattr(BasicChecker, 'visit_discard') and \
        BasicChecker.visit_discard or BasicChecker.visit_expr
    suppress_message(linter, discard, 'W0104', is_manifest_file)

    # W0402 - deprecated-module valid openerp.osv.expression
    discard = ImportsChecker.visit_import
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)
    discard = hasattr(ImportsChecker, 'visit_from') and \
        ImportsChecker.visit_from or ImportsChecker.visit_importfrom
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)

    # E0401 - import-error
    # if the package is openerp then should be ignored because
    # is a runtime valid import
    discard = ImportsChecker.visit_import
    suppress_message(linter, discard, 'E0401', is_openerp_import)
    discard = hasattr(ImportsChecker, 'visit_from') and \
        ImportsChecker.visit_from or ImportsChecker.visit_importfrom
    suppress_message(linter, discard, 'E0401', is_openerp_import)
Example #11
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    discard = hasattr(BasicChecker, 'visit_discard') and \
        BasicChecker.visit_discard or BasicChecker.visit_expr
    suppress_message(linter, discard, 'W0104', is_manifest_file)

    # W0402 - deprecated-module valid openerp.osv.expression
    discard = ImportsChecker.visit_import
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)
    discard = hasattr(ImportsChecker, 'visit_from') and \
        ImportsChecker.visit_from or ImportsChecker.visit_importfrom
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)

    # E0401 - import-error
    # if the package is openerp then should be ignored because
    # is a runtime valid import
    discard = ImportsChecker.visit_import
    suppress_message(linter, discard, 'E0401', is_openerp_import)
    discard = hasattr(ImportsChecker, 'visit_from') and \
        ImportsChecker.visit_from or ImportsChecker.visit_importfrom
    suppress_message(linter, discard, 'E0401', is_openerp_import)
Example #12
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    discard = hasattr(BasicChecker, 'visit_discard') and \
        BasicChecker.visit_discard or BasicChecker.visit_expr
    suppress_message(linter, discard, 'W0104', is_manifest_file)

    # W0402 - deprecated-module valid openerp.osv.expression
    discard = ImportsChecker.visit_import
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)
    discard = hasattr(ImportsChecker, 'visit_from') and \
        ImportsChecker.visit_from or ImportsChecker.visit_importfrom
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)
Example #13
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    discard = hasattr(BasicChecker, 'visit_discard') and \
        BasicChecker.visit_discard or BasicChecker.visit_expr
    suppress_message(linter, discard, 'W0104', is_manifest_file)

    # W0402 - deprecated-module valid openerp.osv.expression
    discard = ImportsChecker.visit_import
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)
    discard = hasattr(ImportsChecker, 'visit_from') and \
        ImportsChecker.visit_from or ImportsChecker.visit_importfrom
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)
Example #14
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)
Example #15
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)
Example #16
0
def apply_augmentations(linter):
    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'))

    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)
Example #17
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)
Example #18
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)
Example #19
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)
Example #20
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)
Example #21
0
def apply_augmentations(linter):
    """Apply suppression rules."""

    # W0104 - pointless-statement
    # manifest file have a valid pointless-statement dict
    discard = hasattr(BasicChecker, 'visit_discard') and \
        BasicChecker.visit_discard or BasicChecker.visit_expr
    suppress_message(linter, discard, 'W0104', is_manifest_file)

    # W0402 - deprecated-module valid openerp.osv.expression
    discard = ImportsChecker.visit_import
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)
    discard = hasattr(ImportsChecker, 'visit_from') and \
        ImportsChecker.visit_from or ImportsChecker.visit_importfrom
    suppress_message(linter, discard, 'W0402', is_valid_openerp_osv_deprecated)

    # C0103 - invalid-name and W0613 - unused-argument for migrations/
    suppress_message(linter, NameChecker.visit_module, 'C0103', is_migration_path)
    suppress_message(linter, NameChecker.visit_functiondef, 'C0103', is_migration_path)
    suppress_message(linter, VariablesChecker.leave_functiondef, 'W0613',
                     is_migration_path)
Example #22
0
def suppress_fields_attrs_messages(linter):
    suppress_message(linter, TypeChecker.visit_attribute, 'no-member',
                     is_field_method)
    suppress_message(linter, TypeChecker.visit_attribute, 'no-member',
                     _is_embedded_doc_attr)
Example #23
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)
Example #24
0
def pylint_newstyle_classdef_compat(linter, warning_name, augment):
    if not hasattr(NewStyleConflictChecker, 'visit_classdef'):
        return
    suppress_message(linter, getattr(NewStyleConflictChecker,
                                     'visit_classdef'), warning_name, augment)
Example #25
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()
Example #26
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)
Example #27
0
def apply_augmentations(linter):
    suppress_message(linter, BasicErrorChecker.visit_function, 'E0102', is_load_function)