altimate-datapilot-cli 0.0.8__py3-none-any.whl → 0.0.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: altimate-datapilot-cli
3
- Version: 0.0.8
3
+ Version: 0.0.10
4
4
  Summary: Assistant for Data Teams
5
- Home-page: https://github.com/AltimateAI/datapilot
6
- Author: Anand Gupta
5
+ Home-page: https://github.com/AltimateAI/datapilot-cli
6
+ Author: Altimate Inc
7
7
  Author-email: info@altimate.ai
8
8
  License: MIT
9
9
  Project-URL: Documentation, https://datapilot.readthedocs.io/
10
10
  Project-URL: Changelog, https://datapilot.readthedocs.io/en/latest/changelog.html
11
- Project-URL: Issue Tracker, https://github.com/AltimateAI/datapilot/issues
11
+ Project-URL: Issue Tracker, https://github.com/AltimateAI/datapilot-cli/issues
12
12
  Platform: UNKNOWN
13
13
  Classifier: Development Status :: 5 - Production/Stable
14
14
  Classifier: Intended Audience :: Developers
@@ -56,7 +56,7 @@ Installation
56
56
 
57
57
  You can also install the in-development version with::
58
58
 
59
- pip install https://github.com/AltimateAI/datapilot/archive/main.zip
59
+ pip install https://github.com/AltimateAI/datapilot-cli/archive/main.zip
60
60
 
61
61
 
62
62
  Documentation
@@ -1,4 +1,4 @@
1
- datapilot/__init__.py,sha256=wOJN3HxAgnSon5vWYU3Txm2UZ_7tBHDKXUKZIH-mXX8,22
1
+ datapilot/__init__.py,sha256=-nNlMKS9nph3FR78_ZG9RGKrbxseeNp2K6nMr0pVGaU,23
2
2
  datapilot/__main__.py,sha256=I9USmeNnK-cAHb6LZfydJC0LeNSE8enieeY55wpR6uw,380
3
3
  datapilot/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  datapilot/cli/main.py,sha256=VSdqlkCiu8GSG9qQh8q0BzyocsQc4lKWxZAPEsjXF18,181
@@ -26,7 +26,7 @@ datapilot/core/platforms/dbt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
26
26
  datapilot/core/platforms/dbt/constants.py,sha256=N9Ovo9100iOAeRu8pPZLYg3_11O5QKgs3dW0VMU6jR8,502
27
27
  datapilot/core/platforms/dbt/exceptions.py,sha256=IC5BgcU90gjYYwPcfTlPNtn0_p8fYjavDRMpKZQ0OnY,110
28
28
  datapilot/core/platforms/dbt/executor.py,sha256=hvdh0qJjalWJN8ElJjIUvUiLrMIcvGvoQfrysMTqa-Y,6562
29
- datapilot/core/platforms/dbt/factory.py,sha256=ZD6alSxbBqXr95tpf4onjd_UVZ4RHp4YXbc0hvbbbOs,1095
29
+ datapilot/core/platforms/dbt/factory.py,sha256=fsk8XWXiSq22t5BH5jGQMASWIJ-eUNqOh5x551cbnLw,1331
30
30
  datapilot/core/platforms/dbt/formatting.py,sha256=bpfa7XmVghTq4WnGDGYC6DruwOwH8YmjFHghoo5cPD8,1638
31
31
  datapilot/core/platforms/dbt/utils.py,sha256=ozFHprR6LTLXQdrGyaRoyIBTua4P1NkP8T7LGgN-9c0,18577
32
32
  datapilot/core/platforms/dbt/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -107,7 +107,7 @@ datapilot/core/platforms/dbt/insights/structure/source_directories_structure.py,
107
107
  datapilot/core/platforms/dbt/insights/structure/test_directory_structure.py,sha256=XL6YQgWmf397W2OwBmT7L8zUN93M1bOZBTp4PlngqlI,3484
