altimate-datapilot-cli 0.0.15__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.15
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,12 +1,11 @@
1
- datapilot/__init__.py,sha256=go20U3RCVaJ2N55RnX4tO5rinfUCRV0puFyrHCto8yw,23
1
+ datapilot/__init__.py,sha256=WlMBNrzKywm5RAbqEVgEgcG7Opc4cf3-wpAnO8PdoEI,23
2
2
  datapilot/__main__.py,sha256=I9USmeNnK-cAHb6LZfydJC0LeNSE8enieeY55wpR6uw,380
3
- datapilot/constants.py,sha256=h0gfZ8qVyTEi0k7NFOQyH4Z1cPU2zb2W7GsoXASgpxg,112
4
3
  datapilot/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
4
  datapilot/cli/main.py,sha256=VSdqlkCiu8GSG9qQh8q0BzyocsQc4lKWxZAPEsjXF18,181
6
5
  datapilot/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
6
  datapilot/clients/altimate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- datapilot/clients/altimate/client.py,sha256=lLIb9wu--5Rk3qpgnmqeyHlWiPmiTIE-nyMXdWodQ5I,3875
9
- 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
10
9
  datapilot/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
10
  datapilot/config/config.py,sha256=kyj53Qsb85V4iGQsX0vSwULOjscMOSFrJDJ3tnagJpo,403
12
11
  datapilot/config/utils.py,sha256=DIAVX-OZ5Lc0Ky_A7dvdbPcD1QSg2DRxZcuaIIZ2rhw,1146
@@ -31,7 +30,7 @@ datapilot/core/platforms/dbt/factory.py,sha256=YIQtb-FQQAJsifJ3KiLjjk0WIKTHtEPTN
31
30
  datapilot/core/platforms/dbt/formatting.py,sha256=bpfa7XmVghTq4WnGDGYC6DruwOwH8YmjFHghoo5cPD8,1638
32
31
  datapilot/core/platforms/dbt/utils.py,sha256=ozFHprR6LTLXQdrGyaRoyIBTua4P1NkP8T7LGgN-9c0,18577
33
32
  datapilot/core/platforms/dbt/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- datapilot/core/platforms/dbt/cli/cli.py,sha256=1phfriG4f5pS1UFwBcZ0uM49iovVpnjdama9lSYcKMU,6266
33
+ datapilot/core/platforms/dbt/cli/cli.py,sha256=ZrTneNStGtwbH2zDavDItR-ZbLSQomJYkpcMyEcU9Rc,7236
35
34
  datapilot/core/platforms/dbt/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
35
  datapilot/core/platforms/dbt/hooks/executor_hook.py,sha256=gSM50vAO7C-f1rdnHogWbqc87aCXPXysZepjp5L2qzw,2966
37
36
  datapilot/core/platforms/dbt/insights/__init__.py,sha256=hk7BAzCTDkY8WNV6L0v-CPn9mrsDyJJusoQxNxGyzAY,7634
@@ -110,8 +109,8 @@ datapilot/core/platforms/dbt/insights/structure/model_naming_conventions.py,sha2
110
109
  datapilot/core/platforms/dbt/insights/structure/source_directories_structure.py,sha256=K-xTjYltuzcHH51s6PbFYcrnqpSCYluTbrzW1JT_vIU,3675
111
110
  datapilot/core/platforms/dbt/insights/structure/test_directory_structure.py,sha256=XL6YQgWmf397W2OwBmT7L8zUN93M1bOZBTp4PlngqlI,3484
112
111
  datapilot/core/platforms/dbt/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
- datapilot/core/platforms/dbt/schemas/catalog.py,sha256=t8qDw2QTI6e3TMeVt_apw9L-WAe8JyPyZS6nf61m4rc,2023
114
- datapilot/core/platforms/dbt/schemas/manifest.py,sha256=zBr6-NgpKx06hQnw5yHmBwR0lOl2L8zyNISvN-eWD6g,14401
112
+ datapilot/core/platforms/dbt/schemas/catalog.py,sha256=ZM8LNWmiOyOdkc797NpiceSaYEL47gd6k3lNajz79c8,1556
113
+ datapilot/core/platforms/dbt/schemas/manifest.py,sha256=vKBRai03D2JdzcO9x2e4aktbH2uIukEXh8lihU14yV4,13543
115
114
  datapilot/core/platforms/dbt/wrappers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
