altimate-datapilot-cli 0.0.16__py3-none-any.whl → 0.0.17__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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: altimate-datapilot-cli
3
- Version: 0.0.16
3
+ Version: 0.0.17
4
4
  Summary: Assistant for Data Teams
5
5
  Home-page: https://github.com/AltimateAI/datapilot-cli
6
6
  Author: Altimate Inc
@@ -1,11 +1,11 @@
1
- datapilot/__init__.py,sha256=8ss7zPyQ3YfaQJw9IIGX35NOL7ASZ7-LErAxKnQDN7c,23
1
+ datapilot/__init__.py,sha256=WlMBNrzKywm5RAbqEVgEgcG7Opc4cf3-wpAnO8PdoEI,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
5
5
  datapilot/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  datapilot/clients/altimate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- datapilot/clients/altimate/client.py,sha256=lLIb9wu--5Rk3qpgnmqeyHlWiPmiTIE-nyMXdWodQ5I,3875
8
- datapilot/clients/altimate/utils.py,sha256=B94GQgaiBbw4GrLrK8P7r89zzVeYIzr9-8tuJhoN2MY,4302
7
+ datapilot/clients/altimate/client.py,sha256=00TRe_ck8UgbhFMAnrLBmug3fAWxAggNl2do5Um_4oU,4083
8
+ datapilot/clients/altimate/utils.py,sha256=URxGzmaJdXWEOQrRJtTK3te6BzkfOGlSfrNGGdGtak4,4549
9
9
  datapilot/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  datapilot/config/config.py,sha256=kyj53Qsb85V4iGQsX0vSwULOjscMOSFrJDJ3tnagJpo,403
11
11
  datapilot/config/utils.py,sha256=DIAVX-OZ5Lc0Ky_A7dvdbPcD1QSg2DRxZcuaIIZ2rhw,1146
@@ -30,7 +30,7 @@ datapilot/core/platforms/dbt/factory.py,sha256=YIQtb-FQQAJsifJ3KiLjjk0WIKTHtEPTN
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
33
- datapilot/core/platforms/dbt/cli/cli.py,sha256=1phfriG4f5pS1UFwBcZ0uM49iovVpnjdama9lSYcKMU,6266
33
+ datapilot/core/platforms/dbt/cli/cli.py,sha256=ZrTneNStGtwbH2zDavDItR-ZbLSQomJYkpcMyEcU9Rc,7236
34
34
  datapilot/core/platforms/dbt/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  datapilot/core/platforms/dbt/hooks/executor_hook.py,sha256=gSM50vAO7C-f1rdnHogWbqc87aCXPXysZepjp5L2qzw,2966
36
36
  datapilot/core/platforms/dbt/insights/__init__.py,sha256=hk7BAzCTDkY8WNV6L0v-CPn9mrsDyJJusoQxNxGyzAY,7634
@@ -120,13 +120,13 @@ datapilot/core/platforms/dbt/wrappers/manifest/__init__.py,sha256=47DEQpj8HBSa-_
120
120
  datapilot/core/platforms/dbt/wrappers/manifest/wrapper.py,sha256=Q9DG-OEyJAa4ePoVhxG78pehfNotNc9A3xtz171fLhU,1189
121
121
  datapilot/core/platforms/dbt/wrappers/manifest/v10/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
122
  datapilot/core/platforms/dbt/wrappers/manifest/v10/schemas.py,sha256=VxqIFQbAL88ObQW1E8wPpiuooCdawdACJUFhgAYBxmo,1523
123
- datapilot/core/platforms/dbt/wrappers/manifest/v10/wrapper.py,sha256=jXF_HDoBMR5r7IPNcL3YGAvY0ZEFpTmda0uNiElbJbY,18057
123
+ datapilot/core/platforms/dbt/wrappers/manifest/v10/wrapper.py,sha256=5nqROcsXLkZrv-DwewF-_HYsknL4AMO9UC_ACP2_AOY,18140
124
124
  datapilot/core/platforms/dbt/wrappers/manifest/v11/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  datapilot/core/platforms/dbt/wrappers/manifest/v11/schemas.py,sha256=Mb0N48czcwQTz5mxQx2QlVINzz50A5FUm0kMJ-Nzs6A,1523
