This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 01d5245cd2d fix: silence deprecation warnings causing noisy production
logs (#38128)
01d5245cd2d is described below
commit 01d5245cd2d06bc10fd86a3b41387e4d28631228
Author: Amin Ghadersohi <[email protected]>
AuthorDate: Mon Mar 2 13:55:00 2026 -0500
fix: silence deprecation warnings causing noisy production logs (#38128)
Co-authored-by: Claude Opus 4.6 <[email protected]>
---
superset/charts/schemas.py | 12 +++++++-----
superset/db_engine_specs/databend.py | 21 ++++++++++++++-------
superset/models/core.py | 5 +++--
superset/models/helpers.py | 2 +-
superset/utils/logging_configurator.py | 7 +++++++
superset/utils/pandas_postprocessing/resample.py | 2 +-
superset/viz.py | 12 ++++++++----
7 files changed, 41 insertions(+), 20 deletions(-)
diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py
index 4f37a810223..81b9509cd0a 100644
--- a/superset/charts/schemas.py
+++ b/superset/charts/schemas.py
@@ -459,7 +459,7 @@ class
ChartDataAggregateOptionsSchema(ChartDataPostProcessingOperationOptionsSch
allow_none=False,
metadata={"description": "Columns by which to group by"},
),
- minLength=1,
+ metadata={"minLength": 1},
required=True,
),
)
@@ -656,8 +656,8 @@ class
ChartDataProphetOptionsSchema(ChartDataPostProcessingOperationOptionsSchem
"description": "Time periods (in units of `time_grain`) to predict
into "
"the future",
"example": 7,
+ "min": 0,
},
- min=0,
required=True,
)
confidence_interval = fields.Float(
@@ -790,8 +790,10 @@ class
ChartDataPivotOptionsSchema(ChartDataPostProcessingOperationOptionsSchema)
index = (
fields.List(
fields.String(allow_none=False),
- metadata={"description": "Columns to group by on the table index
(=rows)"},
- minLength=1,
+ metadata={
+ "description": "Columns to group by on the table index
(=rows)",
+ "minLength": 1,
+ },
required=True,
),
)
@@ -1681,7 +1683,7 @@ class DashboardSchema(Schema):
class ChartGetResponseSchema(Schema):
- id = fields.Int(description=id_description)
+ id = fields.Int(metadata={"description": id_description})
url = fields.String()
cache_timeout = fields.String()
certified_by = fields.String()
diff --git a/superset/db_engine_specs/databend.py
b/superset/db_engine_specs/databend.py
index e0e06b2b10a..9df1d241519 100644
--- a/superset/db_engine_specs/databend.py
+++ b/superset/db_engine_specs/databend.py
@@ -194,20 +194,27 @@ class DatabendEngineSpec(DatabendBaseEngineSpec):
class DatabendParametersSchema(Schema):
- username = fields.String(allow_none=True, description=__("Username"))
- password = fields.String(allow_none=True, description=__("Password"))
- host = fields.String(required=True, description=__("Hostname or IP
address"))
+ username = fields.String(allow_none=True, metadata={"description":
__("Username")})
+ password = fields.String(allow_none=True, metadata={"description":
__("Password")})
+ host = fields.String(
+ required=True, metadata={"description": __("Hostname or IP address")}
+ )
port = fields.Integer(
allow_none=True,
- description=__("Database port"),
+ metadata={"description": __("Database port")},
validate=Range(min=0, max=65535),
)
- database = fields.String(allow_none=True, description=__("Database name"))
+ database = fields.String(
+ allow_none=True, metadata={"description": __("Database name")}
+ )
encryption = fields.Boolean(
- default=True, description=__("Use an encrypted connection to the
database")
+ dump_default=True,
+ metadata={"description": __("Use an encrypted connection to the
database")},
)
query = fields.Dict(
- keys=fields.Str(), values=fields.Raw(), description=__("Additional
parameters")
+ keys=fields.Str(),
+ values=fields.Raw(),
+ metadata={"description": __("Additional parameters")},
)
diff --git a/superset/models/core.py b/superset/models/core.py
index b9b7b605911..0a954b36742 100755
--- a/superset/models/core.py
+++ b/superset/models/core.py
@@ -1183,10 +1183,11 @@ class Database(CoreDatabase, AuditMixinNullable,
ImportExportMixin): # pylint:
def has_table(self, table: Table) -> bool:
with self.get_sqla_engine(catalog=table.catalog, schema=table.schema)
as engine:
+ inspector = sqla.inspect(engine)
# do not pass "" as an empty schema; force null
- if engine.has_table(table.table, table.schema or None):
+ if inspector.has_table(table.table, table.schema or None):
return True
- return engine.has_table(table.table.lower(), table.schema or None)
+ return inspector.has_table(table.table.lower(), table.schema or
None)
def has_view(self, table: Table) -> bool:
with self.get_sqla_engine(catalog=table.catalog, schema=table.schema)
as engine:
diff --git a/superset/models/helpers.py b/superset/models/helpers.py
index a1c92adaa14..46ae374fd57 100644
--- a/superset/models/helpers.py
+++ b/superset/models/helpers.py
@@ -2414,7 +2414,7 @@ class ExploreMixin: # pylint:
disable=too-many-public-methods
self.dttm_sql_literal(end_dttm, time_col)
)
)
- return and_(*l)
+ return and_(True, *l)
def values_for_column( # pylint: disable=too-many-locals
self,
diff --git a/superset/utils/logging_configurator.py
b/superset/utils/logging_configurator.py
index 2d53d535cda..86399689994 100644
--- a/superset/utils/logging_configurator.py
+++ b/superset/utils/logging_configurator.py
@@ -45,6 +45,13 @@ class DefaultLoggingConfigurator( # pylint:
disable=too-few-public-methods
logging.basicConfig(format=app_config["LOG_FORMAT"])
logging.getLogger().setLevel(app_config["LOG_LEVEL"])
+ # Route Python warnings through the logging framework so they get
+ # proper log-level formatting instead of raw stderr output. Without
+ # this, the warnings module writes multi-line text to stderr where
+ # the source-code context line has no level prefix, causing log
+ # aggregators to misclassify it as an error.
+ logging.captureWarnings(True)
+
if app_config["ENABLE_TIME_ROTATE"]:
logging.getLogger().setLevel(app_config["TIME_ROTATE_LOG_LEVEL"])
handler = TimedRotatingFileHandler(
diff --git a/superset/utils/pandas_postprocessing/resample.py
b/superset/utils/pandas_postprocessing/resample.py
index a689895bd62..d394ce0f138 100644
--- a/superset/utils/pandas_postprocessing/resample.py
+++ b/superset/utils/pandas_postprocessing/resample.py
@@ -54,5 +54,5 @@ def resample(
else:
_df = getattr(df.resample(rule), method)()
if method in ("ffill", "bfill"):
- _df = _df.fillna(method=method)
+ _df = getattr(_df, method)()
return _df
diff --git a/superset/viz.py b/superset/viz.py
index c6c7cf699b7..21ddf85c233 100644
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -2817,15 +2817,19 @@ class PartitionViz(NVD3TimeSeriesViz):
return self.nest_values(levels)
-@deprecated(deprecated_in="3.0")
-def get_subclasses(cls: type[BaseViz]) -> set[type[BaseViz]]:
+def _get_subclasses(cls: type[BaseViz]) -> set[type[BaseViz]]:
return set(cls.__subclasses__()).union(
- [sc for c in cls.__subclasses__() for sc in get_subclasses(c)]
+ [sc for c in cls.__subclasses__() for sc in _get_subclasses(c)]
)
+@deprecated(deprecated_in="3.0")
+def get_subclasses(cls: type[BaseViz]) -> set[type[BaseViz]]:
+ return _get_subclasses(cls)
+
+
viz_types = {
o.viz_type: o
- for o in get_subclasses(BaseViz)
+ for o in _get_subclasses(BaseViz)
if o.viz_type not in current_app.config["VIZ_TYPE_DENYLIST"]
}