You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by hu...@apache.org on 2024/04/24 21:48:04 UTC

(superset) 01/01: ok first set of fixes

This is an automated email from the ASF dual-hosted git repository.

hugh pushed a commit to branch hxgh-ruff
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 35e0bbc4a8e45436134a34d2f5fed2d88726a105
Author: Hugh Miles <hu...@Hughs-MacBook-Pro.local>
AuthorDate: Wed Apr 24 17:46:41 2024 -0400

    ok first set of fixes
---
 .pre-commit-config.yaml                              | 11 +++++++++++
 RELEASING/changelog.py                               | 10 +++++-----
 scripts/build_docker.py                              |  6 ++----
 scripts/change_detector.py                           |  5 ++---
 scripts/erd/erd.py                                   |  3 +--
 superset/__init__.py                                 |  7 -------
 superset/commands/chart/importers/v1/__init__.py     |  1 -
 superset/commands/dashboard/importers/v1/__init__.py |  1 -
 superset/commands/database/create.py                 |  1 -
 superset/commands/database/importers/v1/__init__.py  |  1 -
 superset/commands/database/update.py                 |  1 -
 superset/commands/dataset/importers/v1/__init__.py   |  1 -
 superset/commands/importers/v1/__init__.py           |  6 +-----
 superset/commands/query/importers/v1/__init__.py     |  2 --
 superset/connectors/sqla/__init__.py                 |  1 -
 superset/connectors/sqla/models.py                   |  8 ++++----
 superset/daos/chart.py                               |  2 +-
 superset/daos/dataset.py                             |  4 ++--
 superset/db_engine_specs/duckdb.py                   |  2 +-
 superset/db_engine_specs/hive.py                     |  6 ++----
 superset/db_engine_specs/ocient.py                   |  4 ++--
 superset/db_engine_specs/presto.py                   |  6 +++---
 superset/examples/data_loading.py                    | 18 ------------------
 superset/models/__init__.py                          |  1 -
 superset/reports/notifications/__init__.py           |  2 --
 superset/row_level_security/api.py                   |  2 +-
 superset/sql_validators/__init__.py                  |  1 -
 superset/sqllab/execution_context_convertor.py       |  2 --
 superset/tasks/celery_app.py                         |  1 -
 superset/utils/log.py                                |  2 +-
 superset/views/__init__.py                           | 12 ------------
 superset/viz.py                                      |  1 -
 32 files changed, 39 insertions(+), 92 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a476dc3ab1..73304d9923 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -95,3 +95,14 @@ repos:
     hooks:
       - id: helm-docs
         files: helm
+  - repo: https://github.com/astral-sh/ruff-pre-commit
+    # Ruff version.
+    rev: v0.1.4
+    hooks:
+      # Run the linter.
+      - id: ruff
+        args: [ --fix ]
+        exclude: ^(superset/migrations/|tests/)|superset/config\.py$
+      # Run the formatter.
+      - id: ruff-format
+        exclude: ^(superset/migrations/|tests/)|superset/config\.py$
\ No newline at end of file
diff --git a/RELEASING/changelog.py b/RELEASING/changelog.py
index d1ba06a620..80ff98cba6 100644
--- a/RELEASING/changelog.py
+++ b/RELEASING/changelog.py
@@ -94,10 +94,10 @@ class GitChangeLog:
             if not pull_request:
                 pull_request = github_repo.get_pull(pr_number)
                 self._github_prs[pr_number] = pull_request
-        except BadCredentialsException as ex:
+        except BadCredentialsException:
             print(
-                f"Bad credentials to github provided"
-                f" use access_token parameter or set GITHUB_TOKEN"
+                "Bad credentials to github provided"
+                " use access_token parameter or set GITHUB_TOKEN"
             )
             sys.exit(1)
 
@@ -167,8 +167,8 @@ class GitChangeLog:
     def _get_changelog_version_head(self) -> str:
         if not len(self._logs):
             print(
-                f"No changes found between revisions. "
-                f"Make sure your branch is up to date."
+                "No changes found between revisions. "
+                "Make sure your branch is up to date."
             )
             sys.exit(1)
         return f"### {self._version} ({self._logs[0].time})"
