diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 304fd0ebb6bc..a83a59d4e73e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,11 +16,21 @@ # repos: - repo: https://github.com/ambv/black - rev: stable + rev: 19.3b0 hooks: - id: black language_version: python3 +- repo: https://github.com/asottile/seed-isort-config + rev: v1.9.3 + hooks: + - id: seed-isort-config + +- repo: https://github.com/pre-commit/mirrors-isort + rev: v4.3.21 + hooks: + - id: isort + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v2.2.3 hooks: @@ -30,8 +40,3 @@ repos: - id: check-added-large-files - id: check-yaml - id: debug-statements - -- repo: https://gitlab.com/pycqa/flake8 - rev: 3.7.1 - hooks: - - id: flake8 diff --git a/.travis.yml b/.travis.yml index ec11b25b4b52..000d2129deec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -75,7 +75,10 @@ jobs: env: TOXENV=black - language: python python: 3.6 - env: TOXENV=flake8 + env: TOXENV=isort + - language: python + python: 3.6 + env: TOXENV=mypy - language: python python: 3.6 env: TOXENV=py36-sqlite diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e832a149e736..0e4c5c5e7339 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -479,6 +479,24 @@ The Python code is auto-formatted using [Black](https://github.com/python/black) is configured as a pre-commit hook. There are also numerous [editor integrations](https://black.readthedocs.io/en/stable/editor_integration.html). +## Conventions + +### Python + +Parameters in the `config.py` (which are accessible via the Flask app.config dictionary) are assummed to always be defined and thus should be accessed directly via, + +```python +blueprints = app.config["BLUEPRINTS"] +``` + +rather than, + +```python +blueprints = app.config.get("BLUEPRINTS") +``` + +or similar as the later will cause typing issues. The former is of type `List[Callable]` whereas the later is of type `Optional[List[Callable]]`. + ## Testing ### Python Testing diff --git a/requirements-dev.txt b/requirements-dev.txt index 5c425cc607e3..63116507b553 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -16,11 +16,9 @@ # black==19.3b0 coverage==4.5.3 -flake8-import-order==0.18.1 -flake8-mypy==17.8.0 -flake8==3.7.7 flask-cors==3.0.7 ipdb==0.12 +isort==4.3.21 mypy==0.670 nose==1.3.7 pip-tools==3.7.0 diff --git a/setup.cfg b/setup.cfg index 4775dc9a92fa..e2d415b1a005 100644 --- a/setup.cfg +++ b/setup.cfg @@ -39,3 +39,15 @@ detailed-errors = 1 with-coverage = 1 nocapture = 1 cover-package = superset + +[isort] +combine_as_imports = true +include_trailing_comma = true +line_length = 88 +known_first_party = superset +known_third_party =alembic,backoff,bleach,celery,click,colorama,contextlib2,croniter,dateutil,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_wtf,geohash,geopy,humanize,isodate,jinja2,markdown,marshmallow,msgpack,numpy,pandas,parsedatetime,pathlib2,polyline,prison,psycopg2,pyarrow,pyhive,pytz,retry,selenium,setuptools,simplejson,sphinx_rtd_theme,sqlalchemy,sqlalchemy_utils,sqlparse,werkzeug,wtforms,wtforms_json,yaml +multi_line_output = 3 +order_by_type = false + +[mypy] +ignore_missing_imports = true diff --git a/superset/__init__.py b/superset/__init__.py index 2d89234d9310..0feaca91fd98 100644 --- a/superset/__init__.py +++ b/superset/__init__.py @@ -16,11 +16,13 @@ # under the License. # pylint: disable=C,R,W """Package's main module!""" -from copy import deepcopy import json import logging import os +from copy import deepcopy +from typing import Any, Dict +import wtforms_json from flask import Flask, redirect from flask_appbuilder import AppBuilder, IndexView, SQLA from flask_appbuilder.baseviews import expose @@ -28,7 +30,6 @@ from flask_migrate import Migrate from flask_talisman import Talisman from flask_wtf.csrf import CSRFProtect -import wtforms_json from superset import config from superset.connectors.connector_registry import ConnectorRegistry @@ -45,14 +46,14 @@ os.makedirs(config.DATA_DIR) app = Flask(__name__) -app.config.from_object(CONFIG_MODULE) +app.config.from_object(CONFIG_MODULE) # type: ignore conf = app.config ################################################################# # Handling manifest file logic at app start ################################################################# MANIFEST_FILE = APP_DIR + "/static/assets/dist/manifest.json" -manifest = {} +manifest: Dict[Any, Any] = {} def parse_manifest_json(): @@ -103,7 +104,7 @@ def get_manifest(): ################################################################# -for bp in conf.get("BLUEPRINTS"): +for bp in conf["BLUEPRINTS"]: try: print("Registering blueprint: '{}'".format(bp.name)) app.register_blueprint(bp) @@ -129,7 +130,7 @@ def get_manifest(): migrate = Migrate(app, db, directory=APP_DIR + "/migrations") -app.config.get("LOGGING_CONFIGURATOR").configure_logging(app.config, app.debug) +app.config["LOGGING_CONFIGURATOR"].configure_logging(app.config, app.debug) if app.config.get("ENABLE_CORS"): from flask_cors import CORS @@ -139,7 +140,9 @@ def get_manifest(): if app.config.get("ENABLE_PROXY_FIX"): from werkzeug.middleware.proxy_fix import ProxyFix - app.wsgi_app = ProxyFix(app.wsgi_app, **app.config.get("PROXY_FIX_CONFIG")) + app.wsgi_app = ProxyFix( # type: ignore + app.wsgi_app, **app.config.get("PROXY_FIX_CONFIG") + ) if app.config.get("ENABLE_CHUNK_ENCODING"): @@ -154,16 +157,16 @@ def __call__(self, environ, start_response): environ["wsgi.input_terminated"] = True return self.app(environ, start_response) - app.wsgi_app = ChunkedEncodingFix(app.wsgi_app) + app.wsgi_app = ChunkedEncodingFix(app.wsgi_app) # type: ignore -if app.config.get("UPLOAD_FOLDER"): +if app.config["UPLOAD_FOLDER"]: try: - os.makedirs(app.config.get("UPLOAD_FOLDER")) + os.makedirs(app.config["UPLOAD_FOLDER"]) except OSError: pass -for middleware in app.config.get("ADDITIONAL_MIDDLEWARE"): - app.wsgi_app = middleware(app.wsgi_app) +for middleware in app.config["ADDITIONAL_MIDDLEWARE"]: + app.wsgi_app = middleware(app.wsgi_app) # type: ignore class MyIndexView(IndexView): @@ -233,9 +236,9 @@ def is_feature_enabled(feature): if flask_app_mutator: flask_app_mutator(app) -from superset import views # noqa +from superset import views # noqa isort:skip # Registering sources -module_datasource_map = app.config.get("DEFAULT_MODULE_DS_MAP") -module_datasource_map.update(app.config.get("ADDITIONAL_MODULE_DS_MAP")) +module_datasource_map = app.config["DEFAULT_MODULE_DS_MAP"] +module_datasource_map.update(app.config["ADDITIONAL_MODULE_DS_MAP"]) ConnectorRegistry.register_sources(module_datasource_map) diff --git a/superset/cli.py b/superset/cli.py index b30b6547f22d..eea034a039d3 100755 --- a/superset/cli.py +++ b/superset/cli.py @@ -16,17 +16,17 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from datetime import datetime import logging +from datetime import datetime from subprocess import Popen from sys import stdout import click +import yaml from colorama import Fore, Style from flask import g from flask_appbuilder import Model from pathlib2 import Path -import yaml from superset import app, appbuilder, db, examples, security_manager from superset.common.tags import add_favorites, add_owners, add_types diff --git a/superset/common/query_context.py b/superset/common/query_context.py index c2534e9f64fa..36ba6753676d 100644 --- a/superset/common/query_context.py +++ b/superset/common/query_context.py @@ -15,21 +15,21 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from datetime import datetime, timedelta import logging import pickle as pkl +from datetime import datetime, timedelta from typing import Any, Dict, List, Optional import numpy as np import pandas as pd -from superset import app, cache -from superset import db +from superset import app, cache, db from superset.connectors.base.models import BaseDatasource from superset.connectors.connector_registry import ConnectorRegistry from superset.stats_logger import BaseStatsLogger from superset.utils import core as utils from superset.utils.core import DTTM_ALIAS + from .query_object import QueryObject config = app.config @@ -59,8 +59,10 @@ def __init__( force: bool = False, custom_cache_timeout: Optional[int] = None, ) -> None: - self.datasource = ConnectorRegistry.get_datasource( - datasource.get("type"), int(datasource.get("id")), db.session # noqa: T400 + self.datasource = ConnectorRegistry.get_datasource( # type: ignore + datasource.get("type"), # type: ignore + int(datasource.get("id")), # type: ignore + db.session, ) self.queries = list(map(lambda query_obj: QueryObject(**query_obj), queries)) diff --git a/superset/common/query_object.py b/superset/common/query_object.py index 71b690358a4f..4c83c87265f2 100644 --- a/superset/common/query_object.py +++ b/superset/common/query_object.py @@ -15,8 +15,8 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=R -from datetime import datetime, timedelta import hashlib +from datetime import datetime, timedelta from typing import Any, Dict, List, Optional, Union import simplejson as json @@ -24,7 +24,6 @@ from superset import app from superset.utils import core as utils - # TODO: Type Metrics dictionary with TypedDict when it becomes a vanilla python type # https://github.com/python/mypy/issues/5288 @@ -39,7 +38,7 @@ class QueryObject: from_dttm: datetime to_dttm: datetime is_timeseries: bool - time_shift: timedelta + time_shift: Optional[timedelta] groupby: List[str] metrics: List[Union[Dict, str]] row_limit: int @@ -61,7 +60,7 @@ def __init__( time_shift: Optional[str] = None, is_timeseries: bool = False, timeseries_limit: int = 0, - row_limit: int = app.config.get("ROW_LIMIT"), + row_limit: int = app.config["ROW_LIMIT"], timeseries_limit_metric: Optional[Dict] = None, order_desc: bool = True, extras: Optional[Dict] = None, @@ -79,13 +78,15 @@ def __init__( ) self.is_timeseries = is_timeseries self.time_range = time_range - self.time_shift = utils.parse_human_timedelta(time_shift) + self.time_shift = ( + utils.parse_human_timedelta(time_shift) if time_shift else None + ) self.groupby = groupby or [] # Temporal solution for backward compatability issue # due the new format of non-ad-hoc metric. self.metrics = [ - metric if "expressionType" in metric else metric["label"] # noqa: T484 + metric if "expressionType" in metric else metric["label"] # type: ignore for metric in metrics ] self.row_limit = row_limit diff --git a/superset/config.py b/superset/config.py index 235783e83317..b2632855106e 100644 --- a/superset/config.py +++ b/superset/config.py @@ -21,13 +21,14 @@ in your PYTHONPATH as there is a ``from superset_config import *`` at the end of this file. """ -from collections import OrderedDict import imp import importlib.util import json import logging import os import sys +from collections import OrderedDict +from typing import Any, Callable, Dict, List from celery.schedules import crontab from dateutil import tz @@ -93,7 +94,7 @@ def _try_json_readfile(filepath): # --------------------------------------------------------- # Your App secret key -SECRET_KEY = "\2\1thisismyscretkey\1\2\e\y\y\h" # noqa +SECRET_KEY = "\2\1thisismyscretkey\1\2\e\y\y\h" # The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(DATA_DIR, "superset.db") @@ -262,12 +263,12 @@ def _try_json_readfile(filepath): # IMG_SIZE = (300, 200, True) CACHE_DEFAULT_TIMEOUT = 60 * 60 * 24 -CACHE_CONFIG = {"CACHE_TYPE": "null"} +CACHE_CONFIG: Dict[str, Any] = {"CACHE_TYPE": "null"} TABLE_NAMES_CACHE_CONFIG = {"CACHE_TYPE": "null"} # CORS Options ENABLE_CORS = False -CORS_OPTIONS = {} +CORS_OPTIONS: Dict[Any, Any] = {} # Chrome allows up to 6 open connections per domain at a time. When there are more # than 6 slices in dashboard, a lot of time fetch requests are queued up and wait for @@ -292,13 +293,13 @@ def _try_json_readfile(filepath): # time grains in superset/db_engine_specs.builtin_time_grains). # For example: to disable 1 second time grain: # TIME_GRAIN_BLACKLIST = ['PT1S'] -TIME_GRAIN_BLACKLIST = [] +TIME_GRAIN_BLACKLIST: List[str] = [] # Additional time grains to be supported using similar definitions as in # superset/db_engine_specs.builtin_time_grains. # For example: To add a new 2 second time grain: # TIME_GRAIN_ADDONS = {'PT2S': '2 second'} -TIME_GRAIN_ADDONS = {} +TIME_GRAIN_ADDONS: Dict[str, str] = {} # Implementation of additional time grains per engine. # For example: To implement 2 second time grain on clickhouse engine: @@ -307,7 +308,7 @@ def _try_json_readfile(filepath): # 'PT2S': 'toDateTime(intDiv(toUInt32(toDateTime({col})), 2)*2)' # } # } -TIME_GRAIN_ADDON_FUNCTIONS = {} +TIME_GRAIN_ADDON_FUNCTIONS: Dict[str, Dict[str, str]] = {} # --------------------------------------------------- # List of viz_types not allowed in your environment @@ -315,13 +316,13 @@ def _try_json_readfile(filepath): # VIZ_TYPE_BLACKLIST = ['pivot_table', 'treemap'] # --------------------------------------------------- -VIZ_TYPE_BLACKLIST = [] +VIZ_TYPE_BLACKLIST: List[str] = [] # --------------------------------------------------- # List of data sources not to be refreshed in druid cluster # --------------------------------------------------- -DRUID_DATA_SOURCE_BLACKLIST = [] +DRUID_DATA_SOURCE_BLACKLIST: List[str] = [] # -------------------------------------------------- # Modules, datasources and middleware to be registered @@ -332,8 +333,8 @@ def _try_json_readfile(filepath): ("superset.connectors.druid.models", ["DruidDatasource"]), ] ) -ADDITIONAL_MODULE_DS_MAP = {} -ADDITIONAL_MIDDLEWARE = [] +ADDITIONAL_MODULE_DS_MAP: Dict[str, List[str]] = {} +ADDITIONAL_MIDDLEWARE: List[Callable] = [] # 1) https://docs.python-guide.org/writing/logging/ # 2) https://docs.python.org/2/library/logging.config.html @@ -441,8 +442,8 @@ class CeleryConfig(object): # within the app # OVERRIDE_HTTP_HEADERS: sets override values for HTTP headers. These values will # override anything set within the app -DEFAULT_HTTP_HEADERS = {} -OVERRIDE_HTTP_HEADERS = {} +DEFAULT_HTTP_HEADERS: Dict[str, Any] = {} +OVERRIDE_HTTP_HEADERS: Dict[str, Any] = {} # The db id here results in selecting this one as a default in SQL Lab DEFAULT_DB_ID = None @@ -492,7 +493,7 @@ class CeleryConfig(object): # SQL Lab. The existing context gets updated with this dictionary, # meaning values for existing keys get overwritten by the content of this # dictionary. -JINJA_CONTEXT_ADDONS = {} +JINJA_CONTEXT_ADDONS: Dict[str, Callable] = {} # Roles that are controlled by the API / Superset and should not be changes # by humans. @@ -521,7 +522,7 @@ class CeleryConfig(object): SMTP_MAIL_FROM = "superset@superset.com" if not CACHE_DEFAULT_TIMEOUT: - CACHE_DEFAULT_TIMEOUT = CACHE_CONFIG.get("CACHE_DEFAULT_TIMEOUT") + CACHE_DEFAULT_TIMEOUT = CACHE_CONFIG.get("CACHE_DEFAULT_TIMEOUT") # type: ignore # Whether to bump the logging level to ERROR on the flask_appbuilder package # Set to False if/when debugging FAB related issues like @@ -541,12 +542,12 @@ class CeleryConfig(object): # Integrate external Blueprints to the app by passing them to your # configuration. These blueprints will get integrated in the app -BLUEPRINTS = [] +BLUEPRINTS: List[Callable] = [] # Provide a callable that receives a tracking_url and returns another # URL. This is used to translate internal Hadoop job tracker URL # into a proxied one -TRACKING_URL_TRANSFORMER = lambda x: x # noqa: E731 +TRACKING_URL_TRANSFORMER = lambda x: x # Interval between consecutive polls when using Hive Engine HIVE_POLL_INTERVAL = 5 @@ -629,7 +630,7 @@ class CeleryConfig(object): WEBDRIVER_WINDOW = {"dashboard": (1600, 2000), "slice": (3000, 1200)} # Any config options to be passed as-is to the webdriver -WEBDRIVER_CONFIGURATION = {} +WEBDRIVER_CONFIGURATION: Dict[Any, Any] = {} # The base URL to query for accessing the user interface WEBDRIVER_BASEURL = "http://0.0.0.0:8080/" @@ -697,8 +698,8 @@ class CeleryConfig(object): raise elif importlib.util.find_spec("superset_config"): try: - from superset_config import * # noqa pylint: disable=import-error - import superset_config # noqa pylint: disable=import-error + from superset_config import * # pylint: disable=import-error + import superset_config # pylint: disable=import-error print(f"Loaded your LOCAL configuration at [{superset_config.__file__}]") except Exception: diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index d84910c6e563..e9ea9d890d14 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -16,7 +16,7 @@ # under the License. # pylint: disable=C,R,W import json -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Type from flask_appbuilder.security.sqla.models import User from sqlalchemy import and_, Boolean, Column, Integer, String, Text @@ -35,15 +35,17 @@ class BaseDatasource(AuditMixinNullable, ImportMixin): # --------------------------------------------------------------- # class attributes to define when deriving BaseDatasource # --------------------------------------------------------------- - __tablename__ = None # {connector_name}_datasource - type = None # datasoure type, str to be defined when deriving this class - baselink = None # url portion pointing to ModelView endpoint - column_class = None # link to derivative of BaseColumn - metric_class = None # link to derivative of BaseMetric + __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 owner_class = None # Used to do code highlighting when displaying the query in the UI - query_language = None + query_language: Optional[str] = None name = None # can be a Column or a property pointing to one @@ -341,7 +343,7 @@ def get_extra_cache_keys(self, query_obj: Dict) -> List[Any]: class BaseColumn(AuditMixinNullable, ImportMixin): """Interface for column""" - __tablename__ = None # {connector_name}_column + __tablename__: Optional[str] = None # {connector_name}_column id = Column(Integer, primary_key=True) column_name = Column(String(255), nullable=False) @@ -411,7 +413,7 @@ class BaseMetric(AuditMixinNullable, ImportMixin): """Interface for Metrics""" - __tablename__ = None # {connector_name}_metric + __tablename__: Optional[str] = None # {connector_name}_metric id = Column(Integer, primary_key=True) metric_name = Column(String(255), nullable=False) diff --git a/superset/connectors/druid/__init__.py b/superset/connectors/druid/__init__.py index 813d9a29db2c..ad52fc6d8bcb 100644 --- a/superset/connectors/druid/__init__.py +++ b/superset/connectors/druid/__init__.py @@ -14,5 +14,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from . import models # noqa -from . import views # noqa +from . import models, views diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index 804c216e5e0d..af68f1046af7 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -16,23 +16,44 @@ # under the License. # pylint: disable=C,R,W # pylint: disable=invalid-unary-operand-type +import json +import logging +import re from collections import OrderedDict from copy import deepcopy from datetime import datetime, timedelta from distutils.version import LooseVersion -import json -import logging from multiprocessing.pool import ThreadPool -import re from typing import Dict, Iterable, List, Optional, Set, Tuple, Union +import pandas as pd +import sqlalchemy as sa from dateutil.parser import parse as dparse from flask import escape, Markup from flask_appbuilder import Model from flask_appbuilder.models.decorators import renders from flask_appbuilder.security.sqla.models import User from flask_babel import lazy_gettext as _ -import pandas as pd +from sqlalchemy import ( + Boolean, + Column, + DateTime, + ForeignKey, + Integer, + String, + Table, + Text, + UniqueConstraint, +) +from sqlalchemy.orm import backref, relationship, RelationshipProperty, Session +from sqlalchemy_utils import EncryptedType + +from superset import conf, db, security_manager +from superset.connectors.base.models import BaseColumn, BaseDatasource, BaseMetric +from superset.exceptions import SupersetException +from superset.models.core import Database +from superset.models.helpers import AuditMixinNullable, ImportMixin, QueryResult +from superset.utils import core as utils, import_datasource try: from pydruid.client import PyDruid @@ -55,39 +76,16 @@ import requests except ImportError: pass -import sqlalchemy as sa -from sqlalchemy import ( - Boolean, - Column, - DateTime, - ForeignKey, - Integer, - String, - Table, - Text, - UniqueConstraint, -) -from sqlalchemy.orm import backref, relationship, RelationshipProperty, Session -from sqlalchemy_utils import EncryptedType - -from superset import conf, db, security_manager -from superset.connectors.base.models import BaseColumn, BaseDatasource, BaseMetric -from superset.exceptions import SupersetException -from superset.models.core import Database -from superset.models.helpers import AuditMixinNullable, ImportMixin, QueryResult -from superset.utils import core as utils, import_datasource try: from superset.utils.core import DimSelector, DTTM_ALIAS, flasher except ImportError: pass - DRUID_TZ = conf.get("DRUID_TZ") POST_AGG_TYPE = "postagg" metadata = Model.metadata # pylint: disable=no-member - try: # Postaggregator might not have been imported. class JavascriptPostAggregator(Postaggregator): @@ -111,7 +109,6 @@ def __init__(self, name, post_aggregator): except NameError: pass - # Function wrapper because bound methods cannot # be passed to processes def _fetch_metadata_for(datasource): @@ -137,14 +134,14 @@ class DruidCluster(Model, AuditMixinNullable, ImportMixin): broker_user = Column(String(255)) broker_pass = Column(EncryptedType(String(255), conf.get("SECRET_KEY"))) - export_fields = ( + export_fields = [ "cluster_name", "broker_host", "broker_port", "broker_endpoint", "cache_timeout", "broker_user", - ) + ] update_from_object_fields = export_fields export_children = ["datasources"] @@ -188,7 +185,7 @@ def get_druid_version(self) -> str: auth = requests.auth.HTTPBasicAuth(self.broker_user, self.broker_pass) return json.loads(requests.get(endpoint, auth=auth).text)["version"] - @property # noqa: T484 + @property # type: ignore @utils.memoized def druid_version(self) -> str: return self.get_druid_version() @@ -310,7 +307,7 @@ class DruidColumn(Model, BaseColumn): ) dimension_spec_json = Column(Text) - export_fields = ( + export_fields = [ "datasource_id", "column_name", "is_active", @@ -320,7 +317,7 @@ class DruidColumn(Model, BaseColumn): "description", "dimension_spec_json", "verbose_name", - ) + ] update_from_object_fields = export_fields export_parent = "datasource" @@ -332,9 +329,10 @@ def expression(self) -> str: return self.dimension_spec_json @property - def dimension_spec(self) -> Optional[Dict]: # noqa: T484 + def dimension_spec(self) -> Optional[Dict]: if self.dimension_spec_json: return json.loads(self.dimension_spec_json) + return None def get_metrics(self) -> Dict[str, "DruidMetric"]: metrics = { @@ -397,7 +395,7 @@ class DruidMetric(Model, BaseMetric): ) json = Column(Text, nullable=False) - export_fields = ( + export_fields = [ "metric_name", "verbose_name", "metric_type", @@ -406,7 +404,7 @@ class DruidMetric(Model, BaseMetric): "description", "d3format", "warning_text", - ) + ] update_from_object_fields = export_fields export_parent = "datasource" @@ -490,7 +488,7 @@ class DruidDatasource(Model, BaseDatasource): owner_class, secondary=druiddatasource_user, backref="druiddatasources" ) - export_fields = ( + export_fields = [ "datasource_name", "is_hidden", "description", @@ -500,7 +498,7 @@ class DruidDatasource(Model, BaseDatasource): "cache_timeout", "params", "filter_select_enabled", - ) + ] update_from_object_fields = export_fields export_parent = "cluster" @@ -519,7 +517,7 @@ def num_cols(self) -> List[str]: return [c.column_name for c in self.columns if c.is_num] @property - def name(self) -> str: + def name(self) -> str: # type: ignore return self.datasource_name @property @@ -825,7 +823,7 @@ def granularity( granularity["period"] = period_name else: granularity["type"] = "duration" - granularity["duration"] = ( + granularity["duration"] = ( # type: ignore utils.parse_human_timedelta(period_name).total_seconds() * 1000 ) return granularity @@ -928,7 +926,7 @@ def metrics_and_post_aggs( metrics: List[Union[Dict, str]], metrics_dict: Dict[str, DruidMetric], druid_version=None, - ) -> Tuple[OrderedDict, OrderedDict]: # noqa: T484 + ) -> Tuple[OrderedDict, OrderedDict]: # Separate metrics into those that are aggregations # and those that are post aggregations saved_agg_names = set() @@ -937,21 +935,21 @@ def metrics_and_post_aggs( for metric in metrics: if utils.is_adhoc_metric(metric): adhoc_agg_configs.append(metric) - elif metrics_dict[metric].metric_type != POST_AGG_TYPE: # noqa: T484 + elif metrics_dict[metric].metric_type != POST_AGG_TYPE: # type: ignore saved_agg_names.add(metric) else: postagg_names.append(metric) # Create the post aggregations, maintain order since postaggs # may depend on previous ones - post_aggs = OrderedDict() # noqa: T484 + post_aggs: "OrderedDict[str, Postaggregator]" = OrderedDict() visited_postaggs = set() for postagg_name in postagg_names: - postagg = metrics_dict[postagg_name] # noqa: T484 + postagg = metrics_dict[postagg_name] # type: ignore visited_postaggs.add(postagg_name) DruidDatasource.resolve_postagg( postagg, post_aggs, saved_agg_names, visited_postaggs, metrics_dict ) - aggs = DruidDatasource.get_aggregations( # noqa: T484 + aggs = DruidDatasource.get_aggregations( # type: ignore metrics_dict, saved_agg_names, adhoc_agg_configs ) return aggs, post_aggs @@ -1042,7 +1040,7 @@ def druid_type_from_adhoc_metric(adhoc_metric: Dict) -> str: @staticmethod def get_aggregations( - metrics_dict: Dict, saved_metrics: Iterable[str], adhoc_metrics: List[Dict] = [] + metrics_dict: Dict, saved_metrics: Set[str], adhoc_metrics: List[Dict] = [] ) -> OrderedDict: """ Returns a dictionary of aggregation metric names to aggregation json objects @@ -1130,14 +1128,14 @@ def sanitize_metric_object(metric: Dict) -> None: ): metric["column"]["type"] = "DOUBLE" - def run_query( # noqa / druid + def run_query( # druid self, groupby, metrics, granularity, from_dttm, to_dttm, - filter=None, # noqa + filter=None, is_timeseries=True, timeseries_limit=None, timeseries_limit_metric=None, @@ -1145,7 +1143,7 @@ def run_query( # noqa / druid inner_from_dttm=None, inner_to_dttm=None, orderby=None, - extras=None, # noqa + extras=None, columns=None, phase=2, client=None, @@ -1224,7 +1222,7 @@ def run_query( # noqa / druid del qry["dimensions"] client.timeseries(**qry) elif not having_filters and len(groupby) == 1 and order_desc: - dim = list(qry.get("dimensions"))[0] # noqa: T484 + dim = list(qry["dimensions"])[0] logging.info("Running two-phase topn query for dimension [{}]".format(dim)) pre_qry = deepcopy(qry) if timeseries_limit_metric: @@ -1443,7 +1441,7 @@ def _create_extraction_fn(dim_spec): return (col, extraction_fn) @classmethod - def get_filters(cls, raw_filters, num_cols, columns_dict) -> Filter: # noqa: T484 + def get_filters(cls, raw_filters, num_cols, columns_dict) -> Filter: """Given Superset filter data structure, returns pydruid Filter(s)""" filters = None for flt in raw_filters: @@ -1561,9 +1559,9 @@ def get_filters(cls, raw_filters, num_cols, columns_dict) -> Filter: # noqa: T4 alphaNumeric=is_numeric_col, ) elif op == "IS NULL": - cond = Dimension(col) == None # NOQA + cond = Dimension(col) is None elif op == "IS NOT NULL": - cond = Dimension(col) != None # NOQA + cond = Dimension(col) is not None if filters: filters = Filter(type="and", fields=[cond, filters]) diff --git a/superset/connectors/druid/views.py b/superset/connectors/druid/views.py index 606d3380b8ac..d138f7866982 100644 --- a/superset/connectors/druid/views.py +++ b/superset/connectors/druid/views.py @@ -15,17 +15,16 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from datetime import datetime import json import logging +from datetime import datetime from flask import flash, Markup, redirect from flask_appbuilder import CompactCRUDMixin, expose from flask_appbuilder.fieldwidgets import Select2Widget from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ +from flask_babel import gettext as __, lazy_gettext as _ from wtforms.ext.sqlalchemy.fields import QuerySelectField from superset import appbuilder, db, security_manager @@ -42,10 +41,11 @@ validate_json, YamlExportMixin, ) + from . import models -class DruidColumnInlineView(CompactCRUDMixin, SupersetModelView): # noqa +class DruidColumnInlineView(CompactCRUDMixin, SupersetModelView): datamodel = SQLAInterface(models.DruidColumn) list_title = _("Columns") @@ -134,7 +134,7 @@ def post_add(self, col): appbuilder.add_view_no_menu(DruidColumnInlineView) -class DruidMetricInlineView(CompactCRUDMixin, SupersetModelView): # noqa +class DruidMetricInlineView(CompactCRUDMixin, SupersetModelView): datamodel = SQLAInterface(models.DruidMetric) list_title = _("Metrics") @@ -189,7 +189,7 @@ class DruidMetricInlineView(CompactCRUDMixin, SupersetModelView): # noqa appbuilder.add_view_no_menu(DruidMetricInlineView) -class DruidClusterModelView(SupersetModelView, DeleteMixin, YamlExportMixin): # noqa +class DruidClusterModelView(SupersetModelView, DeleteMixin, YamlExportMixin): datamodel = SQLAInterface(models.DruidCluster) list_title = _("Druid Clusters") @@ -268,9 +268,7 @@ def _delete(self, pk): ) -class DruidDatasourceModelView( - DatasourceModelView, DeleteMixin, YamlExportMixin -): # noqa +class DruidDatasourceModelView(DatasourceModelView, DeleteMixin, YamlExportMixin): datamodel = SQLAInterface(models.DruidDatasource) list_title = _("Druid Datasources") diff --git a/superset/connectors/sqla/__init__.py b/superset/connectors/sqla/__init__.py index 813d9a29db2c..ad52fc6d8bcb 100644 --- a/superset/connectors/sqla/__init__.py +++ b/superset/connectors/sqla/__init__.py @@ -14,5 +14,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from . import models # noqa -from . import views # noqa +from . import models, views diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index fcd045e0ae26..5504eb370c74 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -15,17 +15,18 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from collections import OrderedDict -from datetime import datetime import logging import re +from collections import OrderedDict +from datetime import datetime from typing import Any, Dict, List, NamedTuple, Optional, Union +import pandas as pd +import sqlalchemy as sa +import sqlparse from flask import escape, Markup from flask_appbuilder import Model from flask_babel import lazy_gettext as _ -import pandas as pd -import sqlalchemy as sa from sqlalchemy import ( and_, asc, @@ -47,7 +48,6 @@ from sqlalchemy.schema import UniqueConstraint from sqlalchemy.sql import column, ColumnElement, literal_column, table, text from sqlalchemy.sql.expression import Label, Select, TextAsFrom -import sqlparse from superset import app, db, security_manager from superset.connectors.base.models import BaseColumn, BaseDatasource, BaseMetric @@ -126,7 +126,7 @@ class TableColumn(Model, BaseColumn): expression = Column(Text) python_date_format = Column(String(255)) - export_fields = ( + export_fields = [ "table_id", "column_name", "verbose_name", @@ -138,7 +138,7 @@ class TableColumn(Model, BaseColumn): "expression", "description", "python_date_format", - ) + ] update_from_object_fields = [s for s in export_fields if s not in ("table_id",)] export_parent = "table" @@ -162,7 +162,7 @@ def get_time_filter( self, start_dttm: DateTime, end_dttm: DateTime ) -> ColumnElement: col = self.get_sqla_col(label="__time") - l = [] # noqa: E741 + l = [] if start_dttm: l.append(col >= text(self.dttm_sql_literal(start_dttm))) if end_dttm: @@ -238,7 +238,7 @@ class SqlMetric(Model, BaseMetric): ) expression = Column(Text, nullable=False) - export_fields = ( + export_fields = [ "metric_name", "verbose_name", "metric_type", @@ -247,7 +247,7 @@ class SqlMetric(Model, BaseMetric): "description", "d3format", "warning_text", - ) + ] update_from_object_fields = list( [s for s in export_fields if s not in ("table_id",)] ) @@ -325,7 +325,7 @@ class SqlaTable(Model, BaseDatasource): baselink = "tablemodelview" - export_fields = ( + export_fields = [ "table_name", "main_dttm_col", "description", @@ -339,7 +339,7 @@ class SqlaTable(Model, BaseDatasource): "template_params", "filter_select_enabled", "fetch_values_predicate", - ) + ] update_from_object_fields = [ f for f in export_fields if f not in ("table_name", "database_id") ] @@ -427,7 +427,7 @@ def get_perm(self) -> str: return ("[{obj.database}].[{obj.table_name}]" "(id:{obj.id})").format(obj=self) @property - def name(self) -> str: + def name(self) -> str: # type: ignore if not self.schema: return self.table_name return "{}.{}".format(self.schema, self.table_name) @@ -440,7 +440,7 @@ def full_name(self) -> str: @property def dttm_cols(self) -> List: - l = [c.column_name for c in self.columns if c.is_dttm] # noqa: E741 + 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 @@ -618,7 +618,7 @@ def get_sqla_query( # sqla granularity, from_dttm, to_dttm, - filter=None, # noqa + filter=None, is_timeseries=True, timeseries_limit=15, timeseries_limit_metric=None, @@ -759,7 +759,7 @@ def get_sqla_query( # sqla if op in ("in", "not in"): cond = col_obj.get_sqla_col().in_(eq) if "" in eq: - cond = or_(cond, col_obj.get_sqla_col() == None) # noqa + cond = or_(cond, col_obj.get_sqla_col() == None) if op == "not in": cond = ~cond where_clause_and.append(cond) @@ -781,9 +781,9 @@ def get_sqla_query( # sqla elif op == "LIKE": where_clause_and.append(col_obj.get_sqla_col().like(eq)) elif op == "IS NULL": - where_clause_and.append(col_obj.get_sqla_col() == None) # noqa + where_clause_and.append(col_obj.get_sqla_col() == None) elif op == "IS NOT NULL": - where_clause_and.append(col_obj.get_sqla_col() != None) # noqa + where_clause_and.append(col_obj.get_sqla_col() != None) if extras: where = extras.get("where") if where: @@ -976,7 +976,7 @@ def fetch_metadata(self) -> None: ).format(self.table_name) ) - M = SqlMetric # noqa + M = SqlMetric metrics = [] any_date_col = None db_engine_spec = self.database.db_engine_spec diff --git a/superset/connectors/sqla/views.py b/superset/connectors/sqla/views.py index 38145ef88586..6af0a3799c99 100644 --- a/superset/connectors/sqla/views.py +++ b/superset/connectors/sqla/views.py @@ -25,8 +25,7 @@ from flask_appbuilder.fieldwidgets import Select2Widget from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ +from flask_babel import gettext as __, lazy_gettext as _ from wtforms.ext.sqlalchemy.fields import QuerySelectField from wtforms.validators import Regexp @@ -41,12 +40,13 @@ SupersetModelView, YamlExportMixin, ) + from . import models logger = logging.getLogger(__name__) -class TableColumnInlineView(CompactCRUDMixin, SupersetModelView): # noqa +class TableColumnInlineView(CompactCRUDMixin, SupersetModelView): datamodel = SQLAInterface(models.TableColumn) list_title = _("Columns") @@ -162,7 +162,7 @@ class TableColumnInlineView(CompactCRUDMixin, SupersetModelView): # noqa appbuilder.add_view_no_menu(TableColumnInlineView) -class SqlMetricInlineView(CompactCRUDMixin, SupersetModelView): # noqa +class SqlMetricInlineView(CompactCRUDMixin, SupersetModelView): datamodel = SQLAInterface(models.SqlMetric) list_title = _("Metrics") @@ -224,7 +224,7 @@ class SqlMetricInlineView(CompactCRUDMixin, SupersetModelView): # noqa appbuilder.add_view_no_menu(SqlMetricInlineView) -class TableModelView(DatasourceModelView, DeleteMixin, YamlExportMixin): # noqa +class TableModelView(DatasourceModelView, DeleteMixin, YamlExportMixin): datamodel = SQLAInterface(models.SqlaTable) list_title = _("Tables") diff --git a/superset/dataframe.py b/superset/dataframe.py index f82ab294d826..9c36efcdba87 100644 --- a/superset/dataframe.py +++ b/superset/dataframe.py @@ -22,8 +22,8 @@ TODO(bkyryliuk): recognize integer encoded enums. """ -from datetime import date, datetime import logging +from datetime import date, datetime import numpy as np import pandas as pd diff --git a/superset/db_engine_specs/__init__.py b/superset/db_engine_specs/__init__.py index d8987bb8a602..082c27c52453 100644 --- a/superset/db_engine_specs/__init__.py +++ b/superset/db_engine_specs/__init__.py @@ -28,10 +28,10 @@ The general idea is to use static classes and an inheritance scheme. """ -from importlib import import_module import inspect -from pathlib import Path import pkgutil +from importlib import import_module +from pathlib import Path from typing import Dict, Type from superset.db_engine_specs.base import BaseEngineSpec diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 12911ad99f88..97e214f42f82 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -15,16 +15,17 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=unused-argument -from contextlib import closing -from datetime import datetime import hashlib import os import re +from contextlib import closing +from datetime import datetime from typing import Any, Dict, List, NamedTuple, Optional, Tuple, TYPE_CHECKING, Union +import pandas as pd +import sqlparse from flask import g from flask_babel import lazy_gettext as _ -import pandas as pd from sqlalchemy import column, DateTime, select from sqlalchemy.engine import create_engine from sqlalchemy.engine.base import Engine @@ -34,7 +35,6 @@ from sqlalchemy.sql import quoted_name, text from sqlalchemy.sql.expression import ColumnClause, ColumnElement, Select, TextAsFrom from sqlalchemy.types import TypeEngine -import sqlparse from werkzeug.utils import secure_filename from superset import app, db, sql_parse @@ -339,7 +339,7 @@ def apply_limit_to_sql(cls, sql: str, limit: int, database) -> str: return sql @classmethod - def get_limit_from_sql(cls, sql: str) -> int: + def get_limit_from_sql(cls, sql: str) -> Optional[int]: """ Extract limit from SQL query diff --git a/superset/db_engine_specs/bigquery.py b/superset/db_engine_specs/bigquery.py index 2e0476c95e32..bcb9c2f816ff 100644 --- a/superset/db_engine_specs/bigquery.py +++ b/superset/db_engine_specs/bigquery.py @@ -14,9 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from datetime import datetime import hashlib import re +from datetime import datetime from typing import Any, Dict, List, Tuple import pandas as pd @@ -68,7 +68,7 @@ def convert_dttm(cls, target_type: str, dttm: datetime) -> str: def fetch_data(cls, cursor, limit: int) -> List[Tuple]: data = super(BigQueryEngineSpec, cls).fetch_data(cursor, limit) if data and type(data[0]).__name__ == "Row": - data = [r.values() for r in data] + data = [r.values() for r in data] # type: ignore return data @staticmethod diff --git a/superset/db_engine_specs/exasol.py b/superset/db_engine_specs/exasol.py index c6b38cba5d10..0e875d3b8f81 100644 --- a/superset/db_engine_specs/exasol.py +++ b/superset/db_engine_specs/exasol.py @@ -44,5 +44,5 @@ def fetch_data(cls, cursor, limit: int) -> List[Tuple]: data = super().fetch_data(cursor, limit) # Lists of `pyodbc.Row` need to be unpacked further if data and type(data[0]).__name__ == "Row": - data = [[value for value in row] for row in data] + data = [tuple(row) for row in data] return data diff --git a/superset/db_engine_specs/hive.py b/superset/db_engine_specs/hive.py index a08edc22144f..dbcb337fe9bd 100644 --- a/superset/db_engine_specs/hive.py +++ b/superset/db_engine_specs/hive.py @@ -14,11 +14,11 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from datetime import datetime import logging import os import re import time +from datetime import datetime from typing import Any, Dict, List, Optional, Tuple from urllib import parse @@ -415,7 +415,7 @@ def get_configuration_for_impersonation( return configuration @staticmethod - def execute( + def execute( # type: ignore cursor, query: str, async_: bool = False ): # pylint: disable=arguments-differ kwargs = {"async": async_} diff --git a/superset/db_engine_specs/mssql.py b/superset/db_engine_specs/mssql.py index 1a6aea8349a9..1ce1f3a96163 100644 --- a/superset/db_engine_specs/mssql.py +++ b/superset/db_engine_specs/mssql.py @@ -14,8 +14,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from datetime import datetime import re +from datetime import datetime from typing import List, Optional, Tuple from sqlalchemy.engine.interfaces import Dialect @@ -26,7 +26,6 @@ class MssqlEngineSpec(BaseEngineSpec): engine = "mssql" - epoch_to_dttm = "dateadd(S, {col}, '1970-01-01')" limit_method = LimitMethod.WRAP_SQL max_column_name_length = 128 @@ -46,6 +45,10 @@ class MssqlEngineSpec(BaseEngineSpec): "P1Y": "DATEADD(year, DATEDIFF(year, 0, {col}), 0)", } + @classmethod + def epoch_to_dttm(cls): + return "dateadd(S, {col}, '1970-01-01')" + @classmethod def convert_dttm(cls, target_type: str, dttm: datetime) -> str: return "CONVERT(DATETIME, '{}', 126)".format(dttm.isoformat()) @@ -54,7 +57,7 @@ def convert_dttm(cls, target_type: str, dttm: datetime) -> str: def fetch_data(cls, cursor, limit: int) -> List[Tuple]: data = super().fetch_data(cursor, limit) if data and type(data[0]).__name__ == "Row": - data = [[elem for elem in r] for r in data] + data = [tuple(row) for row in data] return data column_types = [ diff --git a/superset/db_engine_specs/presto.py b/superset/db_engine_specs/presto.py index f2a2016935b0..66e798234d67 100644 --- a/superset/db_engine_specs/presto.py +++ b/superset/db_engine_specs/presto.py @@ -14,14 +14,14 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from collections import defaultdict, deque -from contextlib import closing -from datetime import datetime -from distutils.version import StrictVersion import logging import re import textwrap import time +from collections import defaultdict, deque +from contextlib import closing +from datetime import datetime +from distutils.version import StrictVersion from typing import Any, cast, Dict, List, Optional, Tuple, TYPE_CHECKING from urllib import parse @@ -787,14 +787,14 @@ def _partition_query( # pylint: disable=too-many-arguments,too-many-locals limit_clause = "LIMIT {}".format(limit) if limit else "" order_by_clause = "" if order_by: - l = [] # noqa: E741 + l = [] for field, desc in order_by: l.append(field + " DESC" if desc else "") order_by_clause = "ORDER BY " + ", ".join(l) where_clause = "" if filters: - l = [] # noqa: E741 + l = [] for field, value in filters.items(): l.append(f"{field} = '{value}'") where_clause = "WHERE " + " AND ".join(l) @@ -824,7 +824,7 @@ def _partition_query( # pylint: disable=too-many-arguments,too-many-locals def where_latest_partition( # pylint: disable=too-many-arguments cls, table_name: str, - schema: str, + schema: Optional[str], database, query: Select, columns: Optional[List] = None, @@ -856,7 +856,7 @@ def _latest_partition_from_df( # pylint: disable=invalid-name @classmethod def latest_partition( - cls, table_name: str, schema: str, database, show_first: bool = False + cls, table_name: str, schema: Optional[str], database, show_first: bool = False ): """Returns col name and the latest (max) partition value for a table diff --git a/superset/db_engine_specs/sqlite.py b/superset/db_engine_specs/sqlite.py index 95dead268570..16b890adc2ca 100644 --- a/superset/db_engine_specs/sqlite.py +++ b/superset/db_engine_specs/sqlite.py @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. from datetime import datetime -from typing import List, TYPE_CHECKING +from typing import List, Optional, TYPE_CHECKING from sqlalchemy.engine.reflection import Inspector @@ -83,7 +83,7 @@ def convert_dttm(cls, target_type: str, dttm: datetime) -> str: @classmethod def get_table_names( - cls, database: "Database", inspector: Inspector, schema: str + cls, database: "Database", inspector: Inspector, schema: Optional[str] ) -> List[str]: """Need to disregard the schema for Sqlite""" return sorted(inspector.get_table_names()) diff --git a/superset/db_engines/hive.py b/superset/db_engines/hive.py index bdad09a083d2..62cae81a05ba 100644 --- a/superset/db_engines/hive.py +++ b/superset/db_engines/hive.py @@ -27,8 +27,8 @@ def fetch_logs(self, max_rows=1024, orientation=None): .. note:: This is not a part of DB-API. """ - from pyhive import hive # noqa - from TCLIService import ttypes # noqa + from pyhive import hive + from TCLIService import ttypes from thrift import Thrift # pylint: disable=import-error orientation = orientation or ttypes.TFetchOrientation.FETCH_NEXT diff --git a/superset/examples/__init__.py b/superset/examples/__init__.py index aee65ac1e86a..ff1b4e17a38a 100644 --- a/superset/examples/__init__.py +++ b/superset/examples/__init__.py @@ -14,20 +14,20 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from .bart_lines import load_bart_lines # noqa -from .birth_names import load_birth_names # noqa -from .country_map import load_country_map_data # noqa -from .css_templates import load_css_templates # noqa -from .deck import load_deck_dash # noqa -from .energy import load_energy # noqa -from .flights import load_flights # noqa -from .long_lat import load_long_lat_data # noqa -from .misc_dashboard import load_misc_dashboard # noqa -from .multi_line import load_multi_line # noqa -from .multiformat_time_series import load_multiformat_time_series # noqa -from .paris import load_paris_iris_geojson # noqa -from .random_time_series import load_random_time_series_data # noqa -from .sf_population_polygons import load_sf_population_polygons # noqa -from .tabbed_dashboard import load_tabbed_dashboard # noqa -from .unicode_test_data import load_unicode_test_data # noqa -from .world_bank import load_world_bank_health_n_pop # noqa +from .bart_lines import load_bart_lines +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 .multi_line import load_multi_line +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 .tabbed_dashboard import load_tabbed_dashboard +from .unicode_test_data import load_unicode_test_data +from .world_bank import load_world_bank_health_n_pop diff --git a/superset/examples/bart_lines.py b/superset/examples/bart_lines.py index 203a60e5c086..0181d1ea92d7 100644 --- a/superset/examples/bart_lines.py +++ b/superset/examples/bart_lines.py @@ -22,6 +22,7 @@ from superset import db from superset.utils.core import get_example_database + from .helpers import get_example_data, TBL diff --git a/superset/examples/birth_names.py b/superset/examples/birth_names.py index 5154549bbf70..bad084d8a5e5 100644 --- a/superset/examples/birth_names.py +++ b/superset/examples/birth_names.py @@ -24,6 +24,7 @@ from superset import db, security_manager from superset.connectors.sqla.models import SqlMetric, TableColumn from superset.utils.core import get_example_database + from .helpers import ( config, Dash, diff --git a/superset/examples/countries.py b/superset/examples/countries.py index 3e90bc74fb58..2bc352901d3f 100644 --- a/superset/examples/countries.py +++ b/superset/examples/countries.py @@ -15,7 +15,9 @@ # specific language governing permissions and limitations # under the License. """This module contains data related to countries and is used for geo mapping""" -countries = [ +from typing import Any, Dict, List + +countries: List[Dict[str, Any]] = [ { "name": "Angola", "area": 1246700, @@ -2488,7 +2490,7 @@ }, ] -all_lookups = {} +all_lookups: Dict[str, Dict[str, Dict[str, Any]]] = {} lookups = ["cioc", "cca2", "cca3", "name"] for lookup in lookups: all_lookups[lookup] = {} diff --git a/superset/examples/country_map.py b/superset/examples/country_map.py index d664e4b161ef..d18b512bbe58 100644 --- a/superset/examples/country_map.py +++ b/superset/examples/country_map.py @@ -23,6 +23,7 @@ from superset import db from superset.connectors.sqla.models import SqlMetric from superset.utils import core as utils + from .helpers import ( get_example_data, get_slice_json, diff --git a/superset/examples/deck.py b/superset/examples/deck.py index f90689d83252..7b80e565a8f1 100644 --- a/superset/examples/deck.py +++ b/superset/examples/deck.py @@ -18,6 +18,7 @@ import json from superset import db + from .helpers import Dash, get_slice_json, merge_slice, Slice, TBL, update_slice_ids COLOR_RED = {"r": 205, "g": 0, "b": 3, "a": 0.82} diff --git a/superset/examples/energy.py b/superset/examples/energy.py index 00dae11a091f..49c15d84162e 100644 --- a/superset/examples/energy.py +++ b/superset/examples/energy.py @@ -25,6 +25,7 @@ from superset import db from superset.connectors.sqla.models import SqlMetric from superset.utils import core as utils + from .helpers import get_example_data, merge_slice, misc_dash_slices, Slice, TBL diff --git a/superset/examples/flights.py b/superset/examples/flights.py index d386ae2d850a..e4db4ca0c429 100644 --- a/superset/examples/flights.py +++ b/superset/examples/flights.py @@ -19,6 +19,7 @@ from superset import db from superset.utils import core as utils + from .helpers import get_example_data, TBL diff --git a/superset/examples/helpers.py b/superset/examples/helpers.py index 28349eb3a92d..b64300efe2ad 100644 --- a/superset/examples/helpers.py +++ b/superset/examples/helpers.py @@ -16,11 +16,12 @@ # under the License. """Loads datasets, dashboards and slices in a new superset instance""" # pylint: disable=C,R,W -from io import BytesIO import json import os -from urllib import request import zlib +from io import BytesIO +from typing import Set +from urllib import request from superset import app, db from superset.connectors.connector_registry import ConnectorRegistry @@ -37,9 +38,9 @@ config = app.config -EXAMPLES_FOLDER = os.path.join(config.get("BASE_DIR"), "examples") +EXAMPLES_FOLDER = os.path.join(config["BASE_DIR"], "examples") -misc_dash_slices = set() # slices assembled in a 'Misc Chart' dashboard +misc_dash_slices: Set[str] = set() # slices assembled in a 'Misc Chart' dashboard def update_slice_ids(layout_dict, slices): diff --git a/superset/examples/long_lat.py b/superset/examples/long_lat.py index 28b8dbbf01ef..40ddf3520e7e 100644 --- a/superset/examples/long_lat.py +++ b/superset/examples/long_lat.py @@ -23,6 +23,7 @@ from superset import db from superset.utils import core as utils + from .helpers import ( get_example_data, get_slice_json, diff --git a/superset/examples/misc_dashboard.py b/superset/examples/misc_dashboard.py index 53aaf6e94687..9ba74db93373 100644 --- a/superset/examples/misc_dashboard.py +++ b/superset/examples/misc_dashboard.py @@ -17,8 +17,8 @@ import json import textwrap - from superset import db + from .helpers import Dash, misc_dash_slices, Slice, update_slice_ids DASH_SLUG = "misc_charts" diff --git a/superset/examples/multi_line.py b/superset/examples/multi_line.py index 390e5f84e85a..d07319e220e8 100644 --- a/superset/examples/multi_line.py +++ b/superset/examples/multi_line.py @@ -17,6 +17,7 @@ import json from superset import db + from .birth_names import load_birth_names from .helpers import merge_slice, misc_dash_slices, Slice from .world_bank import load_world_bank_health_n_pop diff --git a/superset/examples/multiformat_time_series.py b/superset/examples/multiformat_time_series.py index 2875d375c770..4a03f967d3e4 100644 --- a/superset/examples/multiformat_time_series.py +++ b/superset/examples/multiformat_time_series.py @@ -20,6 +20,7 @@ from superset import db from superset.utils.core import get_example_database + from .helpers import ( config, get_example_data, diff --git a/superset/examples/paris.py b/superset/examples/paris.py index a4f252b0343e..482ada6115e6 100644 --- a/superset/examples/paris.py +++ b/superset/examples/paris.py @@ -21,6 +21,7 @@ from superset import db from superset.utils import core as utils + from .helpers import get_example_data, TBL diff --git a/superset/examples/random_time_series.py b/superset/examples/random_time_series.py index 26dd00398453..2e8f51f7bf6a 100644 --- a/superset/examples/random_time_series.py +++ b/superset/examples/random_time_series.py @@ -20,6 +20,7 @@ from superset import db from superset.utils import core as utils + from .helpers import config, get_example_data, get_slice_json, merge_slice, Slice, TBL diff --git a/superset/examples/sf_population_polygons.py b/superset/examples/sf_population_polygons.py index 0aee4e27141e..a4281d9225bc 100644 --- a/superset/examples/sf_population_polygons.py +++ b/superset/examples/sf_population_polygons.py @@ -21,6 +21,7 @@ from superset import db from superset.utils import core as utils + from .helpers import get_example_data, TBL diff --git a/superset/examples/tabbed_dashboard.py b/superset/examples/tabbed_dashboard.py index ab4552cf36f5..8b6969489d6e 100644 --- a/superset/examples/tabbed_dashboard.py +++ b/superset/examples/tabbed_dashboard.py @@ -20,6 +20,7 @@ import textwrap from superset import db + from .helpers import Dash, Slice, update_slice_ids diff --git a/superset/examples/unicode_test_data.py b/superset/examples/unicode_test_data.py index 3f91f3f3df18..1c88456c80d1 100644 --- a/superset/examples/unicode_test_data.py +++ b/superset/examples/unicode_test_data.py @@ -23,6 +23,7 @@ from superset import db from superset.utils import core as utils + from .helpers import ( config, Dash, diff --git a/superset/examples/world_bank.py b/superset/examples/world_bank.py index fbe45127a306..699eb70450b8 100644 --- a/superset/examples/world_bank.py +++ b/superset/examples/world_bank.py @@ -27,6 +27,7 @@ from superset import db from superset.connectors.sqla.models import SqlMetric from superset.utils import core as utils + from .helpers import ( config, Dash, diff --git a/superset/jinja_context.py b/superset/jinja_context.py index 2fdcb1424d72..c48218a54de5 100644 --- a/superset/jinja_context.py +++ b/superset/jinja_context.py @@ -16,13 +16,13 @@ # under the License. # pylint: disable=C,R,W """Defines the templating context for SQL Lab""" -from datetime import datetime, timedelta import inspect import json import random import time -from typing import Any, List, Optional, Tuple import uuid +from datetime import datetime, timedelta +from typing import Any, List, Optional, Tuple from dateutil.relativedelta import relativedelta from flask import g, request diff --git a/superset/migrations/env.py b/superset/migrations/env.py index a1306256050b..7e647d9063e5 100755 --- a/superset/migrations/env.py +++ b/superset/migrations/env.py @@ -19,6 +19,7 @@ from logging.config import fileConfig from alembic import context +from flask import current_app from flask_appbuilder import Base from sqlalchemy import engine_from_config, pool @@ -31,10 +32,6 @@ fileConfig(config.config_file_name) logger = logging.getLogger("alembic.env") -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -from flask import current_app config.set_main_option( "sqlalchemy.url", current_app.config.get("SQLALCHEMY_DATABASE_URI") diff --git a/superset/migrations/versions/0b1f1ab473c0_add_extra_column_to_query.py b/superset/migrations/versions/0b1f1ab473c0_add_extra_column_to_query.py index c68820537cfc..f131c8454e92 100644 --- a/superset/migrations/versions/0b1f1ab473c0_add_extra_column_to_query.py +++ b/superset/migrations/versions/0b1f1ab473c0_add_extra_column_to_query.py @@ -21,8 +21,8 @@ Create Date: 2018-11-05 08:42:56.181012 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "0b1f1ab473c0" diff --git a/superset/migrations/versions/0c5070e96b57_add_user_attributes_table.py b/superset/migrations/versions/0c5070e96b57_add_user_attributes_table.py index 328db6af96e0..a72bf04aa6fb 100644 --- a/superset/migrations/versions/0c5070e96b57_add_user_attributes_table.py +++ b/superset/migrations/versions/0c5070e96b57_add_user_attributes_table.py @@ -26,8 +26,8 @@ revision = "0c5070e96b57" down_revision = "7fcdcde0761c" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/11c737c17cc6_deprecate_restricted_metrics.py b/superset/migrations/versions/11c737c17cc6_deprecate_restricted_metrics.py index 9ea8218114dd..8bb1c18c9969 100644 --- a/superset/migrations/versions/11c737c17cc6_deprecate_restricted_metrics.py +++ b/superset/migrations/versions/11c737c17cc6_deprecate_restricted_metrics.py @@ -21,9 +21,8 @@ Create Date: 2019-09-08 21:50:58.200229 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "11c737c17cc6" diff --git a/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py b/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py index 32fe74f5e3b6..3f8daa91e056 100644 --- a/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py +++ b/superset/migrations/versions/1226819ee0e3_fix_wrong_constraint_on_table_columns.py @@ -21,10 +21,12 @@ Create Date: 2016-05-27 15:03:32.980343 """ +import logging + from alembic import op + from superset import db from superset.utils.core import generic_find_constraint_name -import logging # revision identifiers, used by Alembic. revision = "1226819ee0e3" diff --git a/superset/migrations/versions/1296d28ec131_druid_exports.py b/superset/migrations/versions/1296d28ec131_druid_exports.py index 993e1fd46dcf..1aa34f42fccc 100644 --- a/superset/migrations/versions/1296d28ec131_druid_exports.py +++ b/superset/migrations/versions/1296d28ec131_druid_exports.py @@ -26,8 +26,8 @@ revision = "1296d28ec131" down_revision = "6414e83d82b7" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/12d55656cbca_is_featured.py b/superset/migrations/versions/12d55656cbca_is_featured.py index 78304facc2b9..229e918cb731 100644 --- a/superset/migrations/versions/12d55656cbca_is_featured.py +++ b/superset/migrations/versions/12d55656cbca_is_featured.py @@ -26,8 +26,8 @@ revision = "12d55656cbca" down_revision = "55179c7f25c7" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/130915240929_is_sqllab_viz_flow.py b/superset/migrations/versions/130915240929_is_sqllab_viz_flow.py index fa2065fb12d4..f615294f3450 100644 --- a/superset/migrations/versions/130915240929_is_sqllab_viz_flow.py +++ b/superset/migrations/versions/130915240929_is_sqllab_viz_flow.py @@ -21,8 +21,8 @@ Create Date: 2018-04-03 08:19:34.098789 """ -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/18dc26817ad2_.py b/superset/migrations/versions/18dc26817ad2_.py index e02e5f27504c..2c5ffdfdc0f0 100644 --- a/superset/migrations/versions/18dc26817ad2_.py +++ b/superset/migrations/versions/18dc26817ad2_.py @@ -26,8 +26,8 @@ revision = "18dc26817ad2" down_revision = ("8b70aa3d0f87", "a33a03f16c4a") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py b/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py index df352c9395f0..a39b6bc82b05 100644 --- a/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py +++ b/superset/migrations/versions/18e88e1cc004_making_audit_nullable.py @@ -21,8 +21,8 @@ Create Date: 2016-03-13 21:30:24.833107 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "18e88e1cc004" diff --git a/superset/migrations/versions/19a814813610_adding_metric_warning_text.py b/superset/migrations/versions/19a814813610_adding_metric_warning_text.py index 7ad8872a7cba..f62db5f5fe0f 100644 --- a/superset/migrations/versions/19a814813610_adding_metric_warning_text.py +++ b/superset/migrations/versions/19a814813610_adding_metric_warning_text.py @@ -26,8 +26,8 @@ revision = "19a814813610" down_revision = "ca69c70ec99b" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/1a1d627ebd8e_position_json.py b/superset/migrations/versions/1a1d627ebd8e_position_json.py index ed380f4f9fae..f6b79db435c5 100644 --- a/superset/migrations/versions/1a1d627ebd8e_position_json.py +++ b/superset/migrations/versions/1a1d627ebd8e_position_json.py @@ -23,8 +23,8 @@ """ -from alembic import op import sqlalchemy as sa +from alembic import op from superset.utils.core import MediumText diff --git a/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py b/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py index 2f73202fea0c..d17a7e62c3f4 100644 --- a/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py +++ b/superset/migrations/versions/1a48a5411020_adding_slug_to_dash.py @@ -26,8 +26,8 @@ revision = "1a48a5411020" down_revision = "289ce07647b" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/1d2ddd543133_log_dt.py b/superset/migrations/versions/1d2ddd543133_log_dt.py index 887a708af648..b6d8492a13de 100644 --- a/superset/migrations/versions/1d2ddd543133_log_dt.py +++ b/superset/migrations/versions/1d2ddd543133_log_dt.py @@ -25,8 +25,8 @@ revision = "1d2ddd543133" down_revision = "d2424a248d63" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/1d9e835a84f9_.py b/superset/migrations/versions/1d9e835a84f9_.py index ad328827675f..0929dfff3987 100644 --- a/superset/migrations/versions/1d9e835a84f9_.py +++ b/superset/migrations/versions/1d9e835a84f9_.py @@ -21,8 +21,8 @@ Create Date: 2018-07-16 18:04:07.764659 """ -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy.sql import expression # revision identifiers, used by Alembic. diff --git a/superset/migrations/versions/1e2841a4128_.py b/superset/migrations/versions/1e2841a4128_.py index e5e482a06f65..5bc8f81265b2 100644 --- a/superset/migrations/versions/1e2841a4128_.py +++ b/superset/migrations/versions/1e2841a4128_.py @@ -26,8 +26,8 @@ revision = "1e2841a4128" down_revision = "5a7bad26f2a7" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/258b5280a45e_form_strip_leading_and_trailing_whitespace.py b/superset/migrations/versions/258b5280a45e_form_strip_leading_and_trailing_whitespace.py index e0dd954f13f6..ddf729543b80 100644 --- a/superset/migrations/versions/258b5280a45e_form_strip_leading_and_trailing_whitespace.py +++ b/superset/migrations/versions/258b5280a45e_form_strip_leading_and_trailing_whitespace.py @@ -22,9 +22,10 @@ """ import re + from alembic import op -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db from superset.utils.core import MediumText diff --git a/superset/migrations/versions/2591d77e9831_user_id.py b/superset/migrations/versions/2591d77e9831_user_id.py index 68dd16dba3c6..e22b50559b35 100644 --- a/superset/migrations/versions/2591d77e9831_user_id.py +++ b/superset/migrations/versions/2591d77e9831_user_id.py @@ -26,8 +26,8 @@ revision = "2591d77e9831" down_revision = "12d55656cbca" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/27ae655e4247_make_creator_owners.py b/superset/migrations/versions/27ae655e4247_make_creator_owners.py index 6d9a69e421a8..561a8ca9a544 100644 --- a/superset/migrations/versions/27ae655e4247_make_creator_owners.py +++ b/superset/migrations/versions/27ae655e4247_make_creator_owners.py @@ -27,12 +27,13 @@ down_revision = "d8bc074f7aad" from alembic import op -from superset import db -from sqlalchemy.ext.declarative import declarative_base +from flask_appbuilder import Model from flask_appbuilder.models.mixins import AuditMixin +from sqlalchemy import Column, ForeignKey, Integer, Table +from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship -from flask_appbuilder import Model -from sqlalchemy import Column, Integer, ForeignKey, Table + +from superset import db Base = declarative_base() diff --git a/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py b/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py index d3ab8120825a..bc47e6067993 100644 --- a/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py +++ b/superset/migrations/versions/289ce07647b_add_encrypted_password_field.py @@ -22,8 +22,8 @@ """ -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy_utils import EncryptedType # revision identifiers, used by Alembic. diff --git a/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py b/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py index 4cb078285dca..8ddd23da4085 100644 --- a/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py +++ b/superset/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py @@ -26,8 +26,8 @@ revision = "2929af7925ed" down_revision = "1e2841a4128" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/2fcdcb35e487_saved_queries.py b/superset/migrations/versions/2fcdcb35e487_saved_queries.py index cd2613986676..581a69dc5ef6 100644 --- a/superset/migrations/versions/2fcdcb35e487_saved_queries.py +++ b/superset/migrations/versions/2fcdcb35e487_saved_queries.py @@ -21,8 +21,8 @@ Create Date: 2017-03-29 15:04:35.734190 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "2fcdcb35e487" diff --git a/superset/migrations/versions/30bb17c0dc76_.py b/superset/migrations/versions/30bb17c0dc76_.py index 29aa6f5e180d..6a642670152d 100644 --- a/superset/migrations/versions/30bb17c0dc76_.py +++ b/superset/migrations/versions/30bb17c0dc76_.py @@ -28,8 +28,8 @@ from datetime import date -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/315b3f4da9b0_adding_log_model.py b/superset/migrations/versions/315b3f4da9b0_adding_log_model.py index 6173b4b03fe7..d19c243ace6b 100644 --- a/superset/migrations/versions/315b3f4da9b0_adding_log_model.py +++ b/superset/migrations/versions/315b3f4da9b0_adding_log_model.py @@ -26,8 +26,8 @@ revision = "315b3f4da9b0" down_revision = "1a48a5411020" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/33d996bcc382_update_slice_model.py b/superset/migrations/versions/33d996bcc382_update_slice_model.py index f0a72b3a46af..f4373a3f383e 100644 --- a/superset/migrations/versions/33d996bcc382_update_slice_model.py +++ b/superset/migrations/versions/33d996bcc382_update_slice_model.py @@ -14,12 +14,6 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from alembic import op -import sqlalchemy as sa -from superset import db -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import Column, Integer, String - """update slice model Revision ID: 33d996bcc382 @@ -27,6 +21,12 @@ Create Date: 2016-09-07 23:50:59.366779 """ +import sqlalchemy as sa +from alembic import op +from sqlalchemy import Column, Integer, String +from sqlalchemy.ext.declarative import declarative_base + +from superset import db # revision identifiers, used by Alembic. revision = "33d996bcc382" diff --git a/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py b/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py index ad1414e6cef0..dd199468e5ef 100644 --- a/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py +++ b/superset/migrations/versions/3b626e2a6783_sync_db_with_models.py @@ -24,13 +24,15 @@ Create Date: 2016-09-22 10:21:33.618976 """ -from alembic import op -from superset import db -from superset.utils.core import generic_find_constraint_name import logging + import sqlalchemy as sa +from alembic import op from sqlalchemy.dialects import mysql +from superset import db +from superset.utils.core import generic_find_constraint_name + # revision identifiers, used by Alembic. revision = "3b626e2a6783" down_revision = "eca4694defa7" diff --git a/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py b/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py index f6bc3df1938b..e94de6147f7b 100644 --- a/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py +++ b/superset/migrations/versions/3c3ffe173e4f_add_sql_string_to_table.py @@ -26,8 +26,8 @@ revision = "3c3ffe173e4f" down_revision = "ad82a75afd82" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/3dda56f1c4c6_migrate_num_period_compare_and_period_.py b/superset/migrations/versions/3dda56f1c4c6_migrate_num_period_compare_and_period_.py index 5e71c36c6216..ca4de4e3e2ff 100644 --- a/superset/migrations/versions/3dda56f1c4c6_migrate_num_period_compare_and_period_.py +++ b/superset/migrations/versions/3dda56f1c4c6_migrate_num_period_compare_and_period_.py @@ -27,10 +27,10 @@ import datetime import json -from alembic import op import isodate -from sqlalchemy.ext.declarative import declarative_base +from alembic import op from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db from superset.utils.core import parse_human_timedelta diff --git a/superset/migrations/versions/3e1b21cd94a4_change_owner_to_m2m_relation_on_.py b/superset/migrations/versions/3e1b21cd94a4_change_owner_to_m2m_relation_on_.py index 4d5a4ee968b6..332fe88e535f 100644 --- a/superset/migrations/versions/3e1b21cd94a4_change_owner_to_m2m_relation_on_.py +++ b/superset/migrations/versions/3e1b21cd94a4_change_owner_to_m2m_relation_on_.py @@ -22,6 +22,9 @@ """ +import sqlalchemy as sa +from alembic import op + # revision identifiers, used by Alembic. from superset import db from superset.utils.core import generic_find_fk_constraint_name @@ -29,9 +32,6 @@ revision = "3e1b21cd94a4" down_revision = "6c7537a6004a" -from alembic import op -import sqlalchemy as sa - sqlatable_user = sa.Table( "sqlatable_user", diff --git a/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py b/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py index 3d4ae8dd40d0..9d47815e99db 100644 --- a/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py +++ b/superset/migrations/versions/41f6a59a61f2_database_options_for_sql_lab.py @@ -21,8 +21,8 @@ Create Date: 2016-08-31 10:26:37.969107 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "41f6a59a61f2" diff --git a/superset/migrations/versions/430039611635_log_more.py b/superset/migrations/versions/430039611635_log_more.py index 242cd8a1b4dc..50a60dc9196c 100644 --- a/superset/migrations/versions/430039611635_log_more.py +++ b/superset/migrations/versions/430039611635_log_more.py @@ -21,8 +21,8 @@ Create Date: 2016-02-10 08:47:28.950891 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "430039611635" diff --git a/superset/migrations/versions/43df8de3a5f4_dash_json.py b/superset/migrations/versions/43df8de3a5f4_dash_json.py index 416af40495db..9bbfde91aec3 100644 --- a/superset/migrations/versions/43df8de3a5f4_dash_json.py +++ b/superset/migrations/versions/43df8de3a5f4_dash_json.py @@ -26,8 +26,8 @@ revision = "43df8de3a5f4" down_revision = "7dbf98566af7" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/4451805bbaa1_remove_double_percents.py b/superset/migrations/versions/4451805bbaa1_remove_double_percents.py index 3a29ca3d46f0..bf7a74559864 100644 --- a/superset/migrations/versions/4451805bbaa1_remove_double_percents.py +++ b/superset/migrations/versions/4451805bbaa1_remove_double_percents.py @@ -27,10 +27,11 @@ down_revision = "bddc498dd179" -from alembic import op import json -from sqlalchemy.ext.declarative import declarative_base + +from alembic import op from sqlalchemy import Column, create_engine, ForeignKey, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py b/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py index df0a9e6763b5..338750255c30 100644 --- a/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py +++ b/superset/migrations/versions/4500485bde7d_allow_run_sync_async.py @@ -26,8 +26,8 @@ revision = "4500485bde7d" down_revision = "41f6a59a61f2" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/45e7da7cfeba_.py b/superset/migrations/versions/45e7da7cfeba_.py index 5b855e9f4880..888483de0310 100644 --- a/superset/migrations/versions/45e7da7cfeba_.py +++ b/superset/migrations/versions/45e7da7cfeba_.py @@ -26,8 +26,8 @@ revision = "45e7da7cfeba" down_revision = ("e553e78e90c5", "c82ee8a39623") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/46ba6aaaac97_.py b/superset/migrations/versions/46ba6aaaac97_.py index a7cf7132fe1f..17f9b3d730df 100644 --- a/superset/migrations/versions/46ba6aaaac97_.py +++ b/superset/migrations/versions/46ba6aaaac97_.py @@ -26,8 +26,8 @@ revision = "46ba6aaaac97" down_revision = ("705732c70154", "e3970889f38e") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/46f444d8b9b7_remove_coordinator_from_druid_cluster_.py b/superset/migrations/versions/46f444d8b9b7_remove_coordinator_from_druid_cluster_.py index 895e6051acda..edeee40698a9 100644 --- a/superset/migrations/versions/46f444d8b9b7_remove_coordinator_from_druid_cluster_.py +++ b/superset/migrations/versions/46f444d8b9b7_remove_coordinator_from_druid_cluster_.py @@ -21,8 +21,8 @@ Create Date: 2018-11-26 00:01:04.781119 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "46f444d8b9b7" diff --git a/superset/migrations/versions/472d2f73dfd4_.py b/superset/migrations/versions/472d2f73dfd4_.py index bb77dee3da62..0bf7ba8bfc67 100644 --- a/superset/migrations/versions/472d2f73dfd4_.py +++ b/superset/migrations/versions/472d2f73dfd4_.py @@ -26,8 +26,8 @@ revision = "472d2f73dfd4" down_revision = ("19a814813610", "a9c47e2c1547") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/4736ec66ce19_.py b/superset/migrations/versions/4736ec66ce19_.py index a3d6b477d5ff..f2d04f9a3671 100644 --- a/superset/migrations/versions/4736ec66ce19_.py +++ b/superset/migrations/versions/4736ec66ce19_.py @@ -24,8 +24,8 @@ import logging -from alembic import op import sqlalchemy as sa +from alembic import op from superset.utils.core import ( generic_find_fk_constraint_name, diff --git a/superset/migrations/versions/4e6a06bad7a8_init.py b/superset/migrations/versions/4e6a06bad7a8_init.py index 0986f6f805c5..31d46b8798ff 100644 --- a/superset/migrations/versions/4e6a06bad7a8_init.py +++ b/superset/migrations/versions/4e6a06bad7a8_init.py @@ -26,8 +26,8 @@ revision = "4e6a06bad7a8" down_revision = None -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py b/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py index 37eeb9440623..b04cfefa6b27 100644 --- a/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py +++ b/superset/migrations/versions/4fa88fe24e94_owners_many_to_many.py @@ -25,8 +25,8 @@ revision = "4fa88fe24e94" down_revision = "b4456560d4f3" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/525c854f0005_log_this_plus.py b/superset/migrations/versions/525c854f0005_log_this_plus.py index 5b5d6c2ef127..354765072694 100644 --- a/superset/migrations/versions/525c854f0005_log_this_plus.py +++ b/superset/migrations/versions/525c854f0005_log_this_plus.py @@ -26,8 +26,8 @@ revision = "525c854f0005" down_revision = "e46f2d27a08e" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/55179c7f25c7_sqla_descr.py b/superset/migrations/versions/55179c7f25c7_sqla_descr.py index 404030904653..01e8950bde8f 100644 --- a/superset/migrations/versions/55179c7f25c7_sqla_descr.py +++ b/superset/migrations/versions/55179c7f25c7_sqla_descr.py @@ -26,8 +26,8 @@ revision = "55179c7f25c7" down_revision = "315b3f4da9b0" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/55e910a74826_add_metadata_column_to_annotation_model_.py b/superset/migrations/versions/55e910a74826_add_metadata_column_to_annotation_model_.py index 113fdaaf14ea..b819dbfd2007 100644 --- a/superset/migrations/versions/55e910a74826_add_metadata_column_to_annotation_model_.py +++ b/superset/migrations/versions/55e910a74826_add_metadata_column_to_annotation_model_.py @@ -26,8 +26,8 @@ revision = "55e910a74826" down_revision = "1a1d627ebd8e" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/5a7bad26f2a7_.py b/superset/migrations/versions/5a7bad26f2a7_.py index 23419074edfd..36bb567b1dcd 100644 --- a/superset/migrations/versions/5a7bad26f2a7_.py +++ b/superset/migrations/versions/5a7bad26f2a7_.py @@ -26,8 +26,8 @@ revision = "5a7bad26f2a7" down_revision = "4e6a06bad7a8" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/5ccf602336a0_.py b/superset/migrations/versions/5ccf602336a0_.py index 7c0679132560..464648219a94 100644 --- a/superset/migrations/versions/5ccf602336a0_.py +++ b/superset/migrations/versions/5ccf602336a0_.py @@ -25,8 +25,8 @@ revision = "5ccf602336a0" down_revision = ("130915240929", "c9495751e314") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py b/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py index 674584083ec5..11d77f51a0a9 100644 --- a/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py +++ b/superset/migrations/versions/5e4a03ef0bf0_add_request_access_model.py @@ -21,8 +21,8 @@ Create Date: 2016-09-09 17:39:57.846309 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "5e4a03ef0bf0" diff --git a/superset/migrations/versions/6414e83d82b7_.py b/superset/migrations/versions/6414e83d82b7_.py index 9fdf52db3db4..22688add449c 100644 --- a/superset/migrations/versions/6414e83d82b7_.py +++ b/superset/migrations/versions/6414e83d82b7_.py @@ -25,8 +25,8 @@ revision = "6414e83d82b7" down_revision = ("525c854f0005", "f1f2d4af5b90") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/65903709c321_allow_dml.py b/superset/migrations/versions/65903709c321_allow_dml.py index 2008e01ebee6..0c72d418df43 100644 --- a/superset/migrations/versions/65903709c321_allow_dml.py +++ b/superset/migrations/versions/65903709c321_allow_dml.py @@ -24,13 +24,13 @@ import logging +import sqlalchemy as sa +from alembic import op + # revision identifiers, used by Alembic. revision = "65903709c321" down_revision = "4500485bde7d" -from alembic import op -import sqlalchemy as sa - def upgrade(): op.add_column("dbs", sa.Column("allow_dml", sa.Boolean(), nullable=True)) diff --git a/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py b/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py index b1d66d1fc767..6073e8b84c91 100644 --- a/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py +++ b/superset/migrations/versions/67a6ac9b727b_update_spatial_params.py @@ -24,8 +24,8 @@ import json from alembic import op -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/6c7537a6004a_models_for_email_reports.py b/superset/migrations/versions/6c7537a6004a_models_for_email_reports.py index 1a6055314161..b4229b161508 100644 --- a/superset/migrations/versions/6c7537a6004a_models_for_email_reports.py +++ b/superset/migrations/versions/6c7537a6004a_models_for_email_reports.py @@ -26,8 +26,8 @@ revision = "6c7537a6004a" down_revision = "a61b40f9f57f" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/705732c70154_.py b/superset/migrations/versions/705732c70154_.py index cda7abf4f9c9..36003a0bc854 100644 --- a/superset/migrations/versions/705732c70154_.py +++ b/superset/migrations/versions/705732c70154_.py @@ -25,8 +25,8 @@ revision = "705732c70154" down_revision = ("4451805bbaa1", "1d9e835a84f9") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py b/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py index 9f1b0a9aab70..8723d1490b34 100644 --- a/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py +++ b/superset/migrations/versions/732f1c06bcbf_add_fetch_values_predicate.py @@ -26,8 +26,8 @@ revision = "732f1c06bcbf" down_revision = "d6db5a5cdb5d" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/7467e77870e4_remove_aggs.py b/superset/migrations/versions/7467e77870e4_remove_aggs.py index d561514dd1f7..7158105e9b38 100644 --- a/superset/migrations/versions/7467e77870e4_remove_aggs.py +++ b/superset/migrations/versions/7467e77870e4_remove_aggs.py @@ -21,8 +21,8 @@ Create Date: 2018-07-22 08:50:01.078218 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "7467e77870e4" diff --git a/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py b/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py index 943c850290b5..fdb7b14077d2 100644 --- a/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py +++ b/superset/migrations/versions/763d4b211ec9_fixing_audit_fk.py @@ -26,8 +26,8 @@ revision = "763d4b211ec9" down_revision = "d2424a248d63" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/7dbf98566af7_slice_description.py b/superset/migrations/versions/7dbf98566af7_slice_description.py index 0020b9b0c962..eb926ccd7bd3 100644 --- a/superset/migrations/versions/7dbf98566af7_slice_description.py +++ b/superset/migrations/versions/7dbf98566af7_slice_description.py @@ -26,8 +26,8 @@ revision = "7dbf98566af7" down_revision = "8e80a26a31db" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py b/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py index 024326cf0944..cc59aafb5f6f 100644 --- a/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py +++ b/superset/migrations/versions/7e3ddad2a00b_results_key_to_query.py @@ -26,8 +26,8 @@ revision = "7e3ddad2a00b" down_revision = "b46fa1b0b39e" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/7fcdcde0761c_.py b/superset/migrations/versions/7fcdcde0761c_.py index ac066417fbc5..02021799e96e 100644 --- a/superset/migrations/versions/7fcdcde0761c_.py +++ b/superset/migrations/versions/7fcdcde0761c_.py @@ -26,8 +26,8 @@ import json import re -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/80a67c5192fa_single_pie_chart_metric.py b/superset/migrations/versions/80a67c5192fa_single_pie_chart_metric.py index 9085cbaf1509..a24247a0bd3b 100644 --- a/superset/migrations/versions/80a67c5192fa_single_pie_chart_metric.py +++ b/superset/migrations/versions/80a67c5192fa_single_pie_chart_metric.py @@ -30,12 +30,11 @@ import json from alembic import op -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db - Base = declarative_base() diff --git a/superset/migrations/versions/80aa3f04bc82_add_parent_ids_in_dashboard_layout.py b/superset/migrations/versions/80aa3f04bc82_add_parent_ids_in_dashboard_layout.py index c731f0c05b8b..1e29855ed3f5 100644 --- a/superset/migrations/versions/80aa3f04bc82_add_parent_ids_in_dashboard_layout.py +++ b/superset/migrations/versions/80aa3f04bc82_add_parent_ids_in_dashboard_layout.py @@ -24,12 +24,11 @@ import json import logging +import sqlalchemy as sa from alembic import op from sqlalchemy import Column, Integer, Text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship -from alembic import op -import sqlalchemy as sa from superset import db diff --git a/superset/migrations/versions/836c0bf75904_cache_timeouts.py b/superset/migrations/versions/836c0bf75904_cache_timeouts.py index 0c0e7bedb954..e4b07af37526 100644 --- a/superset/migrations/versions/836c0bf75904_cache_timeouts.py +++ b/superset/migrations/versions/836c0bf75904_cache_timeouts.py @@ -25,8 +25,8 @@ revision = "836c0bf75904" down_revision = "18e88e1cc004" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py b/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py index b74905048dff..c4497ce287af 100644 --- a/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py +++ b/superset/migrations/versions/867bf4f117f9_adding_extra_field_to_database_model.py @@ -25,8 +25,8 @@ revision = "867bf4f117f9" down_revision = "fee7b758c130" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/8b70aa3d0f87_.py b/superset/migrations/versions/8b70aa3d0f87_.py index 0bb9d20658e7..484f2d0a09f3 100644 --- a/superset/migrations/versions/8b70aa3d0f87_.py +++ b/superset/migrations/versions/8b70aa3d0f87_.py @@ -26,8 +26,8 @@ revision = "8b70aa3d0f87" down_revision = ("fbd55e0f83eb", "fb13d49b72f9") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/8e80a26a31db_.py b/superset/migrations/versions/8e80a26a31db_.py index ed1098ad2b3a..2f3db103ffb3 100644 --- a/superset/migrations/versions/8e80a26a31db_.py +++ b/superset/migrations/versions/8e80a26a31db_.py @@ -25,8 +25,8 @@ revision = "8e80a26a31db" down_revision = "2591d77e9831" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/937d04c16b64_update_datasources.py b/superset/migrations/versions/937d04c16b64_update_datasources.py index 4a01845721bc..5a99d7af529a 100644 --- a/superset/migrations/versions/937d04c16b64_update_datasources.py +++ b/superset/migrations/versions/937d04c16b64_update_datasources.py @@ -26,8 +26,8 @@ revision = "937d04c16b64" down_revision = "d94d33dbe938" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/956a063c52b3_adjusting_key_length.py b/superset/migrations/versions/956a063c52b3_adjusting_key_length.py index b606d6ba9df4..4e945ef0b5bd 100644 --- a/superset/migrations/versions/956a063c52b3_adjusting_key_length.py +++ b/superset/migrations/versions/956a063c52b3_adjusting_key_length.py @@ -21,8 +21,8 @@ Create Date: 2016-05-11 17:28:32.407340 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "956a063c52b3" diff --git a/superset/migrations/versions/960c69cb1f5b_.py b/superset/migrations/versions/960c69cb1f5b_.py index 908954bc8f45..6ff1fc9f3dfd 100644 --- a/superset/migrations/versions/960c69cb1f5b_.py +++ b/superset/migrations/versions/960c69cb1f5b_.py @@ -26,8 +26,8 @@ revision = "960c69cb1f5b" down_revision = "27ae655e4247" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/979c03af3341_.py b/superset/migrations/versions/979c03af3341_.py index 0c1a4d440f1e..d97ba8dcb15e 100644 --- a/superset/migrations/versions/979c03af3341_.py +++ b/superset/migrations/versions/979c03af3341_.py @@ -26,8 +26,8 @@ revision = "979c03af3341" down_revision = ("db527d8c4c78", "ea033256294a") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py b/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py index 7d7ee687ecd9..d9253636b22c 100644 --- a/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py +++ b/superset/migrations/versions/a2d606a761d9_adding_favstar_model.py @@ -26,8 +26,8 @@ revision = "a2d606a761d9" down_revision = "18e88e1cc004" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/a33a03f16c4a_add_extra_column_to_savedquery.py b/superset/migrations/versions/a33a03f16c4a_add_extra_column_to_savedquery.py index 4725cc2fe773..b7f272256fdb 100644 --- a/superset/migrations/versions/a33a03f16c4a_add_extra_column_to_savedquery.py +++ b/superset/migrations/versions/a33a03f16c4a_add_extra_column_to_savedquery.py @@ -41,8 +41,8 @@ revision = "a33a03f16c4a" down_revision = "fb13d49b72f9" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/a61b40f9f57f_remove_allow_run_sync.py b/superset/migrations/versions/a61b40f9f57f_remove_allow_run_sync.py index 6744b8176b59..52ec967fb872 100644 --- a/superset/migrations/versions/a61b40f9f57f_remove_allow_run_sync.py +++ b/superset/migrations/versions/a61b40f9f57f_remove_allow_run_sync.py @@ -21,8 +21,8 @@ Create Date: 2018-11-27 11:53:17.512627 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "a61b40f9f57f" diff --git a/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py b/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py index d7a84b9273ec..27872751cd97 100644 --- a/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py +++ b/superset/migrations/versions/a65458420354_add_result_backend_time_logging.py @@ -21,8 +21,8 @@ Create Date: 2017-04-25 10:00:58.053120 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "a65458420354" diff --git a/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py b/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py index fc1e97225fc0..661fed8fae48 100644 --- a/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py +++ b/superset/migrations/versions/a6c18f869a4e_query_start_running_time.py @@ -21,8 +21,8 @@ Create Date: 2017-03-28 11:28:41.387182 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "a6c18f869a4e" diff --git a/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py b/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py index e655a60e1609..5e1ae9a25867 100644 --- a/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py +++ b/superset/migrations/versions/a99f2f7c195a_rewriting_url_from_shortner_with_new_.py @@ -26,12 +26,14 @@ revision = "a99f2f7c195a" down_revision = "db0c65b146bd" -from alembic import op import json +from urllib import parse + import sqlalchemy as sa -from superset import db +from alembic import op from sqlalchemy.ext.declarative import declarative_base -from urllib import parse + +from superset import db Base = declarative_base() diff --git a/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py b/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py index f1ae605a9c2c..f2fc304a0e71 100644 --- a/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py +++ b/superset/migrations/versions/a9c47e2c1547_add_impersonate_user_to_dbs.py @@ -25,8 +25,8 @@ revision = "a9c47e2c1547" down_revision = "ca69c70ec99b" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py b/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py index b3dc664a93fb..b2dcc402d34c 100644 --- a/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py +++ b/superset/migrations/versions/ab3d66c4246e_add_cache_timeout_to_druid_cluster.py @@ -26,8 +26,8 @@ revision = "ab3d66c4246e" down_revision = "eca4694defa7" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py b/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py index fafa0f026f97..2e1a49aaa6bf 100644 --- a/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py +++ b/superset/migrations/versions/ad4d656d92bc_add_avg_metric.py @@ -26,8 +26,8 @@ revision = "ad4d656d92bc" down_revision = "7e3ddad2a00b" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/ad82a75afd82_add_query_model.py b/superset/migrations/versions/ad82a75afd82_add_query_model.py index d86630543069..26d190a87ce0 100644 --- a/superset/migrations/versions/ad82a75afd82_add_query_model.py +++ b/superset/migrations/versions/ad82a75afd82_add_query_model.py @@ -26,8 +26,8 @@ revision = "ad82a75afd82" down_revision = "f162a1dea4c4" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/afb7730f6a9c_remove_empty_filters.py b/superset/migrations/versions/afb7730f6a9c_remove_empty_filters.py index 63b2f442782a..e4cc3a64aaa9 100644 --- a/superset/migrations/versions/afb7730f6a9c_remove_empty_filters.py +++ b/superset/migrations/versions/afb7730f6a9c_remove_empty_filters.py @@ -26,10 +26,11 @@ revision = "afb7730f6a9c" down_revision = "c5756bec8b47" -from alembic import op import json -from sqlalchemy.ext.declarative import declarative_base + +from alembic import op from sqlalchemy import Column, Integer, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/afc69274c25a_alter_sql_column_data_type_in_query_mysql_table.py b/superset/migrations/versions/afc69274c25a_alter_sql_column_data_type_in_query_mysql_table.py index be643b25be41..5d3a76798df8 100644 --- a/superset/migrations/versions/afc69274c25a_alter_sql_column_data_type_in_query_mysql_table.py +++ b/superset/migrations/versions/afc69274c25a_alter_sql_column_data_type_in_query_mysql_table.py @@ -22,10 +22,10 @@ Create Date: 2019-05-06 14:30:26.181449 """ +import sqlalchemy as sa from alembic import op from sqlalchemy.databases import mysql from sqlalchemy.dialects.mysql.base import MySQLDialect -import sqlalchemy as sa # revision identifiers, used by Alembic. revision = "afc69274c25a" diff --git a/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py b/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py index 0fe4b948f336..3cd00ae9eb63 100644 --- a/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py +++ b/superset/migrations/versions/b318dfe5fb6c_adding_verbose_name_to_druid_column.py @@ -26,8 +26,8 @@ revision = "b318dfe5fb6c" down_revision = "d6db5a5cdb5d" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py b/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py index dfd86eee2f9b..8bc309cc30f3 100644 --- a/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py +++ b/superset/migrations/versions/b46fa1b0b39e_add_params_to_tables.py @@ -26,9 +26,10 @@ revision = "b46fa1b0b39e" down_revision = "ef8843b41dac" -from alembic import op import logging + import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/b4a38aa87893_deprecate_database_expression.py b/superset/migrations/versions/b4a38aa87893_deprecate_database_expression.py index 46c2ad1d7e04..f8696727e9af 100644 --- a/superset/migrations/versions/b4a38aa87893_deprecate_database_expression.py +++ b/superset/migrations/versions/b4a38aa87893_deprecate_database_expression.py @@ -26,8 +26,8 @@ revision = "b4a38aa87893" down_revision = "ab8c66efdd01" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/b6fa807eac07_make_names_non_nullable.py b/superset/migrations/versions/b6fa807eac07_make_names_non_nullable.py index 36d5bcea3762..b0b9529087ab 100644 --- a/superset/migrations/versions/b6fa807eac07_make_names_non_nullable.py +++ b/superset/migrations/versions/b6fa807eac07_make_names_non_nullable.py @@ -21,8 +21,8 @@ Create Date: 2019-10-02 00:29:16.679272 """ -from alembic import op import sqlalchemy as sa +from alembic import op from superset.utils.core import generic_find_fk_constraint_name diff --git a/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py b/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py index dafcb69885bc..7598cd64eec9 100644 --- a/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py +++ b/superset/migrations/versions/bb51420eaf83_add_schema_to_table_model.py @@ -26,8 +26,8 @@ revision = "bb51420eaf83" down_revision = "867bf4f117f9" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/bcf3126872fc_add_keyvalue.py b/superset/migrations/versions/bcf3126872fc_add_keyvalue.py index 2250a126f45c..52e62659e372 100644 --- a/superset/migrations/versions/bcf3126872fc_add_keyvalue.py +++ b/superset/migrations/versions/bcf3126872fc_add_keyvalue.py @@ -26,8 +26,8 @@ revision = "bcf3126872fc" down_revision = "f18570e03440" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/bddc498dd179_adhoc_filters.py b/superset/migrations/versions/bddc498dd179_adhoc_filters.py index a5591ad09057..ec0332827159 100644 --- a/superset/migrations/versions/bddc498dd179_adhoc_filters.py +++ b/superset/migrations/versions/bddc498dd179_adhoc_filters.py @@ -27,13 +27,13 @@ down_revision = "80a67c5192fa" -from collections import defaultdict import json import uuid +from collections import defaultdict from alembic import op -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db from superset.utils.core import ( @@ -41,7 +41,6 @@ split_adhoc_filters_into_base_filters, ) - Base = declarative_base() diff --git a/superset/migrations/versions/bebcf3fed1fe_convert_dashboard_v1_positions.py b/superset/migrations/versions/bebcf3fed1fe_convert_dashboard_v1_positions.py index 708e1e0bcfeb..865a8e59a06e 100644 --- a/superset/migrations/versions/bebcf3fed1fe_convert_dashboard_v1_positions.py +++ b/superset/migrations/versions/bebcf3fed1fe_convert_dashboard_v1_positions.py @@ -24,10 +24,10 @@ # revision identifiers, used by Alembic. import collections -from functools import reduce import json import sys import uuid +from functools import reduce from alembic import op from sqlalchemy import Column, ForeignKey, Integer, String, Table, Text diff --git a/superset/migrations/versions/c3a8f8611885_materializing_permission.py b/superset/migrations/versions/c3a8f8611885_materializing_permission.py index df7200796db2..b92378f092a6 100644 --- a/superset/migrations/versions/c3a8f8611885_materializing_permission.py +++ b/superset/migrations/versions/c3a8f8611885_materializing_permission.py @@ -21,8 +21,8 @@ Create Date: 2016-04-25 08:54:04.303859 """ -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy.ext.declarative import declarative_base diff --git a/superset/migrations/versions/c5756bec8b47_time_grain_sqla.py b/superset/migrations/versions/c5756bec8b47_time_grain_sqla.py index 4553cb1e3fcc..a092bd6ef820 100644 --- a/superset/migrations/versions/c5756bec8b47_time_grain_sqla.py +++ b/superset/migrations/versions/c5756bec8b47_time_grain_sqla.py @@ -26,10 +26,11 @@ revision = "c5756bec8b47" down_revision = "e502db2af7be" -from alembic import op import json -from sqlalchemy.ext.declarative import declarative_base + +from alembic import op from sqlalchemy import Column, Integer, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/c611f2b591b8_dim_spec.py b/superset/migrations/versions/c611f2b591b8_dim_spec.py index 8a42d42868ac..faecb427468a 100644 --- a/superset/migrations/versions/c611f2b591b8_dim_spec.py +++ b/superset/migrations/versions/c611f2b591b8_dim_spec.py @@ -26,8 +26,8 @@ revision = "c611f2b591b8" down_revision = "ad4d656d92bc" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/c617da68de7d_form_nullable.py b/superset/migrations/versions/c617da68de7d_form_nullable.py index ad34bd7f9908..d66ce29bd013 100644 --- a/superset/migrations/versions/c617da68de7d_form_nullable.py +++ b/superset/migrations/versions/c617da68de7d_form_nullable.py @@ -27,8 +27,8 @@ down_revision = "18dc26817ad2" from alembic import op -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db from superset.utils.core import MediumText diff --git a/superset/migrations/versions/c829ff0b37d0_.py b/superset/migrations/versions/c829ff0b37d0_.py index a1712e2c5c04..3dc624e310dc 100644 --- a/superset/migrations/versions/c829ff0b37d0_.py +++ b/superset/migrations/versions/c829ff0b37d0_.py @@ -26,8 +26,8 @@ revision = "c829ff0b37d0" down_revision = ("4451805bbaa1", "1d9e835a84f9") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/c82ee8a39623_add_implicit_tags.py b/superset/migrations/versions/c82ee8a39623_add_implicit_tags.py index ec8b76d1d4e1..42fdb7e4668c 100644 --- a/superset/migrations/versions/c82ee8a39623_add_implicit_tags.py +++ b/superset/migrations/versions/c82ee8a39623_add_implicit_tags.py @@ -27,13 +27,12 @@ down_revision = "c617da68de7d" from alembic import op -from sqlalchemy import Column, Enum, Integer, ForeignKey, String +from sqlalchemy import Column, Enum, ForeignKey, Integer, String from sqlalchemy.ext.declarative import declarative_base from superset.models.helpers import AuditMixinNullable from superset.models.tags import ObjectTypes, TagTypes - Base = declarative_base() diff --git a/superset/migrations/versions/c9495751e314_.py b/superset/migrations/versions/c9495751e314_.py index f691f51fe718..6ae29a510ed9 100644 --- a/superset/migrations/versions/c9495751e314_.py +++ b/superset/migrations/versions/c9495751e314_.py @@ -25,8 +25,8 @@ revision = "c9495751e314" down_revision = ("30bb17c0dc76", "bf706ae5eb46") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/ca69c70ec99b_tracking_url.py b/superset/migrations/versions/ca69c70ec99b_tracking_url.py index 791d816bdc5b..f3efb60c56e4 100644 --- a/superset/migrations/versions/ca69c70ec99b_tracking_url.py +++ b/superset/migrations/versions/ca69c70ec99b_tracking_url.py @@ -26,8 +26,8 @@ revision = "ca69c70ec99b" down_revision = "a65458420354" -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy.dialects import mysql diff --git a/superset/migrations/versions/cefabc8f7d38_increase_size_of_name_column_in_ab_view_.py b/superset/migrations/versions/cefabc8f7d38_increase_size_of_name_column_in_ab_view_.py index 2bc7b5b7143d..042a4f84487c 100644 --- a/superset/migrations/versions/cefabc8f7d38_increase_size_of_name_column_in_ab_view_.py +++ b/superset/migrations/versions/cefabc8f7d38_increase_size_of_name_column_in_ab_view_.py @@ -26,8 +26,8 @@ revision = "cefabc8f7d38" down_revision = "6c7537a6004a" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/d39b1e37131d_.py b/superset/migrations/versions/d39b1e37131d_.py index 3ba8a2eb0a13..ee8bba406fdf 100644 --- a/superset/migrations/versions/d39b1e37131d_.py +++ b/superset/migrations/versions/d39b1e37131d_.py @@ -26,8 +26,8 @@ revision = "d39b1e37131d" down_revision = ("a9c47e2c1547", "ddd6ebdd853b") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/d6db5a5cdb5d_.py b/superset/migrations/versions/d6db5a5cdb5d_.py index 5be450291b9a..e69f03896762 100644 --- a/superset/migrations/versions/d6db5a5cdb5d_.py +++ b/superset/migrations/versions/d6db5a5cdb5d_.py @@ -25,8 +25,8 @@ revision = "d6db5a5cdb5d" down_revision = ("a99f2f7c195a", "bcf3126872fc") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/d6ffdf31bdd4_add_published_column_to_dashboards.py b/superset/migrations/versions/d6ffdf31bdd4_add_published_column_to_dashboards.py index 0923de28524f..bf6b7e460fa7 100644 --- a/superset/migrations/versions/d6ffdf31bdd4_add_published_column_to_dashboards.py +++ b/superset/migrations/versions/d6ffdf31bdd4_add_published_column_to_dashboards.py @@ -26,8 +26,8 @@ revision = "d6ffdf31bdd4" down_revision = "b4a38aa87893" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/d7c1a0d6f2da_remove_limit_used_from_query_model.py b/superset/migrations/versions/d7c1a0d6f2da_remove_limit_used_from_query_model.py index 8505ce20f413..20841c1a6a37 100644 --- a/superset/migrations/versions/d7c1a0d6f2da_remove_limit_used_from_query_model.py +++ b/superset/migrations/versions/d7c1a0d6f2da_remove_limit_used_from_query_model.py @@ -26,8 +26,8 @@ revision = "d7c1a0d6f2da" down_revision = "afc69274c25a" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/d827694c7555_css_templates.py b/superset/migrations/versions/d827694c7555_css_templates.py index 96f4590c3e9b..57a287eb7163 100644 --- a/superset/migrations/versions/d827694c7555_css_templates.py +++ b/superset/migrations/versions/d827694c7555_css_templates.py @@ -26,8 +26,8 @@ revision = "d827694c7555" down_revision = "43df8de3a5f4" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py b/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py index e2b698f06c18..d7565560253d 100644 --- a/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py +++ b/superset/migrations/versions/d8bc074f7aad_add_new_field_is_restricted_to_.py @@ -26,11 +26,12 @@ revision = "d8bc074f7aad" down_revision = "1226819ee0e3" -from alembic import op import sqlalchemy as sa -from superset import db +from alembic import op +from sqlalchemy import Boolean, Column, Integer from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import Column, Integer, Boolean + +from superset import db Base = declarative_base() diff --git a/superset/migrations/versions/d94d33dbe938_form_strip.py b/superset/migrations/versions/d94d33dbe938_form_strip.py index 61f1ab91f083..c1882f613e83 100644 --- a/superset/migrations/versions/d94d33dbe938_form_strip.py +++ b/superset/migrations/versions/d94d33dbe938_form_strip.py @@ -27,8 +27,8 @@ down_revision = "80aa3f04bc82" from alembic import op -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db from superset.utils.core import MediumText diff --git a/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py b/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py index 3964c60ed072..f6ed41b2e695 100644 --- a/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py +++ b/superset/migrations/versions/db0c65b146bd_update_slice_model_json.py @@ -26,10 +26,11 @@ revision = "db0c65b146bd" down_revision = "f18570e03440" -from alembic import op import json -from sqlalchemy.ext.declarative import declarative_base + +from alembic import op from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py b/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py index 96c80156cd1b..30bc9817a705 100644 --- a/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py +++ b/superset/migrations/versions/db527d8c4c78_add_db_verbose_name.py @@ -26,9 +26,10 @@ revision = "db527d8c4c78" down_revision = "b318dfe5fb6c" -from alembic import op import logging + import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/ddd6ebdd853b_annotations.py b/superset/migrations/versions/ddd6ebdd853b_annotations.py index 7e9eafe95375..3f6ae3f0a3c5 100644 --- a/superset/migrations/versions/ddd6ebdd853b_annotations.py +++ b/superset/migrations/versions/ddd6ebdd853b_annotations.py @@ -21,8 +21,8 @@ Create Date: 2017-09-13 16:36:39.144489 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "ddd6ebdd853b" diff --git a/superset/migrations/versions/e3970889f38e_.py b/superset/migrations/versions/e3970889f38e_.py index ff308c5c8b8a..ef45bed109a1 100644 --- a/superset/migrations/versions/e3970889f38e_.py +++ b/superset/migrations/versions/e3970889f38e_.py @@ -26,8 +26,8 @@ revision = "e3970889f38e" down_revision = ("4451805bbaa1", "1d9e835a84f9") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/e46f2d27a08e_materialize_perms.py b/superset/migrations/versions/e46f2d27a08e_materialize_perms.py index c9a8ed374194..99774966a922 100644 --- a/superset/migrations/versions/e46f2d27a08e_materialize_perms.py +++ b/superset/migrations/versions/e46f2d27a08e_materialize_perms.py @@ -25,8 +25,8 @@ revision = "e46f2d27a08e" down_revision = "c611f2b591b8" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/e502db2af7be_add_template_params_to_tables.py b/superset/migrations/versions/e502db2af7be_add_template_params_to_tables.py index 537570bb4c45..c2bb2ec0ff36 100644 --- a/superset/migrations/versions/e502db2af7be_add_template_params_to_tables.py +++ b/superset/migrations/versions/e502db2af7be_add_template_params_to_tables.py @@ -26,8 +26,8 @@ revision = "e502db2af7be" down_revision = "5ccf602336a0" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/e553e78e90c5_add_druid_auth_py_py.py b/superset/migrations/versions/e553e78e90c5_add_druid_auth_py_py.py index d9a7d79a8e20..f87f999c0b9e 100644 --- a/superset/migrations/versions/e553e78e90c5_add_druid_auth_py_py.py +++ b/superset/migrations/versions/e553e78e90c5_add_druid_auth_py_py.py @@ -26,8 +26,8 @@ revision = "e553e78e90c5" down_revision = "18dc26817ad2" -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy_utils import EncryptedType diff --git a/superset/migrations/versions/e68c4473c581_allow_multi_schema_metadata_fetch.py b/superset/migrations/versions/e68c4473c581_allow_multi_schema_metadata_fetch.py index 709bdba876df..8e4284d9421a 100644 --- a/superset/migrations/versions/e68c4473c581_allow_multi_schema_metadata_fetch.py +++ b/superset/migrations/versions/e68c4473c581_allow_multi_schema_metadata_fetch.py @@ -21,8 +21,8 @@ Create Date: 2018-03-06 12:24:30.896293 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "e68c4473c581" diff --git a/superset/migrations/versions/e866bd2d4976_smaller_grid.py b/superset/migrations/versions/e866bd2d4976_smaller_grid.py index 4be70b697943..b674fd603073 100644 --- a/superset/migrations/versions/e866bd2d4976_smaller_grid.py +++ b/superset/migrations/versions/e866bd2d4976_smaller_grid.py @@ -21,10 +21,10 @@ """ import json -from alembic import op import sqlalchemy as sa -from sqlalchemy.ext.declarative import declarative_base +from alembic import op from flask_appbuilder.models.mixins import AuditMixin +from sqlalchemy.ext.declarative import declarative_base from superset import db diff --git a/superset/migrations/versions/ea033256294a_.py b/superset/migrations/versions/ea033256294a_.py index d174cf6363ca..9031b8b90c51 100644 --- a/superset/migrations/versions/ea033256294a_.py +++ b/superset/migrations/versions/ea033256294a_.py @@ -26,8 +26,8 @@ revision = "ea033256294a" down_revision = ("732f1c06bcbf", "b318dfe5fb6c") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py b/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py index 55566382c12f..17f2f9148958 100644 --- a/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py +++ b/superset/migrations/versions/eca4694defa7_sqllab_setting_defaults.py @@ -22,9 +22,10 @@ """ from alembic import op -from superset import db +from sqlalchemy import Boolean, Column, Integer from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import Column, Integer, Boolean + +from superset import db # revision identifiers, used by Alembic. revision = "eca4694defa7" diff --git a/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py b/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py index 9f566afa26e7..346b0af0919f 100644 --- a/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py +++ b/superset/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py @@ -26,8 +26,8 @@ revision = "f0fbf6129e13" down_revision = "c3a8f8611885" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py b/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py index a6029db6fb91..a3760b1e9945 100644 --- a/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py +++ b/superset/migrations/versions/f162a1dea4c4_d3format_by_metric.py @@ -26,8 +26,8 @@ revision = "f162a1dea4c4" down_revision = "960c69cb1f5b" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/f1f2d4af5b90_.py b/superset/migrations/versions/f1f2d4af5b90_.py index 543e626b183a..f84d87273afb 100644 --- a/superset/migrations/versions/f1f2d4af5b90_.py +++ b/superset/migrations/versions/f1f2d4af5b90_.py @@ -26,8 +26,8 @@ revision = "f1f2d4af5b90" down_revision = "e46f2d27a08e" -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/f231d82b9b26_.py b/superset/migrations/versions/f231d82b9b26_.py index c19b2be753cd..1eecfd726415 100644 --- a/superset/migrations/versions/f231d82b9b26_.py +++ b/superset/migrations/versions/f231d82b9b26_.py @@ -21,8 +21,8 @@ Create Date: 2018-03-20 19:47:54.991259 """ -from alembic import op import sqlalchemy as sa +from alembic import op from superset.utils.core import generic_find_uq_constraint_name diff --git a/superset/migrations/versions/f959a6652acd_.py b/superset/migrations/versions/f959a6652acd_.py index 3034ebc25285..12eff47f57af 100644 --- a/superset/migrations/versions/f959a6652acd_.py +++ b/superset/migrations/versions/f959a6652acd_.py @@ -26,8 +26,8 @@ revision = "f959a6652acd" down_revision = ("472d2f73dfd4", "d39b1e37131d") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/fbd55e0f83eb_.py b/superset/migrations/versions/fbd55e0f83eb_.py index 58e324ca6954..99525fd1e3ab 100644 --- a/superset/migrations/versions/fbd55e0f83eb_.py +++ b/superset/migrations/versions/fbd55e0f83eb_.py @@ -26,8 +26,8 @@ revision = "fbd55e0f83eb" down_revision = ("7467e77870e4", "de021a1ca60d") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/migrations/versions/fc480c87706c_.py b/superset/migrations/versions/fc480c87706c_.py index 9c81e8065359..33b746c7622d 100644 --- a/superset/migrations/versions/fc480c87706c_.py +++ b/superset/migrations/versions/fc480c87706c_.py @@ -26,8 +26,8 @@ revision = "fc480c87706c" down_revision = ("4451805bbaa1", "1d9e835a84f9") -from alembic import op import sqlalchemy as sa +from alembic import op def upgrade(): diff --git a/superset/models/__init__.py b/superset/models/__init__.py index d1748c673c62..17e7d188dc11 100644 --- a/superset/models/__init__.py +++ b/superset/models/__init__.py @@ -14,7 +14,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from . import core # noqa -from . import sql_lab # noqa -from . import user_attributes # noqa -from . import schedules # noqa +from . import core, schedules, sql_lab, user_attributes diff --git a/superset/models/core.py b/superset/models/core.py index 34d918f121f0..b919c1e7fe45 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -16,21 +16,23 @@ # under the License. # pylint: disable=C,R,W """A collection of ORM sqlalchemy models for Superset""" -from contextlib import closing -from copy import copy, deepcopy -from datetime import datetime import json import logging import textwrap +from contextlib import closing +from copy import copy, deepcopy +from datetime import datetime from typing import List +from urllib import parse +import numpy +import pandas as pd +import sqlalchemy as sqla +import sqlparse from flask import escape, g, Markup, request from flask_appbuilder import Model from flask_appbuilder.models.decorators import renders from flask_appbuilder.security.sqla.models import User -import numpy -import pandas as pd -import sqlalchemy as sqla from sqlalchemy import ( Boolean, Column, @@ -50,7 +52,6 @@ from sqlalchemy.pool import NullPool from sqlalchemy.schema import UniqueConstraint from sqlalchemy_utils import EncryptedType -import sqlparse from superset import app, db, db_engine_specs, is_feature_enabled, security_manager from superset.connectors.connector_registry import ConnectorRegistry @@ -60,7 +61,6 @@ from superset.models.user_attributes import UserAttribute from superset.utils import cache as cache_util, core as utils from superset.viz import viz_types -from urllib import parse # noqa config = app.config custom_password_store = config.get("SQLALCHEMY_CUSTOM_PASSWORD_STORE") @@ -71,7 +71,7 @@ PASSWORD_MASK = "X" * 10 -def set_related_perm(mapper, connection, target): # noqa +def set_related_perm(mapper, connection, target): src_class = target.cls_model id_ = target.datasource_id if id_: @@ -167,14 +167,14 @@ class Slice(Model, AuditMixinNullable, ImportMixin): perm = Column(String(1000)) owners = relationship(security_manager.user_model, secondary=slice_user) - export_fields = ( + export_fields = [ "slice_name", "datasource_type", "datasource_name", "viz_type", "params", "cache_timeout", - ) + ] def __repr__(self): return self.slice_name or str(self.id) @@ -424,14 +424,14 @@ class Dashboard(Model, AuditMixinNullable, ImportMixin): owners = relationship(security_manager.user_model, secondary=dashboard_user) published = Column(Boolean, default=False) - export_fields = ( + export_fields = [ "dashboard_title", "position_json", "json_metadata", "description", "css", "slug", - ) + ] def __repr__(self): return self.dashboard_title or str(self.id) @@ -750,7 +750,7 @@ class Database(Model, AuditMixinNullable, ImportMixin): ) perm = Column(String(1000)) impersonate_user = Column(Boolean, default=False) - export_fields = ( + export_fields = [ "database_name", "sqlalchemy_uri", "cache_timeout", @@ -759,7 +759,7 @@ class Database(Model, AuditMixinNullable, ImportMixin): "allow_ctas", "allow_csv_upload", "extra", - ) + ] export_children = ["tables"] def __repr__(self): diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 472ad749d06e..9bbee1d2f4ab 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -16,20 +16,21 @@ # under the License. # pylint: disable=C,R,W """a collection of model-related helper classes and functions""" -from datetime import datetime import json import logging import re +from datetime import datetime +from typing import List, Optional +import humanize +import sqlalchemy as sa +import yaml from flask import escape, g, Markup from flask_appbuilder.models.decorators import renders from flask_appbuilder.models.mixins import AuditMixin -import humanize -import sqlalchemy as sa from sqlalchemy import and_, or_, UniqueConstraint from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.orm.exc import MultipleResultsFound -import yaml from superset.utils.core import QueryStatus @@ -44,15 +45,15 @@ def json_to_dict(json_str): class ImportMixin(object): - export_parent = None + export_parent: Optional[str] = None # The name of the attribute # with the SQL Alchemy back reference - export_children = [] + export_children: List[str] = [] # List of (str) names of attributes # with the SQL Alchemy forward references - export_fields = [] + export_fields: List[str] = [] # The names of the attributes # that are available for import and export @@ -300,7 +301,7 @@ class AuditMixinNullable(AuditMixin): ) @declared_attr - def created_by_fk(self): # noqa + def created_by_fk(self): return sa.Column( sa.Integer, sa.ForeignKey("ab_user.id"), @@ -309,7 +310,7 @@ def created_by_fk(self): # noqa ) @declared_attr - def changed_by_fk(self): # noqa + def changed_by_fk(self): return sa.Column( sa.Integer, sa.ForeignKey("ab_user.id"), @@ -330,7 +331,7 @@ def changed_by_name(self): return "" @renders("created_by") - def creator(self): # noqa + def creator(self): return self._user_link(self.created_by) @property @@ -354,7 +355,7 @@ class QueryResult(object): """Object returned by the query interface""" - def __init__( # noqa + def __init__( self, df, query, duration, status=QueryStatus.SUCCESS, error_message=None ): self.df = df diff --git a/superset/models/schedules.py b/superset/models/schedules.py index dbcd56d83a27..42118a2af65c 100644 --- a/superset/models/schedules.py +++ b/superset/models/schedules.py @@ -27,7 +27,6 @@ from superset import security_manager from superset.models.helpers import AuditMixinNullable, ImportMixin - metadata = Model.metadata # pylint: disable=no-member diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py index 293932af3e3d..a1afaca4f350 100644 --- a/superset/models/sql_lab.py +++ b/superset/models/sql_lab.py @@ -16,12 +16,12 @@ # under the License. # pylint: disable=C,R,W """A collection of ORM sqlalchemy models for SQL Lab""" -from datetime import datetime import re +from datetime import datetime +import sqlalchemy as sqla from flask import Markup from flask_appbuilder import Model -import sqlalchemy as sqla from sqlalchemy import ( Boolean, Column, diff --git a/superset/models/sql_types/presto_sql_types.py b/superset/models/sql_types/presto_sql_types.py index 873edb33aad8..f0b46fac0e19 100644 --- a/superset/models/sql_types/presto_sql_types.py +++ b/superset/models/sql_types/presto_sql_types.py @@ -19,7 +19,6 @@ from sqlalchemy.sql.sqltypes import Integer from sqlalchemy.sql.type_api import TypeEngine - # _compiler_dispatch is defined to help with type compilation diff --git a/superset/models/tags.py b/superset/models/tags.py index 0bd6c2b70d3b..580aa71525f0 100644 --- a/superset/models/tags.py +++ b/superset/models/tags.py @@ -15,12 +15,10 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W,no-init -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import absolute_import, division, print_function, unicode_literals import enum +from typing import Optional from flask_appbuilder import Model from sqlalchemy import Column, Enum, ForeignKey, Integer, String @@ -29,7 +27,6 @@ from superset.models.helpers import AuditMixinNullable - Session = sessionmaker(autoflush=False) @@ -109,7 +106,7 @@ def get_object_type(class_name): class ObjectUpdater(object): - object_type = None + object_type: Optional[str] = None @classmethod def get_owners_ids(cls, target): diff --git a/superset/security.py b/superset/security.py index caff0aa9c125..d8dd5edcd5a5 100644 --- a/superset/security.py +++ b/superset/security.py @@ -37,14 +37,14 @@ from superset import sql_parse from superset.connectors.connector_registry import ConnectorRegistry from superset.exceptions import SupersetSecurityException +from superset.utils.core import DatasourceName if TYPE_CHECKING: from superset.common.query_context import QueryContext - from superset.models.core import Database, BaseDatasource + from superset.connectors.base.models import BaseDatasource + from superset.models.core import Database from superset.viz import BaseViz -from superset.utils.core import DatasourceName # noqa: E402 - class SupersetSecurityListWidget(ListWidget): """ @@ -333,9 +333,9 @@ def _get_schema_and_table( table_name_pieces = table_in_query.split(".") if len(table_name_pieces) == 3: - return tuple(table_name_pieces[1:]) # noqa: T484 + return tuple(table_name_pieces[1:]) # type: ignore elif len(table_name_pieces) == 2: - return tuple(table_name_pieces) # noqa: T484 + return tuple(table_name_pieces) # type: ignore return (schema, table_name_pieces[0]) def _datasource_access_by_fullname( @@ -546,8 +546,8 @@ def clean_perms(self) -> None: sesh = self.get_session pvms = sesh.query(ab_models.PermissionView).filter( or_( - ab_models.PermissionView.permission == None, # noqa - ab_models.PermissionView.view_menu == None, # noqa + ab_models.PermissionView.permission == None, + ab_models.PermissionView.view_menu == None, ) ) deleted_count = pvms.delete() diff --git a/superset/sql_lab.py b/superset/sql_lab.py index c2d60726a0cc..9050f06d95bb 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -15,21 +15,21 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W +import logging +import uuid from contextlib import closing from datetime import datetime -import logging from sys import getsizeof from typing import Optional, Tuple, Union -import uuid import backoff -from celery.exceptions import SoftTimeLimitExceeded -from contextlib2 import contextmanager -from flask_babel import lazy_gettext as _ import msgpack import pyarrow as pa import simplejson as json import sqlalchemy +from celery.exceptions import SoftTimeLimitExceeded +from contextlib2 import contextmanager +from flask_babel import lazy_gettext as _ from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import NullPool diff --git a/superset/sql_validators/__init__.py b/superset/sql_validators/__init__.py index ae79ea6b09b2..9130ec2c007e 100644 --- a/superset/sql_validators/__init__.py +++ b/superset/sql_validators/__init__.py @@ -14,12 +14,11 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from typing import Optional +from typing import Optional, Type -from . import base # noqa -from . import presto_db # noqa -from .base import SQLValidationAnnotation # noqa +from . import base, presto_db +from .base import SQLValidationAnnotation -def get_validator_by_name(name: str) -> Optional[base.BaseSQLValidator]: +def get_validator_by_name(name: str) -> Optional[Type[base.BaseSQLValidator]]: return {"PrestoDBSQLValidator": presto_db.PrestoDBSQLValidator}.get(name) diff --git a/superset/sql_validators/presto_db.py b/superset/sql_validators/presto_db.py index 0225390b70e8..f684db652cc8 100644 --- a/superset/sql_validators/presto_db.py +++ b/superset/sql_validators/presto_db.py @@ -15,9 +15,9 @@ # specific language governing permissions and limitations # under the License. -from contextlib import closing import logging import time +from contextlib import closing from typing import Any, Dict, List, Optional from flask import g diff --git a/superset/tasks/__init__.py b/superset/tasks/__init__.py index 669f65f66f13..f6fd1b2b21f9 100644 --- a/superset/tasks/__init__.py +++ b/superset/tasks/__init__.py @@ -15,5 +15,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from . import schedules # noqa -from . import cache # noqa +from . import cache, schedules diff --git a/superset/tasks/cache.py b/superset/tasks/cache.py index 136de81e2719..22da4f9a4894 100644 --- a/superset/tasks/cache.py +++ b/superset/tasks/cache.py @@ -30,7 +30,6 @@ from superset.tasks.celery_app import app as celery_app from superset.utils.core import parse_human_datetime - logger = get_task_logger(__name__) logger.setLevel(logging.INFO) diff --git a/superset/tasks/schedules.py b/superset/tasks/schedules.py index e8c7d6746af8..6bda5b7ba2b6 100644 --- a/superset/tasks/schedules.py +++ b/superset/tasks/schedules.py @@ -18,15 +18,16 @@ """Utility functions used across Superset""" +import logging +import time +import urllib.request from collections import namedtuple from datetime import datetime, timedelta from email.utils import make_msgid, parseaddr -import logging -import time from urllib.error import URLError -import urllib.request import croniter +import simplejson as json from dateutil.tz import tzlocal from flask import render_template, Response, session, url_for from flask_babel import gettext as __ @@ -34,8 +35,7 @@ from retry.api import retry_call from selenium.common.exceptions import WebDriverException from selenium.webdriver import chrome, firefox -import simplejson as json -from werkzeug.utils import parse_cookie +from werkzeug.http import parse_cookie # Superset framework imports from superset import app, db, security_manager diff --git a/superset/translations/utils.py b/superset/translations/utils.py index 5c76eab95238..a545ab068fd5 100644 --- a/superset/translations/utils.py +++ b/superset/translations/utils.py @@ -17,9 +17,10 @@ # pylint: disable=C,R,W import json import os +from typing import Any, Dict # Global caching for JSON language packs -ALL_LANGUAGE_PACKS = {"en": {}} +ALL_LANGUAGE_PACKS: Dict[str, Dict[Any, Any]] = {"en": {}} DIR = os.path.dirname(os.path.abspath(__file__)) diff --git a/superset/utils/core.py b/superset/utils/core.py index 88f8df1fc776..f4d1ac85c13d 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -16,13 +16,7 @@ # under the License. # pylint: disable=C,R,W """Utility functions used across Superset""" -from datetime import date, datetime, time, timedelta import decimal -from email.mime.application import MIMEApplication -from email.mime.image import MIMEImage -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.utils import formatdate import errno import functools import json @@ -30,32 +24,32 @@ import os import signal import smtplib -from time import struct_time import traceback -from typing import Iterator, List, NamedTuple, Optional, Tuple, Union -from urllib.parse import unquote_plus import uuid import zlib +from datetime import date, datetime, time, timedelta +from email.mime.application import MIMEApplication +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.utils import formatdate +from time import struct_time +from typing import Iterator, List, NamedTuple, Optional, Tuple, Union +from urllib.parse import unquote_plus import bleach import celery -from dateutil.parser import parse -from dateutil.relativedelta import relativedelta -from flask import current_app, flash, Flask, g, Markup, render_template -from flask_appbuilder.security.sqla.models import User -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ -from flask_caching import Cache import markdown as md import numpy import pandas as pd import parsedatetime - -try: - from pydruid.utils.having import Having -except ImportError: - pass import sqlalchemy as sa +from dateutil.parser import parse +from dateutil.relativedelta import relativedelta +from flask import current_app, flash, Flask, g, Markup, render_template +from flask_appbuilder.security.sqla.models import User +from flask_babel import gettext as __, lazy_gettext as _ +from flask_caching import Cache from sqlalchemy import event, exc, select, Text from sqlalchemy.dialects.mysql import MEDIUMTEXT from sqlalchemy.sql.type_api import Variant @@ -64,6 +58,11 @@ from superset.exceptions import SupersetException, SupersetTimeoutException from superset.utils.dates import datetime_to_epoch, EPOCH +try: + from pydruid.utils.having import Having +except ImportError: + pass + logging.getLogger("MARKDOWN").setLevel(logging.INFO) @@ -105,7 +104,7 @@ def flasher(msg, severity=None): logging.info(msg) -class _memoized: # noqa +class _memoized: """Decorator that caches a function's return value each time it is called If called later with the same arguments, the cached value is returned, and @@ -1048,23 +1047,23 @@ def get_since_until( relative_end = parse_human_datetime(relative_end if relative_end else "today") common_time_frames = { "Last day": ( - relative_start - relativedelta(days=1), # noqa: T400 + relative_start - relativedelta(days=1), # type: ignore relative_end, ), "Last week": ( - relative_start - relativedelta(weeks=1), # noqa: T400 + relative_start - relativedelta(weeks=1), # type: ignore relative_end, ), "Last month": ( - relative_start - relativedelta(months=1), # noqa: T400 + relative_start - relativedelta(months=1), # type: ignore relative_end, ), "Last quarter": ( - relative_start - relativedelta(months=3), # noqa: T400 + relative_start - relativedelta(months=3), # type: ignore relative_end, ), "Last year": ( - relative_start - relativedelta(years=1), # noqa: T400 + relative_start - relativedelta(years=1), # type: ignore relative_end, ), } @@ -1083,13 +1082,15 @@ def get_since_until( else: rel, num, grain = time_range.split() if rel == "Last": - since = relative_start - relativedelta( # noqa: T400 + since = relative_start - relativedelta( # type: ignore **{grain: int(num)} ) until = relative_end else: # rel == 'Next' since = relative_start - until = relative_end + relativedelta(**{grain: int(num)}) # noqa: T400 + until = relative_end + relativedelta( # type: ignore + **{grain: int(num)} + ) else: since = since or "" if since: @@ -1099,13 +1100,13 @@ def get_since_until( if time_shift: time_delta = parse_past_timedelta(time_shift) - since = since if since is None else (since - time_delta) # noqa: T400 - until = until if until is None else (until - time_delta) # noqa: T400 + since = since if since is None else (since - time_delta) # type: ignore + until = until if until is None else (until - time_delta) # type: ignore if since and until and since > until: raise ValueError(_("From date cannot be larger than to date")) - return since, until # noqa: T400 + return since, until # type: ignore def add_ago_to_since(since: str) -> str: diff --git a/superset/utils/decorators.py b/superset/utils/decorators.py index a141b04f662b..a44d3b17a6db 100644 --- a/superset/utils/decorators.py +++ b/superset/utils/decorators.py @@ -14,9 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import logging from datetime import datetime, timedelta from functools import wraps -import logging from contextlib2 import contextmanager from flask import request @@ -24,7 +24,6 @@ from superset import app, cache from superset.utils.dates import now_as_float - # If a user sets `max_age` to 0, for long the browser should cache the # resource? Flask-Caching will cache forever, but for the HTTP header we need # to specify a "far future" date. diff --git a/superset/utils/dict_import_export.py b/superset/utils/dict_import_export.py index 734ea5dfa23a..a7eecdfefb0c 100644 --- a/superset/utils/dict_import_export.py +++ b/superset/utils/dict_import_export.py @@ -20,7 +20,6 @@ from superset.connectors.druid.models import DruidCluster from superset.models.core import Database - DATABASES_KEY = "databases" DRUID_CLUSTERS_KEY = "druid_clusters" diff --git a/superset/utils/log.py b/superset/utils/log.py index 768e6b3039d6..85d41398c928 100644 --- a/superset/utils/log.py +++ b/superset/utils/log.py @@ -15,13 +15,13 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from abc import ABC, abstractmethod -from datetime import datetime import functools import inspect import json import logging import textwrap +from abc import ABC, abstractmethod +from datetime import datetime from typing import Any, cast, Type from flask import current_app, g, request diff --git a/superset/utils/logging_configurator.py b/superset/utils/logging_configurator.py index a4cf2a21b9a7..37d6717fdd97 100644 --- a/superset/utils/logging_configurator.py +++ b/superset/utils/logging_configurator.py @@ -14,7 +14,6 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -# noqa: T484 import abc import logging from logging.handlers import TimedRotatingFileHandler @@ -50,16 +49,14 @@ def configure_logging( ) # pylint: disable=no-member superset_logger.setLevel(logging.INFO) # pylint: disable=no-member - logging.getLogger("pyhive.presto").setLevel(logging.INFO) # noqa: T484 + logging.getLogger("pyhive.presto").setLevel(logging.INFO) - logging.basicConfig(format=app_config.get("LOG_FORMAT")) # noqa: T484 - logging.getLogger().setLevel(app_config.get("LOG_LEVEL")) # noqa: T484 + logging.basicConfig(format=app_config["LOG_FORMAT"]) + logging.getLogger().setLevel(app_config["LOG_LEVEL"]) if app_config.get("ENABLE_TIME_ROTATE"): - logging.getLogger().setLevel( # noqa: T484 - app_config.get("TIME_ROTATE_LOG_LEVEL") - ) - handler = TimedRotatingFileHandler( # noqa: T484 + logging.getLogger().setLevel(app_config["TIME_ROTATE_LOG_LEVEL"]) + handler = TimedRotatingFileHandler( # type: ignore app_config.get("FILENAME"), when=app_config.get("ROLLOVER"), interval=app_config.get("INTERVAL"), diff --git a/superset/views/__init__.py b/superset/views/__init__.py index 0b69633470cd..b59244fa1cba 100644 --- a/superset/views/__init__.py +++ b/superset/views/__init__.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 . import base # noqa -from . import api # noqa -from . import core # noqa -from . import sql_lab # noqa -from . import dashboard # noqa -from . import annotations # noqa -from . import datasource # noqa -from . import schedules # noqa -from . import tags # noqa -from .log import views # noqa -from .log import api as log_api # noqa +from . import ( + annotations, + api, + base, + core, + dashboard, + datasource, + schedules, + sql_lab, + tags, +) +from .log import api as log_api, views diff --git a/superset/views/annotations.py b/superset/views/annotations.py index e2bce022a938..6d16728f81c4 100644 --- a/superset/views/annotations.py +++ b/superset/views/annotations.py @@ -16,12 +16,12 @@ # under the License. # pylint: disable=C,R,W from flask_appbuilder.models.sqla.interface import SQLAInterface -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ +from flask_babel import gettext as __, lazy_gettext as _ from wtforms.validators import StopValidation from superset import appbuilder from superset.models.annotations import Annotation, AnnotationLayer + from .base import DeleteMixin, SupersetModelView @@ -43,7 +43,7 @@ def __call__(self, form, field): ) -class AnnotationModelView(SupersetModelView, DeleteMixin): # noqa +class AnnotationModelView(SupersetModelView, DeleteMixin): datamodel = SQLAInterface(Annotation) list_title = _("List Annotation") diff --git a/superset/views/api.py b/superset/views/api.py index 6d962305a0a3..296720c19d34 100644 --- a/superset/views/api.py +++ b/superset/views/api.py @@ -15,16 +15,17 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=R +import simplejson as json from flask import request from flask_appbuilder import expose from flask_appbuilder.security.decorators import has_access_api -import simplejson as json +import superset.models.core as models from superset import appbuilder, db, event_logger, security_manager from superset.common.query_context import QueryContext from superset.legacy import update_time_range -import superset.models.core as models from superset.utils import core as utils + from .base import api, BaseSupersetView, handle_api_exception diff --git a/superset/views/base.py b/superset/views/base.py index 37ba99920a84..fb6eccedc77d 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -15,26 +15,24 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from datetime import datetime import functools import logging import traceback +from datetime import datetime from typing import Any, Dict +import simplejson as json +import yaml from flask import abort, flash, g, get_flashed_messages, redirect, Response from flask_appbuilder import BaseView, ModelView from flask_appbuilder.actions import action from flask_appbuilder.forms import DynamicForm from flask_appbuilder.models.sqla.filters import BaseFilter from flask_appbuilder.widgets import ListWidget -from flask_babel import get_locale -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ +from flask_babel import get_locale, gettext as __, lazy_gettext as _ from flask_wtf.form import FlaskForm -import simplejson as json from werkzeug.exceptions import HTTPException from wtforms.fields.core import Field, UnboundField -import yaml from superset import conf, db, get_feature_flags, security_manager from superset.exceptions import SupersetException, SupersetSecurityException @@ -200,7 +198,7 @@ class ListWidgetWithCheckboxes(ListWidget): template = "superset/fab_overrides/list_with_checkboxes.html" -def validate_json(form, field): # noqa +def validate_json(form, field): try: json.loads(field.data) except Exception as e: @@ -335,7 +333,7 @@ def get_view_menus(self, permission_name): class DatasourceFilter(SupersetFilter): - def apply(self, query, func): # noqa + def apply(self, query, func): if security_manager.all_datasource_access(): return query perms = self.get_view_menus("datasource_access") @@ -348,7 +346,7 @@ class CsvResponse(Response): Override Response to take into account csv encoding from config.py """ - charset = conf.get("CSV_EXPORT").get("encoding", "utf-8") + charset = conf["CSV_EXPORT"].get("encoding", "utf-8") def check_ownership(obj, raise_if_false=True): diff --git a/superset/views/core.py b/superset/views/core.py index 4d081ed5d47c..0c6b6ec4c4bf 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -15,14 +15,18 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from contextlib import closing -from datetime import datetime, timedelta import logging import re -from typing import Dict, List, Optional, Union # noqa: F401 +from contextlib import closing +from datetime import datetime, timedelta +from typing import Dict, List, Optional, Union from urllib import parse import backoff +import msgpack +import pandas as pd +import pyarrow as pa +import simplejson as json from flask import ( abort, flash, @@ -39,17 +43,13 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access, has_access_api from flask_appbuilder.security.sqla import models as ab_models -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ -import msgpack -import pandas as pd -import pyarrow as pa -import simplejson as json +from flask_babel import gettext as __, lazy_gettext as _ from sqlalchemy import and_, or_, select from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm.session import Session from werkzeug.routing import BaseConverter +import superset.models.core as models from superset import ( app, appbuilder, @@ -76,15 +76,14 @@ SupersetTimeoutException, ) from superset.jinja_context import get_template_processor -import superset.models.core as models from superset.models.sql_lab import Query from superset.models.user_attributes import UserAttribute from superset.sql_parse import ParsedQuery from superset.sql_validators import get_validator_by_name -from superset.utils import core as utils -from superset.utils import dashboard_import_export +from superset.utils import core as utils, dashboard_import_export from superset.utils.dates import now_as_float from superset.utils.decorators import etag_cache, stats_timing + from .base import ( api, BaseSupersetView, @@ -101,6 +100,7 @@ SupersetFilter, SupersetModelView, ) +from .database import api as database_api, views as in_views from .utils import ( apply_display_max_row_limit, bootstrap_user_data, @@ -109,7 +109,6 @@ get_viz, ) - config = app.config CACHE_DEFAULT_TIMEOUT = config.get("CACHE_DEFAULT_TIMEOUT", 0) SQLLAB_QUERY_COST_ESTIMATE_TIMEOUT = config.get( @@ -227,11 +226,11 @@ def _deserialize_results_payload( with stats_timing( "sqllab.query.results_backend_json_deserialize", stats_logger ): - return json.loads(payload) # noqa + return json.loads(payload) # type: ignore class SliceFilter(SupersetFilter): - def apply(self, query, func): # noqa + def apply(self, query, func): if security_manager.all_datasource_access(): return query perms = self.get_view_menus("datasource_access") @@ -251,10 +250,10 @@ class DashboardFilter(SupersetFilter): if they wish to see those dashboards which are published first """ - def apply(self, query, func): # noqa + def apply(self, query, func): Dash = models.Dashboard User = ab_models.User - Slice = models.Slice # noqa + Slice = models.Slice Favorites = models.FavStar user_roles = [role.name.lower() for role in list(self.get_user_roles())] @@ -268,7 +267,7 @@ def apply(self, query, func): # noqa .join(Dash.slices) .filter( and_( - Dash.published == True, # noqa + Dash.published == True, or_(Slice.perm.in_(datasource_perms), all_datasource_access), ) ) @@ -297,9 +296,6 @@ def apply(self, query, func): # noqa return query -from .database import api as database_api # noqa -from .database import views as in_views # noqa - if config.get("ENABLE_ACCESS_REQUEST"): class AccessRequestsModelView(SupersetModelView, DeleteMixin): @@ -332,7 +328,7 @@ class AccessRequestsModelView(SupersetModelView, DeleteMixin): ) -class SliceModelView(SupersetModelView, DeleteMixin): # noqa +class SliceModelView(SupersetModelView, DeleteMixin): route_base = "/chart" datamodel = SQLAInterface(models.Slice) @@ -434,7 +430,7 @@ def add(self): ) -class SliceAsync(SliceModelView): # noqa +class SliceAsync(SliceModelView): route_base = "/sliceasync" list_columns = [ "id", @@ -452,7 +448,7 @@ class SliceAsync(SliceModelView): # noqa appbuilder.add_view_no_menu(SliceAsync) -class SliceAddView(SliceModelView): # noqa +class SliceAddView(SliceModelView): route_base = "/sliceaddview" list_columns = [ "id", @@ -477,7 +473,7 @@ class SliceAddView(SliceModelView): # noqa appbuilder.add_view_no_menu(SliceAddView) -class DashboardModelView(SupersetModelView, DeleteMixin): # noqa +class DashboardModelView(SupersetModelView, DeleteMixin): route_base = "/dashboard" datamodel = SQLAInterface(models.Dashboard) @@ -595,7 +591,7 @@ def download_dashboards(self): ) -class DashboardModelViewAsync(DashboardModelView): # noqa +class DashboardModelViewAsync(DashboardModelView): route_base = "/dashboardasync" list_columns = [ "id", @@ -618,7 +614,7 @@ class DashboardModelViewAsync(DashboardModelView): # noqa appbuilder.add_view_no_menu(DashboardModelViewAsync) -class DashboardAddView(DashboardModelView): # noqa +class DashboardAddView(DashboardModelView): route_base = "/dashboardaddview" list_columns = [ "id", @@ -1609,7 +1605,7 @@ def _set_dash_metadata(dashboard, data): pass session = db.session() - Slice = models.Slice # noqa + Slice = models.Slice current_slices = session.query(Slice).filter(Slice.id.in_(slice_ids)).all() dashboard.slices = current_slices @@ -1662,7 +1658,7 @@ def add_slices(self, dashboard_id): """Add and save slices to a dashboard""" data = json.loads(request.form.get("data")) session = db.session() - Slice = models.Slice # noqa + Slice = models.Slice dash = session.query(models.Dashboard).filter_by(id=dashboard_id).first() check_ownership(dash, raise_if_false=True) new_slices = session.query(Slice).filter(Slice.id.in_(data["slice_ids"])) @@ -1719,7 +1715,7 @@ def testconn(self): @expose("/recent_activity//", methods=["GET"]) def recent_activity(self, user_id): """Recent activity (actions) for a given user""" - M = models # noqa + M = models if request.args.get("limit"): limit = int(request.args.get("limit")) @@ -1825,7 +1821,7 @@ def fave_dashboards(self, user_id): @has_access_api @expose("/created_dashboards//", methods=["GET"]) def created_dashboards(self, user_id): - Dash = models.Dashboard # noqa + Dash = models.Dashboard qry = ( db.session.query(Dash) .filter(or_(Dash.created_by_fk == user_id, Dash.changed_by_fk == user_id)) @@ -1851,8 +1847,8 @@ def user_slices(self, user_id=None): """List of slices a user created, or faved""" if not user_id: user_id = g.user.id - Slice = models.Slice # noqa - FavStar = models.FavStar # noqa + Slice = models.Slice + FavStar = models.FavStar qry = ( db.session.query(Slice, FavStar.dttm) .join( @@ -1894,7 +1890,7 @@ def created_slices(self, user_id=None): """List of slices created by this user""" if not user_id: user_id = g.user.id - Slice = models.Slice # noqa + Slice = models.Slice qry = ( db.session.query(Slice) .filter(or_(Slice.created_by_fk == user_id, Slice.changed_by_fk == user_id)) @@ -2024,7 +2020,7 @@ def warm_up_cache(self): def favstar(self, class_name, obj_id, action): """Toggle favorite stars on Slices and Dashboard""" session = db.session() - FavStar = models.FavStar # noqa + FavStar = models.FavStar count = 0 favs = ( session.query(FavStar) @@ -2056,7 +2052,7 @@ def favstar(self, class_name, obj_id, action): def publish(self, dashboard_id): """Gets and toggles published status on dashboards""" session = db.session() - Dashboard = models.Dashboard # noqa + Dashboard = models.Dashboard Role = ab_models.Role dash = ( session.query(Dashboard).filter(Dashboard.id == dashboard_id).one_or_none() @@ -2131,7 +2127,7 @@ def dashboard(self, dashboard_id): # Hack to log the dashboard_id properly, even when getting a slug @event_logger.log_this - def dashboard(**kwargs): # noqa + def dashboard(**kwargs): pass dashboard( diff --git a/superset/views/dashboard.py b/superset/views/dashboard.py index 5e3a0b2601fb..712c762e65d2 100644 --- a/superset/views/dashboard.py +++ b/superset/views/dashboard.py @@ -21,6 +21,7 @@ from superset import appbuilder, db from superset.models import core as models + from .base import BaseSupersetView diff --git a/superset/views/database/__init__.py b/superset/views/database/__init__.py index 4673644778a3..0fe573403875 100644 --- a/superset/views/database/__init__.py +++ b/superset/views/database/__init__.py @@ -50,14 +50,14 @@ def sqlalchemy_uri_validator( class DatabaseFilter(SupersetFilter): - def apply(self, query, func): # noqa + def apply(self, query, func): if security_manager.all_database_access(): return query perms = self.get_view_menus("database_access") return query.filter(self.model.perm.in_(perms)) -class DatabaseMixin: # noqa +class DatabaseMixin: list_title = _("Databases") show_title = _("Show Database") add_title = _("Add Database") diff --git a/superset/views/database/api.py b/superset/views/database/api.py index fbfbc5bd98a2..54448b771cbc 100644 --- a/superset/views/database/api.py +++ b/superset/views/database/api.py @@ -17,8 +17,9 @@ from flask_appbuilder import ModelRestApi from flask_appbuilder.models.sqla.interface import SQLAInterface -from superset import appbuilder import superset.models.core as models +from superset import appbuilder + from . import DatabaseFilter, DatabaseMixin, sqlalchemy_uri_validator diff --git a/superset/views/database/forms.py b/superset/views/database/forms.py index edce02552e93..e705b57f7dea 100644 --- a/superset/views/database/forms.py +++ b/superset/views/database/forms.py @@ -33,7 +33,7 @@ class CsvToDatabaseForm(DynamicForm): # pylint: disable=E0211 - def csv_allowed_dbs(): + def csv_allowed_dbs(): # type: ignore csv_allowed_dbs = [] csv_enabled_dbs = ( db.session.query(models.Database).filter_by(allow_csv_upload=True).all() diff --git a/superset/views/database/views.py b/superset/views/database/views.py index 0c616d109351..bb8700c26ecb 100644 --- a/superset/views/database/views.py +++ b/superset/views/database/views.py @@ -21,22 +21,21 @@ from flask_appbuilder import SimpleFormView from flask_appbuilder.forms import DynamicForm from flask_appbuilder.models.sqla.interface import SQLAInterface -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ +from flask_babel import gettext as __, lazy_gettext as _ from sqlalchemy.exc import IntegrityError from werkzeug.utils import secure_filename from wtforms.fields import StringField from wtforms.validators import ValidationError +import superset.models.core as models from superset import app, appbuilder, security_manager from superset.connectors.sqla.models import SqlaTable -import superset.models.core as models from superset.utils import core as utils from superset.views.base import DeleteMixin, SupersetModelView, YamlExportMixin + from . import DatabaseMixin, sqlalchemy_uri_validator from .forms import CsvToDatabaseForm - config = app.config stats_logger = config.get("STATS_LOGGER") @@ -48,9 +47,7 @@ def sqlalchemy_uri_form_validator(form: DynamicForm, field: StringField) -> None sqlalchemy_uri_validator(field.data, exception=ValidationError) -class DatabaseView( - DatabaseMixin, SupersetModelView, DeleteMixin, YamlExportMixin -): # noqa +class DatabaseView(DatabaseMixin, SupersetModelView, DeleteMixin, YamlExportMixin): datamodel = SQLAInterface(models.Database) add_template = "superset/models/database/add.html" diff --git a/superset/views/datasource.py b/superset/views/datasource.py index 329c1919ec7b..900dbd0909c9 100644 --- a/superset/views/datasource.py +++ b/superset/views/datasource.py @@ -24,6 +24,7 @@ from superset import appbuilder, db from superset.connectors.connector_registry import ConnectorRegistry from superset.models.core import Database + from .base import BaseSupersetView, json_error_response diff --git a/superset/views/log/api.py b/superset/views/log/api.py index 4136e5aea6e4..0ebbd5d660fb 100644 --- a/superset/views/log/api.py +++ b/superset/views/log/api.py @@ -17,8 +17,9 @@ from flask_appbuilder import ModelRestApi from flask_appbuilder.models.sqla.interface import SQLAInterface -from superset import app, appbuilder import superset.models.core as models +from superset import app, appbuilder + from . import LogMixin diff --git a/superset/views/log/views.py b/superset/views/log/views.py index 4c11a899feb7..7cb870992852 100644 --- a/superset/views/log/views.py +++ b/superset/views/log/views.py @@ -18,9 +18,10 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_babel import gettext as __ -from superset import app, appbuilder import superset.models.core as models +from superset import app, appbuilder from superset.views.base import SupersetModelView + from . import LogMixin diff --git a/superset/views/schedules.py b/superset/views/schedules.py index b383fc818f6e..7e602d949775 100644 --- a/superset/views/schedules.py +++ b/superset/views/schedules.py @@ -15,17 +15,16 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W - import enum +from typing import Optional, Type +import simplejson as json from croniter import croniter from flask import flash, g from flask_appbuilder import expose from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ -import simplejson as json +from flask_babel import gettext as __, lazy_gettext as _ from wtforms import BooleanField, StringField from superset import app, appbuilder, db, security_manager @@ -39,13 +38,14 @@ from superset.tasks.schedules import schedule_email_report from superset.utils.core import get_email_address_list, json_iso_dttm_ser from superset.views.core import json_success + from .base import DeleteMixin, SupersetModelView class EmailScheduleView(SupersetModelView, DeleteMixin): _extra_data = {"test_email": False, "test_email_recipients": None} - schedule_type = None - schedule_type_model = None + schedule_type: Optional[Type] = None + schedule_type_model: Optional[Type] = None page_size = 20 @@ -150,7 +150,7 @@ def fetch_schedules(self, item_id): class DashboardEmailScheduleView(EmailScheduleView): - schedule_type = ScheduleType.dashboard.name + schedule_type = ScheduleType.dashboard.value schedule_type_model = Dashboard add_title = _("Schedule Email Reports for Dashboards") @@ -209,7 +209,7 @@ def pre_add(self, obj): class SliceEmailScheduleView(EmailScheduleView): - schedule_type = ScheduleType.slice.name + schedule_type = ScheduleType.slice.value schedule_type_model = Slice add_title = _("Schedule Email Reports for Charts") edit_title = add_title diff --git a/superset/views/sql_lab.py b/superset/views/sql_lab.py index 1d202fac66a6..cdb51cf64db6 100644 --- a/superset/views/sql_lab.py +++ b/superset/views/sql_lab.py @@ -17,18 +17,18 @@ # pylint: disable=C,R,W from typing import Callable +import simplejson as json from flask import g, redirect from flask_appbuilder import expose from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access, has_access_api -from flask_babel import gettext as __ -from flask_babel import lazy_gettext as _ +from flask_babel import gettext as __, lazy_gettext as _ from flask_sqlalchemy import BaseQuery -import simplejson as json from superset import appbuilder, get_feature_flags, security_manager from superset.models.sql_lab import Query, SavedQuery from superset.utils import core as utils + from .base import BaseSupersetView, DeleteMixin, SupersetFilter, SupersetModelView diff --git a/superset/views/tags.py b/superset/views/tags.py index 3443dc04309a..f3b78cdcad93 100644 --- a/superset/views/tags.py +++ b/superset/views/tags.py @@ -15,16 +15,13 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=C,R,W -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import absolute_import, division, print_function, unicode_literals +import simplejson as json from flask import request, Response from flask_appbuilder import expose from flask_appbuilder.security.decorators import has_access_api from jinja2.sandbox import SandboxedEnvironment -import simplejson as json from sqlalchemy import and_, func from werkzeug.routing import BaseConverter @@ -33,6 +30,7 @@ from superset.models.core import Dashboard, Slice from superset.models.sql_lab import SavedQuery from superset.models.tags import ObjectTypes, Tag, TaggedObject, TagTypes + from .base import BaseSupersetView, json_success diff --git a/superset/views/utils.py b/superset/views/utils.py index 79b9f9094eab..a785600d06d6 100644 --- a/superset/views/utils.py +++ b/superset/views/utils.py @@ -19,17 +19,16 @@ from typing import Any, Dict, List, Optional, Tuple from urllib import parse -from flask import request import simplejson as json +from flask import request +import superset.models.core as models from superset import app, db, viz from superset.connectors.connector_registry import ConnectorRegistry from superset.exceptions import SupersetException from superset.legacy import update_time_range -import superset.models.core as models from superset.utils.core import QueryStatus - FORM_DATA_KEY_BLACKLIST: List[str] = [] if not app.config.get("ENABLE_JAVASCRIPT_CONTROLS"): FORM_DATA_KEY_BLACKLIST = ["js_tooltip", "js_onclick_href", "js_data_mutator"] diff --git a/superset/viz.py b/superset/viz.py index edd5b1caa434..0d11a9d07d90 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -20,31 +20,31 @@ These objects represent the backend of all the visualizations that Superset can render. """ -from collections import defaultdict, OrderedDict import copy -from datetime import datetime, timedelta -from functools import reduce import hashlib import inspect -from itertools import product import logging import math import pickle as pkl import re -from typing import Any, Dict, List, Optional import uuid +from collections import defaultdict, OrderedDict +from datetime import datetime, timedelta +from functools import reduce +from itertools import product +from typing import Any, Dict, List, Optional +import geohash +import numpy as np +import pandas as pd +import polyline +import simplejson as json from dateutil import relativedelta as rdelta from flask import request from flask_babel import lazy_gettext as _ -import geohash from geopy.point import Point from markdown import markdown -import numpy as np -import pandas as pd from pandas.tseries.frequencies import to_offset -import polyline -import simplejson as json from superset import app, cache, get_css_manifest_files from superset.exceptions import NullValueException, SpatialException @@ -56,7 +56,6 @@ to_adhoc, ) - config = app.config stats_logger = config.get("STATS_LOGGER") relative_start = config.get("DEFAULT_RELATIVE_START_TIME", "today") @@ -686,7 +685,7 @@ def get_data(self, df): # Ensure that Pandas's sum function mimics that of SQL. if aggfunc == "sum": - aggfunc = lambda x: x.sum(min_count=1) # noqa: E731 + aggfunc = lambda x: x.sum(min_count=1) groupby = self.form_data.get("groupby") columns = self.form_data.get("columns") @@ -1525,7 +1524,7 @@ class DistributionBarViz(DistributionPieViz): is_timeseries = False def query_obj(self): - d = super().query_obj() # noqa + d = super().query_obj() fd = self.form_data if len(d["groupby"]) < len(fd.get("groupby") or []) + len( fd.get("columns") or [] @@ -2771,6 +2770,6 @@ def get_data(self, df): if ( inspect.isclass(o) and issubclass(o, BaseViz) - and o.viz_type not in config.get("VIZ_TYPE_BLACKLIST") + and o.viz_type not in config["VIZ_TYPE_BLACKLIST"] ) } diff --git a/tests/access_tests.py b/tests/access_tests.py index 999db1f87b16..e2648db1f153 100644 --- a/tests/access_tests.py +++ b/tests/access_tests.py @@ -24,6 +24,7 @@ from superset.connectors.druid.models import DruidDatasource from superset.connectors.sqla.models import SqlaTable from superset.models import core as models + from .base_tests import SupersetTestCase ROLE_TABLES_PERM_DATA = { diff --git a/tests/base_tests.py b/tests/base_tests.py index 812c896e967d..065235ced9c4 100644 --- a/tests/base_tests.py +++ b/tests/base_tests.py @@ -20,8 +20,8 @@ import unittest from unittest.mock import Mock, patch -from flask_appbuilder.security.sqla import models as ab_models import pandas as pd +from flask_appbuilder.security.sqla import models as ab_models from superset import app, db, is_feature_enabled, security_manager from superset.connectors.druid.models import DruidCluster, DruidDatasource diff --git a/tests/cache_tests.py b/tests/cache_tests.py index 603c0992ae66..3a889fa0d06f 100644 --- a/tests/cache_tests.py +++ b/tests/cache_tests.py @@ -19,6 +19,7 @@ from superset import cache, db from superset.utils.core import QueryStatus + from .base_tests import SupersetTestCase diff --git a/tests/celery_tests.py b/tests/celery_tests.py index d4516db9099c..fc33363457a1 100644 --- a/tests/celery_tests.py +++ b/tests/celery_tests.py @@ -29,8 +29,8 @@ from superset.models.sql_lab import Query from superset.sql_parse import ParsedQuery from superset.utils.core import get_example_database -from .base_tests import SupersetTestCase +from .base_tests import SupersetTestCase BASE_DIR = app.config.get("BASE_DIR") CELERY_SLEEP_TIME = 5 diff --git a/tests/core_tests.py b/tests/core_tests.py index efefbadb975e..2110cdb0aa44 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -41,6 +41,7 @@ from superset.utils import core as utils from superset.views import core as views from superset.views.database.views import DatabaseView + from .base_tests import SupersetTestCase from .fixtures.pyodbcRow import Row diff --git a/tests/dashboard_tests.py b/tests/dashboard_tests.py index 46e080712dff..060cc33e69ad 100644 --- a/tests/dashboard_tests.py +++ b/tests/dashboard_tests.py @@ -24,6 +24,7 @@ from superset import db, security_manager from superset.connectors.sqla.models import SqlaTable from superset.models import core as models + from .base_tests import SupersetTestCase diff --git a/tests/dataframe_test.py b/tests/dataframe_test.py index a698cff08245..e07e0c360fd6 100644 --- a/tests/dataframe_test.py +++ b/tests/dataframe_test.py @@ -20,6 +20,7 @@ from superset.dataframe import dedup, SupersetDataFrame from superset.db_engine_specs import BaseEngineSpec from superset.db_engine_specs.presto import PrestoEngineSpec + from .base_tests import SupersetTestCase diff --git a/tests/db_engine_specs_test.py b/tests/db_engine_specs_test.py index 4d624a34993b..17fb92851117 100644 --- a/tests/db_engine_specs_test.py +++ b/tests/db_engine_specs_test.py @@ -38,6 +38,7 @@ from superset.db_engine_specs.sqlite import SqliteEngineSpec from superset.models.core import Database from superset.utils.core import get_example_database + from .base_tests import SupersetTestCase @@ -764,7 +765,7 @@ def test_pg_time_expression_lower_case_column_sec_1y_grain(self): result = str(expr.compile(dialect=postgresql.dialect())) self.assertEqual( result, - "DATE_TRUNC('year', (timestamp 'epoch' + lower_case * interval '1 second'))", # noqa ignore: E50 + "DATE_TRUNC('year', (timestamp 'epoch' + lower_case * interval '1 second'))", ) def test_pg_time_expression_mixed_case_column_1y_grain(self): @@ -792,7 +793,7 @@ def test_pinot_time_expression_sec_1m_grain(self): self.assertEqual( result, 'DATETIMECONVERT(tstamp, "1:SECONDS:EPOCH", "1:SECONDS:EPOCH", "1:MONTHS")', - ) # noqa + ) def test_column_datatype_to_string(self): example_db = get_example_database() diff --git a/tests/dict_import_export_tests.py b/tests/dict_import_export_tests.py index 26080defdfcf..bf523efefc97 100644 --- a/tests/dict_import_export_tests.py +++ b/tests/dict_import_export_tests.py @@ -24,6 +24,7 @@ from superset.connectors.druid.models import DruidColumn, DruidDatasource, DruidMetric from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn from superset.utils.core import get_example_database + from .base_tests import SupersetTestCase DBREF = "dict_import__export_test" diff --git a/tests/druid_func_tests.py b/tests/druid_func_tests.py index 460595dd178a..3afbfaccada4 100644 --- a/tests/druid_func_tests.py +++ b/tests/druid_func_tests.py @@ -18,6 +18,12 @@ import unittest from unittest.mock import Mock +import superset.connectors.druid.models as models +from superset.connectors.druid.models import DruidColumn, DruidDatasource, DruidMetric +from superset.exceptions import SupersetException + +from .base_tests import SupersetTestCase + try: from pydruid.utils.dimensions import ( MapLookupExtraction, @@ -28,11 +34,6 @@ except ImportError: pass -import superset.connectors.druid.models as models -from superset.connectors.druid.models import DruidColumn, DruidDatasource, DruidMetric -from superset.exceptions import SupersetException -from .base_tests import SupersetTestCase - def mock_metric(metric_name, is_postagg=False): metric = Mock() diff --git a/tests/druid_tests.py b/tests/druid_tests.py index 0d5d2dae969c..cfb66252b100 100644 --- a/tests/druid_tests.py +++ b/tests/druid_tests.py @@ -15,13 +15,15 @@ # specific language governing permissions and limitations # under the License. """Unit tests for Superset""" -from datetime import datetime import json import unittest +from datetime import datetime from unittest.mock import Mock, patch from superset import db, security_manager +from .base_tests import SupersetTestCase + try: from superset.connectors.druid.models import ( DruidCluster, @@ -31,7 +33,6 @@ ) except ImportError: pass -from .base_tests import SupersetTestCase class PickableMock(Mock): @@ -94,7 +95,7 @@ def __reduce__(self): }, ] -DruidCluster.get_druid_version = lambda _: "0.9.1" +DruidCluster.get_druid_version = lambda _: "0.9.1" # type: ignore class DruidTests(SupersetTestCase): diff --git a/tests/email_tests.py b/tests/email_tests.py index 8ae860124281..cc3388d5691c 100644 --- a/tests/email_tests.py +++ b/tests/email_tests.py @@ -16,16 +16,17 @@ # specific language governing permissions and limitations # under the License. """Unit tests for email service in Superset""" -from email.mime.application import MIMEApplication -from email.mime.image import MIMEImage -from email.mime.multipart import MIMEMultipart import logging import tempfile import unittest +from email.mime.application import MIMEApplication +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart from unittest import mock from superset import app from superset.utils import core as utils + from .utils import read_fixture send_email_test = mock.Mock() diff --git a/tests/import_export_tests.py b/tests/import_export_tests.py index 30a55ce48926..d32c7ea03036 100644 --- a/tests/import_export_tests.py +++ b/tests/import_export_tests.py @@ -26,6 +26,7 @@ from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn from superset.models import core as models from superset.utils import core as utils + from .base_tests import SupersetTestCase @@ -251,7 +252,7 @@ def test_export_2_dashboards(self): self.login("admin") birth_dash = self.get_dash_by_slug("births") world_health_dash = self.get_dash_by_slug("world_health") - export_dash_url = "/dashboard/export_dashboards_form?id={}&id={}&action=go".format( # noqa ignore: E50 + export_dash_url = "/dashboard/export_dashboards_form?id={}&id={}&action=go".format( birth_dash.id, world_health_dash.id ) resp = self.client.get(export_dash_url) diff --git a/tests/load_examples_test.py b/tests/load_examples_test.py index 0d1db798b1f8..d98542f4f2c2 100644 --- a/tests/load_examples_test.py +++ b/tests/load_examples_test.py @@ -16,6 +16,7 @@ # under the License. from superset import examples from superset.cli import load_test_users_run + from .base_tests import SupersetTestCase diff --git a/tests/macro_tests.py b/tests/macro_tests.py index 4497feb9bae0..1b9b66ec3090 100644 --- a/tests/macro_tests.py +++ b/tests/macro_tests.py @@ -16,8 +16,7 @@ # under the License. from flask import json -from superset import app -from superset import jinja_context +from superset import app, jinja_context from tests.base_tests import SupersetTestCase diff --git a/tests/migration_tests.py b/tests/migration_tests.py index bdfc9da893d7..9ab5aa2422fd 100644 --- a/tests/migration_tests.py +++ b/tests/migration_tests.py @@ -20,6 +20,7 @@ Slice, upgrade_slice, ) + from .base_tests import SupersetTestCase diff --git a/tests/model_tests.py b/tests/model_tests.py index 784c05674225..22909498fb15 100644 --- a/tests/model_tests.py +++ b/tests/model_tests.py @@ -23,6 +23,7 @@ from superset import app from superset.models.core import Database from superset.utils.core import get_example_database, QueryStatus + from .base_tests import SupersetTestCase diff --git a/tests/schedules_test.py b/tests/schedules_test.py index 9b583946e937..99e6dc95e550 100644 --- a/tests/schedules_test.py +++ b/tests/schedules_test.py @@ -14,8 +14,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from datetime import datetime, timedelta import unittest +from datetime import datetime, timedelta from unittest.mock import Mock, patch, PropertyMock from flask_babel import gettext as __ @@ -35,6 +35,7 @@ deliver_slice, next_schedules, ) + from .utils import read_fixture diff --git a/tests/security_tests.py b/tests/security_tests.py index 3a2cba25ccc0..4192843ae5cb 100644 --- a/tests/security_tests.py +++ b/tests/security_tests.py @@ -20,6 +20,7 @@ from superset import app, appbuilder, security_manager, viz from superset.exceptions import SupersetSecurityException + from .base_tests import SupersetTestCase diff --git a/tests/sql_validator_tests.py b/tests/sql_validator_tests.py index 3313f7eb471b..069bae8a6bc2 100644 --- a/tests/sql_validator_tests.py +++ b/tests/sql_validator_tests.py @@ -27,6 +27,7 @@ PrestoDBSQLValidator, PrestoSQLValidationError, ) + from .base_tests import SupersetTestCase PRESTO_TEST_FEATURE_FLAGS = { @@ -119,7 +120,7 @@ class PrestoValidatorTests(SupersetTestCase): def setUp(self): self.validator = PrestoDBSQLValidator - self.database = MagicMock() # noqa + self.database = MagicMock() self.database_engine = self.database.get_sqla_engine.return_value self.database_conn = self.database_engine.raw_connection.return_value self.database_cursor = self.database_conn.cursor.return_value diff --git a/tests/sqla_models_tests.py b/tests/sqla_models_tests.py index 8215dfef6356..38d0468f8f9c 100644 --- a/tests/sqla_models_tests.py +++ b/tests/sqla_models_tests.py @@ -17,6 +17,7 @@ from superset.connectors.sqla.models import SqlaTable, TableColumn from superset.db_engine_specs.druid import DruidEngineSpec from superset.utils.core import get_example_database + from .base_tests import SupersetTestCase diff --git a/tests/sqllab_tests.py b/tests/sqllab_tests.py index cad88f325cb4..86838ec18bf5 100644 --- a/tests/sqllab_tests.py +++ b/tests/sqllab_tests.py @@ -15,8 +15,8 @@ # specific language governing permissions and limitations # under the License. """Unit tests for Sql Lab""" -from datetime import datetime, timedelta import json +from datetime import datetime, timedelta import prison @@ -25,6 +25,7 @@ from superset.db_engine_specs import BaseEngineSpec from superset.models.sql_lab import Query from superset.utils.core import datetime_to_epoch, get_example_database + from .base_tests import SupersetTestCase QUERY_1 = "SELECT * FROM birth_names LIMIT 1" diff --git a/tests/strategy_tests.py b/tests/strategy_tests.py index 0786ed36f74d..3a0dc62c2822 100644 --- a/tests/strategy_tests.py +++ b/tests/strategy_tests.py @@ -26,8 +26,8 @@ get_form_data, TopNDashboardsStrategy, ) -from .base_tests import SupersetTestCase +from .base_tests import SupersetTestCase URL_PREFIX = "0.0.0.0:8081" diff --git a/tests/superset_test_config.py b/tests/superset_test_config.py index bdcefa1f11b2..3627aa39512d 100644 --- a/tests/superset_test_config.py +++ b/tests/superset_test_config.py @@ -14,9 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -# flake8: noqa from copy import copy -from superset.config import * + +from superset.config import * # type: ignore AUTH_USER_REGISTRATION_ROLE = "alpha" SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(DATA_DIR, "unittests.db") @@ -26,7 +26,7 @@ # Allowing SQLALCHEMY_DATABASE_URI to be defined as an env var for # continuous integration if "SUPERSET__SQLALCHEMY_DATABASE_URI" in os.environ: - SQLALCHEMY_DATABASE_URI = os.environ.get("SUPERSET__SQLALCHEMY_DATABASE_URI") + SQLALCHEMY_DATABASE_URI = os.environ["SUPERSET__SQLALCHEMY_DATABASE_URI"] SQL_SELECT_AS_CTA = True SQL_MAX_ROW = 666 diff --git a/tests/utils_tests.py b/tests/utils_tests.py index a0765834c6fd..8ba37cf801ea 100644 --- a/tests/utils_tests.py +++ b/tests/utils_tests.py @@ -14,15 +14,15 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import unittest +import uuid from datetime import date, datetime, time, timedelta from decimal import Decimal -import unittest from unittest.mock import patch -import uuid +import numpy from flask import Flask from flask_caching import Cache -import numpy from sqlalchemy.exc import ArgumentError from superset import app, db, security_manager diff --git a/tests/viz_tests.py b/tests/viz_tests.py index b5638fa581be..5077dae43ee9 100644 --- a/tests/viz_tests.py +++ b/tests/viz_tests.py @@ -14,17 +14,18 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import uuid from datetime import datetime from unittest.mock import Mock, patch -import uuid import numpy as np import pandas as pd +import superset.viz as viz from superset import app from superset.exceptions import SpatialException from superset.utils.core import DTTM_ALIAS -import superset.viz as viz + from .base_tests import SupersetTestCase from .utils import load_fixture diff --git a/tox.ini b/tox.ini index 1c33d69e5d25..8a8096df6c0f 100644 --- a/tox.ini +++ b/tox.ini @@ -14,26 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -[flake8] -accept-encodings = utf-8 -application-import-names = - superset - tests -commands = - flake8 setup.py superset tests -exclude = - superset/assets - superset/data - superset/migrations -ignore = - E203 - E501 - I202 - W503 - W605 -import-order-style = google -max-line-length = 88 - [testenv] commands = {toxinidir}/superset/bin/superset db upgrade @@ -104,9 +84,15 @@ commands = npm run lint deps = -[testenv:flake8] +[testenv:fossa] +commands = + {toxinidir}/scripts/fossa.sh +deps = +passenv = * + +[testenv:isort] commands = - flake8 setup.py superset tests + isort --check-only --recursive setup.py superset tests deps = -rrequirements-dev.txt @@ -124,11 +110,11 @@ whitelist_externals = {toxinidir}/scripts/check_license.sh deps = -[testenv:fossa] +[testenv:mypy] commands = - {toxinidir}/scripts/fossa.sh -passenv = * + mypy setup.py superset tests deps = + -rrequirements-dev.txt [testenv:py36-mysql] deps = @@ -157,8 +143,9 @@ envlist = cypress-explore cypress-sqllab eslint - flake8 + isort javascript + mypy pylint license-check skipsdist = true