108
108
  datapilot/core/platforms/dbt/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  datapilot/core/platforms/dbt/schemas/catalog.py,sha256=izhzchuME5BTuNAj6iyDHpo6NAPsggG4rd6z6WxOWV8,1878
110
- datapilot/core/platforms/dbt/schemas/manifest.py,sha256=8d8ZNpPIhQSNwh32PodHbzW-iucAvDSYBSnwbJRlEcY,14117
110
+ datapilot/core/platforms/dbt/schemas/manifest.py,sha256=tkmGYWkn9DxnYzvHVH8GiypT3DhcHAVugzETfC9Q19o,14127
111
111
  datapilot/core/platforms/dbt/wrappers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
112
  datapilot/core/platforms/dbt/wrappers/catalog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
113
  datapilot/core/platforms/dbt/wrappers/catalog/wrapper.py,sha256=LDjt4pSiqGAmvI5DSPzEubwq13N1MKv9xakLNhG-BWY,196
@@ -115,9 +115,12 @@ datapilot/core/platforms/dbt/wrappers/catalog/v1/__init__.py,sha256=47DEQpj8HBSa
115
115
  datapilot/core/platforms/dbt/wrappers/catalog/v1/wrapper.py,sha256=OHCxG0CJAxOgicGeykoJJ3AnJG8izZvDUGNm7pXajRQ,832
116
116
  datapilot/core/platforms/dbt/wrappers/manifest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
117
  datapilot/core/platforms/dbt/wrappers/manifest/wrapper.py,sha256=lKFpmgALDqMEXQldkQ9OFjG51VAfTcZ7rk01e2t39n0,1078
118
+ datapilot/core/platforms/dbt/wrappers/manifest/v10/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
+ datapilot/core/platforms/dbt/wrappers/manifest/v10/schemas.py,sha256=VxqIFQbAL88ObQW1E8wPpiuooCdawdACJUFhgAYBxmo,1523
120
+ datapilot/core/platforms/dbt/wrappers/manifest/v10/wrapper.py,sha256=vch6X_sCF3kw-2NuffYMQlOUSZnYgPLZX6x1CC-8gBI,17360
118
121
  datapilot/core/platforms/dbt/wrappers/manifest/v11/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
122
  datapilot/core/platforms/dbt/wrappers/manifest/v11/schemas.py,sha256=Mb0N48czcwQTz5mxQx2QlVINzz50A5FUm0kMJ-Nzs6A,1523
120
- datapilot/core/platforms/dbt/wrappers/manifest/v11/wrapper.py,sha256=WxHRwu3E_8-YHrcoI-5EisUi4uVQ6przB9SVHBnfLEg,17274
123
+ datapilot/core/platforms/dbt/wrappers/manifest/v11/wrapper.py,sha256=z-KGORZHaQLdLzl8lVw7jYrK6t_rEhQI8horw65j1pY,17360
121
124
  datapilot/core/platforms/dbt/wrappers/run_results/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
125
  datapilot/core/platforms/dbt/wrappers/run_results/run_results.py,sha256=3E_y1gAF491WmXt-Z_Fqhr5BU-kVnzjHpZZv5UpOx-s,1267
123
126
  datapilot/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -130,10 +133,10 @@ datapilot/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
133
  datapilot/utils/utils.py,sha256=XGi0jn030M2Cp_WJ-cIOZzdzRewEOQrPldzcaDj7uPw,11150
131
134
  datapilot/utils/formatting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
135
  datapilot/utils/formatting/utils.py,sha256=rAVmIYuldvw9VvCSwG2kMTEgiT7cEconp_F1sAWVyCo,1377
133
- altimate_datapilot_cli-0.0.8.dist-info/AUTHORS.rst,sha256=S4H4zw_v3GVyz5_55jF5Gf_YNG3s5Y0VgbQaEov9PFk,50
134
- altimate_datapilot_cli-0.0.8.dist-info/LICENSE,sha256=Mf7VqpsmU2QR5_s2Cb_ZeeMB2Q9KW7YXJENZPFZRK1k,1100
135
- altimate_datapilot_cli-0.0.8.dist-info/METADATA,sha256=ogb9-SqtGxlIOvFLIRP99d3usxS-6SEZ65TygNAyjts,2385
136
- altimate_datapilot_cli-0.0.8.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
137
- altimate_datapilot_cli-0.0.8.dist-info/entry_points.txt,sha256=0zwgKxN40RLVB5jSmlJz7IH_FBqRtpFdbrdZn-xuQIY,141
138
- altimate_datapilot_cli-0.0.8.dist-info/top_level.txt,sha256=gAOFOdwB00vcxv74y4M1J-nQtPvEatU8-mYViEBcToo,10
139
- altimate_datapilot_cli-0.0.8.dist-info/RECORD,,
136
+ altimate_datapilot_cli-0.0.10.dist-info/AUTHORS.rst,sha256=S4H4zw_v3GVyz5_55jF5Gf_YNG3s5Y0VgbQaEov9PFk,50
137
+ altimate_datapilot_cli-0.0.10.dist-info/LICENSE,sha256=Mf7VqpsmU2QR5_s2Cb_ZeeMB2Q9KW7YXJENZPFZRK1k,1100
138
+ altimate_datapilot_cli-0.0.10.dist-info/METADATA,sha256=sVAlnm0mvyJ-cSbcc25WA14HNwuWZp5myRiUXDJ3Dc8,2399
139
+ altimate_datapilot_cli-0.0.10.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
140
+ altimate_datapilot_cli-0.0.10.dist-info/entry_points.txt,sha256=0zwgKxN40RLVB5jSmlJz7IH_FBqRtpFdbrdZn-xuQIY,141
141
+ altimate_datapilot_cli-0.0.10.dist-info/top_level.txt,sha256=gAOFOdwB00vcxv74y4M1J-nQtPvEatU8-mYViEBcToo,10
142
+ altimate_datapilot_cli-0.0.10.dist-info/RECORD,,
datapilot/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.0.8"
1
+ __version__ = "0.0.10"
@@ -1,9 +1,11 @@
1
1
  from dbt_artifacts_parser.parsers.catalog.catalog_v1 import CatalogV1
2
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import ManifestV10
2
3
  from dbt_artifacts_parser.parsers.manifest.manifest_v11 import ManifestV11
3
4
 
4
5
  from datapilot.core.platforms.dbt.schemas.manifest import Catalog
5
6
  from datapilot.core.platforms.dbt.schemas.manifest import Manifest
6
7
  from datapilot.core.platforms.dbt.wrappers.catalog.v1.wrapper import CatalogV1Wrapper
8
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.wrapper import ManifestV10Wrapper
7
9
  from datapilot.core.platforms.dbt.wrappers.manifest.v11.wrapper import ManifestV11Wrapper
8
10
  from datapilot.exceptions.exceptions import AltimateNotSupportedError
9
11
 
@@ -13,10 +15,12 @@ class DBTFactory:
13
15
  def get_manifest_wrapper(cls, manifest: Manifest):
14
16
  if isinstance(manifest, ManifestV11):
15
17
  return ManifestV11Wrapper(manifest)
16
- raise AltimateNotSupportedError(f"Manifest version {manifest.metadata.dbt_schema_version} not supported")
18
+ if isinstance(manifest, ManifestV10):
19
+ return ManifestV10Wrapper(manifest)
20
+ raise AltimateNotSupportedError(f"dbt version {manifest.metadata.dbt_version} not supported")
17
21
 
18
22
  @classmethod
19
23
  def get_catalog_wrapper(cls, catalog: Catalog):
20
24
  if isinstance(catalog, CatalogV1):
21
25
  return CatalogV1Wrapper(catalog)
