This is an automated email from the ASF dual-hosted git repository.
johnbodley pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new 5e55e09 [mypy] Enforcing typing for some modules (#9416)
5e55e09 is described below
commit 5e55e09e3ea41569ecb24cd22e352ab1c274aab9
Author: John Bodley <[email protected]>
AuthorDate: Sat Apr 4 12:45:14 2020 -0700
[mypy] Enforcing typing for some modules (#9416)
Co-authored-by: John Bodley <[email protected]>
---
setup.cfg | 2 +-
superset/commands/base.py | 5 ++++-
superset/commands/exceptions.py | 16 ++++++++--------
superset/common/query_context.py | 4 ++--
superset/common/query_object.py | 2 +-
superset/common/tags.py | 9 +++++----
superset/dao/base.py | 2 +-
superset/db_engines/hive.py | 11 +++++++++--
superset/stats_logger.py | 12 ++++++------
superset/utils/core.py | 3 ++-
10 files changed, 39 insertions(+), 27 deletions(-)
diff --git a/setup.cfg b/setup.cfg
index d835c76..9fd8ef2 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.charts.*,superset.db_engine_specs.*]
+[mypy-superset.bin.*,superset.charts.*,superset.commands.*,superset.common.*,superset.dao.*,superset.db_engine_specs.*,superset.db_engines.*]
check_untyped_defs = true
disallow_untyped_calls = true
disallow_untyped_defs = true
diff --git a/superset/commands/base.py b/superset/commands/base.py
index 44f46eb..9c6de0c 100644
--- a/superset/commands/base.py
+++ b/superset/commands/base.py
@@ -15,6 +15,9 @@
# specific language governing permissions and limitations
# under the License.
from abc import ABC, abstractmethod
+from typing import Optional
+
+from flask_appbuilder.models.sqla import Model
class BaseCommand(ABC):
@@ -23,7 +26,7 @@ class BaseCommand(ABC):
"""
@abstractmethod
- def run(self):
+ def run(self) -> Optional[Model]:
"""
Run executes the command. Can raise command exceptions
:raises: CommandException
diff --git a/superset/commands/exceptions.py b/superset/commands/exceptions.py
index 03eef1f..cf67ea9 100644
--- a/superset/commands/exceptions.py
+++ b/superset/commands/exceptions.py
@@ -25,10 +25,10 @@ from superset.exceptions import SupersetException
class CommandException(SupersetException):
""" Common base class for Command exceptions. """
- def __repr__(self):
+ def __repr__(self) -> str:
if self._exception:
- return self._exception
- return self
+ return repr(self._exception)
+ return repr(self)
class CommandInvalidError(CommandException):
@@ -36,14 +36,14 @@ class CommandInvalidError(CommandException):
status = 422
- def __init__(self, message="") -> None:
+ def __init__(self, message: str = "") -> None:
self._invalid_exceptions: List[ValidationError] = []
super().__init__(self.message)
- def add(self, exception: ValidationError):
+ def add(self, exception: ValidationError) -> None:
self._invalid_exceptions.append(exception)
- def add_list(self, exceptions: List[ValidationError]):
+ def add_list(self, exceptions: List[ValidationError]) -> None:
self._invalid_exceptions.extend(exceptions)
def normalized_messages(self) -> Dict[Any, Any]:
@@ -76,12 +76,12 @@ class ForbiddenError(CommandException):
class OwnersNotFoundValidationError(ValidationError):
status = 422
- def __init__(self):
+ def __init__(self) -> None:
super().__init__(_("Owners are invalid"), field_names=["owners"])
class DatasourceNotFoundValidationError(ValidationError):
status = 404
- def __init__(self):
+ def __init__(self) -> None:
super().__init__(_("Datasource does not exist"),
field_names=["datasource_id"])
diff --git a/superset/common/query_context.py b/superset/common/query_context.py
index 7e12540..525d829 100644
--- a/superset/common/query_context.py
+++ b/superset/common/query_context.py
@@ -157,7 +157,7 @@ class QueryContext:
return self.datasource.database.cache_timeout
return config["CACHE_DEFAULT_TIMEOUT"]
- def cache_key(self, query_obj: QueryObject, **kwargs) -> Optional[str]:
+ def cache_key(self, query_obj: QueryObject, **kwargs: Any) ->
Optional[str]:
extra_cache_keys =
self.datasource.get_extra_cache_keys(query_obj.to_dict())
cache_key = (
query_obj.cache_key(
@@ -173,7 +173,7 @@ class QueryContext:
return cache_key
def get_df_payload( # pylint: disable=too-many-locals,too-many-statements
- self, query_obj: QueryObject, **kwargs
+ self, query_obj: QueryObject, **kwargs: Any
) -> Dict[str, Any]:
"""Handles caching around the df payload retrieval"""
cache_key = self.cache_key(query_obj, **kwargs)
diff --git a/superset/common/query_object.py b/superset/common/query_object.py
index e0681be..f513385 100644
--- a/superset/common/query_object.py
+++ b/superset/common/query_object.py
@@ -122,7 +122,7 @@ class QueryObject:
}
return query_object_dict
- def cache_key(self, **extra) -> str:
+ def cache_key(self, **extra: Any) -> str:
"""
The cache key is made out of the key/values from to_dict(), plus any
other key/values in `extra`
diff --git a/superset/common/tags.py b/superset/common/tags.py
index 657611c..74c882c 100644
--- a/superset/common/tags.py
+++ b/superset/common/tags.py
@@ -14,14 +14,15 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
-
+from sqlalchemy import Metadata
+from sqlalchemy.engine import Engine
from sqlalchemy.exc import IntegrityError
from sqlalchemy.sql import and_, func, functions, join, literal, select
from superset.models.tags import ObjectTypes, TagTypes
-def add_types(engine, metadata):
+def add_types(engine: Engine, metadata: Metadata) -> None:
"""
Tag every object according to its type:
@@ -163,7 +164,7 @@ def add_types(engine, metadata):
engine.execute(query)
-def add_owners(engine, metadata):
+def add_owners(engine: Engine, metadata: Metadata) -> None:
"""
Tag every object according to its owner:
@@ -319,7 +320,7 @@ def add_owners(engine, metadata):
engine.execute(query)
-def add_favorites(engine, metadata):
+def add_favorites(engine: Engine, metadata: Metadata) -> None:
"""
Tag every object that was favorited:
diff --git a/superset/dao/base.py b/superset/dao/base.py
index 8d6152a..7158643 100644
--- a/superset/dao/base.py
+++ b/superset/dao/base.py
@@ -112,7 +112,7 @@ class BaseDAO:
return model
@classmethod
- def delete(cls, model: Model, commit=True):
+ def delete(cls, model: Model, commit: bool = True) -> Model:
"""
Generic delete a model
:raises: DAOCreateFailedError
diff --git a/superset/db_engines/hive.py b/superset/db_engines/hive.py
index 093b5eb..25f71b4 100644
--- a/superset/db_engines/hive.py
+++ b/superset/db_engines/hive.py
@@ -14,12 +14,19 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+from typing import Optional, TYPE_CHECKING
+
+if TYPE_CHECKING:
+ from pyhive.hive import Cursor # pylint: disable=unused-import
+ from TCLIService.ttypes import TFetchOrientation # pylint:
disable=unused-import
# pylint: disable=protected-access
# TODO: contribute back to pyhive.
def fetch_logs(
- self, max_rows=1024, orientation=None
-): # pylint: disable=unused-argument
+ self: "Cursor",
+ max_rows: int = 1024, # pylint: disable=unused-argument
+ orientation: Optional["TFetchOrientation"] = None,
+) -> str: # pylint: disable=unused-argument
"""Mocked. Retrieve the logs produced by the execution of the query.
Can be called multiple times to fetch the logs produced after
the previous call.
diff --git a/superset/stats_logger.py b/superset/stats_logger.py
index 758208a..37fe3d3 100644
--- a/superset/stats_logger.py
+++ b/superset/stats_logger.py
@@ -24,26 +24,26 @@ logger = logging.getLogger(__name__)
class BaseStatsLogger:
"""Base class for logging realtime events"""
- def __init__(self, prefix="superset"):
+ def __init__(self, prefix: str = "superset") -> None:
self.prefix = prefix
- def key(self, key):
+ def key(self, key: str) -> str:
if self.prefix:
return self.prefix + key
return key
- def incr(self, key):
+ def incr(self, key: str) -> None:
"""Increment a counter"""
raise NotImplementedError()
- def decr(self, key):
+ def decr(self, key: str) -> None:
"""Decrement a counter"""
raise NotImplementedError()
- def timing(self, key, value):
+ def timing(self, key, value: float) -> None:
raise NotImplementedError()
- def gauge(self, key):
+ def gauge(self, key: str) -> None:
"""Setup a gauge"""
raise NotImplementedError()
diff --git a/superset/utils/core.py b/superset/utils/core.py
index 999c4d4..95f1032 100644
--- a/superset/utils/core.py
+++ b/superset/utils/core.py
@@ -1224,9 +1224,10 @@ class DatasourceName(NamedTuple):
schema: str
-def get_stacktrace():
+def get_stacktrace() -> Optional[str]:
if current_app.config["SHOW_STACKTRACE"]:
return traceback.format_exc()
+ return None
def split(