From 7f0a63c9920a047eb51e582adf6a8a07cda6dcd7 Mon Sep 17 00:00:00 2001
From: Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de>
Date: Fri, 4 Apr 2025 12:14:45 +0200
Subject: [PATCH] superset definition generation now supports seeding with
 uuids

---
 .idea/misc.xml                                |  2 +-
 .idea/mitm-tooling.iml                        |  3 +-
 .../superset/definitions/__init__.py          |  6 +-
 .../superset/definitions/chart.py             |  8 +-
 .../superset/definitions/core.py              |  9 ++-
 .../superset/definitions/dashboard.py         |  4 +-
 .../superset/definitions/database.py          |  2 +-
 .../superset/definitions/dataset.py           |  4 +-
 .../superset/definitions/importable.py        | 14 ++--
 .../superset/definitions/post_processing.py   |  5 +-
 .../transformation/superset/factories/core.py |  3 +-
 .../superset/factories/custom_charts.py       |  7 +-
 .../superset/factories/importable.py          |  3 +-
 .../superset/factories/mitm_dataset.py        |  3 +-
 .../superset/from_intermediate.py             | 23 +++++-
 .../transformation/superset/from_sql.py       | 46 ++++++++---
 .../transformation/superset/interface.py      | 19 ++++-
 .../superset/visualizations/abstract.py       |  3 +-
 .../superset/visualizations/maed/charts.py    |  4 +-
 .../visualizations/maed/dashboards.py         |  4 +-
 .../superset/visualizations/registry.py       |  3 +-
 pyproject.toml                                | 77 ++++++++++---------
 22 files changed, 164 insertions(+), 88 deletions(-)

diff --git a/.idea/misc.xml b/.idea/misc.xml
index 026cd6b..b17488e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,5 @@
   <component name="Black">
     <option name="sdkName" value="Poetry (mitm-support)" />
   </component>
-  <component name="ProjectRootManager" version="2" project-jdk-name="Poetry (mitm-tooling)" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="uv (mitm-tooling)" project-jdk-type="Python SDK" />
 </project>
\ No newline at end of file
diff --git a/.idea/mitm-tooling.iml b/.idea/mitm-tooling.iml
index cef4abc..04cbc6e 100644
--- a/.idea/mitm-tooling.iml
+++ b/.idea/mitm-tooling.iml
@@ -3,8 +3,9 @@
   <component name="NewModuleRootManager">
     <content url="file://$MODULE_DIR$">
       <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/.venv" />
     </content>
-    <orderEntry type="jdk" jdkName="Poetry (mitm-tooling)" jdkType="Python SDK" />
+    <orderEntry type="jdk" jdkName="uv (mitm-tooling)" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
 </module>
\ No newline at end of file
diff --git a/mitm_tooling/transformation/superset/definitions/__init__.py b/mitm_tooling/transformation/superset/definitions/__init__.py
index e8bcb32..b520dac 100644
--- a/mitm_tooling/transformation/superset/definitions/__init__.py
+++ b/mitm_tooling/transformation/superset/definitions/__init__.py
@@ -1,8 +1,10 @@
-from .chart import *
 from .constants import *
 from .core import *
-from .dashboard import *
 from .database import *
 from .dataset import *
+from .chart import *
+from .dashboard import *
 from .importable import *
 from .post_processing import *
+from .mitm_dataset import *
+
diff --git a/mitm_tooling/transformation/superset/definitions/chart.py b/mitm_tooling/transformation/superset/definitions/chart.py
index 442e4f2..da401e6 100644
--- a/mitm_tooling/transformation/superset/definitions/chart.py
+++ b/mitm_tooling/transformation/superset/definitions/chart.py
@@ -1,4 +1,10 @@
-from .core import *
+from typing import Any, Literal
+
+import pydantic
+
+from .constants import StrUrl, StrUUID
+from .core import FormData, DatasourceIdentifier, SupersetVizType, SupersetAdhocFilter, SupersetId, ColorScheme, \
+    SupersetAdhocMetric, ColumnName, TimeGrain, AnnotationLayer, SupersetDefFile, QueryContext
 
 
 class ChartParams(FormData):