22
- raise AltimateNotSupportedError(f"Catalog version {catalog.metadata.dbt_schema_version} not supported")
26
+ raise AltimateNotSupportedError(f"dbt version {catalog.metadata.dbt_version} not supported")
@@ -438,7 +438,7 @@ class AltimateMacroArgument(BaseModel):
438
438
 
439
439
  name: str
440
440
  type: Optional[Optional[str]] = None
441
- description: Optional[str] = ""
441
+ description: Optional[Optional[str]] = ""
442
442
 
443
443
 
444
444
  AltimateSupportedLanguage = SupportedLanguage
@@ -0,0 +1,47 @@
1
+ from typing import Dict
2
+ from typing import Type
3
+ from typing import Union
4
+
5
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import AnalysisNode
6
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import Exposure
7
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import GenericTestNode
8
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import HookNode
9
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import Macro
10
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import ModelNode
11
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import RPCNode
12
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import SeedNode
13
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import SingularTestNode
14
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import SnapshotNode
15
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import SourceDefinition
16
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import SqlNode
17
+
18
+ from datapilot.core.platforms.dbt.constants import GENERIC
19
+ from datapilot.core.platforms.dbt.constants import SINGULAR
20
+
21
+ ManifestNode = Union[
22
+ AnalysisNode,
23
+ SingularTestNode,
24
+ HookNode,
25
+ ModelNode,
26
+ RPCNode,
27
+ SqlNode,
28
+ GenericTestNode,
29
+ SnapshotNode,
30
+ SeedNode,
31
+ ]
32
+
33
+ SourceNode = SourceDefinition
34
+
35
+ ExposureNode = Exposure
36
+
37
+ TestNode = Union[GenericTestNode, SingularTestNode]
38
+
39
+ MacroNode = Macro
40
+
41
+ TEST_TYPE_TO_NODE_MAP: Dict[str, Type] = {
42
+ GENERIC: [GenericTestNode],
43
+ SINGULAR: [SingularTestNode],
44
+ }
45
+
46
+
47
+ SeedNodeMap = SeedNode
@@ -0,0 +1,397 @@
1
+ from typing import Dict
2
+ from typing import Set
3
+
4
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import GenericTestNode
5
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import ManifestV10
6
+ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import SingularTestNode
7
+
8
+ from datapilot.core.platforms.dbt.constants import GENERIC
9
+ from datapilot.core.platforms.dbt.constants import OTHER_TEST_NODE
10
+ from datapilot.core.platforms.dbt.constants import SEED
11
+ from datapilot.core.platforms.dbt.constants import SINGULAR
12
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateDBTContract
13
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateDependsOn
14
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateExposureType
15
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateExternalTable
16
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateFileHash
17
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateFreshnessThreshold
18
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateMacroArgument
19
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestColumnInfo
20
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestExposureNode
21
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestMacroNode
22
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestNode
23
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestSourceNode
24
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestTestNode
25
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateMaturityEnum
26
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateNodeConfig
27
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateOwner
28
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateQuoting
29
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateRefArgs
30
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateResourceType
31
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateSeedConfig
32
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateSeedNode
33
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateSourceConfig
34
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateTestConfig
35
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateTestMetadata
36
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.schemas import TEST_TYPE_TO_NODE_MAP
37
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.schemas import ExposureNode
38
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.schemas import MacroNode
39
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.schemas import ManifestNode
40
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.schemas import SeedNodeMap
41
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.schemas import SourceNode
42
+ from datapilot.core.platforms.dbt.wrappers.manifest.v10.schemas import TestNode
43
+ from datapilot.core.platforms.dbt.wrappers.manifest.wrapper import BaseManifestWrapper
44
+
45
+
46
+ class ManifestV10Wrapper(BaseManifestWrapper):
47
+ def __init__(self, manifest: ManifestV10):
48
+ self.manifest = manifest
49
+
50
+ def _get_node(self, node: ManifestNode) -> AltimateManifestNode:
51
+ (
52
+ sources,
53
+ metrics,
54
+ compiled_path,
55
+ compiled,
56
+ compiled_code,
57
+ depends_on_nodes,
58
+ depends_on_macros,
59
+ raw_code,
60
+ language,
61
+ contract,
62
+ ) = ([], [], None, None, None, None, None, "", "", None)
63
+ if node.resource_type.value != SEED:
64
+ sources = node.sources
65
+ metrics = node.metrics
66
+ depends_on_nodes = node.depends_on.nodes if node.depends_on else None
67
+ depends_on_macros = node.depends_on.macros if node.depends_on else None
68
+ compiled_path = node.compiled_path
69
+ compiled = node.compiled
70
+ raw_code = node.raw_code
71
+ language = node.language
72
+ contract = AltimateDBTContract(**node.contract.__dict__) if node.contract else None
73
+
74
+ return AltimateManifestNode(
75
+ database=node.database,
76
+ schema_name=node.schema_,
77
+ name=node.name,
78
+ resource_type=AltimateResourceType(node.resource_type.value),
79
+ package_name=node.package_name,
80
+ path=node.path,
81
+ description=node.description,
82
+ original_file_path=node.original_file_path,
83
+ unique_id=node.unique_id,
84
+ fqn=node.fqn,
85
+ alias=node.alias,
86
+ raw_code=raw_code,
87
+ language=language,
88
+ config=AltimateNodeConfig(**node.config.__dict__) if node.config else None,
89
+ checksum=AltimateFileHash(
90
+ name=node.checksum.name if node.checksum else None,
91
+ checksum=node.checksum.checksum if node.checksum else None,
92
+ ),
93
+ columns={
94
+ name: AltimateManifestColumnInfo(
95
+ name=column.name,
96
+ description=column.description,
97
+ meta=column.meta,
98
+ data_type=column.data_type,
99
+ quote=column.quote,
100
+ tags=column.tags,
101
+ )
102
+ for name, column in node.columns.items()
103
+ },
104
+ relation_name=node.relation_name,
105
+ sources=sources,
106
+ metrics=metrics,
107
+ depends_on=AltimateDependsOn(
108
+ nodes=depends_on_nodes,
109
+ macros=depends_on_macros,
110
+ ),
111
+ compiled_path=compiled_path,
112
+ compiled=compiled,
113
+ compiled_code=compiled_code,
114
+ contract=contract,
115
+ meta=node.meta,
116
+ patch_path=node.patch_path,
117
+ )
118
+
119
+ def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode:
120
+ return AltimateManifestSourceNode(
121
+ database=source.database,
122
+ resource_type=AltimateResourceType(source.resource_type.value),
123
+ schema_name=source.schema_,
124
+ name=source.name,
125
+ package_name=source.package_name,
126
+ path=source.path,
127
+ original_file_path=source.original_file_path,
128
+ unique_id=source.unique_id,
129
+ fqn=source.fqn,
130
+ source_name=source.source_name,
131
+ source_description=source.source_description,
132
+ loader=source.loader,
133
+ identifier=source.identifier,
134
+ quoting=AltimateQuoting(**source.quoting.dict()) if source.quoting else None,
135
+ loaded_at_field=source.loaded_at_field,
136
+ freshness=AltimateFreshnessThreshold(**source.freshness.dict()) if source.freshness else None,
137
+ external=AltimateExternalTable(**source.external.dict()) if source.external else None,
138
+ description=source.description,
139
+ columns={
140
+ name: AltimateManifestColumnInfo(
141
+ name=column.name,
142
+ description=column.description,
143
+ meta=column.meta,
144
+ data_type=column.data_type,
145
+ quote=column.quote,
146
+ tags=column.tags,
147
+ )
148
+ for name, column in source.columns.items()
149
+ },
150
+ meta=source.meta,
151
+ relation_name=source.relation_name,
152
+ source_meta=source.source_meta,
153
+ tags=source.tags,
154
+ config=AltimateSourceConfig(**source.config.dict()) if source.config else None,
155
+ patch_path=source.patch_path,
156
+ unrendered_config=source.unrendered_config,
157
+ created_at=source.created_at,
158
+ )
159
+
160
+ def _get_macro(self, macro: MacroNode) -> AltimateManifestMacroNode:
161
+ return AltimateManifestMacroNode(
162
+ name=macro.name,
163
+ resource_type=AltimateResourceType(macro.resource_type.value),
164
+ package_name=macro.package_name,
165
+ path=macro.path,
166
+ original_file_path=macro.original_file_path,
167
+ unique_id=macro.unique_id,
168
+ macro_sql=macro.macro_sql,
169
+ depends_on=(
170
+ AltimateDependsOn(
171
+ macros=macro.depends_on.macros,
172
+ )
173
+ if macro.depends_on
174
+ else None
175
+ ),
176
+ description=macro.description,
177
+ meta=macro.meta,
178
+ docs=macro.docs,
179
+ patch_path=macro.patch_path,
180
+ arguments=[AltimateMacroArgument(**arg.dict()) for arg in macro.arguments] if macro.arguments else None,
181
+ created_at=macro.created_at,
182
+ supported_languages=macro.supported_languages,
183
+ )
184
+
185
+ def _get_exposure(self, exposure: ExposureNode) -> AltimateManifestExposureNode:
186
+ return AltimateManifestExposureNode(
187
+ name=exposure.name,
188
+ resource_type=AltimateResourceType(exposure.resource_type.value),
189
+ package_name=exposure.package_name,
190
+ path=exposure.path,
191
+ original_file_path=exposure.original_file_path,
192
+ unique_id=exposure.unique_id,
193
+ fqn=exposure.fqn,
194
+ type=AltimateExposureType(exposure.type.value) if exposure.type else None,
195
+ owner=AltimateOwner(**exposure.owner.dict()) if exposure.owner else None,
196
+ description=exposure.description,
197
+ label=exposure.label,
198
+ maturity=AltimateMaturityEnum(exposure.maturity.value) if exposure.maturity else None,
199
+ meta=exposure.meta,
200
+ tags=exposure.tags,
201
+ config=AltimateSourceConfig(**exposure.config.dict()) if exposure.config else None,
202
+ unrendered_config=exposure.unrendered_config,
203
+ url=exposure.url,
204
+ depends_on=AltimateDependsOn(
205
+ nodes=exposure.depends_on.nodes,
206
+ macros=exposure.depends_on.macros,
207
+ )
208
+ if exposure.depends_on
209
+ else None,
210
+ refs=[AltimateRefArgs(**ref.dict()) for ref in exposure.refs] if exposure.refs else None,
211
+ sources=exposure.sources,
212
+ metrics=exposure.metrics,
213
+ created_at=exposure.created_at,
214
+ )
215
+
216
+ def _get_tests(self, test: TestNode) -> AltimateManifestTestNode:
217
+ test_metadata = None
218
+ if isinstance(test, GenericTestNode):
219
+ test_type = GENERIC
220
+ test_metadata = AltimateTestMetadata(**test.test_metadata.dict()) if test.test_metadata else None
221
+ elif isinstance(test, SingularTestNode):
222
+ test_type = SINGULAR
223
+ else:
224
+ test_type = OTHER_TEST_NODE
225
+ return AltimateManifestTestNode(
226
+ test_metadata=test_metadata,
227
+ test_type=test_type,
228
+ name=test.name,
229
+ resource_type=AltimateResourceType(test.resource_type.value),
230
+ package_name=test.package_name,
231
+ path=test.path,
232
+ original_file_path=test.original_file_path,
233
+ unique_id=test.unique_id,
234
+ fqn=test.fqn,
235
+ alias=test.alias,
236
+ checksum=AltimateFileHash(
237
+ name=test.checksum.name,
238
+ checksum=test.checksum.checksum,
239
+ )
240
+ if test.checksum
241
+ else None,
242
+ config=AltimateTestConfig(**test.config.dict()) if test.config else None,
243
+ description=test.description,
244
+ tags=test.tags,
245
+ columns={
246
+ name: AltimateManifestColumnInfo(
247
+ name=column.name,
248
+ description=column.description,
249
+ meta=column.meta,
250
+ data_type=column.data_type,
251
+ quote=column.quote,
252
+ tags=column.tags,
253
+ )
254
+ for name, column in test.columns.items()
255
+ }
256
+ if test.columns
257
+ else None,
258
+ meta=test.meta,
259
+ relation_name=test.relation_name,
260
+ group=test.group,
261
+ raw_code=test.raw_code,
262
+ language=test.language,
263
+ refs=[AltimateRefArgs(**ref.dict()) for ref in test.refs] if test.refs else None,
264
+ sources=test.sources,
265
+ metrics=test.metrics,
266
+ depends_on=AltimateDependsOn(
267
+ nodes=test.depends_on.nodes,
268
+ macros=test.depends_on.macros,
269
+ )
270
+ if test.depends_on
271
+ else None,
272
+ compiled_path=test.compiled_path,
273
+ compiled=test.compiled,
274
+ compiled_code=test.compiled_code,
275
+ )
276
+
277
+ def _get_seed(self, seed: SeedNodeMap) -> AltimateSeedNode:
278
+ return AltimateSeedNode(
279
+ database=seed.database,
280
+ schema_name=seed.schema_,
281
+ name=seed.name,
282
+ resource_type=AltimateResourceType(seed.resource_type.value),
283
+ package_name=seed.package_name,
284
+ path=seed.path,
285
+ original_file_path=seed.original_file_path,
286
+ unique_id=seed.unique_id,
287
+ fqn=seed.fqn,
288
+ alias=seed.alias,
289
+ checksum=AltimateFileHash(
290
+ name=seed.checksum.name,
291
+ checksum=seed.checksum.checksum,
292
+ )
293
+ if seed.checksum
294
+ else None,
295
+ config=AltimateSeedConfig(**seed.config.dict()) if seed.config else None,
296
+ description=seed.description,
297
+ tags=seed.tags,
298
+ columns={
299
+ name: AltimateManifestColumnInfo(
300
+ name=column.name,
301
+ description=column.description,
302
+ meta=column.meta,
303
+ data_type=column.data_type,
304
+ quote=column.quote,
305
+ tags=column.tags,
306
+ )
307
+ for name, column in seed.columns.items()
308
+ }
309
+ if seed.columns
310
+ else None,
311
+ meta=seed.meta,
312
+ group=seed.group,
313
+ docs=seed.docs.dict() if seed.docs else None,
314
+ patch_path=seed.patch_path,
315
+ build_path=seed.build_path,
316
+ deferred=seed.deferred,
317
+ unrendered_config=seed.unrendered_config,
318
+ created_at=seed.created_at,
319
+ config_call_dict=seed.config_call_dict,
320
+ )
321
+
322
+ def get_nodes(
323
+ self,
324
+ ) -> Dict[str, AltimateManifestNode]:
325
+ nodes = {}
326
+ for node in self.manifest.nodes.values():
327
+ if (
328
+ node.resource_type.value
329
+ in [
330
+ AltimateResourceType.seed.value,
331
+ AltimateResourceType.test.value,
332
+ ]
333
+ or node.package_name != self.get_package()
334
+ ):
335
+ continue
336
+ nodes[node.unique_id] = self._get_node(node)
337
+ return nodes
338
+
339
+ def get_package(self) -> str:
340
+ return self.manifest.metadata.project_name
341
+
342
+ def get_sources(self) -> Dict[str, AltimateManifestSourceNode]:
343
+ sources = {}
344
+ for source in self.manifest.sources.values():
345
+ sources[source.unique_id] = self._get_source(source)
346
+ return sources
347
+
348
+ def get_macros(self) -> Dict[str, AltimateManifestMacroNode]:
349
+ macros = {}
350
+ for macro in self.manifest.macros.values():
351
+ if macro.resource_type.value == AltimateResourceType.macro.value and macro.package_name == self.get_package():
352
+ macros[macro.unique_id] = self._get_macro(macro)
353
+ return macros
354
+
355
+ def get_exposures(self) -> Dict[str, AltimateManifestExposureNode]:
356
+ exposures = {}
357
+ for exposure in self.manifest.exposures.values():
358
+ exposures[exposure.unique_id] = self._get_exposure(exposure)
359
+ return exposures
360
+
361
+ def get_tests(self, type=None) -> Dict[str, AltimateManifestTestNode]:
362
+ tests = {}
363
+ # Initialize types_union with TestNode
364
+ types = [GenericTestNode, SingularTestNode]
365
+
366
+ # Add other types to the union if provided
367
+ if type:
368
+ types = TEST_TYPE_TO_NODE_MAP.get(type)
369
+
370
+ for node in self.manifest.nodes.values():
371
+ # Check if the node is a test and of the correct type
372
+ if node.resource_type.value == AltimateResourceType.test.value:
373
+ if any(isinstance(node, t) for t in types):
374
+ tests[node.unique_id] = self._get_tests(node)
375
+ return tests
376
+
377
+ def get_seeds(self) -> Dict[str, AltimateSeedNode]:
378
+ seeds = {}
379
+ for seed in self.manifest.nodes.values():
380
+ if seed.resource_type.value == AltimateResourceType.seed.value:
381
+ seeds[seed.unique_id] = self._get_seed(seed)
382
+ return seeds
383
+
384
+ def parent_to_child_map(self, nodes: Dict[str, AltimateManifestNode]) -> Dict[str, Set[str]]:
385
+ """
386
+ Current manifest contains information about parents
387
+ THis gives an information of node to childre
388
+ :param nodes: A dictionary of nodes in a manifest.
389
+ :return: A dictionary of all the children of a node.
390
+ """
391
+ children_map = {}
392
+ for node_id, node in nodes.items():
393
+ if node_id not in children_map:
394
+ children_map[node_id] = set()
395
+ for parent in node.depends_on.nodes or []:
396
+ children_map.setdefault(parent, set()).add(node_id)
397
+ return children_map
@@ -15,6 +15,7 @@ from datapilot.core.platforms.dbt.schemas.manifest import AltimateExposureType
15
15
  from datapilot.core.platforms.dbt.schemas.manifest import AltimateExternalTable
16
16
  from datapilot.core.platforms.dbt.schemas.manifest import AltimateFileHash
17
17
  from datapilot.core.platforms.dbt.schemas.manifest import AltimateFreshnessThreshold
18
+ from datapilot.core.platforms.dbt.schemas.manifest import AltimateMacroArgument
18
19
  from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestColumnInfo
19
20
  from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestExposureNode
20
21
  from datapilot.core.platforms.dbt.schemas.manifest import AltimateManifestMacroNode
@@ -176,7 +177,7 @@ class ManifestV11Wrapper(BaseManifestWrapper):
176
177
  meta=macro.meta,
177
178
  docs=macro.docs,
178
179
  patch_path=macro.patch_path,
179
- arguments=[AltimateRefArgs(**arg.dict()) for arg in macro.arguments] if macro.arguments else None,
180
+ arguments=[AltimateMacroArgument(**arg.dict()) for arg in macro.arguments] if macro.arguments else None,
180
181
  created_at=macro.created_at,
181
182
  supported_languages=macro.supported_languages,
182
183
  )