You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by dp...@apache.org on 2023/06/27 07:37:52 UTC

[superset] branch master updated: chore: remove marshmallow-enum dependency and bump FAB (#24499)

This is an automated email from the ASF dual-hosted git repository.

dpgaspar 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 0ddc0a6738 chore: remove marshmallow-enum dependency and bump FAB (#24499)
0ddc0a6738 is described below

commit 0ddc0a6738bbffc86739a485169e2d5d23ad14e4
Author: Daniel Vaz Gaspar <da...@gmail.com>
AuthorDate: Tue Jun 27 08:37:43 2023 +0100

    chore: remove marshmallow-enum dependency and bump FAB (#24499)
---
 requirements/base.txt                                     | 13 +++++--------
 requirements/docker.txt                                   |  4 ++++
 requirements/integration.txt                              | 11 ++++++++---
 setup.cfg                                                 |  2 +-
 setup.py                                                  |  2 +-
 superset/charts/schemas.py                                |  9 ++++-----
 superset/dashboards/schemas.py                            |  3 +--
 superset/databases/schemas.py                             |  5 ++---
 superset/reports/schemas.py                               |  5 ++---
 superset/security/api.py                                  |  3 +--
 tests/integration_tests/base_api_tests.py                 |  2 +-
 tests/integration_tests/databases/api_tests.py            | 15 ++++++++++-----
 tests/integration_tests/db_engine_specs/postgres_tests.py |  1 -
 tests/integration_tests/reports/api_tests.py              |  6 +++++-
 tests/unit_tests/db_engine_specs/test_databricks.py       |  1 -
 15 files changed, 45 insertions(+), 37 deletions(-)

diff --git a/requirements/base.txt b/requirements/base.txt
index b72d555957..aace7b5136 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -11,7 +11,7 @@ alembic==1.6.5
     # via flask-migrate
 amqp==5.1.0
     # via kombu
-apispec[yaml]==3.3.2
+apispec[yaml]==6.3.0
     # via flask-appbuilder
 async-timeout==4.0.2
     # via redis
@@ -88,7 +88,7 @@ flask==2.2.5
     #   flask-migrate
     #   flask-sqlalchemy
     #   flask-wtf
-flask-appbuilder==4.3.2
+flask-appbuilder==4.3.3
     # via apache-superset
 flask-babel==1.0.0
     # via flask-appbuilder
@@ -122,8 +122,6 @@ geographiclib==1.52
     # via geopy
 geopy==2.2.0
     # via apache-superset
-greenlet==2.0.2
-    # via sqlalchemy
 gunicorn==20.1.0
     # via apache-superset
 hashids==1.3.1
@@ -172,13 +170,10 @@ markupsafe==2.1.1
     #   mako
     #   werkzeug
     #   wtforms
-marshmallow==3.13.0
+marshmallow==3.19.0
     # via
     #   flask-appbuilder
-    #   marshmallow-enum
     #   marshmallow-sqlalchemy
-marshmallow-enum==1.5.1
-    # via flask-appbuilder
 marshmallow-sqlalchemy==0.23.1
     # via flask-appbuilder
 mdurl==0.1.2
@@ -197,8 +192,10 @@ ordered-set==4.1.0
 packaging==23.1
     # via
     #   apache-superset
+    #   apispec
     #   deprecation
     #   limits
+    #   marshmallow
 pandas==1.5.3
     # via apache-superset
 paramiko==2.11.0
diff --git a/requirements/docker.txt b/requirements/docker.txt
index 1c6009b944..d001734ad1 100644
--- a/requirements/docker.txt
+++ b/requirements/docker.txt
@@ -12,6 +12,10 @@
     #   -r requirements/docker.in
 gevent==22.10.2
     # via -r requirements/docker.in
+greenlet==2.0.2
+    # via
+    #   -r requirements/docker.in
+    #   gevent
 psycopg2-binary==2.9.6
     # via apache-superset
 zope-event==4.5.0
diff --git a/requirements/integration.txt b/requirements/integration.txt
index 336f9f0058..1269e505a6 100644
--- a/requirements/integration.txt
+++ b/requirements/integration.txt
@@ -35,7 +35,7 @@ packaging==23.1
     #   pyproject-api
     #   tox
 pip-compile-multi==2.6.3
-    # via -r integration.in
+    # via -r requirements/integration.in
 pip-tools==6.13.0
     # via pip-compile-multi
 platformdirs==3.5.3
@@ -45,17 +45,22 @@ platformdirs==3.5.3
 pluggy==1.0.0
     # via tox
 pre-commit==3.3.3
-    # via -r integration.in
+    # via -r requirements/integration.in
 pyproject-api==1.5.1
     # via tox
 pyproject-hooks==1.0.0
     # via build
 pyyaml==5.4.1
     # via pre-commit
+tomli==2.0.1
+    # via
+    #   build
+    #   pyproject-api
+    #   tox
 toposort==1.10
     # via pip-compile-multi
 tox==4.6.1
-    # via -r integration.in
+    # via -r requirements/integration.in
 virtualenv==20.23.0
     # via
     #   pre-commit
diff --git a/setup.cfg b/setup.cfg
index 41db2332ab..bc704c5b6c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -30,7 +30,7 @@ combine_as_imports = true
 include_trailing_comma = true
 line_length = 88
 known_first_party = superset
-known_third_party =alembic,apispec,backoff,cachelib,celery,click,colorama,cron_descriptor,croniter,cryptography,dateutil,deprecation,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_jwt_extended,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,holidays,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,marshmallow_enum,msgpack,nh3,numpy,pandas,parameterized,parsedatetime,pgsanity,pkg_resources,polyline [...]
+known_third_party =alembic,apispec,backoff,cachelib,celery,click,colorama,cron_descriptor,croniter,cryptography,dateutil,deprecation,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_jwt_extended,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,holidays,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,msgpack,nh3,numpy,pandas,parameterized,parsedatetime,pgsanity,pkg_resources,polyline,prison,progress, [...]
 multi_line_output = 3
 order_by_type = false
 
diff --git a/setup.py b/setup.py
index c7c7c18df2..d29109ae49 100644
--- a/setup.py
+++ b/setup.py
@@ -81,7 +81,7 @@ setup(
         "cryptography>=39.0.1, <40",
         "deprecation>=2.1.0, <2.2.0",
         "flask>=2.2.5, <3.0.0",
-        "flask-appbuilder>=4.3.2, <5.0.0",
+        "flask-appbuilder>=4.3.3, <5.0.0",
         "flask-caching>=1.10.1, <1.11",
         "flask-compress>=1.13, <2.0",
         "flask-talisman>=1.0.0, <2.0",
diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py
index 1145d5be73..545845f7f2 100644
--- a/superset/charts/schemas.py
+++ b/superset/charts/schemas.py
@@ -23,7 +23,6 @@ from typing import Any, TYPE_CHECKING
 from flask_babel import gettext as _
 from marshmallow import EXCLUDE, fields, post_load, Schema, validate
 from marshmallow.validate import Length, Range
-from marshmallow_enum import EnumField
 
 from superset import app
 from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType
@@ -153,7 +152,7 @@ openapi_spec_methods_override = {
 class TagSchema(Schema):
     id = fields.Int()
     name = fields.String()
-    type = EnumField(TagTypes, by_value=True)
+    type = fields.Enum(TagTypes, by_value=True)
 
 
 class ChartEntityResponseSchema(Schema):
@@ -1127,7 +1126,7 @@ class ChartDataQueryObjectSchema(Schema):
         unknown = EXCLUDE
 
     datasource = fields.Nested(ChartDataDatasourceSchema, allow_none=True)
-    result_type = EnumField(ChartDataResultType, by_value=True, allow_none=True)
+    result_type = fields.Enum(ChartDataResultType, by_value=True, allow_none=True)
 
     annotation_layers = fields.List(
         fields.Nested(AnnotationLayerSchema),
@@ -1369,8 +1368,8 @@ class ChartDataQueryContextSchema(Schema):
         allow_none=True,
     )
 
-    result_type = EnumField(ChartDataResultType, by_value=True)
-    result_format = EnumField(ChartDataResultFormat, by_value=True)
+    result_type = fields.Enum(ChartDataResultType, by_value=True)
+    result_format = fields.Enum(ChartDataResultFormat, by_value=True)
 
     form_data = fields.Raw(allow_none=True, required=False)
 
diff --git a/superset/dashboards/schemas.py b/superset/dashboards/schemas.py
index 8d47d39cd3..9d6e712a73 100644
--- a/superset/dashboards/schemas.py
+++ b/superset/dashboards/schemas.py
@@ -20,7 +20,6 @@ from typing import Any, Union
 
 from marshmallow import fields, post_load, pre_load, Schema
 from marshmallow.validate import Length, ValidationError
-from marshmallow_enum import EnumField
 
 from superset.exceptions import SupersetException
 from superset.tags.models import TagTypes
@@ -174,7 +173,7 @@ class RolesSchema(Schema):
 class TagSchema(Schema):
     id = fields.Int()
     name = fields.String()
-    type = EnumField(TagTypes, by_value=True)
+    type = fields.Enum(TagTypes, by_value=True)
 
 
 class DashboardGetResponseSchema(Schema):
diff --git a/superset/databases/schemas.py b/superset/databases/schemas.py
index 01a00e8b80..8dfb044beb 100644
--- a/superset/databases/schemas.py
+++ b/superset/databases/schemas.py
@@ -25,7 +25,6 @@ from flask import current_app
 from flask_babel import lazy_gettext as _
 from marshmallow import EXCLUDE, fields, pre_load, Schema, validates_schema
 from marshmallow.validate import Length, ValidationError
-from marshmallow_enum import EnumField
 from sqlalchemy import MetaData
 
 from superset import db, is_feature_enabled
@@ -254,7 +253,7 @@ class DatabaseParametersSchemaMixin:  # pylint: disable=too-few-public-methods
         values=fields.Raw(),
         metadata={"description": "DB-specific parameters for configuration"},
     )
-    configuration_method = EnumField(
+    configuration_method = fields.Enum(
         ConfigurationMethod,
         by_value=True,
         metadata={"description": configuration_method_description},
@@ -387,7 +386,7 @@ class DatabaseValidateParametersSchema(Schema):
         allow_none=True,
         validate=server_cert_validator,
     )
-    configuration_method = EnumField(
+    configuration_method = fields.Enum(
         ConfigurationMethod,
         by_value=True,
         required=True,
diff --git a/superset/reports/schemas.py b/superset/reports/schemas.py
index 83dea02f8f..fbe681be36 100644
--- a/superset/reports/schemas.py
+++ b/superset/reports/schemas.py
@@ -20,7 +20,6 @@ from croniter import croniter
 from flask_babel import gettext as _
 from marshmallow import fields, Schema, validate, validates_schema
 from marshmallow.validate import Length, Range, ValidationError
-from marshmallow_enum import EnumField
 from pytz import all_timezones
 
 from superset.reports.models import (
@@ -168,7 +167,7 @@ class ReportSchedulePostSchema(Schema):
         }
     )
     chart = fields.Integer(required=False, allow_none=True)
-    creation_method = EnumField(
+    creation_method = fields.Enum(
         ReportCreationMethod,
         by_value=True,
         required=False,
@@ -265,7 +264,7 @@ class ReportSchedulePutSchema(Schema):
         allow_none=True,
     )
     chart = fields.Integer(required=False, allow_none=True)
-    creation_method = EnumField(
+    creation_method = fields.Enum(
         ReportCreationMethod,
         by_value=True,
         allow_none=True,
diff --git a/superset/security/api.py b/superset/security/api.py
index aff536519d..c99fd63b1d 100644
--- a/superset/security/api.py
+++ b/superset/security/api.py
@@ -23,7 +23,6 @@ from flask_appbuilder.api import safe
 from flask_appbuilder.security.decorators import permission_name, protect
 from flask_wtf.csrf import generate_csrf
 from marshmallow import EXCLUDE, fields, post_load, Schema, ValidationError
-from marshmallow_enum import EnumField
 
 from superset.embedded_dashboard.commands.exceptions import (
     EmbeddedDashboardNotFoundError,
@@ -51,7 +50,7 @@ class UserSchema(PermissiveSchema):
 
 
 class ResourceSchema(PermissiveSchema):
-    type = EnumField(GuestTokenResourceType, by_value=True, required=True)
+    type = fields.Enum(GuestTokenResourceType, by_value=True, required=True)
     id = fields.String(required=True)
 
     @post_load
diff --git a/tests/integration_tests/base_api_tests.py b/tests/integration_tests/base_api_tests.py
index 478fee0a0d..75c9d919d8 100644
--- a/tests/integration_tests/base_api_tests.py
+++ b/tests/integration_tests/base_api_tests.py
@@ -115,7 +115,7 @@ class TestBaseModelRestApi(SupersetTestCase):
         self.assertEqual(rv.status_code, 200)
         response = json.loads(rv.data.decode("utf-8"))
         expected_mutation_spec = {
-            "properties": {"id": {"format": "int32", "type": "integer"}},
+            "properties": {"id": {"type": "integer"}},
             "type": "object",
         }
         self.assertEqual(
diff --git a/tests/integration_tests/databases/api_tests.py b/tests/integration_tests/databases/api_tests.py
index e7f33e4a64..005ac0d290 100644
--- a/tests/integration_tests/databases/api_tests.py
+++ b/tests/integration_tests/databases/api_tests.py
@@ -711,7 +711,11 @@ class TestDatabaseApi(SupersetTestCase):
         rv = self.client.post(uri, json=database_data)
         response = json.loads(rv.data.decode("utf-8"))
         assert response == {
-            "message": {"configuration_method": ["Invalid enum value BAD_FORM"]}
+            "message": {
+                "configuration_method": [
+                    "Must be one of: sqlalchemy_form, dynamic_form."
+                ]
+            }
         }
         assert rv.status_code == 400
 
@@ -1113,7 +1117,11 @@ class TestDatabaseApi(SupersetTestCase):
         rv = self.client.put(uri, json=database_data)
         response = json.loads(rv.data.decode("utf-8"))
         assert response == {
-            "message": {"configuration_method": ["Invalid enum value BAD_FORM"]}
+            "message": {
+                "configuration_method": [
+                    "Must be one of: sqlalchemy_form, dynamic_form."
+                ]
+            }
         }
         assert rv.status_code == 400
 
@@ -2873,7 +2881,6 @@ class TestDatabaseApi(SupersetTestCase):
                             },
                             "port": {
                                 "description": "Database port",
-                                "format": "int32",
                                 "maximum": 65536,
                                 "minimum": 0,
                                 "type": "integer",
@@ -2948,7 +2955,6 @@ class TestDatabaseApi(SupersetTestCase):
                             },
                             "port": {
                                 "description": "Database port",
-                                "format": "int32",
                                 "maximum": 65536,
                                 "minimum": 0,
                                 "type": "integer",
@@ -3023,7 +3029,6 @@ class TestDatabaseApi(SupersetTestCase):
                             },
                             "port": {
                                 "description": "Database port",
-                                "format": "int32",
                                 "maximum": 65536,
                                 "minimum": 0,
                                 "type": "integer",
diff --git a/tests/integration_tests/db_engine_specs/postgres_tests.py b/tests/integration_tests/db_engine_specs/postgres_tests.py
index 44fb1c0474..945e0667fc 100644
--- a/tests/integration_tests/db_engine_specs/postgres_tests.py
+++ b/tests/integration_tests/db_engine_specs/postgres_tests.py
@@ -501,7 +501,6 @@ def test_base_parameters_mixin():
             "database": {"type": "string", "description": "Database name"},
             "port": {
                 "type": "integer",
-                "format": "int32",
                 "minimum": 0,
                 "maximum": 65536,
                 "description": "Database port",
diff --git a/tests/integration_tests/reports/api_tests.py b/tests/integration_tests/reports/api_tests.py
index 5a981166aa..12d00d59f3 100644
--- a/tests/integration_tests/reports/api_tests.py
+++ b/tests/integration_tests/reports/api_tests.py
@@ -1249,7 +1249,11 @@ class TestReportSchedulesApi(SupersetTestCase):
         rv = self.post_assert_metric(uri, report_schedule_data, "post")
         response = json.loads(rv.data.decode("utf-8"))
         assert response == {
-            "message": {"creation_method": ["Invalid enum value BAD_CREATION_METHOD"]}
+            "message": {
+                "creation_method": [
+                    "Must be one of: charts, dashboards, alerts_reports."
+                ]
+            }
         }
         assert rv.status_code == 400
 
diff --git a/tests/unit_tests/db_engine_specs/test_databricks.py b/tests/unit_tests/db_engine_specs/test_databricks.py
index 49d65b324b..0bfa1a4c7b 100644
--- a/tests/unit_tests/db_engine_specs/test_databricks.py
+++ b/tests/unit_tests/db_engine_specs/test_databricks.py
@@ -102,7 +102,6 @@ def test_parameters_json_schema() -> None:
             "http_path": {"type": "string"},
             "port": {
                 "description": "Database port",
-                "format": "int32",
                 "maximum": 65536,
                 "minimum": 0,
                 "type": "integer",