126
- datapilot/core/platforms/dbt/wrappers/manifest/v11/wrapper.py,sha256=vuGFupQHyAJokWkgdzXmZd67S04nRkH89fEYCXeJWa0,17991
126
+ datapilot/core/platforms/dbt/wrappers/manifest/v11/wrapper.py,sha256=L9f5uMlwCg4Tu_uR--1KakN-4gvzf6Yspd1uX5ZPQWc,18074
127
127
  datapilot/core/platforms/dbt/wrappers/manifest/v12/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  datapilot/core/platforms/dbt/wrappers/manifest/v12/schemas.py,sha256=2rMEQ_BCcjiibfrlDKwgCE8vFX_6BzSInpilpVTWrNE,1269
129
- datapilot/core/platforms/dbt/wrappers/manifest/v12/wrapper.py,sha256=lAQY7rAI2luQep4sPogi1swVzcAZ_z5VzGwIl2XpKe0,17926
129
+ datapilot/core/platforms/dbt/wrappers/manifest/v12/wrapper.py,sha256=knhwCPXqHA4XWr4tAETsS23g7QOG6hGEPjnrhdarG2Q,18009
130
130
  datapilot/core/platforms/dbt/wrappers/run_results/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
131
  datapilot/core/platforms/dbt/wrappers/run_results/run_results.py,sha256=3E_y1gAF491WmXt-Z_Fqhr5BU-kVnzjHpZZv5UpOx-s,1267
132
132
  datapilot/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -139,10 +139,10 @@ datapilot/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
139
  datapilot/utils/utils.py,sha256=MY8q6ZBJ0hkrTuH7gWMxAlEAQGrajXFMabEhtGtT7sc,11524
140
140
  datapilot/utils/formatting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
141
  datapilot/utils/formatting/utils.py,sha256=rAVmIYuldvw9VvCSwG2kMTEgiT7cEconp_F1sAWVyCo,1377
142
- altimate_datapilot_cli-0.0.16.dist-info/AUTHORS.rst,sha256=S4H4zw_v3GVyz5_55jF5Gf_YNG3s5Y0VgbQaEov9PFk,50
143
- altimate_datapilot_cli-0.0.16.dist-info/LICENSE,sha256=Mf7VqpsmU2QR5_s2Cb_ZeeMB2Q9KW7YXJENZPFZRK1k,1100
144
- altimate_datapilot_cli-0.0.16.dist-info/METADATA,sha256=u9VMpTgcYnEQPTfpKgk7ossYVldRkUDPU4y42rg-YDM,2382
145
- altimate_datapilot_cli-0.0.16.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
146
- altimate_datapilot_cli-0.0.16.dist-info/entry_points.txt,sha256=0zwgKxN40RLVB5jSmlJz7IH_FBqRtpFdbrdZn-xuQIY,141
147
- altimate_datapilot_cli-0.0.16.dist-info/top_level.txt,sha256=gAOFOdwB00vcxv74y4M1J-nQtPvEatU8-mYViEBcToo,10
148
- altimate_datapilot_cli-0.0.16.dist-info/RECORD,,
142
+ altimate_datapilot_cli-0.0.17.dist-info/AUTHORS.rst,sha256=S4H4zw_v3GVyz5_55jF5Gf_YNG3s5Y0VgbQaEov9PFk,50
143
+ altimate_datapilot_cli-0.0.17.dist-info/LICENSE,sha256=Mf7VqpsmU2QR5_s2Cb_ZeeMB2Q9KW7YXJENZPFZRK1k,1100
144
+ altimate_datapilot_cli-0.0.17.dist-info/METADATA,sha256=TTbwpdqhNYT67BniF6Fkdu6KbJ_7EURNhasQPsVE5tg,2382
145
+ altimate_datapilot_cli-0.0.17.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
146
+ altimate_datapilot_cli-0.0.17.dist-info/entry_points.txt,sha256=0zwgKxN40RLVB5jSmlJz7IH_FBqRtpFdbrdZn-xuQIY,141
147
+ altimate_datapilot_cli-0.0.17.dist-info/top_level.txt,sha256=gAOFOdwB00vcxv74y4M1J-nQtPvEatU8-mYViEBcToo,10
148
+ altimate_datapilot_cli-0.0.17.dist-info/RECORD,,
datapilot/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.0.16"
1
+ __version__ = "0.0.17"
@@ -104,3 +104,9 @@ class APIClient:
104
104
  "check_names": check_names,
105
105
  }
106
106
  return self.post(endpoint, data=data)
