You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by el...@apache.org on 2023/12/02 01:21:01 UTC

(superset) 06/08: chore: Update mypy and fix stubs issue (#24033)

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

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit b76aa5709089a867eb33164a38af40ba27f23203
Author: EugeneTorap <ev...@gmail.com>
AuthorDate: Fri May 12 10:47:14 2023 +0300

    chore: Update mypy and fix stubs issue (#24033)
---
 .pre-commit-config.yaml                            | 17 +++++++++++++++--
 superset/charts/api.py                             |  2 +-
 superset/dashboards/api.py                         |  2 +-
 superset/databases/api.py                          |  8 +++-----
 superset/databases/schemas.py                      |  5 ++---
 superset/datasets/api.py                           |  2 +-
 superset/db_engine_specs/presto.py                 |  6 +++---
 superset/embedded/view.py                          |  2 ++
 superset/exceptions.py                             |  2 +-
 superset/extensions/__init__.py                    |  2 +-
 superset/importexport/api.py                       |  2 +-
 superset/initialization/__init__.py                | 10 +++-------
 superset/jinja_context.py                          |  2 +-
 superset/models/dashboard.py                       |  4 ++--
 superset/queries/saved_queries/api.py              |  2 +-
 superset/result_set.py                             |  6 +++---
 superset/sqllab/api.py                             |  4 ++--
 superset/sqllab/exceptions.py                      | 14 +++++++-------
 superset/sqllab/query_render.py                    |  7 ++-----
 superset/sqllab/sql_json_executer.py               |  3 +--
 superset/tasks/async_queries.py                    |  8 ++++++--
 superset/utils/core.py                             | 22 +++++++++++-----------
 superset/utils/decorators.py                       |  2 +-
 superset/utils/encrypt.py                          |  2 +-
 superset/utils/machine_auth.py                     |  2 +-
 superset/utils/pandas_postprocessing/boxplot.py    |  4 ++--
 superset/utils/pandas_postprocessing/flatten.py    |  2 +-
 superset/utils/url_map_converters.py               |  2 +-
 superset/views/base.py                             |  8 ++++----
 superset/views/base_api.py                         |  5 +----
 superset/views/core.py                             |  6 ++++--
 superset/views/utils.py                            |  4 ++--
 tests/integration_tests/reports/scheduler_tests.py |  2 +-
 tests/unit_tests/tasks/test_cron_util.py           |  2 +-
 34 files changed, 90 insertions(+), 83 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index aa0cf4af62..fe7ca007e9 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -20,10 +20,23 @@ repos:
     hooks:
       - id: isort
   - repo: https://github.com/pre-commit/mirrors-mypy
-    rev: v0.941
+    rev: v1.3.0
     hooks:
       - id: mypy
-        additional_dependencies: [types-all]
+        args: [--check-untyped-defs]
+        additional_dependencies:
+          [
+            types-simplejson,
+            types-python-dateutil,
+            types-requests,
+            types-redis,
+            types-pytz,
+            types-croniter,
+            types-PyYAML,
+            types-setuptools,
+            types-paramiko,
+            types-Markdown,
+          ]
   - repo: https://github.com/peterdemin/pip-compile-multi
     rev: v2.4.1
     hooks:
diff --git a/superset/charts/api.py b/superset/charts/api.py
index 88d74f875e..3f397d1bd7 100644
--- a/superset/charts/api.py
+++ b/superset/charts/api.py
@@ -780,7 +780,7 @@ class ChartRestApi(BaseSupersetModelRestApi):
             buf,
             mimetype="application/zip",
             as_attachment=True,
-            attachment_filename=filename,
+            download_name=filename,
         )
         if token:
             response.set_cookie(token, "done", max_age=600)
diff --git a/superset/dashboards/api.py b/superset/dashboards/api.py
index 6f478e22cc..f5a0434c53 100644
--- a/superset/dashboards/api.py
+++ b/superset/dashboards/api.py
@@ -803,7 +803,7 @@ class DashboardRestApi(BaseSupersetModelRestApi):
                 buf,
                 mimetype="application/zip",
                 as_attachment=True,
-                attachment_filename=filename,
+                download_name=filename,
             )
             if token:
                 response.set_cookie(token, "done", max_age=600)