115
  datapilot/core/platforms/dbt/wrappers/catalog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
116
  datapilot/core/platforms/dbt/wrappers/catalog/wrapper.py,sha256=LDjt4pSiqGAmvI5DSPzEubwq13N1MKv9xakLNhG-BWY,196
@@ -121,13 +120,13 @@ datapilot/core/platforms/dbt/wrappers/manifest/__init__.py,sha256=47DEQpj8HBSa-_
121
120
  datapilot/core/platforms/dbt/wrappers/manifest/wrapper.py,sha256=Q9DG-OEyJAa4ePoVhxG78pehfNotNc9A3xtz171fLhU,1189
122
121
  datapilot/core/platforms/dbt/wrappers/manifest/v10/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
122
  datapilot/core/platforms/dbt/wrappers/manifest/v10/schemas.py,sha256=VxqIFQbAL88ObQW1E8wPpiuooCdawdACJUFhgAYBxmo,1523
124
- 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
125
124
  datapilot/core/platforms/dbt/wrappers/manifest/v11/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
125
  datapilot/core/platforms/dbt/wrappers/manifest/v11/schemas.py,sha256=Mb0N48czcwQTz5mxQx2QlVINzz50A5FUm0kMJ-Nzs6A,1523
127
- 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
128
127
  datapilot/core/platforms/dbt/wrappers/manifest/v12/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
128
  datapilot/core/platforms/dbt/wrappers/manifest/v12/schemas.py,sha256=2rMEQ_BCcjiibfrlDKwgCE8vFX_6BzSInpilpVTWrNE,1269
130
- 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
131
130
  datapilot/core/platforms/dbt/wrappers/run_results/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
131
  datapilot/core/platforms/dbt/wrappers/run_results/run_results.py,sha256=3E_y1gAF491WmXt-Z_Fqhr5BU-kVnzjHpZZv5UpOx-s,1267
133
132
  datapilot/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -140,10 +139,10 @@ datapilot/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
139
  datapilot/utils/utils.py,sha256=MY8q6ZBJ0hkrTuH7gWMxAlEAQGrajXFMabEhtGtT7sc,11524
141
140
  datapilot/utils/formatting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
141
  datapilot/utils/formatting/utils.py,sha256=rAVmIYuldvw9VvCSwG2kMTEgiT7cEconp_F1sAWVyCo,1377
143
- altimate_datapilot_cli-0.0.15.dist-info/AUTHORS.rst,sha256=S4H4zw_v3GVyz5_55jF5Gf_YNG3s5Y0VgbQaEov9PFk,50
144
- altimate_datapilot_cli-0.0.15.dist-info/LICENSE,sha256=Mf7VqpsmU2QR5_s2Cb_ZeeMB2Q9KW7YXJENZPFZRK1k,1100
145
- altimate_datapilot_cli-0.0.15.dist-info/METADATA,sha256=WKXEoLY1k78gtF1S4mw3IYJZUu2Butum_gkDHf_n0dI,2382
146
- altimate_datapilot_cli-0.0.15.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
147
- altimate_datapilot_cli-0.0.15.dist-info/entry_points.txt,sha256=0zwgKxN40RLVB5jSmlJz7IH_FBqRtpFdbrdZn-xuQIY,141
148
- altimate_datapilot_cli-0.0.15.dist-info/top_level.txt,sha256=gAOFOdwB00vcxv74y4M1J-nQtPvEatU8-mYViEBcToo,10
149
- altimate_datapilot_cli-0.0.15.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.15"
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(" ")
@@ -5,17 +5,10 @@ from typing import List
5
5
  from typing import Optional
6
6
  from typing import Union
7
7
 
8
- from pydantic import ConfigDict
9
8
  from pydantic.main import BaseModel
10
9
 
11
- from datapilot.constants import Extra
12
-
13
10
 