107
+
108
+ def get_all_dbt_configs(self):
109
+ """Get all DBT configs with a page size of 100."""
110
+ endpoint = "/dbtconfig/"
111
+ params = {"size": 100}
112
+ return self.get(endpoint, params=params)
@@ -124,3 +124,13 @@ def run_project_governance_llm_checks(
124
124
  ):
125
125
  api_client = APIClient(api_token=api_token, base_url=backend_url, tenant=tenant)
126
126
  return api_client.run_project_governance_llm_checks(manifest, catalog, check_names)
127
+
128
+
129
+ def get_all_dbt_configs(
130
+ api_token,
131
+ tenant,
132
+ backend_url,
133
+ ):
134
+ """Get all DBT configs from the API."""
135
+ api_client = APIClient(api_token=api_token, base_url=backend_url, tenant=tenant)
136
+ return api_client.get_all_dbt_configs()
@@ -3,6 +3,7 @@ import logging
3
3
  import click
4
4
 
5
5
  from datapilot.clients.altimate.utils import check_token_and_instance
6
+ from datapilot.clients.altimate.utils import get_all_dbt_configs
6
7
  from datapilot.clients.altimate.utils import onboard_file
7
8
  from datapilot.clients.altimate.utils import start_dbt_ingestion
8
9
  from datapilot.clients.altimate.utils import validate_credentials
@@ -45,6 +46,11 @@ def dbt():
45
46
  required=False,
46
47
  help="Path to the DBT config file",
47
48
  )
49
+ @click.option(
50
+ "--config-name",
51
+ required=False,
52
+ help="Name of the DBT config to use from the API",
53
+ )
48
54
  @click.option(
49
55
  "--select",
50
56
  required=False,
@@ -53,7 +59,14 @@ def dbt():
53
59
  )
54
60
  @click.option("--backend-url", required=False, help="Altimate's Backend URL", default="https://api.myaltimate.com")
55
61
  def project_health(
56
- token, instance_name, manifest_path, catalog_path, config_path=None, select=None, backend_url="https://api.myaltimate.com"
62
+ token,
63
+ instance_name,
64
+ manifest_path,
65
+ catalog_path,
66
+ config_path=None,
67
+ config_name=None,
68
+ select=None,
69
+ backend_url="https://api.myaltimate.com",
57
70
  ):
58
71
  """
59
72
  Validate the DBT project's configuration and structure.
@@ -62,6 +75,23 @@ def project_health(
62
75
  config = None
63
76
  if config_path:
64
77
  config = load_config(config_path)
78
+ elif config_name and token and instance_name:
79
+ # Get configs from API
80
+ configs = get_all_dbt_configs(token, instance_name, backend_url)
81
+ if configs and "items" in configs:
82
+ # Find config by name
83
+ matching_configs = [c for c in configs["items"] if c["name"] == config_name]
84
+ if matching_configs:
85
+ # Get the config directly from the API response
86
+ click.echo(f"Using config: {config_name}")
87
+ config = matching_configs[0].get("config", {})
88
+ else:
89
+ click.echo(f"No config found with name: {config_name}")
90
+ return
91
+ else:
92
+ click.echo("Failed to fetch configs from API")
93
+ return
94
+
65
95
  selected_models = []
66
96
  if select:
67
97
  selected_models = select.split(" ")
@@ -116,7 +116,7 @@ class ManifestV10Wrapper(BaseManifestWrapper):
116
116
  contract=contract,
117
117
  meta=node.meta,
118
118
  patch_path=node.patch_path,
119
- access=node.access.value,
119
+ access=getattr(node.access, "value", None) if hasattr(node, "access") and node.access is not None else None,
120
120
  )
121
121
 
122
122
  def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode:
@@ -116,7 +116,7 @@ class ManifestV11Wrapper(BaseManifestWrapper):
116
116
  contract=contract,
117
117
  meta=node.meta,
118
118
  patch_path=node.patch_path,
119
- access=node.access.value,
119
+ access=getattr(node.access, "value", None) if hasattr(node, "access") and node.access is not None else None,
120
120
  )
121
121
 
122
122
  def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode:
@@ -116,7 +116,7 @@ class ManifestV12Wrapper(BaseManifestWrapper):
116
116
  contract=contract,
117
117
  meta=node.meta,
118
118
  patch_path=node.patch_path,
119
- access=node.access.value,
119
+ access=getattr(node.access, "value", None) if hasattr(node, "access") and node.access is not None else None,
120
120
  )
121
121
 
122
122
  def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode: