diff --git a/pyatlan/generator/templates/methods/asset/metabase_collection.jinja2 b/pyatlan/generator/templates/methods/asset/metabase_collection.jinja2 new file mode 100644 index 000000000..fffcd1425 --- /dev/null +++ b/pyatlan/generator/templates/methods/asset/metabase_collection.jinja2 @@ -0,0 +1,35 @@ + + @classmethod + @init_guid + def creator( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseCollection: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + attributes = MetabaseCollection.Attributes.create( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + return cls(attributes=attributes) + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseCollection: + warn( + ( + "This method is deprecated, please use 'creator' " + "instead, which offers identical functionality." + ), + DeprecationWarning, + stacklevel=2, + ) + return cls.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) diff --git a/pyatlan/generator/templates/methods/asset/metabase_dashboard.jinja2 b/pyatlan/generator/templates/methods/asset/metabase_dashboard.jinja2 new file mode 100644 index 000000000..4614a6845 --- /dev/null +++ b/pyatlan/generator/templates/methods/asset/metabase_dashboard.jinja2 @@ -0,0 +1,35 @@ + + @classmethod + @init_guid + def creator( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseDashboard: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + attributes = MetabaseDashboard.Attributes.create( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + return cls(attributes=attributes) + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseDashboard: + warn( + ( + "This method is deprecated, please use 'creator' " + "instead, which offers identical functionality." + ), + DeprecationWarning, + stacklevel=2, + ) + return cls.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) diff --git a/pyatlan/generator/templates/methods/asset/metabase_question.jinja2 b/pyatlan/generator/templates/methods/asset/metabase_question.jinja2 new file mode 100644 index 000000000..2d65513ae --- /dev/null +++ b/pyatlan/generator/templates/methods/asset/metabase_question.jinja2 @@ -0,0 +1,35 @@ + + @classmethod + @init_guid + def creator( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseQuestion: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + attributes = MetabaseQuestion.Attributes.create( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + return cls(attributes=attributes) + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseQuestion: + warn( + ( + "This method is deprecated, please use 'creator' " + "instead, which offers identical functionality." + ), + DeprecationWarning, + stacklevel=2, + ) + return cls.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) diff --git a/pyatlan/generator/templates/methods/attribute/metabase_collection.jinja2 b/pyatlan/generator/templates/methods/attribute/metabase_collection.jinja2 new file mode 100644 index 000000000..f608ffb20 --- /dev/null +++ b/pyatlan/generator/templates/methods/attribute/metabase_collection.jinja2 @@ -0,0 +1,18 @@ + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseCollection.Attributes: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + return MetabaseCollection.Attributes( + name=name, + qualified_name=f"{connection_qualified_name}/collections/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=AtlanConnectorType.get_connector_name( + connection_qualified_name + ), + ) diff --git a/pyatlan/generator/templates/methods/attribute/metabase_dashboard.jinja2 b/pyatlan/generator/templates/methods/attribute/metabase_dashboard.jinja2 new file mode 100644 index 000000000..13e0b1da5 --- /dev/null +++ b/pyatlan/generator/templates/methods/attribute/metabase_dashboard.jinja2 @@ -0,0 +1,18 @@ + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseDashboard.Attributes: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + return MetabaseDashboard.Attributes( + name=name, + qualified_name=f"{connection_qualified_name}/dashboards/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=AtlanConnectorType.get_connector_name( + connection_qualified_name + ), + ) diff --git a/pyatlan/generator/templates/methods/attribute/metabase_question.jinja2 b/pyatlan/generator/templates/methods/attribute/metabase_question.jinja2 new file mode 100644 index 000000000..c8e57bbb9 --- /dev/null +++ b/pyatlan/generator/templates/methods/attribute/metabase_question.jinja2 @@ -0,0 +1,18 @@ + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseQuestion.Attributes: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + return MetabaseQuestion.Attributes( + name=name, + qualified_name=f"{connection_qualified_name}/questions/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=AtlanConnectorType.get_connector_name( + connection_qualified_name + ), + ) diff --git a/pyatlan/model/assets/metabase_collection.py b/pyatlan/model/assets/metabase_collection.py index 64b4594aa..aaf7caf13 100644 --- a/pyatlan/model/assets/metabase_collection.py +++ b/pyatlan/model/assets/metabase_collection.py @@ -5,9 +5,11 @@ from __future__ import annotations from typing import ClassVar, List, Optional +from warnings import warn from pydantic.v1 import Field, validator +from pyatlan.model.enums import AtlanConnectorType from pyatlan.model.fields.atlan_fields import ( BooleanField, KeywordField, @@ -15,12 +17,49 @@ RelationField, ) +from pyatlan.utils import init_guid, validate_required_fields + from .metabase import Metabase class MetabaseCollection(Metabase): """Description""" + @classmethod + @init_guid + def creator( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseCollection: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + attributes = MetabaseCollection.Attributes.create( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + return cls(attributes=attributes) + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseCollection: + warn( + ( + "This method is deprecated, please use 'creator' " + "instead, which offers identical functionality." + ), + DeprecationWarning, + stacklevel=2, + ) + return cls.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + type_name: str = Field(default="MetabaseCollection", allow_mutation=False) @validator("type_name") @@ -161,6 +200,24 @@ class Attributes(Metabase.Attributes): default=None, description="" ) # relationship + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseCollection.Attributes: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + return MetabaseCollection.Attributes( + name=name, + qualified_name=f"{connection_qualified_name}/collections/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=AtlanConnectorType.get_connector_name( + connection_qualified_name + ), + ) + attributes: MetabaseCollection.Attributes = Field( default_factory=lambda: MetabaseCollection.Attributes(), description=( diff --git a/pyatlan/model/assets/metabase_dashboard.py b/pyatlan/model/assets/metabase_dashboard.py index 34d3447b8..dfc5e45b6 100644 --- a/pyatlan/model/assets/metabase_dashboard.py +++ b/pyatlan/model/assets/metabase_dashboard.py @@ -5,10 +5,13 @@ from __future__ import annotations from typing import ClassVar, List, Optional +from warnings import warn from pydantic.v1 import Field, validator +from pyatlan.model.enums import AtlanConnectorType from pyatlan.model.fields.atlan_fields import NumericField, RelationField +from pyatlan.utils import init_guid, validate_required_fields from .metabase import Metabase @@ -16,6 +19,41 @@ class MetabaseDashboard(Metabase): """Description""" + @classmethod + @init_guid + def creator( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseDashboard: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + attributes = MetabaseDashboard.Attributes.create( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + return cls(attributes=attributes) + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseDashboard: + warn( + ( + "This method is deprecated, please use 'creator' " + "instead, which offers identical functionality." + ), + DeprecationWarning, + stacklevel=2, + ) + return cls.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + type_name: str = Field(default="MetabaseDashboard", allow_mutation=False) @validator("type_name") @@ -92,6 +130,24 @@ class Attributes(Metabase.Attributes): default=None, description="" ) # relationship + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseDashboard.Attributes: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + return MetabaseDashboard.Attributes( + name=name, + qualified_name=f"{connection_qualified_name}/dashboards/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=AtlanConnectorType.get_connector_name( + connection_qualified_name + ), + ) + attributes: MetabaseDashboard.Attributes = Field( default_factory=lambda: MetabaseDashboard.Attributes(), description=( diff --git a/pyatlan/model/assets/metabase_question.py b/pyatlan/model/assets/metabase_question.py index 3ee9efdfd..2f7e51eac 100644 --- a/pyatlan/model/assets/metabase_question.py +++ b/pyatlan/model/assets/metabase_question.py @@ -5,14 +5,17 @@ from __future__ import annotations from typing import ClassVar, List, Optional +from warnings import warn from pydantic.v1 import Field, validator +from pyatlan.model.enums import AtlanConnectorType from pyatlan.model.fields.atlan_fields import ( KeywordTextField, NumericField, RelationField, ) +from pyatlan.utils import init_guid, validate_required_fields from .metabase import Metabase @@ -20,6 +23,41 @@ class MetabaseQuestion(Metabase): """Description""" + @classmethod + @init_guid + def creator( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseQuestion: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + attributes = MetabaseQuestion.Attributes.create( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + return cls(attributes=attributes) + + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseQuestion: + warn( + ( + "This method is deprecated, please use 'creator' " + "instead, which offers identical functionality." + ), + DeprecationWarning, + stacklevel=2, + ) + return cls.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + type_name: str = Field(default="MetabaseQuestion", allow_mutation=False) @validator("type_name") @@ -136,6 +174,24 @@ class Attributes(Metabase.Attributes): default=None, description="" ) # relationship + @classmethod + @init_guid + def create( + cls, *, name: str, connection_qualified_name: str, metabase_id: str + ) -> MetabaseQuestion.Attributes: + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + return MetabaseQuestion.Attributes( + name=name, + qualified_name=f"{connection_qualified_name}/questions/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=AtlanConnectorType.get_connector_name( + connection_qualified_name + ), + ) + attributes: MetabaseQuestion.Attributes = Field( default_factory=lambda: MetabaseQuestion.Attributes(), description=( diff --git a/pyatlan_v9/model/assets/_overlays/metabase_collection.py b/pyatlan_v9/model/assets/_overlays/metabase_collection.py new file mode 100644 index 000000000..1fd60068d --- /dev/null +++ b/pyatlan_v9/model/assets/_overlays/metabase_collection.py @@ -0,0 +1,31 @@ +# INTERNAL_IMPORT: from pyatlan.utils import init_guid, validate_required_fields + + @classmethod + @init_guid + def creator( + cls, + *, + name: str, + connection_qualified_name: str, + metabase_id: str, + ) -> "MetabaseCollection": + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + fields = connection_qualified_name.split("/") + connector_name = fields[1] if len(fields) > 1 else None + return cls( + name=name, + qualified_name=f"{connection_qualified_name}/collections/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=connector_name, + ) + + @classmethod + def create(cls, **kwargs) -> "MetabaseCollection": + return cls.creator(**kwargs) + + @classmethod + def create_for_modification(cls, **kwargs) -> "MetabaseCollection": + return cls.updater(**kwargs) diff --git a/pyatlan_v9/model/assets/_overlays/metabase_dashboard.py b/pyatlan_v9/model/assets/_overlays/metabase_dashboard.py new file mode 100644 index 000000000..b7e8bcd95 --- /dev/null +++ b/pyatlan_v9/model/assets/_overlays/metabase_dashboard.py @@ -0,0 +1,31 @@ +# INTERNAL_IMPORT: from pyatlan.utils import init_guid, validate_required_fields + + @classmethod + @init_guid + def creator( + cls, + *, + name: str, + connection_qualified_name: str, + metabase_id: str, + ) -> "MetabaseDashboard": + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + fields = connection_qualified_name.split("/") + connector_name = fields[1] if len(fields) > 1 else None + return cls( + name=name, + qualified_name=f"{connection_qualified_name}/dashboards/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=connector_name, + ) + + @classmethod + def create(cls, **kwargs) -> "MetabaseDashboard": + return cls.creator(**kwargs) + + @classmethod + def create_for_modification(cls, **kwargs) -> "MetabaseDashboard": + return cls.updater(**kwargs) diff --git a/pyatlan_v9/model/assets/_overlays/metabase_question.py b/pyatlan_v9/model/assets/_overlays/metabase_question.py new file mode 100644 index 000000000..e52b35ebb --- /dev/null +++ b/pyatlan_v9/model/assets/_overlays/metabase_question.py @@ -0,0 +1,31 @@ +# INTERNAL_IMPORT: from pyatlan.utils import init_guid, validate_required_fields + + @classmethod + @init_guid + def creator( + cls, + *, + name: str, + connection_qualified_name: str, + metabase_id: str, + ) -> "MetabaseQuestion": + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + fields = connection_qualified_name.split("/") + connector_name = fields[1] if len(fields) > 1 else None + return cls( + name=name, + qualified_name=f"{connection_qualified_name}/questions/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=connector_name, + ) + + @classmethod + def create(cls, **kwargs) -> "MetabaseQuestion": + return cls.creator(**kwargs) + + @classmethod + def create_for_modification(cls, **kwargs) -> "MetabaseQuestion": + return cls.updater(**kwargs) diff --git a/pyatlan_v9/model/assets/metabase_collection.py b/pyatlan_v9/model/assets/metabase_collection.py index 026377ec3..8a4bb085b 100644 --- a/pyatlan_v9/model/assets/metabase_collection.py +++ b/pyatlan_v9/model/assets/metabase_collection.py @@ -24,6 +24,7 @@ ) from pyatlan_v9.model.serde import Serde, get_serde from pyatlan_v9.model.transform import register_asset +from pyatlan_v9.utils import init_guid, validate_required_fields from .airflow_related import RelatedAirflowTask from .anomalo_related import RelatedAnomaloCheck @@ -307,6 +308,36 @@ def relate(self) -> "RelatedMetabaseCollection": return RelatedMetabaseCollection(guid=self.guid) return RelatedMetabaseCollection(qualified_name=self.qualified_name) + @classmethod + @init_guid + def creator( + cls, + *, + name: str, + connection_qualified_name: str, + metabase_id: str, + ) -> "MetabaseCollection": + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + fields = connection_qualified_name.split("/") + connector_name = fields[1] if len(fields) > 1 else None + return cls( + name=name, + qualified_name=f"{connection_qualified_name}/collections/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=connector_name, + ) + + @classmethod + def create(cls, **kwargs) -> "MetabaseCollection": + return cls.creator(**kwargs) + + @classmethod + def create_for_modification(cls, **kwargs) -> "MetabaseCollection": + return cls.updater(**kwargs) + # ========================================================================= # Optimized Serialization Methods (override Asset base class) # ========================================================================= diff --git a/pyatlan_v9/model/assets/metabase_dashboard.py b/pyatlan_v9/model/assets/metabase_dashboard.py index f3d40e12d..212b3ebad 100644 --- a/pyatlan_v9/model/assets/metabase_dashboard.py +++ b/pyatlan_v9/model/assets/metabase_dashboard.py @@ -25,6 +25,7 @@ ) from pyatlan_v9.model.serde import Serde, get_serde from pyatlan_v9.model.transform import register_asset +from pyatlan_v9.utils import init_guid, validate_required_fields from .airflow_related import RelatedAirflowTask from .anomalo_related import RelatedAnomaloCheck @@ -314,6 +315,36 @@ def relate(self) -> "RelatedMetabaseDashboard": return RelatedMetabaseDashboard(guid=self.guid) return RelatedMetabaseDashboard(qualified_name=self.qualified_name) + @classmethod + @init_guid + def creator( + cls, + *, + name: str, + connection_qualified_name: str, + metabase_id: str, + ) -> "MetabaseDashboard": + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + fields = connection_qualified_name.split("/") + connector_name = fields[1] if len(fields) > 1 else None + return cls( + name=name, + qualified_name=f"{connection_qualified_name}/dashboards/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=connector_name, + ) + + @classmethod + def create(cls, **kwargs) -> "MetabaseDashboard": + return cls.creator(**kwargs) + + @classmethod + def create_for_modification(cls, **kwargs) -> "MetabaseDashboard": + return cls.updater(**kwargs) + # ========================================================================= # Optimized Serialization Methods (override Asset base class) # ========================================================================= diff --git a/pyatlan_v9/model/assets/metabase_question.py b/pyatlan_v9/model/assets/metabase_question.py index 434490d59..0c3257298 100644 --- a/pyatlan_v9/model/assets/metabase_question.py +++ b/pyatlan_v9/model/assets/metabase_question.py @@ -25,6 +25,7 @@ ) from pyatlan_v9.model.serde import Serde, get_serde from pyatlan_v9.model.transform import register_asset +from pyatlan_v9.utils import init_guid, validate_required_fields from .airflow_related import RelatedAirflowTask from .anomalo_related import RelatedAnomaloCheck @@ -322,6 +323,36 @@ def relate(self) -> "RelatedMetabaseQuestion": return RelatedMetabaseQuestion(guid=self.guid) return RelatedMetabaseQuestion(qualified_name=self.qualified_name) + @classmethod + @init_guid + def creator( + cls, + *, + name: str, + connection_qualified_name: str, + metabase_id: str, + ) -> "MetabaseQuestion": + validate_required_fields( + ["name", "connection_qualified_name", "metabase_id"], + [name, connection_qualified_name, metabase_id], + ) + fields = connection_qualified_name.split("/") + connector_name = fields[1] if len(fields) > 1 else None + return cls( + name=name, + qualified_name=f"{connection_qualified_name}/questions/{metabase_id}", + connection_qualified_name=connection_qualified_name, + connector_name=connector_name, + ) + + @classmethod + def create(cls, **kwargs) -> "MetabaseQuestion": + return cls.creator(**kwargs) + + @classmethod + def create_for_modification(cls, **kwargs) -> "MetabaseQuestion": + return cls.updater(**kwargs) + # ========================================================================= # Optimized Serialization Methods (override Asset base class) # ========================================================================= diff --git a/tests/unit/model/constants.py b/tests/unit/model/constants.py index 46961daf4..85ed95819 100644 --- a/tests/unit/model/constants.py +++ b/tests/unit/model/constants.py @@ -127,6 +127,22 @@ f"{PRESET_CONNECTION_QUALIFIED_NAME}/{PRESET_WORKSPACE_NAME}" ) PRESET_CONNECTOR_TYPE = "preset" +# Metabase +METABASE_CONNECTION_QUALIFIED_NAME = "default/metabase/123456789" +METABASE_CONNECTOR_TYPE = "metabase" +METABASE_ID = "42" +METABASE_COLLECTION_NAME = "mb-collection" +METABASE_COLLECTION_QUALIFIED_NAME = ( + f"{METABASE_CONNECTION_QUALIFIED_NAME}/collections/{METABASE_ID}" +) +METABASE_DASHBOARD_NAME = "mb-dashboard" +METABASE_DASHBOARD_QUALIFIED_NAME = ( + f"{METABASE_CONNECTION_QUALIFIED_NAME}/dashboards/{METABASE_ID}" +) +METABASE_QUESTION_NAME = "mb-question" +METABASE_QUESTION_QUALIFIED_NAME = ( + f"{METABASE_CONNECTION_QUALIFIED_NAME}/questions/{METABASE_ID}" +) PRESET_DASHBOARD_NAME = "ps-collection" PRESET_DASHBOARD_QUALIFIED_NAME = f"{PRESET_CONNECTION_QUALIFIED_NAME}/{PRESET_WORKSPACE_NAME}/{PRESET_DASHBOARD_NAME}" PRESET_CHART_NAME = "ps-chart" diff --git a/tests/unit/model/metabase_collection_test.py b/tests/unit/model/metabase_collection_test.py new file mode 100644 index 000000000..41af5b7c6 --- /dev/null +++ b/tests/unit/model/metabase_collection_test.py @@ -0,0 +1,89 @@ +import pytest + +from pyatlan.model.assets import MetabaseCollection +from tests.unit.model.constants import ( + METABASE_COLLECTION_NAME, + METABASE_COLLECTION_QUALIFIED_NAME, + METABASE_CONNECTION_QUALIFIED_NAME, + METABASE_CONNECTOR_TYPE, + METABASE_ID, +) + + +@pytest.mark.parametrize( + "name, connection_qualified_name, metabase_id, message", + [ + (None, METABASE_CONNECTION_QUALIFIED_NAME, METABASE_ID, "name is required"), + ( + METABASE_COLLECTION_NAME, + None, + METABASE_ID, + "connection_qualified_name is required", + ), + ( + METABASE_COLLECTION_NAME, + METABASE_CONNECTION_QUALIFIED_NAME, + None, + "metabase_id is required", + ), + ], +) +def test_creator_with_missing_parameters_raise_value_error( + name: str, connection_qualified_name: str, metabase_id: str, message: str +): + with pytest.raises(ValueError, match=message): + MetabaseCollection.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + + +def test_creator(): + sut = MetabaseCollection.creator( + name=METABASE_COLLECTION_NAME, + connection_qualified_name=METABASE_CONNECTION_QUALIFIED_NAME, + metabase_id=METABASE_ID, + ) + + assert sut.name == METABASE_COLLECTION_NAME + assert sut.connection_qualified_name == METABASE_CONNECTION_QUALIFIED_NAME + assert sut.qualified_name == METABASE_COLLECTION_QUALIFIED_NAME + assert sut.connector_name == METABASE_CONNECTOR_TYPE + + +def test_overload_creator_deprecated_create(): + with pytest.warns(DeprecationWarning): + sut = MetabaseCollection.create( + name=METABASE_COLLECTION_NAME, + connection_qualified_name=METABASE_CONNECTION_QUALIFIED_NAME, + metabase_id=METABASE_ID, + ) + + assert sut.qualified_name == METABASE_COLLECTION_QUALIFIED_NAME + + +@pytest.mark.parametrize( + "qualified_name, name, message", + [ + (None, METABASE_COLLECTION_NAME, "qualified_name is required"), + (METABASE_COLLECTION_QUALIFIED_NAME, None, "name is required"), + ], +) +def test_create_for_modification_with_invalid_parameter_raises_value_error( + qualified_name: str, name: str, message: str +): + with pytest.raises(ValueError, match=message): + MetabaseCollection.create_for_modification( + qualified_name=qualified_name, name=name + ) + + +def test_trim_to_required(): + sut = MetabaseCollection.create_for_modification( + qualified_name=METABASE_COLLECTION_QUALIFIED_NAME, + name=METABASE_COLLECTION_NAME, + ).trim_to_required() + + assert sut.qualified_name == METABASE_COLLECTION_QUALIFIED_NAME + assert sut.name == METABASE_COLLECTION_NAME diff --git a/tests/unit/model/metabase_dashboard_test.py b/tests/unit/model/metabase_dashboard_test.py new file mode 100644 index 000000000..d6cb24a69 --- /dev/null +++ b/tests/unit/model/metabase_dashboard_test.py @@ -0,0 +1,89 @@ +import pytest + +from pyatlan.model.assets import MetabaseDashboard +from tests.unit.model.constants import ( + METABASE_CONNECTION_QUALIFIED_NAME, + METABASE_CONNECTOR_TYPE, + METABASE_DASHBOARD_NAME, + METABASE_DASHBOARD_QUALIFIED_NAME, + METABASE_ID, +) + + +@pytest.mark.parametrize( + "name, connection_qualified_name, metabase_id, message", + [ + (None, METABASE_CONNECTION_QUALIFIED_NAME, METABASE_ID, "name is required"), + ( + METABASE_DASHBOARD_NAME, + None, + METABASE_ID, + "connection_qualified_name is required", + ), + ( + METABASE_DASHBOARD_NAME, + METABASE_CONNECTION_QUALIFIED_NAME, + None, + "metabase_id is required", + ), + ], +) +def test_creator_with_missing_parameters_raise_value_error( + name: str, connection_qualified_name: str, metabase_id: str, message: str +): + with pytest.raises(ValueError, match=message): + MetabaseDashboard.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + + +def test_creator(): + sut = MetabaseDashboard.creator( + name=METABASE_DASHBOARD_NAME, + connection_qualified_name=METABASE_CONNECTION_QUALIFIED_NAME, + metabase_id=METABASE_ID, + ) + + assert sut.name == METABASE_DASHBOARD_NAME + assert sut.connection_qualified_name == METABASE_CONNECTION_QUALIFIED_NAME + assert sut.qualified_name == METABASE_DASHBOARD_QUALIFIED_NAME + assert sut.connector_name == METABASE_CONNECTOR_TYPE + + +def test_overload_creator_deprecated_create(): + with pytest.warns(DeprecationWarning): + sut = MetabaseDashboard.create( + name=METABASE_DASHBOARD_NAME, + connection_qualified_name=METABASE_CONNECTION_QUALIFIED_NAME, + metabase_id=METABASE_ID, + ) + + assert sut.qualified_name == METABASE_DASHBOARD_QUALIFIED_NAME + + +@pytest.mark.parametrize( + "qualified_name, name, message", + [ + (None, METABASE_DASHBOARD_NAME, "qualified_name is required"), + (METABASE_DASHBOARD_QUALIFIED_NAME, None, "name is required"), + ], +) +def test_create_for_modification_with_invalid_parameter_raises_value_error( + qualified_name: str, name: str, message: str +): + with pytest.raises(ValueError, match=message): + MetabaseDashboard.create_for_modification( + qualified_name=qualified_name, name=name + ) + + +def test_trim_to_required(): + sut = MetabaseDashboard.create_for_modification( + qualified_name=METABASE_DASHBOARD_QUALIFIED_NAME, + name=METABASE_DASHBOARD_NAME, + ).trim_to_required() + + assert sut.qualified_name == METABASE_DASHBOARD_QUALIFIED_NAME + assert sut.name == METABASE_DASHBOARD_NAME diff --git a/tests/unit/model/metabase_question_test.py b/tests/unit/model/metabase_question_test.py new file mode 100644 index 000000000..71c145c44 --- /dev/null +++ b/tests/unit/model/metabase_question_test.py @@ -0,0 +1,89 @@ +import pytest + +from pyatlan.model.assets import MetabaseQuestion +from tests.unit.model.constants import ( + METABASE_CONNECTION_QUALIFIED_NAME, + METABASE_CONNECTOR_TYPE, + METABASE_ID, + METABASE_QUESTION_NAME, + METABASE_QUESTION_QUALIFIED_NAME, +) + + +@pytest.mark.parametrize( + "name, connection_qualified_name, metabase_id, message", + [ + (None, METABASE_CONNECTION_QUALIFIED_NAME, METABASE_ID, "name is required"), + ( + METABASE_QUESTION_NAME, + None, + METABASE_ID, + "connection_qualified_name is required", + ), + ( + METABASE_QUESTION_NAME, + METABASE_CONNECTION_QUALIFIED_NAME, + None, + "metabase_id is required", + ), + ], +) +def test_creator_with_missing_parameters_raise_value_error( + name: str, connection_qualified_name: str, metabase_id: str, message: str +): + with pytest.raises(ValueError, match=message): + MetabaseQuestion.creator( + name=name, + connection_qualified_name=connection_qualified_name, + metabase_id=metabase_id, + ) + + +def test_creator(): + sut = MetabaseQuestion.creator( + name=METABASE_QUESTION_NAME, + connection_qualified_name=METABASE_CONNECTION_QUALIFIED_NAME, + metabase_id=METABASE_ID, + ) + + assert sut.name == METABASE_QUESTION_NAME + assert sut.connection_qualified_name == METABASE_CONNECTION_QUALIFIED_NAME + assert sut.qualified_name == METABASE_QUESTION_QUALIFIED_NAME + assert sut.connector_name == METABASE_CONNECTOR_TYPE + + +def test_overload_creator_deprecated_create(): + with pytest.warns(DeprecationWarning): + sut = MetabaseQuestion.create( + name=METABASE_QUESTION_NAME, + connection_qualified_name=METABASE_CONNECTION_QUALIFIED_NAME, + metabase_id=METABASE_ID, + ) + + assert sut.qualified_name == METABASE_QUESTION_QUALIFIED_NAME + + +@pytest.mark.parametrize( + "qualified_name, name, message", + [ + (None, METABASE_QUESTION_NAME, "qualified_name is required"), + (METABASE_QUESTION_QUALIFIED_NAME, None, "name is required"), + ], +) +def test_create_for_modification_with_invalid_parameter_raises_value_error( + qualified_name: str, name: str, message: str +): + with pytest.raises(ValueError, match=message): + MetabaseQuestion.create_for_modification( + qualified_name=qualified_name, name=name + ) + + +def test_trim_to_required(): + sut = MetabaseQuestion.create_for_modification( + qualified_name=METABASE_QUESTION_QUALIFIED_NAME, + name=METABASE_QUESTION_NAME, + ).trim_to_required() + + assert sut.qualified_name == METABASE_QUESTION_QUALIFIED_NAME + assert sut.name == METABASE_QUESTION_NAME