From 54dced1cf6886bce3508eb80f7a98fe4ed5de6ca Mon Sep 17 00:00:00 2001 From: John Bodley <4567245+john-bodley@users.noreply.github.com> Date: Wed, 27 May 2020 21:31:26 -0700 Subject: [PATCH] style(mypy): Enforcing mypy typing for views.chart (#9912) Co-authored-by: John Bodley --- setup.cfg | 2 +- superset/connectors/base/models.py | 7 ++++--- superset/connectors/sqla/models.py | 1 + superset/views/chart/filters.py | 5 ++++- superset/views/chart/views.py | 15 ++++++++------- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/setup.cfg b/setup.cfg index fd028af67..99c09ce9f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -53,7 +53,7 @@ order_by_type = false ignore_missing_imports = true no_implicit_optional = true -[mypy-superset.bin.*,superset.charts.*,superset.commands.*,superset.common.*,superset.connectors.*,superset.dao.*,superset.dashboards.*,superset.datasets.*,superset.db_engine_specs.*,superset.db_engines.*,superset.examples.*,superset.migrations.*,superset.models.*,uperset.queries.*,superset.security.*,superset.sql_validators.*,superset.tasks.*,superset.translations.*,superset.views.dashboard.*,superset.views.database.*] +[mypy-superset.bin.*,superset.charts.*,superset.commands.*,superset.common.*,superset.connectors.*,superset.dao.*,superset.dashboards.*,superset.datasets.*,superset.db_engine_specs.*,superset.db_engines.*,superset.examples.*,superset.migrations.*,superset.models.*,uperset.queries.*,superset.security.*,superset.sql_validators.*,superset.tasks.*,superset.translations.*,superset.views.chart.*,superset.views.dashboard.*,superset.views.database.*] check_untyped_defs = true disallow_untyped_calls = true disallow_untyped_defs = true diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index c4e62a6e2..8ead67018 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -61,9 +61,6 @@ class BaseDatasource( # class attributes to define when deriving BaseDatasource # --------------------------------------------------------------- __tablename__: Optional[str] = None # {connector_name}_datasource - type: Optional[ # datasoure type, str to be defined when deriving this class - str - ] = None baselink: Optional[str] = None # url portion pointing to ModelView endpoint column_class: Optional[Type] = None # link to derivative of BaseColumn metric_class: Optional[Type] = None # link to derivative of BaseMetric @@ -107,6 +104,10 @@ class BaseDatasource( # placeholder for a relationship to a derivative of BaseMetric metrics: List[Any] = [] + @property + def type(self) -> str: + raise NotImplementedError() + @property def uid(self) -> str: """Unique id across datasource types""" diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 0e0d8523a..955424fba 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -90,6 +90,7 @@ class AnnotationDatasource(BaseDatasource): cache_timeout = 0 changed_on = None + type = "annotation" def query(self, query_obj: QueryObjectDict) -> QueryResult: error_message = None diff --git a/superset/views/chart/filters.py b/superset/views/chart/filters.py index f0bea4720..89faa4bfd 100644 --- a/superset/views/chart/filters.py +++ b/superset/views/chart/filters.py @@ -14,14 +14,17 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from typing import Any + from sqlalchemy import or_ +from sqlalchemy.orm.query import Query from superset import security_manager from superset.views.base import BaseFilter class SliceFilter(BaseFilter): # pylint: disable=too-few-public-methods - def apply(self, query, value): + def apply(self, query: Query, value: Any) -> Query: if security_manager.all_datasource_access(): return query perms = security_manager.user_view_menu_names("datasource_access") diff --git a/superset/views/chart/views.py b/superset/views/chart/views.py index fb9c298ca..478a2e563 100644 --- a/superset/views/chart/views.py +++ b/superset/views/chart/views.py @@ -24,6 +24,7 @@ from superset import app, db from superset.connectors.connector_registry import ConnectorRegistry from superset.constants import RouteMethod from superset.models.slice import Slice +from superset.typing import FlaskResponse from superset.utils import core as utils from superset.views.base import check_ownership, DeleteMixin, SupersetModelView from superset.views.chart.mixin import SliceMixin @@ -40,22 +41,22 @@ class SliceModelView( RouteMethod.API_DELETE, } - def pre_add(self, item): + def pre_add(self, item: "SliceModelView") -> None: utils.validate_json(item.params) - def pre_update(self, item): + def pre_update(self, item: "SliceModelView") -> None: utils.validate_json(item.params) check_ownership(item) - def pre_delete(self, item): + def pre_delete(self, item: "SliceModelView") -> None: check_ownership(item) @expose("/add", methods=["GET", "POST"]) @has_access - def add(self): - datasources = ConnectorRegistry.get_all_datasources(db.session) + def add(self) -> FlaskResponse: datasources = [ - {"value": str(d.id) + "__" + d.type, "label": repr(d)} for d in datasources + {"value": str(d.id) + "__" + d.type, "label": repr(d)} + for d in ConnectorRegistry.get_all_datasources(db.session) ] return self.render_template( "superset/add_slice.html", @@ -66,7 +67,7 @@ class SliceModelView( @expose("/list/") @has_access - def list(self): + def list(self) -> FlaskResponse: if not app.config["ENABLE_REACT_CRUD_VIEWS"]: return super().list()