14
11
  class AltimateCatalogMetadata(BaseModel):
15
- model_config = ConfigDict(
16
- extra=Extra.forbid,
17
- )
18
-
19
12
  dbt_schema_version: Optional[str] = "https://schemas.getdbt.com/dbt/catalog/v1.json"
20
13
  dbt_version: Optional[str] = "0.19.0"
21
14
  generated_at: Optional[datetime] = "2021-02-10T04:42:33.680487Z"
@@ -24,10 +17,6 @@ class AltimateCatalogMetadata(BaseModel):
24
17
 
25
18
 
26
19
  class AltimateCatalogTableMetadata(BaseModel):
27
- model_config = ConfigDict(
28
- extra=Extra.forbid,
29
- )
30
-
31
20
  type: str
32
21
  database: Optional[Optional[str]] = None
33
22
  schema_name: str
@@ -37,10 +26,6 @@ class AltimateCatalogTableMetadata(BaseModel):
37
26
 
38
27
 
39
28
  class AltimateCatalogColumnMetadata(BaseModel):
40
- model_config = ConfigDict(
41
- extra=Extra.forbid,
42
- )
43
-
44
29
  type: str
45
30
  comment: Optional[Optional[str]] = None
46
31
  index: int
@@ -48,10 +33,6 @@ class AltimateCatalogColumnMetadata(BaseModel):
48
33
 
49
34
 
50
35
  class AltimateCatalogStatsItem(BaseModel):
51
- model_config = ConfigDict(
52
- extra=Extra.forbid,
53
- )
54
-
55
36
  id: str
56
37
  label: str
57
38
  value: Optional[Optional[Union[bool, str, float]]] = None
@@ -60,10 +41,6 @@ class AltimateCatalogStatsItem(BaseModel):
60
41
 
61
42
 
62
43
  class AltimateCatalogTable(BaseModel):
63
- model_config = ConfigDict(
64
- extra=Extra.forbid,
65
- )
66
-
67
44
  metadata: AltimateCatalogTableMetadata
68
45
  columns: Dict[str, AltimateCatalogColumnMetadata]
69
46
  stats: Dict[str, AltimateCatalogStatsItem]
@@ -71,10 +48,6 @@ class AltimateCatalogTable(BaseModel):
71
48
 
72
49
 
73
50
  class AltimateCatalogCatalogV1(BaseModel):
74
- model_config = ConfigDict(
75
- extra=Extra.forbid,
76
- )
77
-
78
51
  metadata: AltimateCatalogMetadata
79
52
  nodes: Dict[str, AltimateCatalogTable]
80
53
  sources: Dict[str, AltimateCatalogTable]
@@ -19,9 +19,6 @@ from dbt_artifacts_parser.parsers.manifest.manifest_v10 import ManifestV10
19
19
  from dbt_artifacts_parser.parsers.manifest.manifest_v11 import ManifestV11
20
20
  from dbt_artifacts_parser.parsers.manifest.manifest_v11 import SupportedLanguage
21
21
  from pydantic import BaseModel
22
- from pydantic import ConfigDict
23
-
24
- from datapilot.constants import Extra
25
22
 
26
23
 
27
24
  class DBTVersion(BaseModel):
@@ -48,10 +45,6 @@ Catalog = CatalogV1
48
45
 
49
46
 
50
47
  class AltimateDocs(BaseModel):
51
- model_config = ConfigDict(
52
- extra=Extra.forbid,
53
- )
54
-
55
48
  show: Optional[bool] = True
56
49
  node_color: Optional[Optional[str]] = None
57
50
 
@@ -101,20 +94,12 @@ class AltimateAccess(Enum):
101
94
 
102
95
 
103
96
  class AltimateDBTContract(BaseModel):
104
- model_config = ConfigDict(
105
- extra=Extra.forbid,
106
- )
107
-
108
97
  enforced: Optional[bool] = False
109
98
  alias_types: Optional[bool] = True
110
99
  checksum: Optional[Optional[str]] = None
111
100
 
112
101
 
113
102
  class AltimateHook(BaseModel):