diff --git a/mitm_tooling/transformation/superset/definitions/core.py b/mitm_tooling/transformation/superset/definitions/core.py
index 21e175a..aa0f70e 100644
--- a/mitm_tooling/transformation/superset/definitions/core.py
+++ b/mitm_tooling/transformation/superset/definitions/core.py
@@ -1,6 +1,6 @@
 from typing import Any
 
-from mitm_tooling.representation import ColumnName
+from mitm_tooling.representation import ColumnName, TableName
 from .constants import *
 
 
@@ -14,6 +14,7 @@ class DatasourceIdentifier(FrozenSupersetDefinition):
     def datasource_uid(self):
         return f'{self.id}__{self.type}'
 
+DatasourceIdentifierMap = dict[TableName, DatasourceIdentifier]
 
 class SupersetPostProcessing(pydantic.BaseModel, ABC):
     operation: str
@@ -26,7 +27,9 @@ class SupersetColumn(FrozenSupersetDefinition):
     is_dttm: bool = False
     is_active: bool = True
     type: str = str(MITMDataType.Text.sa_sql_type)
-    type_generic: GenericDataType = GenericDataType.STRING
+    # not permitted
+    # type_generic: GenericDataType = GenericDataType.STRING
+    # type_generic=GenericDataType.from_mitm_dt(dt)
     advanced_data_type: str | None = None
     groupby: bool = True
     filterable: bool = True
@@ -178,3 +181,5 @@ class QueryContext(BaseSupersetDefinition):
     result_format: ChartDataResultFormat = ChartDataResultFormat.JSON
     force: bool = False
     custom_cache_timeout: int | None = None
+
+
diff --git a/mitm_tooling/transformation/superset/definitions/dashboard.py b/mitm_tooling/transformation/superset/definitions/dashboard.py
index 8bb9c1e..a693ded 100644
--- a/mitm_tooling/transformation/superset/definitions/dashboard.py
+++ b/mitm_tooling/transformation/superset/definitions/dashboard.py
@@ -3,8 +3,8 @@ from typing import Literal
 
 import pydantic
 
-from . import SupersetDefFile, StrUrl
-from .constants import StrUUID
+from .core import SupersetDefFile
+from .constants import StrUUID, StrUrl
 
 DashboardInternalID = str
 
diff --git a/mitm_tooling/transformation/superset/definitions/database.py b/mitm_tooling/transformation/superset/definitions/database.py
index 32bc282..f72c368 100644
--- a/mitm_tooling/transformation/superset/definitions/database.py
+++ b/mitm_tooling/transformation/superset/definitions/database.py
@@ -2,7 +2,7 @@ from typing import Any
 
 import pydantic
 
-from mitm_tooling.transformation.superset.definitions import SupersetDefFile, StrUrl, StrUUID
+from .core import SupersetDefFile, StrUrl, StrUUID
 
 
 class SupersetDatabaseDef(SupersetDefFile):
diff --git a/mitm_tooling/transformation/superset/definitions/dataset.py b/mitm_tooling/transformation/superset/definitions/dataset.py
index 150ea59..6b6d3a0 100644
--- a/mitm_tooling/transformation/superset/definitions/dataset.py
+++ b/mitm_tooling/transformation/superset/definitions/dataset.py
@@ -2,7 +2,7 @@ from typing import Any
 
 import pydantic
 
-from mitm_tooling.transformation.superset.definitions import SupersetDefFile, StrUUID, SupersetMetric, SupersetColumn
+from .core import SupersetDefFile, StrUUID, SupersetMetric, SupersetColumn
 
 
 class SupersetDatasetDef(SupersetDefFile):