diff --git a/superset/databases/api.py b/superset/databases/api.py
index c285198747..3d4e94153f 100644
--- a/superset/databases/api.py
+++ b/superset/databases/api.py
@@ -1054,7 +1054,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
             buf,
             mimetype="application/zip",
             as_attachment=True,
-            attachment_filename=filename,
+            download_name=filename,
         )
         if token:
             response.set_cookie(token, "done", max_age=600)
@@ -1263,12 +1263,10 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
                 and hasattr(engine_spec, "sqlalchemy_uri_placeholder")
                 and getattr(engine_spec, "default_driver") in drivers
             ):
-                payload[
-                    "parameters"
-                ] = engine_spec.parameters_json_schema()  # type: ignore
+                payload["parameters"] = engine_spec.parameters_json_schema()
                 payload[
                     "sqlalchemy_uri_placeholder"
-                ] = engine_spec.sqlalchemy_uri_placeholder  # type: ignore
+                ] = engine_spec.sqlalchemy_uri_placeholder
 
             available_databases.append(payload)
 
diff --git a/superset/databases/schemas.py b/superset/databases/schemas.py
index e318e41121..f06ff0189a 100644
--- a/superset/databases/schemas.py
+++ b/superset/databases/schemas.py
@@ -298,7 +298,7 @@ class DatabaseParametersSchemaMixin:  # pylint: disable=too-few-public-methods
                 )
 
             # validate parameters
-            parameters = engine_spec.parameters_schema.load(parameters)  # type: ignore
+            parameters = engine_spec.parameters_schema.load(parameters)
 
             serialized_encrypted_extra = data.get("masked_encrypted_extra") or "{}"
             try:
@@ -306,7 +306,7 @@ class DatabaseParametersSchemaMixin:  # pylint: disable=too-few-public-methods
             except json.decoder.JSONDecodeError:
                 encrypted_extra = {}
 