114
- model_config = ConfigDict(
115
- extra=Extra.forbid,
116
- )
117
-
118
103
  sql: str
119
104
  transaction: Optional[bool] = True
120
105
  index: Optional[Optional[int]] = None
@@ -122,10 +107,6 @@ class AltimateHook(BaseModel):
122
107
 
123
108
  # TODO: Need to add the rest of the fields
124
109
  class AltimateNodeConfig(BaseModel):
125
- model_config = ConfigDict(
126
- extra=Extra.allow,
127
- )
128
-
129
110
  _extra: Optional[Dict[str, Any]] = None
130
111
  enabled: Optional[bool] = True
131
112
  alias: Optional[Optional[str]] = None
@@ -209,10 +190,6 @@ class AltimateSourceConfig(BaseModel):
209
190
 
210
191
 
211
192
  class AltimateDeferRelation(BaseModel):
212
- model_config = ConfigDict(
213
- extra=Extra.forbid,
214
- )
215
-
216
193
  database: Optional[str]
217
194
  schema_name: str
218
195
  alias: str
@@ -220,10 +197,6 @@ class AltimateDeferRelation(BaseModel):
220
197
 
221
198
 
222
199
  class AltimateSeedConfig(BaseModel):
223
- model_config = ConfigDict(
224
- extra=Extra.allow,
225
- )
226
-
227
200
  _extra: Optional[Dict[str, Any]] = None
228
201
  enabled: Optional[bool] = True
229
202
  alias: Optional[Optional[str]] = None
@@ -322,10 +295,6 @@ class AltimateExposureType(Enum):
322
295
 
323
296
 
324
297
  class AltimateOwner(BaseModel):
325
- model_config = ConfigDict(
326
- extra=Extra.allow,
327
- )
328
-
329
298
  _extra: Optional[Dict[str, Any]] = None
330
299
  email: Optional[Optional[str]] = None
331
300
  name: Optional[Optional[str]] = None
@@ -338,20 +307,12 @@ class AltimateMaturityEnum(Enum):
338
307
 
339
308
 
340
309
  class AltimateRefArgs(BaseModel):
341
- model_config = ConfigDict(
342
- extra=Extra.forbid,
343
- )
344
-
345
310
  name: str
346
311
  package: Optional[Optional[str]] = None
347
312
  version: Optional[Optional[Union[str, float]]] = None
348
313
 
349
314
 
350
315
  class AltimateExposureConfig(BaseModel):
351
- model_config = ConfigDict(
352
- extra=Extra.allow,
353
- )
354
-
355
316
  _extra: Optional[Dict[str, Any]] = None
356
317
  enabled: Optional[bool] = True
357
318
 
@@ -382,20 +343,12 @@ class AltimateManifestExposureNode(BaseModel):
382
343
 
383
344
 
384
345
  class AltimateTestMetadata(BaseModel):
385
- model_config = ConfigDict(
386
- extra=Extra.forbid,
387
- )
388
-
389
346
  name: str
390
347
  kwargs: Optional[Dict[str, Any]] = None
391
348
  namespace: Optional[Optional[str]] = None
392
349
 
393
350
 
394
351
  class AltimateTestConfig(BaseModel):
395
- model_config = ConfigDict(
396
- extra=Extra.allow,
397
- )
398
-
399
352
  _extra: Optional[Dict[str, Any]] = None
400
353
  enabled: Optional[bool] = True
401
354
  alias: Optional[Optional[str]] = None
@@ -446,10 +399,6 @@ class AltimateManifestTestNode(BaseModel):
446
399
 
447
400
 
448
401
  class AltimateMacroArgument(BaseModel):
449
- model_config = ConfigDict(
450
- extra=Extra.forbid,
451
- )
452
-
453
402
  name: str
454
403
  type: Optional[Optional[str]] = None
455
404
  description: Optional[Optional[str]] = ""
@@ -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:
datapilot/constants.py DELETED
@@ -1,7 +0,0 @@
1
- from enum import Enum
2
-
3
-
4
- class Extra(str, Enum):
5
- allow = "allow"
6
- forbid = "forbid"
7
- ignore = "ignore"