diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d9516f731e87223aa1e74e85b5564629bfeb7e6..429c0b42a722b28f394c46611d5d45e34510da10 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -47,7 +47,7 @@ db_migrations_updated: linter: stage: test script: - - pip3 install pylint-gitlab # this force-updates jinja2 and some other packages! + - pip3 install pylint-gitlab pylint-flask-sqlalchemy # this force-updates jinja2 and some other packages! - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabCodeClimateReporter uffd > codeclimate.json - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabPagesHtmlReporter uffd > pylint.html - python3 -m pylint --rcfile .pylintrc --output-format=text uffd diff --git a/.pylintrc b/.pylintrc index 2d0b9f37cb50ff484d26cbb82f7c9f29019ef164..3ea72c68f3583556f21e551874fa0623e1f1dde3 100644 --- a/.pylintrc +++ b/.pylintrc @@ -28,7 +28,7 @@ limit-inference-results=100 # List of plugins (as comma separated values of python module names) to load, # usually to register additional checkers. -load-plugins= +load-plugins=pylint_flask_sqlalchemy # Pickle collected data for later comparisons. persistent=yes @@ -63,91 +63,9 @@ confidence= disable=missing-module-docstring, missing-class-docstring, missing-function-docstring, - print-statement, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, - bad-inline-option, - locally-disabled, - file-ignored, - suppressed-message, - useless-suppression, - deprecated-pragma, - use-symbolic-message-instead, - unused-wildcard-import, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - deprecated-operator-function, - deprecated-urllib-function, - xreadlines-attribute, - deprecated-sys-function, - exception-escape, - comprehension-escape, too-few-public-methods, method-hidden, - bad-continuation, too-many-ancestors, - no-self-use, duplicate-code, # Enable the message, report, category or checker with the given id(s). You can @@ -206,7 +124,7 @@ ignore-docstrings=yes ignore-imports=no # Minimum lines number of a similarity. -min-similarity-lines=6 +min-similarity-lines=10 [TYPECHECK] diff --git a/CHANGELOG b/CHANGELOG index 0b229b0799a603a1a640260ebe12f39d2ec66407..250c5362b5ebaf6f0af0f2f7e8741b786a132c11 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -14,7 +14,7 @@ uffd (0.3.0) unstable; urgency=medium [ Julian ] * ensure uffd-admin works with arguments containing whitespace - -- CCCV <it@cccv.de> Sat, 31 Jul 2021 23:36:01 +0000 + -- root <root@runner-f9u6bnzu-project-27-concurrent-0> Sun, 01 Aug 2021 13:27:31 +0000 uffd (0.2.0) unstable; urgency=medium diff --git a/uffd/csrf/csrf.py b/uffd/csrf/csrf.py index 6b61cf47dabc8be0893eb0f81c0d6d292c221d1d..225bda284c95339880598801092146ad05a850c1 100644 --- a/uffd/csrf/csrf.py +++ b/uffd/csrf/csrf.py @@ -4,9 +4,7 @@ from flask import Blueprint, request, session bp = Blueprint("csrf", __name__) -# pylint: disable=invalid-name -csrfEndpoints = [] -# pylint: enable=invalid-name +csrf_endpoints = [] def csrf_protect(blueprint=None, endpoint=None): def wraper(func): @@ -15,7 +13,7 @@ def csrf_protect(blueprint=None, endpoint=None): urlendpoint = "{}.{}".format(blueprint.name, func.__name__) else: urlendpoint = func.__name__ - csrfEndpoints.append(urlendpoint) + csrf_endpoints.append(urlendpoint) @wraps(func) def decorator(*args, **kwargs): if '_csrf_token' in request.values: @@ -32,6 +30,6 @@ def csrf_protect(blueprint=None, endpoint=None): @bp.app_url_defaults def csrf_inject(endpoint, values): - if endpoint not in csrfEndpoints or not session.get('_csrf_token'): + if endpoint not in csrf_endpoints or not session.get('_csrf_token'): return values['_csrf_token'] = session['_csrf_token'] diff --git a/uffd/database.py b/uffd/database.py index 4f5413f94276d3dc45ce5af15afd8f824660b3fa..681581e19e4e17f1f113ad9bfe2e1ab7d25ed34a 100644 --- a/uffd/database.py +++ b/uffd/database.py @@ -13,9 +13,7 @@ convention = { } metadata = MetaData(naming_convention=convention) -# pylint: disable=C0103 db = SQLAlchemy(metadata=metadata) -# pylint: enable=C0103 class SQLAlchemyJSON(JSONEncoder): def default(self, o): diff --git a/uffd/invite/models.py b/uffd/invite/models.py index fb6f315fd38fbb417c3fc261b01ada9935af313c..196e333cd378f2a52e60104c1df87db47e29005f 100644 --- a/uffd/invite/models.py +++ b/uffd/invite/models.py @@ -10,7 +10,6 @@ from uffd.database import db from uffd.user.models import User from uffd.signup.models import Signup -# pylint: disable=E1101 invite_roles = db.Table('invite_roles', Column('invite_id', Integer(), ForeignKey('invite.id'), primary_key=True), Column('role_id', Integer, ForeignKey('role.id'), primary_key=True) diff --git a/uffd/ldap.py b/uffd/ldap.py index 015713d5d898d89358c360c07171590bff6adc68..ed31bb01e3372d5e89dbb6a1c89c8eaf84e7a835 100644 --- a/uffd/ldap.py +++ b/uffd/ldap.py @@ -6,6 +6,7 @@ from flask import current_app, request, abort, session import ldap3 from ldap3.core.exceptions import LDAPBindError, LDAPPasswordIsMandatoryError, LDAPInvalidDnError +# We import LDAPCommitError only because it is imported from us by other files. It is not needed here from uffd.ldapalchemy import LDAPMapper, LDAPCommitError # pylint: disable=unused-import from uffd.ldapalchemy.model import Query from uffd.ldapalchemy.core import encode_filter diff --git a/uffd/ldapalchemy/core.py b/uffd/ldapalchemy/core.py index c20a93ef789a057ff52470a2e310665b673fe63c..2d84598f4ad127a5cb572b162e8c27c57032a4be 100644 --- a/uffd/ldapalchemy/core.py +++ b/uffd/ldapalchemy/core.py @@ -80,7 +80,7 @@ class DeleteOperation: self.obj = obj self.attributes = {name: values.copy() for name, values in obj.state.attributes.items()} - def apply_object(self, obj_state): + def apply_object(self, obj_state): #pylint: disable=no-self-use obj_state.dn = None def apply_session(self, session_state): diff --git a/uffd/navbar.py b/uffd/navbar.py index 59198cc6f8bf643ee05c2d0ccdc15ffde3b64097..e9b1f9ebc2854a10694b2c3e81ecc610aa3229b7 100644 --- a/uffd/navbar.py +++ b/uffd/navbar.py @@ -10,6 +10,7 @@ def setup_navbar(app): def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None, visible=None): def wrapper(func): def deferred_call(state): + assert blueprint urlendpoint = endpoint if not endpoint: # pylint: disable=protected-access @@ -17,7 +18,7 @@ def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, bl urlendpoint = "{}.{}".format(blueprint.name, func.__name__) else: urlendpoint = func.__name_ - # pylint: enable=protected-access + # pylint: enable=protected-access item = {} item['iconlib'] = iconlib item['icon'] = icon @@ -26,20 +27,8 @@ def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, bl item['name'] = name item['blueprint'] = blueprint item['visible'] = visible or (lambda: True) - state.app.navbarList.append(item) - - if blueprint: - blueprint.record_once(deferred_call) - else: - class StateMock: - def __init__(self, app): - self.app = app - # pylint: disable=C0415 - from flask import current_app - # pylint: enable=C0415 - deferred_call(StateMock(current_app)) - + blueprint.record_once(deferred_call) return func return wrapper