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

[superset] branch master updated: fix(dataset-import): support empty strings for extra fields (#24663)

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

elizabeth 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 65fb8e10ba fix(dataset-import): support empty strings for extra fields (#24663)
65fb8e10ba is described below

commit 65fb8e10ba065c9037a7058544ec491a8b5a2051
Author: Vitor Avila <96...@users.noreply.github.com>
AuthorDate: Thu Jul 13 20:19:00 2023 -0300

    fix(dataset-import): support empty strings for extra fields (#24663)
---
 superset/datasets/schemas.py                       |  6 ++-
 .../datasets/commands/importers/v1/import_test.py  | 63 ++++++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/superset/datasets/schemas.py b/superset/datasets/schemas.py
index 2b65d674ed..dcac648148 100644
--- a/superset/datasets/schemas.py
+++ b/superset/datasets/schemas.py
@@ -205,7 +205,11 @@ class ImportV1DatasetSchema(Schema):
         Fix for extra initially being exported as a string.
         """
         if isinstance(data.get("extra"), str):
-            data["extra"] = json.loads(data["extra"])
+            try:
+                extra = data["extra"]
+                data["extra"] = json.loads(extra) if extra.strip() else None
+            except ValueError:
+                data["extra"] = None
 
         return data
 
diff --git a/tests/unit_tests/datasets/commands/importers/v1/import_test.py b/tests/unit_tests/datasets/commands/importers/v1/import_test.py
index 9e8690e6e3..e8e8c8e7c5 100644
--- a/tests/unit_tests/datasets/commands/importers/v1/import_test.py
+++ b/tests/unit_tests/datasets/commands/importers/v1/import_test.py
@@ -359,6 +359,69 @@ def test_import_column_extra_is_string(mocker: MockFixture, session: Session) ->
     assert sqla_table.extra == '{"warning_markdown": "*WARNING*"}'
 
 
+def test_import_dataset_extra_empty_string(
+    mocker: MockFixture, session: Session
+) -> None:
+    """
+    Test importing a dataset when the extra field is an empty string.
+    """
+    from superset import security_manager
+    from superset.connectors.sqla.models import SqlaTable
+    from superset.datasets.commands.importers.v1.utils import import_dataset
+    from superset.datasets.schemas import ImportV1DatasetSchema
+    from superset.models.core import Database
+
+    mocker.patch.object(security_manager, "can_access", return_value=True)
+
+    engine = session.get_bind()
+    SqlaTable.metadata.create_all(engine)  # pylint: disable=no-member
+
+    database = Database(database_name="my_database", sqlalchemy_uri="sqlite://")
+    session.add(database)
+    session.flush()
+
+    dataset_uuid = uuid.uuid4()
+    yaml_config: dict[str, Any] = {
+        "version": "1.0.0",
+        "table_name": "my_table",
+        "main_dttm_col": "ds",
+        "schema": "my_schema",
+        "sql": None,
+        "params": {
+            "remote_id": 64,
+            "database_name": "examples",
+            "import_time": 1606677834,
+        },
+        "extra": " ",
+        "uuid": dataset_uuid,
+        "metrics": [
+            {
+                "metric_name": "cnt",
+                "expression": "COUNT(*)",
+            }
+        ],
+        "columns": [
+            {
+                "column_name": "profit",
+                "is_dttm": False,
+                "is_active": True,
+                "type": "INTEGER",
+                "groupby": False,
+                "filterable": False,
+                "expression": "revenue-expenses",
+            }
+        ],
+        "database_uuid": database.uuid,
+    }
+
+    schema = ImportV1DatasetSchema()
+    dataset_config = schema.load(yaml_config)
+    dataset_config["database_id"] = database.id
+    sqla_table = import_dataset(session, dataset_config)
+
+    assert sqla_table.extra == None
+
+
 @patch("superset.datasets.commands.importers.v1.utils.request")
 def test_import_column_allowed_data_url(
     request: Mock,