This is an automated email from the ASF dual-hosted git repository. villebro pushed a commit to branch villebro/superset-core in repository https://gitbox.apache.org/repos/asf/superset.git
commit a35c17cebfcbd9f9d33e0f8987df54e30f0e87c2 Author: Ville Brofeldt <[email protected]> AuthorDate: Wed Dec 4 18:11:36 2024 -0800 feat: break out superset-core package --- pyproject.toml | 1 + requirements/base.in | 1 + requirements/base.txt | 4 ++- requirements/development.txt | 6 ++-- superset-core/pyproject.toml | 12 ++++++++ superset-core/superset_core/__init__.py | 0 superset-core/superset_core/charts/__init__.py | 0 .../superset_core/charts/types.py | 27 ++++++++++------- superset-core/superset_core/utils/__init__.py | 0 .../superset_core}/utils/backports.py | 0 superset/common/chart_data.py | 2 +- superset/common/db_query_status.py | 2 +- superset/common/query_context.py | 2 +- superset/common/query_context_processor.py | 2 +- superset/connectors/sqla/models.py | 35 ++++++++++------------ superset/constants.py | 2 +- superset/db_engine_specs/base.py | 3 +- superset/db_engine_specs/doris.py | 2 +- superset/db_engine_specs/mysql.py | 2 +- superset/db_engine_specs/presto.py | 2 +- superset/db_engine_specs/starrocks.py | 2 +- superset/errors.py | 3 +- superset/key_value/types.py | 2 +- superset/models/core.py | 2 +- superset/models/helpers.py | 20 +++++-------- superset/reports/models.py | 2 +- superset/result_set.py | 10 +++---- superset/security/guest_token.py | 3 +- superset/sql_parse.py | 2 +- superset/sqllab/limiting_factor.py | 2 +- superset/superset_typing.py | 10 +++---- superset/tasks/types.py | 2 +- superset/utils/core.py | 20 ++----------- superset/utils/csv.py | 2 +- superset/utils/excel.py | 3 +- superset/utils/slack.py | 2 +- 36 files changed, 94 insertions(+), 98 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c54d1a7f31..3f09bef7f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -95,6 +95,7 @@ dependencies = [ #https://github.com/tobymao/sqlglot/blob/main/CHANGELOG.md#v25250---2024-10-14 "sqlglot>=25.24.0,<25.25.0", "sqlparse>=0.5.0", + "superset-core", "tabulate>=0.8.9, <0.9", "typing-extensions>=4, <5", "waitress; sys_platform == 'win32'", diff --git a/requirements/base.in b/requirements/base.in index ca3a260a0e..311dcab6d6 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -17,6 +17,7 @@ # under the License. # -e file:. +-e file:superset-core/. urllib3>=1.26.18 werkzeug>=3.0.1 numexpr>=2.9.0 diff --git a/requirements/base.txt b/requirements/base.txt index 724ca62712..c49103020a 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:04f7e0860829f18926ea238354e6d4a6ab823d50 +# SHA1:5db27c2c8daa8730583759637e8e8ae11ef40369 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -7,6 +7,8 @@ # -e file:. # via -r requirements/base.in +-e file:superset-core/. + # via -r requirements/base.in alembic==1.14.0 # via flask-migrate amqp==5.3.1 diff --git a/requirements/development.txt b/requirements/development.txt index 77c52059fa..3277978059 100644 --- a/requirements/development.txt +++ b/requirements/development.txt @@ -6,10 +6,12 @@ # pip-compile-multi # -r base.txt --e file:. +-e file:///Users/ville/apple/apache-superset # via - # -r requirements/base.in + # -r /Users/ville/apple/apache-superset/requirements/base.in # -r requirements/development.in +-e file:superset-core/. + # via -r /Users/ville/apple/apache-superset/requirements/base.in astroid==3.1.0 # via pylint build==1.2.1 diff --git a/superset-core/pyproject.toml b/superset-core/pyproject.toml new file mode 100644 index 0000000000..0f2b3909f5 --- /dev/null +++ b/superset-core/pyproject.toml @@ -0,0 +1,12 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "superset-core" +version = "0.1.0" +description = "Core stuff for Superset backend" +authors = [ + { name = "Apache Software Foundation", email = "[email protected]" }, +] +dependencies = [] diff --git a/superset-core/superset_core/__init__.py b/superset-core/superset_core/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/superset-core/superset_core/charts/__init__.py b/superset-core/superset_core/charts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/superset/common/db_query_status.py b/superset-core/superset_core/charts/types.py similarity index 68% copy from superset/common/db_query_status.py copy to superset-core/superset_core/charts/types.py index fa893a1717..22dd4ad45e 100644 --- a/superset/common/db_query_status.py +++ b/superset-core/superset_core/charts/types.py @@ -14,17 +14,22 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.utils.backports import StrEnum +from enum import IntEnum -class QueryStatus(StrEnum): - """Enum-type class for query statuses""" - STOPPED: str = "stopped" - FAILED: str = "failed" - PENDING: str = "pending" - RUNNING: str = "running" - SCHEDULED: str = "scheduled" - SUCCESS: str = "success" - FETCHING: str = "fetching" - TIMED_OUT: str = "timed_out" +class GenericDataType(IntEnum): + """ + Generic database column type that fits both frontend and backend. + """ + + NUMERIC = 0 + STRING = 1 + TEMPORAL = 2 + BOOLEAN = 3 + # Mapping all the complex data types to STRING for now and leaving these as a + # reminder. + # ARRAY = 4 + # JSON = 5 + # MAP = 6 + # ROW = 7 diff --git a/superset-core/superset_core/utils/__init__.py b/superset-core/superset_core/utils/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/superset/utils/backports.py b/superset-core/superset_core/utils/backports.py similarity index 100% rename from superset/utils/backports.py rename to superset-core/superset_core/utils/backports.py diff --git a/superset/common/chart_data.py b/superset/common/chart_data.py index e03f51eee2..207880dc53 100644 --- a/superset/common/chart_data.py +++ b/superset/common/chart_data.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.utils.backports import StrEnum +from superset_core.utils.backports import StrEnum class ChartDataResultFormat(StrEnum): diff --git a/superset/common/db_query_status.py b/superset/common/db_query_status.py index fa893a1717..97d295f304 100644 --- a/superset/common/db_query_status.py +++ b/superset/common/db_query_status.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.utils.backports import StrEnum +from superset_core.utils.backports import StrEnum class QueryStatus(StrEnum): diff --git a/superset/common/query_context.py b/superset/common/query_context.py index a04e394460..e893575adb 100644 --- a/superset/common/query_context.py +++ b/superset/common/query_context.py @@ -20,6 +20,7 @@ import logging from typing import Any, ClassVar, TYPE_CHECKING import pandas as pd +from superset_core.charts.types import GenericDataType from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType from superset.common.query_context_processor import ( @@ -28,7 +29,6 @@ from superset.common.query_context_processor import ( ) from superset.common.query_object import QueryObject from superset.models.slice import Slice -from superset.utils.core import GenericDataType if TYPE_CHECKING: from superset.connectors.sqla.models import BaseDatasource diff --git a/superset/common/query_context_processor.py b/superset/common/query_context_processor.py index 27478fe6de..148c72f50d 100644 --- a/superset/common/query_context_processor.py +++ b/superset/common/query_context_processor.py @@ -26,6 +26,7 @@ import numpy as np import pandas as pd from flask_babel import gettext as _ from pandas import DateOffset +from superset_core.charts.types import GenericDataType from superset import app from superset.common.chart_data import ChartDataResultFormat @@ -57,7 +58,6 @@ from superset.utils.core import ( DTTM_ALIAS, error_msg_from_exception, FilterOperator, - GenericDataType, get_base_axis_labels, get_column_names_from_columns, get_column_names_from_metrics, diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 01889cb2e1..10d708a59e 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -69,6 +69,8 @@ from sqlalchemy.sql import column, ColumnElement, literal_column, table from sqlalchemy.sql.elements import ColumnClause, TextClause from sqlalchemy.sql.expression import Label from sqlalchemy.sql.selectable import Alias, TableClause +from superset_core.charts.types import GenericDataType +from superset_core.utils.backports import StrEnum from superset import app, db, is_feature_enabled, security_manager from superset.commands.dataset.exceptions import DatasetNotFoundError @@ -115,7 +117,6 @@ from superset.superset_typing import ( ResultSetColumnType, ) from superset.utils import core as utils, json -from superset.utils.backports import StrEnum config = app.config metadata = Model.metadata # pylint: disable=no-member @@ -476,7 +477,7 @@ class BaseDatasource(AuditMixinNullable, ImportExportMixin): # pylint: disable= ] filtered_columns: list[Column] = [] - column_types: set[utils.GenericDataType] = set() + column_types: set[GenericDataType] = set() for column_ in data["columns"]: generic_type = column_.get("type_generic") if generic_type is not None: @@ -510,7 +511,7 @@ class BaseDatasource(AuditMixinNullable, ImportExportMixin): # pylint: disable= def filter_values_handler( # pylint: disable=too-many-arguments values: FilterValues | None, operator: str, - target_generic_type: utils.GenericDataType, + target_generic_type: GenericDataType, target_native_type: str | None = None, is_list_target: bool = False, db_engine_spec: builtins.type[BaseEngineSpec] | None = None, @@ -524,7 +525,7 @@ class BaseDatasource(AuditMixinNullable, ImportExportMixin): # pylint: disable= return value if ( isinstance(value, (float, int)) - and target_generic_type == utils.GenericDataType.TEMPORAL + and target_generic_type == GenericDataType.TEMPORAL and target_native_type is not None and db_engine_spec is not None ): @@ -537,14 +538,10 @@ class BaseDatasource(AuditMixinNullable, ImportExportMixin): # pylint: disable= if isinstance(value, str): value = value.strip("\t\n") - if ( - target_generic_type == utils.GenericDataType.NUMERIC - and operator - not in { - utils.FilterOperator.ILIKE, - utils.FilterOperator.LIKE, - } - ): + if target_generic_type == GenericDataType.NUMERIC and operator not in { + utils.FilterOperator.ILIKE, + utils.FilterOperator.LIKE, + }: # For backwards compatibility and edge cases # where a column data type might have changed return utils.cast_to_num(value) @@ -552,7 +549,7 @@ class BaseDatasource(AuditMixinNullable, ImportExportMixin): # pylint: disable= return None if value == EMPTY_STRING: return "" - if target_generic_type == utils.GenericDataType.BOOLEAN: + if target_generic_type == GenericDataType.BOOLEAN: return utils.cast_to_boolean(value) return value @@ -891,21 +888,21 @@ class TableColumn(AuditMixinNullable, ImportExportMixin, CertificationMixin, Mod """ Check if the column has a boolean datatype. """ - return self.type_generic == utils.GenericDataType.BOOLEAN + return self.type_generic == GenericDataType.BOOLEAN @property def is_numeric(self) -> bool: """ Check if the column has a numeric datatype. """ - return self.type_generic == utils.GenericDataType.NUMERIC + return self.type_generic == GenericDataType.NUMERIC @property def is_string(self) -> bool: """ Check if the column has a string datatype. """ - return self.type_generic == utils.GenericDataType.STRING + return self.type_generic == GenericDataType.STRING @property def is_temporal(self) -> bool: @@ -917,7 +914,7 @@ class TableColumn(AuditMixinNullable, ImportExportMixin, CertificationMixin, Mod """ if self.is_dttm is not None: return self.is_dttm - return self.type_generic == utils.GenericDataType.TEMPORAL + return self.type_generic == GenericDataType.TEMPORAL @property def database(self) -> Database: @@ -932,9 +929,9 @@ class TableColumn(AuditMixinNullable, ImportExportMixin, CertificationMixin, Mod return self.database.get_extra() @property - def type_generic(self) -> utils.GenericDataType | None: + def type_generic(self) -> GenericDataType | None: if self.is_dttm: - return utils.GenericDataType.TEMPORAL + return GenericDataType.TEMPORAL return ( column_spec.generic_type diff --git a/superset/constants.py b/superset/constants.py index f6cf2a1157..cf4a343c49 100644 --- a/superset/constants.py +++ b/superset/constants.py @@ -20,7 +20,7 @@ # string to use when None values *need* to be converted to/from strings from enum import Enum -from superset.utils.backports import StrEnum +from superset_core.utils.backports import StrEnum USER_AGENT = "Apache Superset" diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index e6c52d6849..4ec2835e5f 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -57,6 +57,7 @@ from sqlalchemy.sql import literal_column, quoted_name, text from sqlalchemy.sql.expression import ColumnClause, Select, TextAsFrom, TextClause from sqlalchemy.types import TypeEngine from sqlparse.tokens import CTE +from superset_core.charts.types import GenericDataType from superset import db, sql_parse from superset.constants import QUERY_CANCEL_KEY, TimeGrain as TimeGrainConstants @@ -73,7 +74,7 @@ from superset.superset_typing import ( SQLAColumnType, ) from superset.utils import core as utils, json -from superset.utils.core import ColumnSpec, GenericDataType +from superset.utils.core import ColumnSpec from superset.utils.hashing import md5_sha_from_str from superset.utils.json import redact_sensitive, reveal_sensitive from superset.utils.network import is_hostname_valid, is_port_open diff --git a/superset/db_engine_specs/doris.py b/superset/db_engine_specs/doris.py index e502f5bda2..0f0beb29cd 100644 --- a/superset/db_engine_specs/doris.py +++ b/superset/db_engine_specs/doris.py @@ -24,10 +24,10 @@ from flask_babel import gettext as __ from sqlalchemy import Float, Integer, Numeric, String, TEXT, types from sqlalchemy.engine.url import URL from sqlalchemy.sql.type_api import TypeEngine +from superset_core.charts.types import GenericDataType from superset.db_engine_specs.mysql import MySQLEngineSpec from superset.errors import SupersetErrorType -from superset.utils.core import GenericDataType # Regular expressions to catch custom errors CONNECTION_ACCESS_DENIED_REGEX = re.compile( diff --git a/superset/db_engine_specs/mysql.py b/superset/db_engine_specs/mysql.py index fc0606697b..6a1b3c430b 100644 --- a/superset/db_engine_specs/mysql.py +++ b/superset/db_engine_specs/mysql.py @@ -37,12 +37,12 @@ from sqlalchemy.dialects.mysql import ( TINYTEXT, ) from sqlalchemy.engine.url import URL +from superset_core.charts.types import GenericDataType from superset.constants import TimeGrain from superset.db_engine_specs.base import BaseEngineSpec, BasicParametersMixin from superset.errors import SupersetErrorType from superset.models.sql_lab import Query -from superset.utils.core import GenericDataType # Regular expressions to catch custom errors CONNECTION_ACCESS_DENIED_REGEX = re.compile( diff --git a/superset/db_engine_specs/presto.py b/superset/db_engine_specs/presto.py index 61b4cff5c3..9e29f32e5c 100644 --- a/superset/db_engine_specs/presto.py +++ b/superset/db_engine_specs/presto.py @@ -39,6 +39,7 @@ from sqlalchemy.engine.reflection import Inspector from sqlalchemy.engine.result import Row as ResultRow from sqlalchemy.engine.url import URL from sqlalchemy.sql.expression import ColumnClause, Select +from superset_core.charts.types import GenericDataType from superset import cache_manager, db, is_feature_enabled from superset.common.db_query_status import QueryStatus @@ -60,7 +61,6 @@ from superset.models.sql_types.presto_sql_types import ( from superset.result_set import destringify from superset.superset_typing import ResultSetColumnType from superset.utils import core as utils, json -from superset.utils.core import GenericDataType if TYPE_CHECKING: # prevent circular imports diff --git a/superset/db_engine_specs/starrocks.py b/superset/db_engine_specs/starrocks.py index 6f54329d6f..6a2832ddb3 100644 --- a/superset/db_engine_specs/starrocks.py +++ b/superset/db_engine_specs/starrocks.py @@ -25,11 +25,11 @@ from flask_babel import gettext as __ from sqlalchemy import Float, Integer, Numeric, types from sqlalchemy.engine.url import URL from sqlalchemy.sql.type_api import TypeEngine +from superset_core.charts.types import GenericDataType from superset.db_engine_specs.mysql import MySQLEngineSpec from superset.errors import SupersetErrorType from superset.models.core import Database -from superset.utils.core import GenericDataType # Regular expressions to catch custom errors CONNECTION_ACCESS_DENIED_REGEX = re.compile( diff --git a/superset/errors.py b/superset/errors.py index 4d9c08d142..9d39a10cd0 100644 --- a/superset/errors.py +++ b/superset/errors.py @@ -18,8 +18,7 @@ from dataclasses import dataclass from typing import Any, Optional from flask_babel import lazy_gettext as _ - -from superset.utils.backports import StrEnum +from superset_core.utils.backports import StrEnum class SupersetErrorType(StrEnum): diff --git a/superset/key_value/types.py b/superset/key_value/types.py index f6459c3302..532cbb4195 100644 --- a/superset/key_value/types.py +++ b/superset/key_value/types.py @@ -23,12 +23,12 @@ from typing import Any, TypedDict, Union from uuid import UUID from marshmallow import Schema, ValidationError +from superset_core.utils.backports import StrEnum from superset.key_value.exceptions import ( KeyValueCodecDecodeException, KeyValueCodecEncodeException, ) -from superset.utils.backports import StrEnum Key = Union[int, UUID] diff --git a/superset/models/core.py b/superset/models/core.py index 9b06932afc..7ff980de32 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -59,6 +59,7 @@ from sqlalchemy.orm import relationship from sqlalchemy.pool import NullPool from sqlalchemy.schema import UniqueConstraint from sqlalchemy.sql import ColumnElement, expression, Select +from superset_core.utils.backports import StrEnum from superset import app, db, db_engine_specs, is_feature_enabled from superset.commands.database.exceptions import DatabaseInvalidError @@ -77,7 +78,6 @@ from superset.result_set import SupersetResultSet from superset.sql_parse import Table from superset.superset_typing import OAuth2ClientConfig, ResultSetColumnType from superset.utils import cache as cache_util, core as utils, json -from superset.utils.backports import StrEnum from superset.utils.core import DatasourceName, get_username from superset.utils.oauth2 import get_oauth2_access_token, OAuth2ClientConfigSchema diff --git a/superset/models/helpers.py b/superset/models/helpers.py index feb05a401e..debb80b0ab 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -50,6 +50,7 @@ from sqlalchemy.sql.elements import ColumnElement, literal_column, TextClause from sqlalchemy.sql.expression import Label, Select, TextAsFrom from sqlalchemy.sql.selectable import Alias, TableClause from sqlalchemy_utils import UUIDType +from superset_core.charts.types import GenericDataType from superset import app, db, is_feature_enabled from superset.advanced_data_type.types import AdvancedDataTypeResponse @@ -85,7 +86,6 @@ from superset.superset_typing import ( ) from superset.utils import core as utils, json from superset.utils.core import ( - GenericDataType, get_column_name, get_non_base_axis_columns, get_user_id, @@ -1135,7 +1135,7 @@ class ExploreMixin: # pylint: disable=too-many-public-methods def filter_values_handler( # pylint: disable=too-many-arguments values: Optional[FilterValues], operator: str, - target_generic_type: utils.GenericDataType, + target_generic_type: GenericDataType, target_native_type: Optional[str] = None, is_list_target: bool = False, db_engine_spec: Optional[ @@ -1151,7 +1151,7 @@ class ExploreMixin: # pylint: disable=too-many-public-methods return value if ( isinstance(value, (float, int)) - and target_generic_type == utils.GenericDataType.TEMPORAL + and target_generic_type == GenericDataType.TEMPORAL and target_native_type is not None and db_engine_spec is not None ): @@ -1164,14 +1164,10 @@ class ExploreMixin: # pylint: disable=too-many-public-methods if isinstance(value, str): value = value.strip("\t\n") - if ( - target_generic_type == utils.GenericDataType.NUMERIC - and operator - not in { - utils.FilterOperator.ILIKE, - utils.FilterOperator.LIKE, - } - ): + if target_generic_type == GenericDataType.NUMERIC and operator not in { + utils.FilterOperator.ILIKE, + utils.FilterOperator.LIKE, + }: # For backwards compatibility and edge cases # where a column data type might have changed return utils.cast_to_num(value) @@ -1179,7 +1175,7 @@ class ExploreMixin: # pylint: disable=too-many-public-methods return None if value == EMPTY_STRING: return "" - if target_generic_type == utils.GenericDataType.BOOLEAN: + if target_generic_type == GenericDataType.BOOLEAN: return utils.cast_to_boolean(value) return value diff --git a/superset/reports/models.py b/superset/reports/models.py index e4cdd7c9b4..5fe12f3c76 100644 --- a/superset/reports/models.py +++ b/superset/reports/models.py @@ -34,6 +34,7 @@ from sqlalchemy import ( from sqlalchemy.orm import backref, relationship from sqlalchemy.schema import UniqueConstraint from sqlalchemy_utils import UUIDType +from superset_core.utils.backports import StrEnum from superset.extensions import security_manager from superset.models.core import Database @@ -41,7 +42,6 @@ from superset.models.dashboard import Dashboard from superset.models.helpers import AuditMixinNullable, ExtraJSONMixin from superset.models.slice import Slice from superset.reports.types import ReportScheduleExtra -from superset.utils.backports import StrEnum from superset.utils.core import MediumText metadata = Model.metadata # pylint: disable=no-member diff --git a/superset/result_set.py b/superset/result_set.py index f4303a7f80..a6ec1aace9 100644 --- a/superset/result_set.py +++ b/superset/result_set.py @@ -24,11 +24,11 @@ import numpy as np import pandas as pd import pyarrow as pa from numpy.typing import NDArray +from superset_core.charts.types import GenericDataType from superset.db_engine_specs import BaseEngineSpec from superset.superset_typing import DbapiDescription, DbapiResult, ResultSetColumnType -from superset.utils import core as utils, json -from superset.utils.core import GenericDataType +from superset.utils import json logger = logging.getLogger(__name__) @@ -154,7 +154,7 @@ class SupersetResultSet: if pa.types.is_nested(pa_data[i].type): # TODO: revisit nested column serialization once nested types # are added as a natively supported column type in Superset - # (superset.utils.core.GenericDataType). + # (superset_core.charts.types.GenericDataType). stringified_arr = stringify_values(array[column]) pa_data[i] = pa.array(stringified_arr.tolist()) @@ -222,9 +222,7 @@ class SupersetResultSet: return False return column_spec.is_dttm - def type_generic( - self, db_type_str: Optional[str] - ) -> Optional[utils.GenericDataType]: + def type_generic(self, db_type_str: Optional[str]) -> Optional[GenericDataType]: column_spec = self.db_engine_spec.get_column_spec(db_type_str) if column_spec is None: return None diff --git a/superset/security/guest_token.py b/superset/security/guest_token.py index 6727330afe..6c8b375dcf 100644 --- a/superset/security/guest_token.py +++ b/superset/security/guest_token.py @@ -18,8 +18,7 @@ from typing import Optional, TypedDict, Union from flask_appbuilder.security.sqla.models import Role from flask_login import AnonymousUserMixin - -from superset.utils.backports import StrEnum +from superset_core.utils.backports import StrEnum class GuestTokenUser(TypedDict, total=False): diff --git a/superset/sql_parse.py b/superset/sql_parse.py index cb457cd4f5..5d3b3a87ef 100644 --- a/superset/sql_parse.py +++ b/superset/sql_parse.py @@ -53,6 +53,7 @@ from sqlparse.tokens import ( Wildcard, ) from sqlparse.utils import imt +from superset_core.utils.backports import StrEnum from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.exceptions import ( @@ -67,7 +68,6 @@ from superset.sql.parse import ( SQLStatement, Table, ) -from superset.utils.backports import StrEnum try: from sqloxide import parse_sql as sqloxide_parse diff --git a/superset/sqllab/limiting_factor.py b/superset/sqllab/limiting_factor.py index 638f9e347a..da3174d871 100644 --- a/superset/sqllab/limiting_factor.py +++ b/superset/sqllab/limiting_factor.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.utils.backports import StrEnum +from superset_core.utils.backports import StrEnum class LimitingFactor(StrEnum): diff --git a/superset/superset_typing.py b/superset/superset_typing.py index c3c40cd31a..fbe3f6ffb2 100644 --- a/superset/superset_typing.py +++ b/superset/superset_typing.py @@ -16,15 +16,13 @@ # under the License. from collections.abc import Sequence from datetime import datetime -from typing import Any, Literal, Optional, TYPE_CHECKING, TypedDict, Union +from typing import Any, Literal, Optional, TypedDict, Union from sqlalchemy.sql.type_api import TypeEngine +from superset_core.charts.types import GenericDataType from typing_extensions import NotRequired from werkzeug.wrappers import Response -if TYPE_CHECKING: - from superset.utils.core import GenericDataType - SQLType = Union[TypeEngine, type[TypeEngine]] @@ -42,7 +40,7 @@ class AdhocMetricColumn(TypedDict, total=False): is_dttm: bool python_date_format: Optional[str] type: str - type_generic: "GenericDataType" + type_generic: GenericDataType verbose_name: Optional[str] @@ -78,7 +76,7 @@ class ResultSetColumnType(TypedDict): column_name: str type: Optional[Union[SQLType, str]] is_dttm: Optional[bool] - type_generic: NotRequired[Optional["GenericDataType"]] + type_generic: NotRequired[Optional[GenericDataType]] nullable: NotRequired[Any] default: NotRequired[Any] diff --git a/superset/tasks/types.py b/superset/tasks/types.py index 84a3e7b01f..944528505e 100644 --- a/superset/tasks/types.py +++ b/superset/tasks/types.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.utils.backports import StrEnum +from superset_core.utils.backports import StrEnum class ExecutorType(StrEnum): diff --git a/superset/utils/core.py b/superset/utils/core.py index ada40053c1..98fe153439 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -44,7 +44,7 @@ from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import formatdate -from enum import Enum, IntEnum +from enum import Enum from io import BytesIO from timeit import default_timer from types import TracebackType @@ -71,6 +71,8 @@ from sqlalchemy.engine import Connection, Engine from sqlalchemy.engine.reflection import Inspector from sqlalchemy.sql.type_api import Variant from sqlalchemy.types import TypeEngine +from superset_core.charts.types import GenericDataType +from superset_core.utils.backports import StrEnum from typing_extensions import TypeGuard from superset.constants import ( @@ -96,7 +98,6 @@ from superset.superset_typing import ( FormData, Metric, ) -from superset.utils.backports import StrEnum from superset.utils.database import get_example_database from superset.utils.date_parser import parse_human_timedelta from superset.utils.hashing import md5_sha_from_dict, md5_sha_from_str @@ -131,21 +132,6 @@ class AnnotationType(StrEnum): TIME_SERIES = "TIME_SERIES" -class GenericDataType(IntEnum): - """ - Generic database column type that fits both frontend and backend. - """ - - NUMERIC = 0 - STRING = 1 - TEMPORAL = 2 - BOOLEAN = 3 - # ARRAY = 4 # Mapping all the complex data types to STRING for now - # JSON = 5 # and leaving these as a reminder. - # MAP = 6 - # ROW = 7 - - class DatasourceType(StrEnum): TABLE = "table" DATASET = "dataset" diff --git a/superset/utils/csv.py b/superset/utils/csv.py index bf5045728d..b281547e8a 100644 --- a/superset/utils/csv.py +++ b/superset/utils/csv.py @@ -22,9 +22,9 @@ from urllib.error import URLError import numpy as np import pandas as pd +from superset_core.charts.types import GenericDataType from superset.utils import json -from superset.utils.core import GenericDataType logger = logging.getLogger(__name__) diff --git a/superset/utils/excel.py b/superset/utils/excel.py index 602549975f..ac51927049 100644 --- a/superset/utils/excel.py +++ b/superset/utils/excel.py @@ -18,8 +18,7 @@ import io from typing import Any import pandas as pd - -from superset.utils.core import GenericDataType +from superset_core.charts.types import GenericDataType def quote_formulas(df: pd.DataFrame) -> pd.DataFrame: diff --git a/superset/utils/slack.py b/superset/utils/slack.py index 468429fb60..7d09507d62 100644 --- a/superset/utils/slack.py +++ b/superset/utils/slack.py @@ -22,10 +22,10 @@ from typing import Optional from flask import current_app from slack_sdk import WebClient from slack_sdk.errors import SlackApiError +from superset_core.utils.backports import StrEnum from superset import feature_flag_manager from superset.exceptions import SupersetException -from superset.utils.backports import StrEnum logger = logging.getLogger(__name__)