@@ -19,6 +19,8 @@ class SupersetDatasetDef(SupersetDefFile):
     sql: str | None = None
     params: Any = None
     template_params: Any = None
+    is_managed_externally: bool = True
+    external_url: str | None = None
     filter_select_enabled: bool = True
     fetch_values_predicate: str | None = None
     extra: dict[str, Any] = pydantic.Field(default_factory=dict)
diff --git a/mitm_tooling/transformation/superset/definitions/importable.py b/mitm_tooling/transformation/superset/definitions/importable.py
index 7ceb148..26a339d 100644
--- a/mitm_tooling/transformation/superset/definitions/importable.py
+++ b/mitm_tooling/transformation/superset/definitions/importable.py
@@ -1,13 +1,17 @@
 from collections import defaultdict
-from datetime import UTC
-
-from .chart import *
+from datetime import UTC, datetime
+from enum import StrEnum
+from abc import ABC, abstractmethod
+from .constants import StrDatetime
+from .core import BaseSupersetDefinition, SupersetDefFile
+from .chart import SupersetChartDef
 from .dashboard import SupersetDashboardDef
 from .database import SupersetDatabaseDef
 from .dataset import SupersetDatasetDef
 from .mitm_dataset import SupersetMitMDatasetDef
-from .post_processing import *
-
+from .post_processing import SupersetPostProcessing
+import pydantic
+from typing import Any
 
 class MetadataType(StrEnum):
     Database = 'Database'
diff --git a/mitm_tooling/transformation/superset/definitions/post_processing.py b/mitm_tooling/transformation/superset/definitions/post_processing.py
index 733cad4..ad8fd50 100644
--- a/mitm_tooling/transformation/superset/definitions/post_processing.py
+++ b/mitm_tooling/transformation/superset/definitions/post_processing.py
@@ -1,5 +1,6 @@
-from .core import *
-
+from .core import FrozenSupersetDefinition, SupersetPostProcessing, ColumnName
+import pydantic
+from typing import Literal
 
 class PivotOperator(FrozenSupersetDefinition):
     operator: str = 'mean'
diff --git a/mitm_tooling/transformation/superset/factories/core.py b/mitm_tooling/transformation/superset/factories/core.py
index 7707725..db2d11b 100644
--- a/mitm_tooling/transformation/superset/factories/core.py
+++ b/mitm_tooling/transformation/superset/factories/core.py
@@ -66,8 +66,7 @@ def mk_column(col: ColumnName, dt: MITMDataType, col_id: SupersetId | None = Non
                 groupby=dt not in {MITMDataType.Json,
                                    MITMDataType.Numeric},
                 type=(dt.sa_sql_type or MITMDataType.Text.sa_sql_type).compile(
-                    dialect=dialect),
-                type_generic=GenericDataType.from_mitm_dt(dt)) | kwargs
+                    dialect=dialect)) | kwargs
     if col_id is not None:
         return IdentifiedSupersetColumn(**args, id=col_id)
     else:
diff --git a/mitm_tooling/transformation/superset/factories/custom_charts.py b/mitm_tooling/transformation/superset/factories/custom_charts.py
index 54865d3..85e6afb 100644
--- a/mitm_tooling/transformation/superset/factories/custom_charts.py
+++ b/mitm_tooling/transformation/superset/factories/custom_charts.py
@@ -1,10 +1,9 @@
 from typing import Literal
 
 from mitm_tooling.transformation.superset.definitions import SupersetChartDef, SupersetVizType, ChartParams, \
-    DatasourceIdentifier
-from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier
-from mitm_tooling.transformation.superset.factories.chart import mk_chart_def
-from mitm_tooling.transformation.superset.factories.query import mk_query_object, mk_query_context
+    DatasourceIdentifier, MitMDatasetIdentifier
+from .chart import mk_chart_def
+from .query import mk_query_object, mk_query_context
 
 
 class MAEDCustomChartParams(ChartParams):
