diff --git a/.pylintrc b/.pylintrc index c2db55d..2627ec0 100644 --- a/.pylintrc +++ b/.pylintrc @@ -3,16 +3,25 @@ [MESSAGES CONTROL] disable=fixme, abstract-method, + anomalous-backslash-in-string, arguments-differ, arguments-renamed, assignment-from-no-return, attribute-defined-outside-init, + bare-except, + broad-exception-caught, consider-using-dict-comprehension, consider-using-dict-items, consider-using-generator, consider-using-get, consider-using-set-comprehension, + cyclic-import, + dangerous-default-value, + deprecated-method, duplicate-code, + implicit-str-concat, + import-outside-toplevel, + invalid-name, isinstance-second-argument-not-valid-type, keyword-arg-before-vararg, missing-function-docstring, @@ -40,5 +49,8 @@ disable=fixme, unnecessary-lambda-assignment, unspecified-encoding, unused-argument, + unused-wildcard-import, use-a-generator, use-dict-literal, + wildcard-import, + wrong-import-order, diff --git a/src/wuttaweb/cli/webapp.py b/src/wuttaweb/cli/webapp.py index 24695a4..f319d3a 100644 --- a/src/wuttaweb/cli/webapp.py +++ b/src/wuttaweb/cli/webapp.py @@ -63,7 +63,7 @@ def webapp( elif runner == "uvicorn": - import uvicorn # pylint: disable=import-error,import-outside-toplevel + import uvicorn # pylint: disable=import-error # need service details from config spec = config.require(f"{config.appname}.web.app.spec") diff --git a/src/wuttaweb/emails.py b/src/wuttaweb/emails.py index eb34bb3..43bc956 100644 --- a/src/wuttaweb/emails.py +++ b/src/wuttaweb/emails.py @@ -27,7 +27,7 @@ from wuttjamaican.email import EmailSetting -class feedback(EmailSetting): # pylint: disable=invalid-name +class feedback(EmailSetting): """ Sent when user submits feedback via the web app. """ diff --git a/src/wuttaweb/forms/base.py b/src/wuttaweb/forms/base.py index 8eeed6f..3a8af71 100644 --- a/src/wuttaweb/forms/base.py +++ b/src/wuttaweb/forms/base.py @@ -274,14 +274,14 @@ class Form: # pylint: disable=too-many-instance-attributes schema=None, model_class=None, model_instance=None, - nodes=None, - widgets=None, - validators=None, - defaults=None, + nodes={}, + widgets={}, + validators={}, + defaults={}, readonly=False, - readonly_fields=None, - required_fields=None, - labels=None, + readonly_fields=[], + required_fields={}, + labels={}, action_method="post", action_url=None, reset_url=None, @@ -465,9 +465,7 @@ class Form: # pylint: disable=too-many-instance-attributes Node overrides are tracked via :attr:`nodes`. """ - from wuttaweb.forms.schema import ( # pylint: disable=import-outside-toplevel - ObjectNode, - ) + from wuttaweb.forms.schema import ObjectNode if isinstance(nodeinfo, colander.SchemaNode): # assume nodeinfo is a complete node @@ -496,7 +494,7 @@ class Form: # pylint: disable=too-many-instance-attributes :param widget: Either a :class:`deform:deform.widget.Widget` instance, or else a widget "type" name. - :param \\**kwargs: Any remaining kwargs are passed along to + :param \**kwargs: Any remaining kwargs are passed along to :meth:`make_widget()` - if applicable. Widget overrides are tracked via :attr:`widgets`. @@ -528,13 +526,13 @@ class Form: # pylint: disable=too-many-instance-attributes :param widget_type: Which of the above (or custom) widget type to create. - :param \\**kwargs: Remaining kwargs are passed as-is to the + :param \**kwargs: Remaining kwargs are passed as-is to the widget factory. :returns: New widget instance, or ``None`` if e.g. it could not determine how to create the widget. """ - from wuttaweb.forms import widgets # pylint: disable=import-outside-toplevel + from wuttaweb.forms import widgets if widget_type == "notes": return widgets.NotesWidget(**kwargs) @@ -558,7 +556,7 @@ class Form: # pylint: disable=too-many-instance-attributes * :class:`sqlalchemy:sqlalchemy.types.DateTime` -> :class:`~wuttaweb.forms.widgets.WuttaDateTimeWidget` """ - from wuttaweb.forms import widgets # pylint: disable=import-outside-toplevel + from wuttaweb.forms import widgets if not self.model_class: return @@ -588,9 +586,7 @@ class Form: # pylint: disable=too-many-instance-attributes :param widget: :class:`~wuttaweb.grids.base.Grid` instance, pre-configured and (usually) with data. """ - from wuttaweb.forms.widgets import ( # pylint: disable=import-outside-toplevel - GridWidget, - ) + from wuttaweb.forms.widgets import GridWidget widget = GridWidget(self.request, grid) self.set_widget(key, widget) @@ -603,7 +599,7 @@ class Form: # pylint: disable=too-many-instance-attributes if grid.key in self.grid_vue_context: log.warning( - "grid data with key '%s' already registered, but will be replaced", + "grid data with key '%s' already registered, " "but will be replaced", grid.key, ) diff --git a/src/wuttaweb/forms/schema.py b/src/wuttaweb/forms/schema.py index f3384b1..222eb3a 100644 --- a/src/wuttaweb/forms/schema.py +++ b/src/wuttaweb/forms/schema.py @@ -63,7 +63,7 @@ class WuttaDateTime(colander.DateTime): for fmt in formats: try: return datetime.datetime.strptime(cstruct, fmt) - except Exception: # pylint: disable=broad-exception-caught + except: pass node.raise_invalid("Invalid date and/or time") diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index 0468a6a..f21aacc 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -37,8 +37,8 @@ from paginate_sqlalchemy import SqlalchemyOrmPage from pyramid.renderers import render from webhelpers2.html import HTML -from wuttjamaican.db.util import UUID from wuttaweb.util import FieldList, get_model_fields, make_json_safe +from wuttjamaican.db.util import UUID from wuttaweb.grids.filters import default_sqlalchemy_filters, VerbNotSupported @@ -379,14 +379,14 @@ class Grid: # pylint: disable=too-many-instance-attributes key=None, columns=None, data=None, - labels=None, - renderers=None, - enums=None, + labels={}, + renderers={}, + enums={}, checkable=False, row_class=None, - actions=None, - linked_columns=None, - hidden_columns=None, + actions=[], + linked_columns=[], + hidden_columns=[], sortable=False, sort_multiple=True, sort_on_backend=True, @@ -467,7 +467,7 @@ class Grid: # pylint: disable=too-many-instance-attributes # enums self.enums = {} - for k in enums or {}: + for k in enums: self.set_enum(k, enums[k]) def get_columns(self): @@ -1853,7 +1853,7 @@ class Grid: # pylint: disable=too-many-instance-attributes data = filtr.apply_filter(data) except VerbNotSupported as error: log.warning("verb not supported for '%s' filter: %s", key, error.verb) - except Exception: # pylint: disable=broad-exception-caught + except: log.exception("filtering data by '%s' failed!", key) return data diff --git a/src/wuttaweb/grids/filters.py b/src/wuttaweb/grids/filters.py index 9bf2b9f..6e90d98 100644 --- a/src/wuttaweb/grids/filters.py +++ b/src/wuttaweb/grids/filters.py @@ -63,7 +63,7 @@ class GridFilter: # pylint: disable=too-many-instance-attributes column by which to filter. For instance, ``model.Person.full_name``. - :param \\**kwargs: Any additional kwargs will be set as attributes + :param \**kwargs: Any additional kwargs will be set as attributes on the filter instance. Filter instances have the following attributes: @@ -175,7 +175,7 @@ class GridFilter: # pylint: disable=too-many-instance-attributes key, label=None, verbs=None, - choices=None, + choices={}, default_active=False, default_verb=None, default_value=None, @@ -198,7 +198,7 @@ class GridFilter: # pylint: disable=too-many-instance-attributes self.default_verb = default_verb # choices - self.set_choices(choices or {}) + self.set_choices(choices) # value self.default_value = default_value @@ -358,7 +358,7 @@ class GridFilter: # pylint: disable=too-many-instance-attributes verb = self.verb if not verb: verb = self.get_default_verb() - log.warning( + log.warn( "missing verb for '%s' filter, will use default verb: %s", self.key, verb, @@ -582,7 +582,7 @@ class IntegerAlchemyFilter(NumericAlchemyFilter): if value: try: return int(value) - except Exception: # pylint: disable=broad-exception-caught + except: pass return None diff --git a/src/wuttaweb/handler.py b/src/wuttaweb/handler.py index e3520b5..04deab2 100644 --- a/src/wuttaweb/handler.py +++ b/src/wuttaweb/handler.py @@ -187,8 +187,8 @@ class WebHandler(GenericHandler): # registered via entry points registered = [] - for handler in load_entry_points(f"{self.appname}.web.menus").values(): - spec = handler.get_spec() + for Handler in load_entry_points(f"{self.appname}.web.menus").values(): + spec = Handler.get_spec() if spec not in handlers: registered.append(spec) if registered: diff --git a/src/wuttaweb/helpers.py b/src/wuttaweb/helpers.py index 832c82e..3319fa1 100644 --- a/src/wuttaweb/helpers.py +++ b/src/wuttaweb/helpers.py @@ -51,8 +51,8 @@ This module contains the following references: """ -from webhelpers2.html import * # pylint: disable=wildcard-import,unused-wildcard-import -from webhelpers2.html.tags import * # pylint: disable=wildcard-import,unused-wildcard-import +from webhelpers2.html import * +from webhelpers2.html.tags import * from wuttaweb.util import ( # pylint: disable=unused-import get_liburl, diff --git a/src/wuttaweb/views/auth.py b/src/wuttaweb/views/auth.py index c2a52cb..f3b162e 100644 --- a/src/wuttaweb/views/auth.py +++ b/src/wuttaweb/views/auth.py @@ -314,7 +314,7 @@ class AuthView(View): def defaults(config, **kwargs): base = globals() - AuthView = kwargs.get("AuthView", base["AuthView"]) # pylint: disable=invalid-name + AuthView = kwargs.get("AuthView", base["AuthView"]) AuthView.defaults(config) diff --git a/src/wuttaweb/views/batch.py b/src/wuttaweb/views/batch.py index 77cc056..fd2ced9 100644 --- a/src/wuttaweb/views/batch.py +++ b/src/wuttaweb/views/batch.py @@ -127,7 +127,7 @@ class BatchMasterView(MasterView): model = self.app.model # created_by - CreatedBy = orm.aliased(model.User) # pylint: disable=invalid-name + CreatedBy = orm.aliased(model.User) g.set_joiner( "created_by", lambda q: q.join( @@ -221,7 +221,7 @@ class BatchMasterView(MasterView): on the batch handler - when creating. Parent/default logic is used when updating. - :param \\**kwargs: Additional kwargs will be passed as-is to + :param \**kwargs: Additional kwargs will be passed as-is to the ``make_batch()`` call. """ if self.creating: @@ -329,7 +329,7 @@ class BatchMasterView(MasterView): self.batch_handler.do_populate(batch, progress=progress) session.flush() - except Exception as error: # pylint: disable=broad-exception-caught + except Exception as error: session.rollback() log.warning( "failed to populate %s: %s", @@ -367,7 +367,7 @@ class BatchMasterView(MasterView): try: self.batch_handler.do_execute(batch, self.request.user) - except Exception as error: # pylint: disable=broad-exception-caught + except Exception as error: log.warning("failed to execute batch: %s", batch, exc_info=True) self.request.session.flash(f"Execution failed!: {error}", "error") @@ -383,8 +383,8 @@ class BatchMasterView(MasterView): if hasattr(cls, "row_model_class"): return cls.row_model_class - model_class = cls.get_model_class() - return model_class.__row_class__ + Batch = cls.get_model_class() + return Batch.__row_class__ def get_row_grid_data(self, batch): """ @@ -392,10 +392,8 @@ class BatchMasterView(MasterView): :attr:`~wuttjamaican:wuttjamaican.db.model.batch.BatchMixin.rows` data. """ - row_model_class = self.get_row_model_class() - query = self.Session.query(row_model_class).filter( - row_model_class.batch == batch - ) + BatchRow = self.get_row_model_class() + query = self.Session.query(BatchRow).filter(BatchRow.batch == batch) return query def configure_row_grid(self, g): # pylint: disable=empty-docstring diff --git a/src/wuttaweb/views/common.py b/src/wuttaweb/views/common.py index 71ef57e..45d463b 100644 --- a/src/wuttaweb/views/common.py +++ b/src/wuttaweb/views/common.py @@ -109,7 +109,7 @@ class CommonView(View): # send email try: self.feedback_send(context) - except Exception as error: # pylint: disable=broad-exception-caught + except Exception as error: log.warning("failed to send feedback email", exc_info=True) return {"error": str(error) or error.__class__.__name__} @@ -287,7 +287,7 @@ class CommonView(View): if theme: try: set_app_theme(self.request, theme, session=Session()) - except Exception as error: # pylint: disable=broad-exception-caught + except Exception as error: error = self.app.render_error(error) self.request.session.flash(f"Failed to set theme: {error}", "error") referrer = self.request.params.get("referrer") or self.request.get_referrer() @@ -345,9 +345,7 @@ class CommonView(View): def defaults(config, **kwargs): base = globals() - CommonView = kwargs.get( # pylint: disable=invalid-name - "CommonView", base["CommonView"] - ) + CommonView = kwargs.get("CommonView", base["CommonView"]) CommonView.defaults(config) diff --git a/src/wuttaweb/views/email.py b/src/wuttaweb/views/email.py index 34e6a29..91ea49a 100644 --- a/src/wuttaweb/views/email.py +++ b/src/wuttaweb/views/email.py @@ -301,9 +301,7 @@ class EmailSettingView(MasterView): def defaults(config, **kwargs): base = globals() - EmailSettingView = kwargs.get( # pylint: disable=invalid-name - "EmailSettingView", base["EmailSettingView"] - ) + EmailSettingView = kwargs.get("EmailSettingView", base["EmailSettingView"]) EmailSettingView.defaults(config) diff --git a/src/wuttaweb/views/master.py b/src/wuttaweb/views/master.py index d2086ea..db234de 100644 --- a/src/wuttaweb/views/master.py +++ b/src/wuttaweb/views/master.py @@ -34,11 +34,11 @@ from sqlalchemy import orm from pyramid.renderers import render_to_response from webhelpers2.html import HTML -from wuttjamaican.util import get_class_hierarchy -from wuttaweb.views.base import View +from wuttaweb.views import View from wuttaweb.util import get_form_data, render_csrf_token from wuttaweb.db import Session from wuttaweb.progress import SessionProgress +from wuttjamaican.util import get_class_hierarchy log = logging.getLogger(__name__) @@ -826,7 +826,7 @@ class MasterView(View): try: self.delete_bulk_action(records, progress=progress) - except Exception as error: # pylint: disable=broad-exception-caught + except Exception as error: session.rollback() log.warning( "failed to delete %s results for %s", @@ -1128,7 +1128,7 @@ class MasterView(View): try: self.execute_instance(obj, user, progress=progress) - except Exception as error: # pylint: disable=broad-exception-caught + except Exception as error: session.rollback() log.warning("%s failed to execute: %s", model_title, obj, exc_info=True) if progress: @@ -1651,7 +1651,7 @@ class MasterView(View): button act like a link. This will yield something like: ```` - :param \\**kwargs: All remaining kwargs are passed to the + :param \**kwargs: All remaining kwargs are passed to the underlying ``HTML.tag()`` call, so will be rendered as attributes on the button tag. @@ -2260,7 +2260,7 @@ class MasterView(View): :param obj: Model instance object. - :param \\**kwargs: Additional kwargs to be passed to + :param \**kwargs: Additional kwargs to be passed to ``request.route_url()``, if needed. """ kw = self.get_action_route_kwargs(obj) diff --git a/src/wuttaweb/views/people.py b/src/wuttaweb/views/people.py index f9de00e..74f58f9 100644 --- a/src/wuttaweb/views/people.py +++ b/src/wuttaweb/views/people.py @@ -210,9 +210,7 @@ class PersonView(MasterView): def defaults(config, **kwargs): base = globals() - PersonView = kwargs.get( # pylint: disable=invalid-name - "PersonView", base["PersonView"] - ) + PersonView = kwargs.get("PersonView", base["PersonView"]) PersonView.defaults(config) diff --git a/src/wuttaweb/views/reports.py b/src/wuttaweb/views/reports.py index a79b262..aafde7e 100644 --- a/src/wuttaweb/views/reports.py +++ b/src/wuttaweb/views/reports.py @@ -264,9 +264,7 @@ class ReportView(MasterView): def defaults(config, **kwargs): base = globals() - ReportView = kwargs.get( # pylint: disable=invalid-name - "ReportView", base["ReportView"] - ) + ReportView = kwargs.get("ReportView", base["ReportView"]) ReportView.defaults(config) diff --git a/src/wuttaweb/views/roles.py b/src/wuttaweb/views/roles.py index 2d19ef1..0dc59c8 100644 --- a/src/wuttaweb/views/roles.py +++ b/src/wuttaweb/views/roles.py @@ -374,12 +374,10 @@ class PermissionView(MasterView): def defaults(config, **kwargs): base = globals() - RoleView = kwargs.get("RoleView", base["RoleView"]) # pylint: disable=invalid-name + RoleView = kwargs.get("RoleView", base["RoleView"]) RoleView.defaults(config) - PermissionView = kwargs.get( # pylint: disable=invalid-name - "PermissionView", base["PermissionView"] - ) + PermissionView = kwargs.get("PermissionView", base["PermissionView"]) PermissionView.defaults(config) diff --git a/src/wuttaweb/views/settings.py b/src/wuttaweb/views/settings.py index 7cfd576..0c6b9bb 100644 --- a/src/wuttaweb/views/settings.py +++ b/src/wuttaweb/views/settings.py @@ -278,14 +278,10 @@ class SettingView(MasterView): def defaults(config, **kwargs): base = globals() - AppInfoView = kwargs.get( # pylint: disable=invalid-name - "AppInfoView", base["AppInfoView"] - ) + AppInfoView = kwargs.get("AppInfoView", base["AppInfoView"]) AppInfoView.defaults(config) - SettingView = kwargs.get( # pylint: disable=invalid-name - "SettingView", base["SettingView"] - ) + SettingView = kwargs.get("SettingView", base["SettingView"]) SettingView.defaults(config) diff --git a/src/wuttaweb/views/upgrades.py b/src/wuttaweb/views/upgrades.py index a3bc205..e86d617 100644 --- a/src/wuttaweb/views/upgrades.py +++ b/src/wuttaweb/views/upgrades.py @@ -86,7 +86,7 @@ class UpgradeView(MasterView): # created_by g.set_link("created_by") - Creator = orm.aliased(model.User) # pylint: disable=invalid-name + Creator = orm.aliased(model.User) g.set_joiner( "created_by", lambda q: q.join(Creator, Creator.uuid == model.Upgrade.created_by_uuid), @@ -101,7 +101,7 @@ class UpgradeView(MasterView): # executed_by g.set_link("executed_by") - Executor = orm.aliased(model.User) # pylint: disable=invalid-name + Executor = orm.aliased(model.User) g.set_joiner( "executed_by", lambda q: q.outerjoin( @@ -378,9 +378,7 @@ class UpgradeView(MasterView): def defaults(config, **kwargs): base = globals() - UpgradeView = kwargs.get( # pylint: disable=invalid-name - "UpgradeView", base["UpgradeView"] - ) + UpgradeView = kwargs.get("UpgradeView", base["UpgradeView"]) UpgradeView.defaults(config) diff --git a/src/wuttaweb/views/users.py b/src/wuttaweb/views/users.py index cd09c66..f8463b1 100644 --- a/src/wuttaweb/views/users.py +++ b/src/wuttaweb/views/users.py @@ -418,7 +418,7 @@ class UserView(MasterView): def defaults(config, **kwargs): base = globals() - UserView = kwargs.get("UserView", base["UserView"]) # pylint: disable=invalid-name + UserView = kwargs.get("UserView", base["UserView"]) UserView.defaults(config)