diff --git a/pyproject.toml b/pyproject.toml index 42a245f09..fc4c34928 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -169,7 +169,7 @@ build-backend = "poetry.core.masonry.api" [tool.ruff] exclude = [".git", "viz-lib", "node_modules", "migrations"] ignore = ["E501"] -select = ["C9", "E", "F", "W", "I001"] +select = ["C9", "E", "F", "W", "I001", "UP004"] [tool.ruff.mccabe] max-complexity = 15 diff --git a/redash/destinations/__init__.py b/redash/destinations/__init__.py index 4b14e52b0..4a24e9910 100644 --- a/redash/destinations/__init__.py +++ b/redash/destinations/__init__.py @@ -5,7 +5,7 @@ logger = logging.getLogger(__name__) __all__ = ["BaseDestination", "register", "get_destination", "import_destinations"] -class BaseDestination(object): +class BaseDestination: deprecated = False def __init__(self, configuration): diff --git a/redash/models/__init__.py b/redash/models/__init__.py index 908f571ad..f05250bbd 100644 --- a/redash/models/__init__.py +++ b/redash/models/__init__.py @@ -80,7 +80,7 @@ from redash.utils.configuration import ConfigurationContainer logger = logging.getLogger(__name__) -class ScheduledQueriesExecutions(object): +class ScheduledQueriesExecutions: KEY_NAME = "sq:executed_at" def __init__(self): @@ -302,7 +302,7 @@ class DataSourceGroup(db.Model): DESERIALIZED_DATA_ATTR = "_deserialized_data" -class DBPersistence(object): +class DBPersistence: @property def data(self): if self._data is None: diff --git a/redash/models/base.py b/redash/models/base.py index 0482fb9ac..2edbb36fd 100644 --- a/redash/models/base.py +++ b/redash/models/base.py @@ -68,7 +68,7 @@ def gfk_type(cls): return cls -class GFKBase(object): +class GFKBase: """ Compatibility with 'generic foreign key' approach Peewee used. """ diff --git a/redash/models/changes.py b/redash/models/changes.py index 63cd053d3..be676a475 100644 --- a/redash/models/changes.py +++ b/redash/models/changes.py @@ -45,7 +45,7 @@ class Change(GFKBase, db.Model): ) -class ChangeTrackingMixin(object): +class ChangeTrackingMixin: skipped_fields = ("id", "created_at", "updated_at", "version") _clean_values = None diff --git a/redash/models/mixins.py b/redash/models/mixins.py index 264865343..e72155490 100644 --- a/redash/models/mixins.py +++ b/redash/models/mixins.py @@ -3,7 +3,7 @@ from sqlalchemy.event import listens_for from .base import Column, db -class TimestampMixin(object): +class TimestampMixin: updated_at = Column(db.DateTime(True), default=db.func.now(), nullable=False) created_at = Column(db.DateTime(True), default=db.func.now(), nullable=False) @@ -17,7 +17,7 @@ def timestamp_before_update(mapper, connection, target): target.updated_at = db.func.now() -class BelongsToOrgMixin(object): +class BelongsToOrgMixin: @classmethod def get_by_id_and_org(cls, object_id, org, org_cls=None): query = cls.query.filter(cls.id == object_id) diff --git a/redash/models/parameterized_query.py b/redash/models/parameterized_query.py index 5a5cf7c29..a3a3fe594 100644 --- a/redash/models/parameterized_query.py +++ b/redash/models/parameterized_query.py @@ -103,7 +103,7 @@ def _is_value_within_options(value, dropdown_options, allow_list=False): return str(value) in dropdown_options -class ParameterizedQuery(object): +class ParameterizedQuery: def __init__(self, template, schema=None, org=None): self.schema = schema or [] self.org = org diff --git a/redash/models/users.py b/redash/models/users.py index bab0c8b1f..f46d3954a 100644 --- a/redash/models/users.py +++ b/redash/models/users.py @@ -60,7 +60,7 @@ def init_app(app): request_started.connect(update_user_active_at, app) -class PermissionsCheckMixin(object): +class PermissionsCheckMixin: def has_permission(self, permission): return self.has_permissions((permission,)) diff --git a/redash/permissions.py b/redash/permissions.py index 689363c57..cca017d19 100644 --- a/redash/permissions.py +++ b/redash/permissions.py @@ -54,7 +54,7 @@ def require_access(obj, user, need_view_only): abort(403) -class require_permissions(object): +class require_permissions: def __init__(self, permissions, allow_one=False): self.permissions = permissions self.allow_one = allow_one diff --git a/redash/query_runner/__init__.py b/redash/query_runner/__init__.py index 9e7539042..6fe84514a 100644 --- a/redash/query_runner/__init__.py +++ b/redash/query_runner/__init__.py @@ -114,7 +114,7 @@ class NotSupported(Exception): pass -class BaseQueryRunner(object): +class BaseQueryRunner: deprecated = False should_annotate_query = True noop_query = None diff --git a/redash/query_runner/athena.py b/redash/query_runner/athena.py index ff7972881..1b379dc5b 100644 --- a/redash/query_runner/athena.py +++ b/redash/query_runner/athena.py @@ -47,7 +47,7 @@ _TYPE_MAPPINGS = { } -class SimpleFormatter(object): +class SimpleFormatter: def format(self, operation, parameters=None): return operation diff --git a/redash/query_runner/jql.py b/redash/query_runner/jql.py index 519e4bec1..1079a3aba 100644 --- a/redash/query_runner/jql.py +++ b/redash/query_runner/jql.py @@ -6,7 +6,7 @@ from redash.utils import json_dumps, json_loads # TODO: make this more general and move into __init__.py -class ResultSet(object): +class ResultSet: def __init__(self): self.columns = OrderedDict() self.rows = [] diff --git a/redash/query_runner/mysql.py b/redash/query_runner/mysql.py index 12ee1e0df..a7e59b318 100644 --- a/redash/query_runner/mysql.py +++ b/redash/query_runner/mysql.py @@ -44,7 +44,7 @@ types_map = { } -class Result(object): +class Result: def __init__(self): pass diff --git a/redash/query_runner/python.py b/redash/query_runner/python.py index 939bcfbf7..1fc994ea4 100644 --- a/redash/query_runner/python.py +++ b/redash/query_runner/python.py @@ -39,7 +39,7 @@ else: logger = logging.getLogger(__name__) -class CustomPrint(object): +class CustomPrint: """CustomPrint redirect "print" calls to be sent as "log" on the result object.""" def __init__(self): diff --git a/redash/query_runner/rockset.py b/redash/query_runner/rockset.py index 07d3c85e5..1d358881c 100644 --- a/redash/query_runner/rockset.py +++ b/redash/query_runner/rockset.py @@ -25,7 +25,7 @@ def _get_type(value): # The following is here, because Rockset's PyPi package is Python 3 only. # Should be removed once we move to Python 3. -class RocksetAPI(object): +class RocksetAPI: def __init__(self, api_key, api_server, vi_id): self.api_key = api_key self.api_server = api_server diff --git a/redash/serializers/__init__.py b/redash/serializers/__init__.py index d95623561..0cdeaf612 100644 --- a/redash/serializers/__init__.py +++ b/redash/serializers/__init__.py @@ -65,7 +65,7 @@ def public_dashboard(dashboard): return dashboard_dict -class Serializer(object): +class Serializer: pass diff --git a/redash/tasks/queries/execution.py b/redash/tasks/queries/execution.py index de459cd7c..695375f99 100644 --- a/redash/tasks/queries/execution.py +++ b/redash/tasks/queries/execution.py @@ -145,7 +145,7 @@ def _resolve_user(user_id, is_api_key, query_id): return None -class QueryExecutor(object): +class QueryExecutor: def __init__(self, query, data_source_id, user_id, is_api_key, metadata, is_scheduled_query): self.job = get_current_job() self.query = query diff --git a/tests/factories.py b/tests/factories.py index 0656a67ed..139be00a7 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -7,7 +7,7 @@ from redash.utils import gen_query_hash, utcnow from redash.utils.configuration import ConfigurationContainer -class ModelFactory(object): +class ModelFactory: def __init__(self, model, **kwargs): self.model = model self.kwargs = kwargs @@ -30,7 +30,7 @@ class ModelFactory(object): return obj -class Sequence(object): +class Sequence: def __init__(self, string): self.sequence = 0 self.string = string @@ -172,7 +172,7 @@ query_snippet_factory = ModelFactory( ) -class Factory(object): +class Factory: def __init__(self): self.org, self.admin_group, self.default_group = redash.models.init_db() self._data_source = None diff --git a/tests/handlers/test_paginate.py b/tests/handlers/test_paginate.py index 29e56b562..278f1974f 100644 --- a/tests/handlers/test_paginate.py +++ b/tests/handlers/test_paginate.py @@ -6,7 +6,7 @@ from werkzeug.exceptions import BadRequest from redash.handlers.base import paginate -class DummyResults(object): +class DummyResults: items = [i for i in range(25)] diff --git a/tests/handlers/test_users.py b/tests/handlers/test_users.py index 562956bda..08a0a18c5 100644 --- a/tests/handlers/test_users.py +++ b/tests/handlers/test_users.py @@ -102,7 +102,7 @@ class TestUserListResourcePost(BaseTestCase): class TestUserListGet(BaseTestCase): def create_filters_fixtures(self): - class PlainObject(object): + class PlainObject: pass result = PlainObject() diff --git a/tests/test_handlers.py b/tests/test_handlers.py index d9e605dcf..0bf4617e8 100644 --- a/tests/test_handlers.py +++ b/tests/test_handlers.py @@ -6,7 +6,7 @@ from redash import models, settings from tests import BaseTestCase, authenticated_user -class AuthenticationTestMixin(object): +class AuthenticationTestMixin: def test_returns_404_when_not_unauthenticated(self): for path in self.paths: rv = self.client.get(path)