-            data["sqlalchemy_uri"] = engine_spec.build_sqlalchemy_uri(  # type: ignore
+            data["sqlalchemy_uri"] = engine_spec.build_sqlalchemy_uri(
                 parameters,
                 encrypted_extra,
             )
@@ -482,7 +482,6 @@ class DatabasePutSchema(Schema, DatabaseParametersSchemaMixin):
 
 
 class DatabaseTestConnectionSchema(Schema, DatabaseParametersSchemaMixin):
-
     rename_encrypted_extra = pre_load(rename_encrypted_extra)
 
     database_name = fields.String(
diff --git a/superset/datasets/api.py b/superset/datasets/api.py
index 16975675e6..247e6b5ffd 100644
--- a/superset/datasets/api.py
+++ b/superset/datasets/api.py
@@ -514,7 +514,7 @@ class DatasetRestApi(BaseSupersetModelRestApi):
                 buf,
                 mimetype="application/zip",
                 as_attachment=True,
-                attachment_filename=filename,
+                download_name=filename,
             )
             if token:
                 response.set_cookie(token, "done", max_age=600)
diff --git a/superset/db_engine_specs/presto.py b/superset/db_engine_specs/presto.py
index 87f362acc8..33c848cfd5 100644
--- a/superset/db_engine_specs/presto.py
+++ b/superset/db_engine_specs/presto.py
@@ -1272,10 +1272,10 @@ class PrestoEngineSpec(PrestoBaseEngineSpec):
     def _extract_error_message(cls, ex: Exception) -> str:
         if (
             hasattr(ex, "orig")
-            and type(ex.orig).__name__ == "DatabaseError"  # type: ignore
-            and isinstance(ex.orig[0], dict)  # type: ignore
+            and type(ex.orig).__name__ == "DatabaseError"
+            and isinstance(ex.orig[0], dict)
         ):
-            error_dict = ex.orig[0]  # type: ignore
+            error_dict = ex.orig[0]
             return "{} at {}: {}".format(
                 error_dict.get("errorName"),
                 error_dict.get("errorLocation"),
diff --git a/superset/embedded/view.py b/superset/embedded/view.py
index 8dd383aada..b7062c0b5e 100644
--- a/superset/embedded/view.py
+++ b/superset/embedded/view.py
@@ -55,6 +55,8 @@ class EmbeddedView(BaseSupersetView):
         if not embedded:
             abort(404)
 
+        assert embedded is not None
+
         # validate request referrer in allowed domains
         is_referrer_allowed = not embedded.allowed_domains
         for domain in embedded.allowed_domains:
diff --git a/superset/exceptions.py b/superset/exceptions.py
index cee15be376..32b06203cd 100644
--- a/superset/exceptions.py
+++ b/superset/exceptions.py
@@ -54,7 +54,7 @@ class SupersetException(Exception):
         if self.error_type:
             rv["error_type"] = self.error_type
         if self.exception is not None and hasattr(self.exception, "to_dict"):
-            rv = {**rv, **self.exception.to_dict()}  # type: ignore
+            rv = {**rv, **self.exception.to_dict()}
         return rv
 
 
diff --git a/superset/extensions/__init__.py b/superset/extensions/__init__.py
index e2e5592e1e..f633385972 100644
--- a/superset/extensions/__init__.py
+++ b/superset/extensions/__init__.py
@@ -107,7 +107,7 @@ class ProfilingExtension:  # pylint: disable=too-few-public-methods
         self.interval = interval
 
     def init_app(self, app: Flask) -> None:
-        app.wsgi_app = SupersetProfiler(app.wsgi_app, self.interval)  # type: ignore
+        app.wsgi_app = SupersetProfiler(app.wsgi_app, self.interval)
 
 
 APP_DIR = os.path.join(os.path.dirname(__file__), os.path.pardir)
diff --git a/superset/importexport/api.py b/superset/importexport/api.py
index 26bc78e5d7..3a159c140e 100644
--- a/superset/importexport/api.py
+++ b/superset/importexport/api.py
@@ -87,7 +87,7 @@ class ImportExportRestApi(BaseSupersetApi):
             buf,
             mimetype="application/zip",
             as_attachment=True,
-            attachment_filename=filename,
+            download_name=filename,
         )
         return response
 
diff --git a/superset/initialization/__init__.py b/superset/initialization/__init__.py
index ef332e502d..f06dbdb907 100644
--- a/superset/initialization/__init__.py
+++ b/superset/initialization/__init__.py
@@ -564,7 +564,7 @@ class SupersetAppInitializer:  # pylint: disable=too-many-public-methods
             CORS(self.superset_app, **self.config["CORS_OPTIONS"])
 
         if self.config["ENABLE_PROXY_FIX"]:
-            self.superset_app.wsgi_app = ProxyFix(  # type: ignore
+            self.superset_app.wsgi_app = ProxyFix(
                 self.superset_app.wsgi_app, **self.config["PROXY_FIX_CONFIG"]
             )
 
@@ -583,9 +583,7 @@ class SupersetAppInitializer:  # pylint: disable=too-many-public-methods
                         environ["wsgi.input_terminated"] = True
                     return self.app(environ, start_response)
 
-            self.superset_app.wsgi_app = ChunkedEncodingFix(  # type: ignore
-                self.superset_app.wsgi_app  # type: ignore
-            )
+            self.superset_app.wsgi_app = ChunkedEncodingFix(self.superset_app.wsgi_app)
 
         if self.config["UPLOAD_FOLDER"]:
             try:
@@ -594,9 +592,7 @@ class SupersetAppInitializer:  # pylint: disable=too-many-public-methods
                 pass
 
         for middleware in self.config["ADDITIONAL_MIDDLEWARE"]:
-            self.superset_app.wsgi_app = middleware(  # type: ignore
-                self.superset_app.wsgi_app
-            )
+            self.superset_app.wsgi_app = middleware(self.superset_app.wsgi_app)
 
         # Flask-Compress
         Compress(self.superset_app)
diff --git a/superset/jinja_context.py b/superset/jinja_context.py
index ffbab4f9bc..4fcb6c374d 100644
--- a/superset/jinja_context.py
+++ b/superset/jinja_context.py
@@ -190,7 +190,7 @@ class ExtraCache:
         # pylint: disable=import-outside-toplevel
         from superset.views.utils import get_form_data
 
-        if has_request_context() and request.args.get(param):  # type: ignore
+        if has_request_context() and request.args.get(param):
             return request.args.get(param, default)
 
         form_data, _ = get_form_data()
diff --git a/superset/models/dashboard.py b/superset/models/dashboard.py
index e2192ae2f2..3715eb7bc6 100644
--- a/superset/models/dashboard.py
+++ b/superset/models/dashboard.py
@@ -319,8 +319,8 @@ class Dashboard(Model, AuditMixinNullable, ImportExportMixin):
 
         return result
 
-    @property  # type: ignore
-    def params(self) -> str:  # type: ignore
+    @property
+    def params(self) -> str:
         return self.json_metadata
 
     @params.setter
diff --git a/superset/queries/saved_queries/api.py b/superset/queries/saved_queries/api.py
index 2b70b582bb..5d1fb2d2b2 100644
--- a/superset/queries/saved_queries/api.py
+++ b/superset/queries/saved_queries/api.py
@@ -275,7 +275,7 @@ class SavedQueryRestApi(BaseSupersetModelRestApi):
             buf,
             mimetype="application/zip",
             as_attachment=True,
-            attachment_filename=filename,
+            download_name=filename,
         )
         if token:
             response.set_cookie(token, "done", max_age=600)
diff --git a/superset/result_set.py b/superset/result_set.py
index 1c4ae98dc9..170de1869c 100644
--- a/superset/result_set.py
+++ b/superset/result_set.py
@@ -70,14 +70,14 @@ def stringify_values(array: NDArray[Any]) -> NDArray[Any]:
         for obj in it:
             if na_obj := pd.isna(obj):
                 # pandas <NA> type cannot be converted to string
-                obj[na_obj] = None  # type: ignore
+                obj[na_obj] = None
             else:
                 try:
                     # for simple string conversions
                     # this handles odd character types better
-                    obj[...] = obj.astype(str)  # type: ignore
+                    obj[...] = obj.astype(str)
                 except ValueError:
-                    obj[...] = stringify(obj)  # type: ignore
+                    obj[...] = stringify(obj)
 
     return result
 
diff --git a/superset/sqllab/api.py b/superset/sqllab/api.py
index 5915601c0d..0f7a5236c5 100644
--- a/superset/sqllab/api.py
+++ b/superset/sqllab/api.py
@@ -280,7 +280,7 @@ class SqlLabRestApi(BaseSupersetApi):
         )
         execution_context_convertor = ExecutionContextConvertor()
         execution_context_convertor.set_max_row_in_display(
-            int(config.get("DISPLAY_MAX_ROW"))  # type: ignore
+            int(config.get("DISPLAY_MAX_ROW"))
         )
         return ExecuteSqlCommand(
             execution_context,
@@ -305,7 +305,7 @@ class SqlLabRestApi(BaseSupersetApi):
             sql_json_executor = SynchronousSqlJsonExecutor(
                 query_dao,
                 get_sql_results,
-                config.get("SQLLAB_TIMEOUT"),  # type: ignore
+                config.get("SQLLAB_TIMEOUT"),
                 is_feature_enabled("SQLLAB_BACKEND_PERSISTENCE"),
             )
         return sql_json_executor
diff --git a/superset/sqllab/exceptions.py b/superset/sqllab/exceptions.py
index c0096d5db6..8a4db21950 100644
--- a/superset/sqllab/exceptions.py
+++ b/superset/sqllab/exceptions.py
@@ -33,7 +33,7 @@ class SqlLabException(SupersetException):
     failed_reason_msg: str
     suggestion_help_msg: Optional[str]
 
-    def __init__(  # pylint: disable=too-many-arguments
+    def __init__(
         self,
         sql_json_execution_context: SqlJsonExecutionContext,
         error_type: Optional[SupersetErrorType] = None,
@@ -48,13 +48,13 @@ class SqlLabException(SupersetException):
             if exception is not None:
                 if (
                     hasattr(exception, "error_type")
-                    and exception.error_type is not None  # type: ignore
+                    and exception.error_type is not None
                 ):
-                    error_type = exception.error_type  # type: ignore
+                    error_type = exception.error_type
                 elif hasattr(exception, "error") and isinstance(
-                    exception.error, SupersetError  # type: ignore
+                    exception.error, SupersetError
                 ):
-                    error_type = exception.error.error_type  # type: ignore
+                    error_type = exception.error.error_type
             else:
                 error_type = SupersetErrorType.GENERIC_BACKEND_ERROR
 
@@ -79,9 +79,9 @@ class SqlLabException(SupersetException):
             return ": {}".format(reason_message)
         if exception is not None:
             if hasattr(exception, "get_message"):
-                return ": {}".format(exception.get_message())  # type: ignore
+                return ": {}".format(exception.get_message())
             if hasattr(exception, "message"):
-                return ": {}".format(exception.message)  # type: ignore
+                return ": {}".format(exception.message)
             return ": {}".format(str(exception))
         return ""
 
diff --git a/superset/sqllab/query_render.py b/superset/sqllab/query_render.py
index 2854a7e390..1369e78db1 100644
--- a/superset/sqllab/query_render.py
+++ b/superset/sqllab/query_render.py
@@ -48,8 +48,7 @@ class SqlQueryRenderImpl(SqlQueryRender):
     def __init__(
         self, sql_template_factory: Callable[..., BaseTemplateProcessor]
     ) -> None:
-
-        self._sql_template_processor_factory = sql_template_factory  # type: ignore
+        self._sql_template_processor_factory = sql_template_factory
 
     def render(self, execution_context: SqlJsonExecutionContext) -> str:
         query_model = execution_context.query
@@ -76,9 +75,7 @@ class SqlQueryRenderImpl(SqlQueryRender):
         if is_feature_enabled("ENABLE_TEMPLATE_PROCESSING"):
             # pylint: disable=protected-access
             syntax_tree = sql_template_processor._env.parse(rendered_query)
-            undefined_parameters = find_undeclared_variables(  # type: ignore
-                syntax_tree
-            )
+            undefined_parameters = find_undeclared_variables(syntax_tree)
             if undefined_parameters:
                 self._raise_undefined_parameter_exception(
                     execution_context, undefined_parameters
diff --git a/superset/sqllab/sql_json_executer.py b/superset/sqllab/sql_json_executer.py
index 3d55047b41..e4e6b60654 100644
--- a/superset/sqllab/sql_json_executer.py
+++ b/superset/sqllab/sql_json_executer.py
@@ -64,7 +64,7 @@ class SqlJsonExecutorBase(SqlJsonExecutor, ABC):
 
     def __init__(self, query_dao: QueryDAO, get_sql_results_task: GetSqlResultsTask):
         self._query_dao = query_dao
-        self._get_sql_results_task = get_sql_results_task  # type: ignore
+        self._get_sql_results_task = get_sql_results_task
 
 
 class SynchronousSqlJsonExecutor(SqlJsonExecutorBase):
@@ -163,7 +163,6 @@ class ASynchronousSqlJsonExecutor(SqlJsonExecutorBase):
         rendered_query: str,
         log_params: Optional[Dict[str, Any]],
     ) -> SqlJsonExecutionStatus:
-
         query_id = execution_context.query.id
         logger.info("Query %i: Running query on a Celery worker", query_id)
         try:
diff --git a/superset/tasks/async_queries.py b/superset/tasks/async_queries.py
index 1157c5fd37..8d2b488480 100644
--- a/superset/tasks/async_queries.py
+++ b/superset/tasks/async_queries.py
@@ -90,7 +90,9 @@ def load_chart_data_into_cache(
             raise ex
         except Exception as ex:
             # TODO: QueryContext should support SIP-40 style errors
-            error = ex.message if hasattr(ex, "message") else str(ex)  # type: ignore # pylint: disable=no-member
+            error = (
+                ex.message if hasattr(ex, "message") else str(ex)
+            )  # pylint: disable=no-member
             errors = [{"message": error}]
             async_query_manager.update_job(
                 job_metadata, async_query_manager.STATUS_ERROR, errors=errors
@@ -157,7 +159,9 @@ def load_explore_json_into_cache(  # pylint: disable=too-many-locals
             if isinstance(ex, SupersetVizException):
                 errors = ex.errors  # pylint: disable=no-member
             else:
-                error = ex.message if hasattr(ex, "message") else str(ex)  # type: ignore # pylint: disable=no-member
+                error = (
+                    ex.message if hasattr(ex, "message") else str(ex)
+                )  # pylint: disable=no-member
                 errors = [error]
 
             async_query_manager.update_job(
diff --git a/superset/utils/core.py b/superset/utils/core.py
index 517ca6e21b..109d6742b1 100644
--- a/superset/utils/core.py
+++ b/superset/utils/core.py
@@ -56,6 +56,7 @@ from typing import (
     Iterable,
     Iterator,
     List,
+    Literal,
     NamedTuple,
     Optional,
     Sequence,
@@ -655,10 +656,10 @@ def error_msg_from_exception(ex: Exception) -> str:
     """
     msg = ""
     if hasattr(ex, "message"):
-        if isinstance(ex.message, dict):  # type: ignore
+        if isinstance(ex.message, dict):
             msg = ex.message.get("message")  # type: ignore
-        elif ex.message:  # type: ignore
-            msg = ex.message  # type: ignore
+        elif ex.message:
+            msg = ex.message
     return msg or str(ex)
 
 
@@ -1148,9 +1149,7 @@ def merge_extra_form_data(form_data: Dict[str, Any]) -> None:
     append_adhoc_filters: List[AdhocFilterClause] = extra_form_data.get(
         "adhoc_filters", []
     )
-    adhoc_filters.extend(
-        {"isExtra": True, **fltr} for fltr in append_adhoc_filters  # type: ignore
-    )
+    adhoc_filters.extend({"isExtra": True, **fltr} for fltr in append_adhoc_filters)  # type: ignore
     if append_filters:
         for key, value in form_data.items():
             if re.match("adhoc_filter.*", key):
@@ -1667,7 +1666,7 @@ def get_form_data_token(form_data: Dict[str, Any]) -> str:
     return form_data.get("token") or "token_" + uuid.uuid4().hex[:8]
 
 
-def get_column_name_from_column(column: Column) -> Optional[str]:
+def get_column_name_from_column(column: Column) -> Optional[Column]:
     """
     Extract the physical column that a column is referencing. If the column is
     an adhoc column, always returns `None`.
@@ -1677,10 +1676,12 @@ def get_column_name_from_column(column: Column) -> Optional[str]:
     """
     if is_adhoc_column(column):
         return None
-    return column  # type: ignore
+    return column
 
 
-def get_column_names_from_columns(columns: List[Column]) -> List[str]:
+def get_column_names_from_columns(
+    columns: List[Column],
+) -> List[Union[AdhocColumn, str]]:
     """
     Extract the physical columns that a list of columns are referencing. Ignore
     adhoc columns
@@ -1785,7 +1786,7 @@ def indexed(
     return idx
 
 
-def is_test() -> bool:
+def is_test() -> Literal[0, 1]:
     return strtobool(os.environ.get("SUPERSET_TESTENV", "false"))
 
 
@@ -1793,7 +1794,6 @@ def get_time_filter_status(
     datasource: "BaseDatasource",
     applied_time_extras: Dict[str, str],
 ) -> Tuple[List[Dict[str, str]], List[Dict[str, str]]]:
-
     temporal_columns: Set[Any]
     if datasource.type == "query":
         temporal_columns = {
diff --git a/superset/utils/decorators.py b/superset/utils/decorators.py
index f80a578674..e77a559905 100644
--- a/superset/utils/decorators.py
+++ b/superset/utils/decorators.py
@@ -47,7 +47,7 @@ def statsd_gauge(metric_prefix: Optional[str] = None) -> Callable[..., Any]:
             except Exception as ex:
                 if (
                     hasattr(ex, "status")
-                    and ex.status < 500  # type: ignore # pylint: disable=no-member
+                    and ex.status < 500  # pylint: disable=no-member
                 ):
                     current_app.config["STATS_LOGGER"].gauge(
                         f"{metric_prefix_}.warning", 1
diff --git a/superset/utils/encrypt.py b/superset/utils/encrypt.py
index 0c230c6cd9..52b784bb23 100644
--- a/superset/utils/encrypt.py
+++ b/superset/utils/encrypt.py
@@ -60,7 +60,7 @@ class EncryptedFieldFactory:
 
     def init_app(self, app: Flask) -> None:
         self._config = app.config
-        self._concrete_type_adapter = self._config[
+        self._concrete_type_adapter = self._config[  # type: ignore
             "SQLALCHEMY_ENCRYPTED_FIELD_TYPE_ADAPTER"
         ]()
 
diff --git a/superset/utils/machine_auth.py b/superset/utils/machine_auth.py
index d58f739f77..b770245137 100644
--- a/superset/utils/machine_auth.py
+++ b/superset/utils/machine_auth.py
@@ -52,7 +52,7 @@ class MachineAuthProvider:
         :return: The WebDriver passed in (fluent)
         """
         # Short-circuit this method if we have an override configured
-        if self._auth_webdriver_func_override:
+        if self._auth_webdriver_func_override is not None:
             return self._auth_webdriver_func_override(driver, user)
 
         # Setting cookies requires doing a request first
diff --git a/superset/utils/pandas_postprocessing/boxplot.py b/superset/utils/pandas_postprocessing/boxplot.py
index d4c78bf15e..399cf569fb 100644
--- a/superset/utils/pandas_postprocessing/boxplot.py
+++ b/superset/utils/pandas_postprocessing/boxplot.py
@@ -99,8 +99,8 @@ def boxplot(
             return np.nanpercentile(series, low)
 
     else:
-        whisker_high = np.max  # type: ignore
-        whisker_low = np.min  # type: ignore
+        whisker_high = np.max
+        whisker_low = np.min
 
     def outliers(series: Series) -> Set[float]:
         above = series[series > whisker_high(series)]
diff --git a/superset/utils/pandas_postprocessing/flatten.py b/superset/utils/pandas_postprocessing/flatten.py
index 1026164e45..db783c4bed 100644
--- a/superset/utils/pandas_postprocessing/flatten.py
+++ b/superset/utils/pandas_postprocessing/flatten.py
@@ -85,7 +85,7 @@ def flatten(
         _columns = []
         for series in df.columns.to_flat_index():
             _cells = []
-            for cell in series if is_sequence(series) else [series]:  # type: ignore
+            for cell in series if is_sequence(series) else [series]:
                 if pd.notnull(cell):
                     # every cell should be converted to string and escape comma
                     _cells.append(escape_separator(str(cell)))
diff --git a/superset/utils/url_map_converters.py b/superset/utils/url_map_converters.py
index c5eaf3b359..fbd9c800b0 100644
--- a/superset/utils/url_map_converters.py
+++ b/superset/utils/url_map_converters.py
@@ -23,7 +23,7 @@ from superset.tags.models import ObjectTypes
 
 class RegexConverter(BaseConverter):
     def __init__(self, url_map: Map, *items: List[str]) -> None:
-        super().__init__(url_map)  # type: ignore
+        super().__init__(url_map)
         self.regex = items[0]
 
 
diff --git a/superset/views/base.py b/superset/views/base.py
index ec74b8ccdb..f4a945484c 100644
--- a/superset/views/base.py
+++ b/superset/views/base.py
@@ -486,7 +486,7 @@ def show_http_exception(ex: HTTPException) -> FlaskResponse:
         and ex.code in {404, 500}
     ):
         path = resource_filename("superset", f"static/assets/{ex.code}.html")
-        return send_file(path, cache_timeout=0), ex.code
+        return send_file(path, max_age=0), ex.code
 
     return json_errors_response(
         errors=[
@@ -508,7 +508,7 @@ def show_command_errors(ex: CommandException) -> FlaskResponse:
     logger.warning("CommandException", exc_info=True)
     if "text/html" in request.accept_mimetypes and not config["DEBUG"]:
         path = resource_filename("superset", "static/assets/500.html")
-        return send_file(path, cache_timeout=0), 500
+        return send_file(path, max_age=0), 500
 
     extra = ex.normalized_messages() if isinstance(ex, CommandInvalidError) else {}
     return json_errors_response(
@@ -530,7 +530,7 @@ def show_unexpected_exception(ex: Exception) -> FlaskResponse:
     logger.exception(ex)
     if "text/html" in request.accept_mimetypes and not config["DEBUG"]:
         path = resource_filename("superset", "static/assets/500.html")
-        return send_file(path, cache_timeout=0), 500
+        return send_file(path, max_age=0), 500
 
     return json_errors_response(
         errors=[
@@ -729,7 +729,7 @@ def apply_http_headers(response: Response) -> Response:
     """Applies the configuration's http headers to all responses"""
 
     # HTTP_HEADERS is deprecated, this provides backwards compatibility
-    response.headers.extend(  # type: ignore
+    response.headers.extend(
         {**config["OVERRIDE_HTTP_HEADERS"], **config["HTTP_HEADERS"]}
     )
 
diff --git a/superset/views/base_api.py b/superset/views/base_api.py
index 57d7e17367..b6f1644bde 100644
--- a/superset/views/base_api.py
+++ b/superset/views/base_api.py
@@ -112,10 +112,7 @@ def statsd_metrics(f: Callable[..., Any]) -> Callable[..., Any]:
         try:
             duration, response = time_function(f, self, *args, **kwargs)
         except Exception as ex:
-            if (
-                hasattr(ex, "status")
-                and ex.status < 500  # type: ignore # pylint: disable=no-member
-            ):
+            if hasattr(ex, "status") and ex.status < 500:  # pylint: disable=no-member
                 self.incr_stats("warning", func_name)
             else:
                 self.incr_stats("error", func_name)
diff --git a/superset/views/core.py b/superset/views/core.py
index b1580756b7..7f6364bb8a 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -1844,6 +1844,8 @@ class Superset(BaseSupersetView):  # pylint: disable=too-many-public-methods
         if not dashboard:
             abort(404)
 
+        assert dashboard is not None
+
         has_access_ = False
         for datasource in dashboard.datasources:
             datasource = DatasourceDAO.get_datasource(
@@ -2367,7 +2369,7 @@ class Superset(BaseSupersetView):  # pylint: disable=too-many-public-methods
         )
         execution_context_convertor = ExecutionContextConvertor()
         execution_context_convertor.set_max_row_in_display(
-            int(config.get("DISPLAY_MAX_ROW"))  # type: ignore
+            int(config.get("DISPLAY_MAX_ROW"))
         )
         return ExecuteSqlCommand(
             execution_context,
@@ -2392,7 +2394,7 @@ class Superset(BaseSupersetView):  # pylint: disable=too-many-public-methods
             sql_json_executor = SynchronousSqlJsonExecutor(
                 query_dao,
                 get_sql_results,
-                config.get("SQLLAB_TIMEOUT"),  # type: ignore
+                config.get("SQLLAB_TIMEOUT"),
                 is_feature_enabled("SQLLAB_BACKEND_PERSISTENCE"),
             )
         return sql_json_executor
diff --git a/superset/views/utils.py b/superset/views/utils.py
index cd84d8e0a5..35a39fdc9c 100644
--- a/superset/views/utils.py
+++ b/superset/views/utils.py
@@ -153,7 +153,7 @@ def get_form_data(  # pylint: disable=too-many-locals
 ) -> Tuple[Dict[str, Any], Optional[Slice]]:
     form_data: Dict[str, Any] = initial_form_data or {}
 
-    if has_request_context():  # type: ignore
+    if has_request_context():
         # chart data API requests are JSON
         request_json_data = (
             request.json["queries"][0]
@@ -186,7 +186,7 @@ def get_form_data(  # pylint: disable=too-many-locals
         json_data = form_data["queries"][0] if "queries" in form_data else {}
         form_data.update(json_data)
 
-    if has_request_context():  # type: ignore
+    if has_request_context():
         url_id = request.args.get("r")
         if url_id:
             saved_url = db.session.query(models.Url).filter_by(id=url_id).first()
diff --git a/tests/integration_tests/reports/scheduler_tests.py b/tests/integration_tests/reports/scheduler_tests.py
index 3dd6e72941..d121e87d45 100644
--- a/tests/integration_tests/reports/scheduler_tests.py
+++ b/tests/integration_tests/reports/scheduler_tests.py
@@ -22,7 +22,7 @@ from unittest.mock import patch
 import pytest
 from flask_appbuilder.security.sqla.models import User
 from freezegun import freeze_time
-from freezegun.api import FakeDatetime  # type: ignore
+from freezegun.api import FakeDatetime
 
 from superset.extensions import db
 from superset.reports.models import ReportScheduleType
diff --git a/tests/unit_tests/tasks/test_cron_util.py b/tests/unit_tests/tasks/test_cron_util.py
index d0f9ae2170..282dc99860 100644
--- a/tests/unit_tests/tasks/test_cron_util.py
+++ b/tests/unit_tests/tasks/test_cron_util.py
@@ -21,7 +21,7 @@ import pytest
 import pytz
 from dateutil import parser
 from freezegun import freeze_time
-from freezegun.api import FakeDatetime  # type: ignore
+from freezegun.api import FakeDatetime
 
 from superset.tasks.cron_util import cron_schedule_window