diff --git a/mitm_tooling/transformation/superset/factories/importable.py b/mitm_tooling/transformation/superset/factories/importable.py
index c601702..7ae04a7 100644
--- a/mitm_tooling/transformation/superset/factories/importable.py
+++ b/mitm_tooling/transformation/superset/factories/importable.py
@@ -1,6 +1,5 @@
 from ..definitions import SupersetMetadataDef, SupersetDatabaseDef, SupersetDashboardDef, SupersetDatasetDef, \
-    SupersetChartDef, SupersetMitMDatasetDef
-from ..definitions.importable import MetadataType, SupersetAssetsImport, SupersetMitMDatasetImport
+    SupersetChartDef, SupersetMitMDatasetDef, MetadataType, SupersetAssetsImport, SupersetMitMDatasetImport
 
 
 def mk_metadata(metadata_type: MetadataType) -> SupersetMetadataDef:
diff --git a/mitm_tooling/transformation/superset/factories/mitm_dataset.py b/mitm_tooling/transformation/superset/factories/mitm_dataset.py
index 6d554bb..8a844ec 100644
--- a/mitm_tooling/transformation/superset/factories/mitm_dataset.py
+++ b/mitm_tooling/transformation/superset/factories/mitm_dataset.py
@@ -3,8 +3,7 @@ from uuid import UUID
 
 from mitm_tooling.definition import MITM
 from mitm_tooling.utilities.identifiers import mk_uuid, name_plus_uuid