diff --git a/scripts/build_docker.py b/scripts/build_docker.py
index 3351e508df..812d087399 100755
--- a/scripts/build_docker.py
+++ b/scripts/build_docker.py
@@ -82,8 +82,8 @@ def is_latest_release(release: str) -> bool:
     return "SKIP_TAG::false" in output
 
 
-def make_docker_tag(l: list[str]) -> str:
-    return f"{REPO}:" + "-".join([o for o in l if o])
+def make_docker_tag(tags: list[str]) -> str:
+    return f"{REPO}:" + "-".join([o for o in tags if o])
 
 
 def get_docker_tags(
@@ -140,7 +140,6 @@ def get_docker_command(
     build_context_ref: str,
     force_latest: bool = False,
 ) -> str:
-    tag = ""
     build_target = ""
     py_ver = BASE_PY_IMAGE
     docker_context = "."
@@ -284,7 +283,6 @@ def main(
         script = script + docker_build_command
         if verbose:
             run_cmd("cat Dockerfile")
-        stdout = run_cmd(script)
     else:
         print("Dry Run - Docker Build Command:")
         print(docker_build_command)
diff --git a/scripts/change_detector.py b/scripts/change_detector.py
index df2c872a4a..4c953555fd 100755
--- a/scripts/change_detector.py
+++ b/scripts/change_detector.py
@@ -21,7 +21,6 @@ import os
 import re
 import subprocess
 from typing import List
-from urllib.error import HTTPError, URLError
 from urllib.request import Request, urlopen
 
 # Define patterns for each group of files you're interested in
@@ -102,12 +101,12 @@ def main(event_type: str, sha: str, repo: str) -> None:
     if event_type == "pull_request":
         pr_number = os.getenv("GITHUB_REF", "").split("/")[-2]
         files = fetch_changed_files_pr(repo, pr_number)
-        print(f"PR files:")
+        print("PR files:")
         print_files(files)
 
     elif event_type == "push":
         files = fetch_changed_files_push(repo, sha)
-        print(f"Files touched since previous commit:")
+        print("Files touched since previous commit:")
         print_files(files)
     else:
         raise ValueError("Unsupported event type")
diff --git a/scripts/erd/erd.py b/scripts/erd/erd.py
index 0622e0d853..b51cd21652 100644
--- a/scripts/erd/erd.py
+++ b/scripts/erd/erd.py
@@ -27,9 +27,8 @@ from typing import Any, Optional
 
 import click
 import jinja2
-from flask.cli import FlaskGroup, with_appcontext
 
-from superset import app, db
+from superset import db
 
 GROUPINGS: dict[str, Iterable[str]] = {
     "Core": [
diff --git a/superset/__init__.py b/superset/__init__.py
index d96697de99..a891207156 100644
--- a/superset/__init__.py
+++ b/superset/__init__.py
@@ -19,19 +19,12 @@
 from flask import current_app, Flask
 from werkzeug.local import LocalProxy
 
-from superset.app import create_app
 from superset.extensions import (
-    appbuilder,
     cache_manager,
-    db,
-    event_logger,
     feature_flag_manager,
     manifest_processor,
     results_backend_manager,
-    security_manager,
-    talisman,
 )
-from superset.security import SupersetSecurityManager
 
 #  All of the fields located here should be considered legacy. The correct way
 #  to declare "global" dependencies is to define it in extensions.py,
diff --git a/superset/commands/chart/importers/v1/__init__.py b/superset/commands/chart/importers/v1/__init__.py
index 7f2537383f..c3f67d4146 100644
--- a/superset/commands/chart/importers/v1/__init__.py
+++ b/superset/commands/chart/importers/v1/__init__.py
@@ -18,7 +18,6 @@
 from typing import Any
 
 from marshmallow import Schema
-from sqlalchemy.orm import Session
 
 from superset.charts.schemas import ImportV1ChartSchema
 from superset.commands.chart.exceptions import ChartImportError
diff --git a/superset/commands/dashboard/importers/v1/__init__.py b/superset/commands/dashboard/importers/v1/__init__.py
index 77d28696cf..e5f948c911 100644
--- a/superset/commands/dashboard/importers/v1/__init__.py
+++ b/superset/commands/dashboard/importers/v1/__init__.py
@@ -18,7 +18,6 @@
 from typing import Any
 
 from marshmallow import Schema
-from sqlalchemy.orm import Session
 from sqlalchemy.sql import select
 
 from superset import db
diff --git a/superset/commands/database/create.py b/superset/commands/database/create.py
index 9efb39b75a..4903938eb9 100644
--- a/superset/commands/database/create.py
+++ b/superset/commands/database/create.py
@@ -19,7 +19,6 @@ from typing import Any, Optional
 
 from flask import current_app
 from flask_appbuilder.models.sqla import Model
-from flask_babel import gettext as _
 from marshmallow import ValidationError
 
 from superset import is_feature_enabled
diff --git a/superset/commands/database/importers/v1/__init__.py b/superset/commands/database/importers/v1/__init__.py
index 203f0e3089..89cfa3b66a 100644
--- a/superset/commands/database/importers/v1/__init__.py
+++ b/superset/commands/database/importers/v1/__init__.py
@@ -18,7 +18,6 @@
 from typing import Any
 
 from marshmallow import Schema
-from sqlalchemy.orm import Session
 
 from superset.commands.database.exceptions import DatabaseImportError
 from superset.commands.database.importers.v1.utils import import_database
diff --git a/superset/commands/database/update.py b/superset/commands/database/update.py
index 5575d674a8..b63e91c176 100644
--- a/superset/commands/database/update.py
+++ b/superset/commands/database/update.py
@@ -18,7 +18,6 @@ import logging
 from typing import Any, Optional
 
 from flask_appbuilder.models.sqla import Model
-from flask_babel import gettext as _
 from marshmallow import ValidationError
 
 from superset import is_feature_enabled
diff --git a/superset/commands/dataset/importers/v1/__init__.py b/superset/commands/dataset/importers/v1/__init__.py
index 29f850258c..8218bc8592 100644
--- a/superset/commands/dataset/importers/v1/__init__.py
+++ b/superset/commands/dataset/importers/v1/__init__.py
@@ -18,7 +18,6 @@
 from typing import Any
 
 from marshmallow import Schema
-from sqlalchemy.orm import Session
 
 from superset.commands.database.importers.v1.utils import import_database
 from superset.commands.dataset.exceptions import DatasetImportError
diff --git a/superset/commands/importers/v1/__init__.py b/superset/commands/importers/v1/__init__.py
index 8d90875fd3..1c69d0521c 100644
--- a/superset/commands/importers/v1/__init__.py
+++ b/superset/commands/importers/v1/__init__.py
@@ -16,9 +16,8 @@
 # under the License.
 from typing import Any, Optional
 
-from marshmallow import Schema, validate
+from marshmallow import Schema
 from marshmallow.exceptions import ValidationError
-from sqlalchemy.orm import Session
 
 from superset import db
 from superset.commands.base import BaseCommand
@@ -26,12 +25,9 @@ from superset.commands.exceptions import CommandException, CommandInvalidError
 from superset.commands.importers.v1.utils import (
     load_configs,
     load_metadata,
-    load_yaml,
-    METADATA_FILE_NAME,
     validate_metadata_type,
 )
 from superset.daos.base import BaseDAO
-from superset.models.core import Database
 
 
 class ImportModelsCommand(BaseCommand):
diff --git a/superset/commands/query/importers/v1/__init__.py b/superset/commands/query/importers/v1/__init__.py
index f251759c38..b50ef53db6 100644
--- a/superset/commands/query/importers/v1/__init__.py
+++ b/superset/commands/query/importers/v1/__init__.py
@@ -18,13 +18,11 @@
 from typing import Any
 
 from marshmallow import Schema
-from sqlalchemy.orm import Session
 
 from superset.commands.database.importers.v1.utils import import_database
 from superset.commands.importers.v1 import ImportModelsCommand
 from superset.commands.query.exceptions import SavedQueryImportError
 from superset.commands.query.importers.v1.utils import import_saved_query
-from superset.connectors.sqla.models import SqlaTable
 from superset.daos.query import SavedQueryDAO
 from superset.databases.schemas import ImportV1DatabaseSchema
 from superset.queries.saved_queries.schemas import ImportV1SavedQuerySchema
diff --git a/superset/connectors/sqla/__init__.py b/superset/connectors/sqla/__init__.py
index ad52fc6d8b..13a83393a9 100644
--- a/superset/connectors/sqla/__init__.py
+++ b/superset/connectors/sqla/__init__.py
@@ -14,4 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-from . import models, views
diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index 208487299a..d77aaabf81 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -1289,10 +1289,10 @@ class SqlaTable(
 
     @property
     def dttm_cols(self) -> list[str]:
-        l = [c.column_name for c in self.columns if c.is_dttm]
-        if self.main_dttm_col and self.main_dttm_col not in l:
-            l.append(self.main_dttm_col)
-        return l
+        columns_with_dttm = [c.column_name for c in self.columns if c.is_dttm]
+        if self.main_dttm_col and self.main_dttm_col not in columns_with_dttm:
+            columns_with_dttm.append(self.main_dttm_col)
+        return columns_with_dttm
 
     @property
     def num_cols(self) -> list[str]:
diff --git a/superset/daos/chart.py b/superset/daos/chart.py
index eb8b3e809e..844b36b6b3 100644
--- a/superset/daos/chart.py
+++ b/superset/daos/chart.py
@@ -28,7 +28,7 @@ from superset.models.slice import Slice
 from superset.utils.core import get_user_id
 
 if TYPE_CHECKING:
-    from superset.connectors.sqla.models import BaseDatasource
+    pass
 
 logger = logging.getLogger(__name__)
 
diff --git a/superset/daos/dataset.py b/superset/daos/dataset.py
index 4647e02ce6..23b46e3329 100644
--- a/superset/daos/dataset.py
+++ b/superset/daos/dataset.py
@@ -245,7 +245,7 @@ class DatasetDAO(BaseDAO[SqlaTable]):
                 [
                     {**properties, "table_id": model.id}
                     for properties in property_columns
-                    if not "id" in properties
+                    if "id" not in properties
                 ],
             )
 
@@ -297,7 +297,7 @@ class DatasetDAO(BaseDAO[SqlaTable]):
             [
                 {**properties, "table_id": model.id}
                 for properties in property_metrics
-                if not "id" in properties
+                if "id" not in properties
             ],
         )
 
diff --git a/superset/db_engine_specs/duckdb.py b/superset/db_engine_specs/duckdb.py
index 56539d6652..89c45fb572 100644
--- a/superset/db_engine_specs/duckdb.py
+++ b/superset/db_engine_specs/duckdb.py
@@ -23,7 +23,7 @@ from typing import Any, TYPE_CHECKING, TypedDict
 
 from apispec import APISpec
 from apispec.ext.marshmallow import MarshmallowPlugin
-from flask_babel import gettext as __, lazy_gettext as _
+from flask_babel import gettext as __
 from marshmallow import fields, Schema
 from sqlalchemy import types
 from sqlalchemy.engine.reflection import Inspector
diff --git a/superset/db_engine_specs/hive.py b/superset/db_engine_specs/hive.py
index 2655ed6c9a..618059fe05 100644
--- a/superset/db_engine_specs/hive.py
+++ b/superset/db_engine_specs/hive.py
@@ -50,8 +50,6 @@ from superset.superset_typing import ResultSetColumnType
 
 if TYPE_CHECKING:
     # prevent circular imports
-    from pyhive.hive import Cursor
-    from TCLIService.ttypes import TFetchOrientation
 
     from superset.models.core import Database
 
@@ -392,8 +390,8 @@ class HiveEngineSpec(PrestoEngineSpec):
                     # Wait for job id before logging things out
                     # this allows for prefixing all log lines and becoming
                     # searchable in something like Kibana
-                    for l in log_lines[last_log_line:]:
-                        logger.info("Query %s: [%s] %s", str(query_id), str(job_id), l)
+                    for log in log_lines[last_log_line:]:
+                        logger.info("Query %s: [%s] %s", str(query_id), str(job_id), log)
                     last_log_line = len(log_lines)
                 if needs_commit:
                     db.session.commit()
diff --git a/superset/db_engine_specs/ocient.py b/superset/db_engine_specs/ocient.py
index 77c906fe77..34ab672404 100644
--- a/superset/db_engine_specs/ocient.py
+++ b/superset/db_engine_specs/ocient.py
@@ -19,7 +19,7 @@ import contextlib
 import re
 import threading
 from re import Pattern
-from typing import Any, Callable, List, NamedTuple, Optional
+from typing import Any, Callable, NamedTuple, Optional
 
 from flask_babel import gettext as __
 from sqlalchemy.engine.reflection import Inspector
@@ -204,7 +204,7 @@ try:
         TypeCodes.ST_LINESTRING: _linestring_to_geo_json,
         TypeCodes.ST_POLYGON: _polygon_to_geo_json,
     }
-except ImportError as e:
+except ImportError:
     _sanitized_ocient_type_codes = {}
 
 
diff --git a/superset/db_engine_specs/presto.py b/superset/db_engine_specs/presto.py
index a8143c87ed..2d902a6159 100644
--- a/superset/db_engine_specs/presto.py
+++ b/superset/db_engine_specs/presto.py
@@ -447,10 +447,10 @@ class PrestoBaseEngineSpec(BaseEngineSpec, metaclass=ABCMeta):
         limit_clause = f"LIMIT {limit}" if limit else ""
         order_by_clause = ""
         if order_by:
-            l = []
+            order_clauses = []
             for field, desc in order_by:
-                l.append(field + " DESC" if desc else "")
-            order_by_clause = "ORDER BY " + ", ".join(l)
+                order_clauses.append(field + " DESC" if desc else "")
+            order_by_clause = "ORDER BY " + ", ".join(order_clauses)
 
         where_clause = ""
         if filters:
diff --git a/superset/examples/data_loading.py b/superset/examples/data_loading.py
index 7b79adfcf4..a835ec14e8 100644
--- a/superset/examples/data_loading.py
+++ b/superset/examples/data_loading.py
@@ -15,21 +15,3 @@
 #  specific language governing permissions and limitations
 #  under the License.
 # pylint: disable=unused-import
-from .bart_lines import load_bart_lines
-from .big_data import load_big_data
-from .birth_names import load_birth_names
-from .country_map import load_country_map_data
-from .css_templates import load_css_templates
-from .deck import load_deck_dash
-from .energy import load_energy
-from .flights import load_flights
-from .long_lat import load_long_lat_data
-from .misc_dashboard import load_misc_dashboard
-from .multiformat_time_series import load_multiformat_time_series
-from .paris import load_paris_iris_geojson
-from .random_time_series import load_random_time_series_data
-from .sf_population_polygons import load_sf_population_polygons
-from .supported_charts_dashboard import load_supported_charts_dashboard
-from .tabbed_dashboard import load_tabbed_dashboard
-from .utils import load_examples_from_configs
-from .world_bank import load_world_bank_health_n_pop
diff --git a/superset/models/__init__.py b/superset/models/__init__.py
index 067d6ae831..13a83393a9 100644
--- a/superset/models/__init__.py
+++ b/superset/models/__init__.py
@@ -14,4 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-from . import core, dynamic_plugins, sql_lab, user_attributes
diff --git a/superset/reports/notifications/__init__.py b/superset/reports/notifications/__init__.py
index b9fff48cf7..d804070a27 100644
--- a/superset/reports/notifications/__init__.py
+++ b/superset/reports/notifications/__init__.py
@@ -16,8 +16,6 @@
 # under the License.
 from superset.reports.models import ReportRecipients
 from superset.reports.notifications.base import BaseNotification, NotificationContent
-from superset.reports.notifications.email import EmailNotification
-from superset.reports.notifications.slack import SlackNotification
 
 
 def create_notification(
diff --git a/superset/row_level_security/api.py b/superset/row_level_security/api.py
index fc505e724f..86956683cb 100644
--- a/superset/row_level_security/api.py
+++ b/superset/row_level_security/api.py
@@ -299,7 +299,7 @@ class RLSRestApi(BaseSupersetModelRestApi):
                 exc_info=True,
             )
             return self.response_422(message=str(ex))
-        except RLSRuleNotFoundError as ex:
+        except RLSRuleNotFoundError:
             return self.response_404()
 
     @expose("/", methods=("DELETE",))
diff --git a/superset/sql_validators/__init__.py b/superset/sql_validators/__init__.py
index ad048a86a5..8a8cf45aae 100644
--- a/superset/sql_validators/__init__.py
+++ b/superset/sql_validators/__init__.py
@@ -17,7 +17,6 @@
 from typing import Optional
 
 from . import base, postgres, presto_db
-from .base import SQLValidationAnnotation
 
 
 def get_validator_by_name(name: str) -> Optional[type[base.BaseSQLValidator]]:
diff --git a/superset/sqllab/execution_context_convertor.py b/superset/sqllab/execution_context_convertor.py
index a1e7a86d0a..587e027555 100644
--- a/superset/sqllab/execution_context_convertor.py
+++ b/superset/sqllab/execution_context_convertor.py
@@ -28,8 +28,6 @@ from superset.sqllab.utils import apply_display_max_row_configuration_if_require
 logger = logging.getLogger(__name__)
 
 if TYPE_CHECKING:
-    from superset.models.sql_lab import Query
-    from superset.sqllab.sql_json_executer import SqlResults
     from superset.sqllab.sqllab_execution_context import SqlJsonExecutionContext
 
 
diff --git a/superset/tasks/celery_app.py b/superset/tasks/celery_app.py
index e9ab10c050..85b966530c 100644
--- a/superset/tasks/celery_app.py
+++ b/superset/tasks/celery_app.py
@@ -32,7 +32,6 @@ flask_app = create_app()
 
 # Need to import late, as the celery_app will have been setup by "create_app()"
 # pylint: disable=wrong-import-position, unused-import
-from . import cache, scheduler  # isort:skip
 
 # Export the celery app globally for Celery (as run on the cmd line) to find
 app = celery_app
diff --git a/superset/utils/log.py b/superset/utils/log.py
index cb5343470d..65355c175b 100644
--- a/superset/utils/log.py
+++ b/superset/utils/log.py
@@ -35,7 +35,7 @@ from superset.extensions import stats_logger_manager
 from superset.utils.core import get_user_id, LoggerLevel, to_int
 
 if TYPE_CHECKING:
-    from superset.stats_logger import BaseStatsLogger
+    pass
 
 logger = logging.getLogger(__name__)
 
diff --git a/superset/views/__init__.py b/superset/views/__init__.py
index 838e92aca2..13a83393a9 100644
--- a/superset/views/__init__.py
+++ b/superset/views/__init__.py
@@ -14,15 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-from . import (
-    alerts,
-    api,
-    base,
-    core,
-    css_templates,
-    dynamic_plugins,
-    health,
-    sql_lab,
-    tags,
-)
-from .log import api as log_api, views
diff --git a/superset/viz.py b/superset/viz.py
index 447b36d53d..78e71a839d 100644
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -83,7 +83,6 @@ from superset.utils.date_parser import get_since_until, parse_past_timedelta
 from superset.utils.hashing import md5_sha_from_str
 
 if TYPE_CHECKING:
-    from superset.common.query_context_factory import QueryContextFactory
     from superset.connectors.sqla.models import BaseDatasource
 
 config = app.config