-from ..definitions import SupersetMitMDatasetDef
-from ..definitions.mitm_dataset import RelatedTable, RelatedSlice, RelatedDashboard
+from ..definitions import SupersetMitMDatasetDef, RelatedTable, RelatedSlice, RelatedDashboard
 
 
 def mk_related_obj(kind: Literal['table', 'slice', 'dashboard'],
diff --git a/mitm_tooling/transformation/superset/from_intermediate.py b/mitm_tooling/transformation/superset/from_intermediate.py
index a315f08..5ef8f78 100644
--- a/mitm_tooling/transformation/superset/from_intermediate.py
+++ b/mitm_tooling/transformation/superset/from_intermediate.py
@@ -1,22 +1,37 @@
+from uuid import UUID
+
 from mitm_tooling.representation import Header
 from .asset_bundles.asset_bundles import SupersetDatasourceBundle, \
     SupersetMitMDatasetBundle
 from .common import DBConnectionInfo
+from .definitions import DatasourceIdentifierMap
 from .definitions.mitm_dataset import MitMDatasetIdentifier
 
 
 def header_into_superset_datasource_bundle(header: Header,
-                                           db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
+                                           db_conn_info: DBConnectionInfo,
+                                           database_uuid: UUID | None = None,
+                                           ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
     from ..sql.from_intermediate import header_into_db_meta
     from .from_sql import db_meta_into_superset_datasource_bundle
     db_meta = header_into_db_meta(header)
-    return db_meta_into_superset_datasource_bundle(db_meta, db_conn_info)
+    return db_meta_into_superset_datasource_bundle(db_meta,
+                                                   db_conn_info,
+                                                   database_uuid=database_uuid,
+                                                   ds_id_map=ds_id_map)
 
 
 def header_into_mitm_dataset_bundle(header: Header,
                                     db_conn_info: DBConnectionInfo,
-                                    dataset_identifier: MitMDatasetIdentifier) -> SupersetMitMDatasetBundle:
+                                    dataset_identifier: MitMDatasetIdentifier,
+                                    database_uuid: UUID | None = None,
+                                    ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetMitMDatasetBundle:
     from ..sql.from_intermediate import header_into_db_meta
     from .from_sql import db_meta_into_mitm_dataset_bundle
     db_meta = header_into_db_meta(header)
-    return db_meta_into_mitm_dataset_bundle(db_meta, db_conn_info, dataset_identifier, header.mitm)
+    return db_meta_into_mitm_dataset_bundle(db_meta,
+                                            db_conn_info,
+                                            dataset_identifier,
+                                            header.mitm,
+                                            database_uuid=database_uuid,
+                                            ds_id_map=ds_id_map)
diff --git a/mitm_tooling/transformation/superset/from_sql.py b/mitm_tooling/transformation/superset/from_sql.py
index 9cf7822..f5b28b0 100644
--- a/mitm_tooling/transformation/superset/from_sql.py
+++ b/mitm_tooling/transformation/superset/from_sql.py
@@ -1,3 +1,6 @@
+from uuid import UUID
+
+from mitm_tooling.definition import MITM
 from mitm_tooling.extraction.sql.data_models import DBMetaInfo
 from mitm_tooling.extraction.sql.data_models.db_meta import DBMetaInfoBase
 from mitm_tooling.extraction.sql.db import connect_and_reflect
@@ -5,26 +8,34 @@ from .asset_bundles import SupersetDatasourceBundle, \
     SupersetMitMDatasetBundle
 from .common import DBConnectionInfo
 from .common import _mk_engine, SQLiteFileOrEngine
+from .definitions import DatasourceIdentifierMap
 from .definitions.mitm_dataset import MitMDatasetIdentifier
 from .factories.database import mk_database
 from .factories.dataset import mk_dataset
 from .factories.mitm_dataset import mk_mitm_dataset
-from ...definition import MITM
 
 
 def db_meta_into_superset_datasource_bundle(db_meta: DBMetaInfoBase,
-                                            db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
+                                            db_conn_info: DBConnectionInfo,
+                                            database_uuid: UUID | None = None,
+                                            ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
     sqlalchemy_uri = db_conn_info.sql_alchemy_uri
     db_name = db_conn_info.db_name
     dialect = db_conn_info.dialect_cls()
 
-    database = mk_database(name=db_name, sqlalchemy_uri=sqlalchemy_uri, uniquify_name=True)
+    database = mk_database(name=db_name, sqlalchemy_uri=sqlalchemy_uri, uniquify_name=True, uuid=database_uuid)
 
     database_uuid = database.uuid
     datasets = []
+    ds_id_map = ds_id_map or {}
+
+    def ds_uuid(tn: str) -> UUID | None:
+        if (ds_id := ds_id_map.get(tn)) is not None:
+            return ds_id.uuid
+
     for schema_name, schema_tables in db_meta.db_structure.items():
         for table_name, tm in schema_tables.items():
-            datasets.append(mk_dataset(tm, database_uuid, dialect=dialect))
+            datasets.append(mk_dataset(tm, database_uuid, dialect=dialect, uuid=ds_uuid(table_name)))
 
     return SupersetDatasourceBundle(database=database, datasets=datasets)
 
@@ -32,8 +43,13 @@ def db_meta_into_superset_datasource_bundle(db_meta: DBMetaInfoBase,
 def db_meta_into_mitm_dataset_bundle(db_meta: DBMetaInfoBase,
                                      db_conn_info: DBConnectionInfo,
                                      dataset_identifier: MitMDatasetIdentifier,
-                                     mitm: MITM) -> SupersetMitMDatasetBundle:
-    datasource_bundle = db_meta_into_superset_datasource_bundle(db_meta, db_conn_info)
+                                     mitm: MITM,
+                                     database_uuid: UUID | None = None,
+                                     ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetMitMDatasetBundle:
+    datasource_bundle = db_meta_into_superset_datasource_bundle(db_meta,
+                                                                db_conn_info,
+                                                                database_uuid=database_uuid,
+                                                                ds_id_map=ds_id_map)
     mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, uuid=dataset_identifier.uuid,
                                    database_uuid=datasource_bundle.database_uuid,
                                    table_uuids=datasource_bundle.dataset_uuids)
@@ -41,20 +57,30 @@ def db_meta_into_mitm_dataset_bundle(db_meta: DBMetaInfoBase,
 
 
 def db_into_superset_datasource_bundle(arg: SQLiteFileOrEngine,
-                                       db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
+                                       db_conn_info: DBConnectionInfo,
+                                       database_uuid: UUID | None = None,
+                                       ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
     engine = _mk_engine(arg)
 
     meta, _ = connect_and_reflect(engine, allowed_schemas=[db_conn_info.schema_name])
     db_meta = DBMetaInfo.from_sa_meta(meta, default_schema=db_conn_info.schema_name)
 
-    return db_meta_into_superset_datasource_bundle(db_meta, db_conn_info)
+    return db_meta_into_superset_datasource_bundle(db_meta,
+                                                   db_conn_info,
+                                                   database_uuid=database_uuid,
+                                                   ds_id_map=ds_id_map)
 
 
 def db_into_mitm_dataset_bundle(arg: SQLiteFileOrEngine,
                                 db_conn_info: DBConnectionInfo,
                                 dataset_identifier: MitMDatasetIdentifier,
-                                mitm: MITM) -> SupersetMitMDatasetBundle:
-    datasource_bundle = db_into_superset_datasource_bundle(arg, db_conn_info)
+                                mitm: MITM,
+                                database_uuid: UUID | None = None,
+                                ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetMitMDatasetBundle:
+    datasource_bundle = db_into_superset_datasource_bundle(arg,
+                                                           db_conn_info,
+                                                           database_uuid=database_uuid,
+                                                           ds_id_map=ds_id_map)
     mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, uuid=dataset_identifier.uuid,
                                    database_uuid=datasource_bundle.database_uuid,
                                    table_uuids=datasource_bundle.dataset_uuids)
diff --git a/mitm_tooling/transformation/superset/interface.py b/mitm_tooling/transformation/superset/interface.py
index 43c8de6..52dbf44 100644
--- a/mitm_tooling/transformation/superset/interface.py
+++ b/mitm_tooling/transformation/superset/interface.py
@@ -1,17 +1,22 @@
 from collections.abc import Iterable
+from uuid import UUID
 
 from mitm_tooling.representation import Header
 from .asset_bundles.asset_bundles import SupersetDatasourceBundle, \
     SupersetVisualizationBundle, SupersetMitMDatasetBundle
 from .common import DBConnectionInfo
+from .definitions import DatasourceIdentifierMap
 from .definitions.mitm_dataset import MitMDatasetIdentifier
 from .from_intermediate import header_into_superset_datasource_bundle, header_into_mitm_dataset_bundle
-from .visualizations.abstract import DatasourceIdentifierMap
 from .visualizations.registry import VisualizationType, mk_visualization
 
 
-def mk_superset_datasource_bundle(header: Header, db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
-    return header_into_superset_datasource_bundle(header, db_conn_info)
+def mk_superset_datasource_bundle(header: Header, db_conn_info: DBConnectionInfo, database_uuid: UUID | None = None,
+                                  ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
+    return header_into_superset_datasource_bundle(header,
+                                                  db_conn_info,
+                                                  database_uuid=database_uuid,
+                                                  ds_id_map=ds_id_map)
 
 
 def mk_superset_visualization_bundle(header: Header,
@@ -28,9 +33,15 @@ def mk_superset_visualization_bundle(header: Header,
 def mk_superset_mitm_dataset_bundle(header: Header,
                                     db_conn_info: DBConnectionInfo,
                                     mitm_dataset_identifier: MitMDatasetIdentifier,
+                                    database_uuid: UUID | None = None,
+                                    ds_id_map: DatasourceIdentifierMap | None = None,
                                     visualization_types: Iterable[
                                                              VisualizationType] | None = None) -> SupersetMitMDatasetBundle:
-    mitm_dataset_bundle = header_into_mitm_dataset_bundle(header, db_conn_info, mitm_dataset_identifier)
+    mitm_dataset_bundle = header_into_mitm_dataset_bundle(header,
+                                                          db_conn_info,
+                                                          mitm_dataset_identifier,
+                                                          database_uuid=database_uuid,
+                                                          ds_id_map=ds_id_map)
     if visualization_types is not None:
         mdi = mitm_dataset_bundle.mitm_dataset.identifier
         ds_id_map = mitm_dataset_bundle.datasource_bundle.placeholder_dataset_identifiers
diff --git a/mitm_tooling/transformation/superset/visualizations/abstract.py b/mitm_tooling/transformation/superset/visualizations/abstract.py
index a04671d..cc19d5d 100644
--- a/mitm_tooling/transformation/superset/visualizations/abstract.py
+++ b/mitm_tooling/transformation/superset/visualizations/abstract.py
@@ -4,12 +4,11 @@ from typing import Self, Type, Callable
 from mitm_tooling.representation import TableName, Header
 from ..asset_bundles.asset_bundles import SupersetVisualizationBundle
 from ..definitions import DatasourceIdentifier, SupersetChartDef, \
-    SupersetDashboardDef
+    SupersetDashboardDef, DatasourceIdentifierMap
 from ..definitions.mitm_dataset import MitMDatasetIdentifier
 
 ChartDefCollection = dict[str, SupersetChartDef]
 DashboardDefCollection = dict[str, SupersetDashboardDef]
-DatasourceIdentifierMap = dict[TableName, DatasourceIdentifier]
 
 
 class ChartCreator(ABC):
diff --git a/mitm_tooling/transformation/superset/visualizations/maed/charts.py b/mitm_tooling/transformation/superset/visualizations/maed/charts.py
index 9ff6959..5b5895a 100644
--- a/mitm_tooling/transformation/superset/visualizations/maed/charts.py
+++ b/mitm_tooling/transformation/superset/visualizations/maed/charts.py
@@ -4,8 +4,8 @@ from mitm_tooling.data_types import MITMDataType
 from mitm_tooling.definition import get_mitm_def, ConceptName, MITM, RelationName, TypeName
 from mitm_tooling.representation import SQLRepresentationSchema, Header, mk_sql_rep_schema
 from mitm_tooling.utilities.identifiers import naive_pluralize
-from ..abstract import DatasourceIdentifierMap, ChartDefCollection, ChartCollectionCreator, ChartCreator
-from ...definitions import FilterOperator, DatasourceIdentifier, SupersetChartDef
+from ..abstract import ChartDefCollection, ChartCollectionCreator, ChartCreator
+from ...definitions import FilterOperator, DatasourceIdentifier, SupersetChartDef, DatasourceIdentifierMap
 from ...factories.core import mk_adhoc_filter
 from ...factories.generic_charts import mk_pie_chart, mk_time_series_bar_chart, mk_avg_count_time_series_chart
 
diff --git a/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py b/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py
index 5866f36..c4c7954 100644
--- a/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py
+++ b/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py
@@ -1,10 +1,10 @@
 from mitm_tooling.representation import Header, SQLRepresentationSchema, mk_sql_rep_schema
-from mitm_tooling.transformation.superset.definitions import SupersetDashboardDef
+from mitm_tooling.transformation.superset.definitions import SupersetDashboardDef, DatasourceIdentifierMap
 from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier
 from mitm_tooling.transformation.superset.factories.custom_charts import mk_maed_custom_chart
 from mitm_tooling.transformation.superset.factories.dashboard import mk_dashboard_chart, mk_dashboard_def
 from mitm_tooling.transformation.superset.visualizations.abstract import DashboardCreator, \
-    ChartCollectionCreator, ChartDefCollection, DatasourceIdentifierMap
+    ChartCollectionCreator, ChartDefCollection
 from mitm_tooling.transformation.superset.visualizations.maed.charts import BaselineMAEDCharts
 from mitm_tooling.utilities.python_utils import take_first
 
diff --git a/mitm_tooling/transformation/superset/visualizations/registry.py b/mitm_tooling/transformation/superset/visualizations/registry.py
index ece717c..957c299 100644
--- a/mitm_tooling/transformation/superset/visualizations/registry.py
+++ b/mitm_tooling/transformation/superset/visualizations/registry.py
@@ -4,7 +4,8 @@ from mitm_tooling.definition import MITM
 from mitm_tooling.representation import Header
 from .maed.registry import MAEDVisualizationType, maed_visualization_creators
 from ..definitions.mitm_dataset import MitMDatasetIdentifier
-from ..visualizations.abstract import VisualizationCreator, DatasourceIdentifierMap, SupersetVisualizationBundle
+from ..visualizations.abstract import VisualizationCreator, SupersetVisualizationBundle
+from ..definitions import DatasourceIdentifierMap
 
 VisualizationType = MAEDVisualizationType | None
 
diff --git a/pyproject.toml b/pyproject.toml
index fde4501..d973f69 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,44 +1,51 @@
-[tool.poetry]
+[project]
 name = "mitm-tooling"
-version = "0.4.8"
+version = "0.4.9"
 description = ""
-authors = ["Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de>"]
+authors = [{ name = "Leah Tacke genannt Unterberg", email = "l.tgu@pads.rwth-aachen.de" }]
+requires-python = ">=3.11,<3.14"
 readme = "README.md"
-packages = [{ include = "mitm_tooling" }]
-
-[tool.poetry.dependencies]
-python = ">=3.11,<3.14"
-pydantic = "^2.9.2"
-pyyaml = "6.0.2"
-genson = "^1.3.0"
-
-sqlalchemy = { version = ">=2", extras = ["postgresql-psycopg", "postgresql"] }
-sqlalchemy-utils = ">=0.38.0"
-numpy = ">=2"
-pandas = { version = ">=2.0", extras = ["performance", "excel", "hdf5", "output_formatting", "computation", "postgresql", "mysql", "sql-other", "plot", "compression"] }
-
-# visualization
-matplotlib = "*"
-seaborn = "*"
-plotly = "*"
-
-[tool.poetry.extras]
-analysis = ["polars"]
-pm = ["pm4py"]
-
-[tool.poetry.group.dev.dependencies]
-pytest = "*"
-jupyter = "*"
-
-[[tool.poetry.source]]
+dependencies = [
+    "pydantic>=2.9.2",
+    "pyyaml==6.0.2",
+    "genson>=1.3.0",
+    "sqlalchemy[postgresql-psycopg, postgresql]>=2",
+    "sqlalchemy-utils>=0.38.0",
+    "numpy>=2",
+    "pandas[performance, excel, hdf5, output_formatting, computation, postgresql, mysql, sql-other, plot, compression]>=2.0",
+    "matplotlib",
+    "seaborn",
+    "plotly",
+]
+
+[project.optional-dependencies]
+analysis = []
+pm = []
+
+[dependency-groups]
+dev = [
+    "pytest",
+    "jupyter",
+]
+
+[tool.uv]
+
+[[tool.uv.index]]
 name = "testpypi"
 url = "https://test.pypi.org/"
-priority = "explicit"
+explicit = true
 
-[[tool.poetry.source]]
+[[tool.uv.index]]
 name = "PyPI"
-priority = "primary"
+url = "https://pypi.org/simple/"
+default = true
+
+[tool.hatch.build.targets.sdist]
+include = ["mitm_tooling"]
+
+[tool.hatch.build.targets.wheel]
+include = ["mitm_tooling"]
 
 [build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
+requires = ["hatchling"]
+build-backend = "hatchling.build"
-- 
GitLab