dasl-client 1.0.9__tar.gz → 1.0.11__tar.gz

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.

Potentially problematic release.


This version of dasl-client might be problematic. Click here for more details.

Files changed (38) hide show
  1. {dasl_client-1.0.9 → dasl_client-1.0.11}/PKG-INFO +2 -2
  2. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/auth/auth.py +6 -5
  3. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/client.py +35 -1
  4. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/__init__.py +1 -0
  5. dasl_client-1.0.11/dasl_client/types/content.py +235 -0
  6. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/workspace_config.py +4 -0
  7. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client.egg-info/PKG-INFO +2 -2
  8. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client.egg-info/SOURCES.txt +1 -0
  9. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client.egg-info/requires.txt +1 -1
  10. {dasl_client-1.0.9 → dasl_client-1.0.11}/pyproject.toml +2 -2
  11. {dasl_client-1.0.9 → dasl_client-1.0.11}/LICENSE +0 -0
  12. {dasl_client-1.0.9 → dasl_client-1.0.11}/README.md +0 -0
  13. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/__init__.py +0 -0
  14. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/auth/__init__.py +0 -0
  15. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/conn/__init__.py +0 -0
  16. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/conn/client_identifier.py +0 -0
  17. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/conn/conn.py +0 -0
  18. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/errors/__init__.py +0 -0
  19. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/errors/errors.py +0 -0
  20. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/helpers.py +0 -0
  21. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/preset_development/__init__.py +0 -0
  22. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/preset_development/errors.py +0 -0
  23. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/preset_development/preview_engine.py +0 -0
  24. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/preset_development/preview_parameters.py +0 -0
  25. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/preset_development/stage.py +0 -0
  26. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/admin_config.py +0 -0
  27. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/datasource.py +0 -0
  28. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/dbui.py +0 -0
  29. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/helpers.py +0 -0
  30. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/rule.py +0 -0
  31. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client/types/types.py +0 -0
  32. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client.egg-info/dependency_links.txt +0 -0
  33. {dasl_client-1.0.9 → dasl_client-1.0.11}/dasl_client.egg-info/top_level.txt +0 -0
  34. {dasl_client-1.0.9 → dasl_client-1.0.11}/setup.cfg +0 -0
  35. {dasl_client-1.0.9 → dasl_client-1.0.11}/setup.py +0 -0
  36. {dasl_client-1.0.9 → dasl_client-1.0.11}/test/test_api_changes.py +0 -0
  37. {dasl_client-1.0.9 → dasl_client-1.0.11}/test/test_api_surface.py +0 -0
  38. {dasl_client-1.0.9 → dasl_client-1.0.11}/test/test_marshaling.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dasl_client
3
- Version: 1.0.9
3
+ Version: 1.0.11
4
4
  Summary: The DASL client library used for interacting with the DASL workspace
5
5
  Home-page: https://github.com/antimatter/asl
6
6
  Author: Antimatter Team
@@ -8,7 +8,7 @@ Author-email: Antimatter Team <support@antimatter.io>
8
8
  Requires-Python: >=3.8
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: dasl_api==0.1.12
11
+ Requires-Dist: dasl_api==0.1.14
12
12
  Requires-Dist: databricks-sdk>=0.41.0
13
13
  Requires-Dist: pydantic>=2
14
14
  Requires-Dist: typing_extensions==4.10.0
@@ -1,4 +1,5 @@
1
1
  import abc
2
+ import base64
2
3
  import time
3
4
  from datetime import datetime
4
5
 
@@ -176,15 +177,15 @@ class DatabricksSecretAuth(Authorization):
176
177
  principalName=self._principal,
177
178
  )
178
179
  handler = api.WorkspaceV1Api(api_client=self._client)
179
- resp = handler.workspace_v1_begin_authentication(
180
- workspace=self._workspace, workspace_v1_begin_authenticate_request=req
180
+ resp = handler.workspace_v1_request_secret(
181
+ workspace=self._workspace, workspace_v1_request_secret_request=req
181
182
  )
182
183
  secret_name = resp.secret_name
183
184
  secret_value = ""
184
185
  for tries in range(3):
185
186
  try:
186
- secret_value = WorkspaceClient().secrets.get_secret(
187
- secret_name, "token"
187
+ secret_value = (
188
+ WorkspaceClient().secrets.get_secret(secret_name, "token").value
188
189
  )
189
190
  break
190
191
  except ResourceDoesNotExist:
@@ -194,7 +195,7 @@ class DatabricksSecretAuth(Authorization):
194
195
  raise RuntimeError(f"failed to complete secret auth")
195
196
 
196
197
  req = WorkspaceV1AuthenticateRequest(
197
- databricks_secret=secret_value,
198
+ databricks_secret=base64.b64decode(secret_value).decode("utf-8"),
198
199
  )
199
200
  handler = api.WorkspaceV1Api(api_client=self._client)
200
201
 
@@ -3,8 +3,8 @@ from typing import Any, Callable, Iterator, List, Optional, TypeVar
3
3
 
4
4
  from dasl_api import (
5
5
  CoreV1Api,
6
- CoreV1DataSourceAutoloaderSpec,
7
6
  DbuiV1Api,
7
+ ContentV1Api,
8
8
  WorkspaceV1Api,
9
9
  WorkspaceV1CreateWorkspaceRequest,
10
10
  api,
@@ -13,6 +13,7 @@ from pydantic import Field
13
13
 
14
14
  from dasl_client.auth.auth import (
15
15
  Authorization,
16
+ DatabricksSecretAuth,
16
17
  DatabricksTokenAuth,
17
18
  ServiceAccountKeyAuth,
18
19
  )
@@ -29,6 +30,8 @@ from .types import (
29
30
  WorkspaceConfig,
30
31
  TransformRequest,
31
32
  TransformResponse,
33
+ DataSourcePresetsList,
34
+ DataSourcePreset,
32
35
  )
33
36
 
34
37
 
@@ -229,6 +232,9 @@ class Client:
229
232
  def _dbui_client(self) -> DbuiV1Api:
230
233
  return DbuiV1Api(self.auth.client())
231
234
 
235
+ def _content_client(self) -> ContentV1Api:
236
+ return ContentV1Api(self.auth.client())
237
+
232
238
  def _workspace(self) -> str:
233
239
  return self.auth.workspace()
234
240
 
@@ -616,3 +622,31 @@ class Client:
616
622
  limit=limit,
617
623
  )
618
624
  )
625
+
626
+ def list_presets(self) -> DataSourcePresetsList:
627
+ """
628
+ List the Presets in this workspace. This will include any user defined
629
+ presets if a custom presets path has been configured in the workspace.
630
+
631
+ :returns: DataSourcePresetsList
632
+ """
633
+ with error_handler():
634
+ return DataSourcePresetsList.from_api_obj(
635
+ self._content_client().content_v1_get_preset_data_sources(
636
+ self._workspace(),
637
+ )
638
+ )
639
+
640
+ def get_preset(self, name: str) -> DataSourcePreset:
641
+ """
642
+ Get the preset with the argument name from the DASL server. If the preset name
643
+ begins with 'internal_' it will instead be collected from the user catalog,
644
+ provided a preset path is set in the workspace config.
645
+
646
+ :param name: The unique name of the DataSource preset within this workspace.
647
+ :returns: DataSourcePreset
648
+ """
649
+ with error_handler():
650
+ return DataSourcePreset.from_api_obj(
651
+ self._content_client().content_v1_get_preset_datasource(self._workspace(), name)
652
+ )
@@ -4,3 +4,4 @@ from .workspace_config import *
4
4
  from .datasource import *
5
5
  from .rule import *
6
6
  from .dbui import *
7
+ from .content import *
@@ -0,0 +1,235 @@
1
+ from typing import Optional, List, Dict
2
+ from pydantic import BaseModel
3
+
4
+ from dasl_api import (
5
+ ContentV1PresetDataSourceList, ContentV1PresetDataSourceListItemsInner, ContentV1DatasourcePresetAutoloader,
6
+ ContentV1DatasourcePresetSilver, ContentV1DatasourcePresetSilverPreTransformInner,
7
+ ContentV1DatasourcePresetSilverTransformInner, ContentV1DatasourcePresetGoldInner, ContentV1DatasourcePreset,
8
+ ContentV1DatasourcePresetAutoloaderCloudFiles,
9
+ )
10
+
11
+ from .datasource import DataSource, FieldSpec, FieldUtils
12
+ from .helpers import Helpers
13
+
14
+
15
+ class SilverPreset(BaseModel):
16
+ class PreTransform(BaseModel):
17
+ name: Optional[str] = None
18
+ filter: Optional[str] = None
19
+ post_filter: Optional[str] = None
20
+ fields: Optional[List[Optional[FieldSpec]]] = None
21
+ utils: Optional[FieldUtils] = None
22
+
23
+ @staticmethod
24
+ def from_api_obj(
25
+ obj: Optional[ContentV1DatasourcePresetSilverPreTransformInner],
26
+ ) -> Optional["SilverPreset.PreTransform"]:
27
+ if obj is None:
28
+ return None
29
+ if obj.fields is not None:
30
+ fields = [FieldSpec.from_api_obj(item) for item in obj.fields]
31
+ else:
32
+ fields = None
33
+
34
+ return SilverPreset.PreTransform(
35
+ name=obj.name,
36
+ filter=obj.filter,
37
+ post_filter=obj.post_filter,
38
+ fields=fields,
39
+ utils=FieldUtils.from_api_obj(obj.utils),
40
+ )
41
+
42
+ class Transform(BaseModel):
43
+ name: Optional[str] = None
44
+ filter: Optional[str] = None
45
+ post_filter: Optional[str] = None
46
+ fields: Optional[List[Optional[FieldSpec]]] = None
47
+ utils: Optional[FieldUtils] = None
48
+
49
+ @staticmethod
50
+ def from_api_obj(
51
+ obj: Optional[ContentV1DatasourcePresetSilverTransformInner],
52
+ ) -> Optional["SilverPreset.Transform"]:
53
+ if obj is None:
54
+ return None
55
+ if obj.fields is not None:
56
+ fields = [FieldSpec.from_api_obj(item) for item in obj.fields]
57
+ else:
58
+ fields = None
59
+
60
+ return SilverPreset.Transform(
61
+ name=obj.name,
62
+ filter=obj.filter,
63
+ post_filter=obj.post_filter,
64
+ fields=fields,
65
+ utils=FieldUtils.from_api_obj(obj.utils),
66
+ )
67
+
68
+ pre_transform: Optional[List[PreTransform]] = None
69
+ transform: Optional[List[Transform]] = None
70
+
71
+ @staticmethod
72
+ def from_api_obj(
73
+ obj: Optional[ContentV1DatasourcePresetSilver],
74
+ ) -> Optional["SilverPreset"]:
75
+ if obj is None:
76
+ return None
77
+
78
+ if obj.pre_transform is not None:
79
+ pre_transform = [SilverPreset.PreTransform.from_api_obj(item) for item in obj.pre_transform]
80
+ else:
81
+ pre_transform = None
82
+
83
+ if obj.transform is not None:
84
+ transform = [SilverPreset.Transform.from_api_obj(item) for item in obj.transform]
85
+ else:
86
+ transform = None
87
+
88
+
89
+ return SilverPreset(
90
+ pre_transform=pre_transform,
91
+ transform=transform,
92
+ )
93
+
94
+
95
+ class GoldPreset(BaseModel):
96
+ name: str
97
+ input: str
98
+ filter: Optional[str] = None
99
+ post_filter: Optional[str] = None
100
+ fields: Optional[List[Optional[FieldSpec]]] = None
101
+ utils: Optional[FieldUtils] = None
102
+
103
+ @staticmethod
104
+ def from_api_obj(
105
+ obj: Optional[ContentV1DatasourcePresetGoldInner],
106
+ ) -> Optional["GoldPreset"]:
107
+ if obj is None:
108
+ return None
109
+ if obj.fields is not None:
110
+ fields = [FieldSpec.from_api_obj(item) for item in obj.fields]
111
+ else:
112
+ fields = None
113
+
114
+ return GoldPreset(
115
+ name=obj.name,
116
+ input=obj.input,
117
+ filter=obj.filter,
118
+ post_filter=obj.post_filter,
119
+ fields=fields,
120
+ utils=FieldUtils.from_api_obj(obj.utils),
121
+ )
122
+
123
+
124
+ class PresetCloudFiles(BaseModel):
125
+ schema_hints_file: Optional[str] = None
126
+ schema_hints: Optional[str] = None
127
+
128
+ @staticmethod
129
+ def from_api_obj(
130
+ obj: Optional[ContentV1DatasourcePresetAutoloaderCloudFiles],
131
+ ) -> Optional["PresetCloudFiles"]:
132
+ if obj is None:
133
+ return None
134
+
135
+ return PresetCloudFiles(
136
+ schema_hints_file=obj.schema_hints_file,
137
+ schema_hints=obj.schema_hints,
138
+ )
139
+
140
+
141
+ class PresetAutoloader(BaseModel):
142
+ format: str
143
+ schema_file: Optional[str] = None
144
+ var_schema: Optional[str] = None
145
+ cloud_files: Optional[PresetCloudFiles] = None
146
+
147
+ @staticmethod
148
+ def from_api_obj(
149
+ obj: Optional[ContentV1DatasourcePresetAutoloader],
150
+ ) -> Optional["PresetAutoloader"]:
151
+ if obj is None:
152
+ return None
153
+
154
+ return PresetAutoloader(
155
+ format=obj.format,
156
+ schema_file=obj.schema_file,
157
+ var_schema=obj.var_schema,
158
+ cloud_files=PresetCloudFiles.from_api_obj(obj.cloud_files),
159
+ )
160
+
161
+ class DataSourcePreset(BaseModel):
162
+
163
+ name: Optional[str] = None
164
+ author: Optional[str] = None
165
+ description: Optional[str] = None
166
+ autoloader: Optional[PresetAutoloader] = None
167
+ silver: Optional[SilverPreset] = None
168
+ gold: Optional[List[GoldPreset]] = None
169
+
170
+ @staticmethod
171
+ def from_api_obj(
172
+ obj: Optional[ContentV1DatasourcePreset],
173
+ ) -> Optional["DataSourcePreset"]:
174
+ if obj is None:
175
+ return None
176
+
177
+ return DataSourcePreset(
178
+ name=obj.name,
179
+ author=obj.author,
180
+ description=obj.description,
181
+ autoloader=PresetAutoloader.from_api_obj(obj.autoloader),
182
+ silver=SilverPreset.from_api_obj(obj.silver),
183
+ gold=[GoldPreset.from_api_obj(item) for item in obj.gold],
184
+ )
185
+
186
+
187
+ class DataSourcePresetSummary(BaseModel):
188
+ name: Optional[str] = None
189
+ source: Optional[str] = None
190
+ source_type: Optional[str] = None
191
+ description: Optional[str] = None
192
+ title: Optional[str] = None
193
+ author: Optional[str] = None
194
+ icon_url: Optional[str] = None
195
+
196
+ @staticmethod
197
+ def from_api_obj(
198
+ obj: Optional[ContentV1PresetDataSourceListItemsInner],
199
+ ) -> Optional["DataSourcePresetSummary"]:
200
+ if obj is None:
201
+ return None
202
+
203
+ return DataSourcePresetSummary(
204
+ name=obj.name,
205
+ source=obj.source,
206
+ source_type=obj.source_type,
207
+ description=obj.description,
208
+ title=obj.title,
209
+ author=obj.author,
210
+ icon_url=obj.icon_url,
211
+ )
212
+
213
+ class DataSourcePresetsList(BaseModel):
214
+ kind: Optional[str] = None
215
+ cursor: Optional[str] = None
216
+ items: List["DataSourcePresetSummary"] = []
217
+
218
+ @staticmethod
219
+ def from_api_obj(
220
+ obj: Optional[ContentV1PresetDataSourceList],
221
+ ) -> Optional["DataSourcePresetsList"]:
222
+ if obj is None:
223
+ return None
224
+ cursor = None
225
+ if obj.metadata is not None:
226
+ cursor = obj.metadata.cursor
227
+
228
+ return DataSourcePresetsList(
229
+ kind=obj.kind,
230
+ cursor=cursor,
231
+ items=[
232
+ DataSourcePresetSummary.from_api_obj(item)
233
+ for item in obj.items
234
+ ],
235
+ )
@@ -576,6 +576,8 @@ class WorkspaceConfig(BaseModel):
576
576
  dasl_storage_path (Optional[str]):
577
577
  The path to a directory where DASL can store internal files and
578
578
  state.
579
+ dasl_custom_presets_path (Optional[str]):
580
+ An optional path to a directory containing user defined presets.
579
581
  default_config (Optional[DefaultConfig]):
580
582
  Configuration settings regarding storage of bronze, silver, and
581
583
  gold tables and related assets for each resource type.
@@ -594,6 +596,7 @@ class WorkspaceConfig(BaseModel):
594
596
  operational_alert_export: Optional[ExportConfig] = None
595
597
  observables: Optional[WorkspaceConfigObservables] = None
596
598
  dasl_storage_path: Optional[str] = None
599
+ dasl_custom_presets_path: Optional[str] = None
597
600
  default_config: Optional[DefaultConfig] = None
598
601
  managed_retention: Optional[List[ManagedRetention]] = None
599
602
  status: Optional[ResourceStatus] = None
@@ -623,6 +626,7 @@ class WorkspaceConfig(BaseModel):
623
626
  ),
624
627
  observables=WorkspaceConfigObservables.from_api_obj(spec.observables),
625
628
  dasl_storage_path=spec.dasl_storage_path,
629
+ dasl_custom_presets_path=spec.dasl_custom_presets_path,
626
630
  default_config=DefaultConfig.from_api_obj(spec.default_config),
627
631
  managed_retention=managed_retention,
628
632
  status=ResourceStatus.from_api_obj(obj.status),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dasl_client
3
- Version: 1.0.9
3
+ Version: 1.0.11
4
4
  Summary: The DASL client library used for interacting with the DASL workspace
5
5
  Home-page: https://github.com/antimatter/asl
6
6
  Author: Antimatter Team
@@ -8,7 +8,7 @@ Author-email: Antimatter Team <support@antimatter.io>
8
8
  Requires-Python: >=3.8
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: dasl_api==0.1.12
11
+ Requires-Dist: dasl_api==0.1.14
12
12
  Requires-Dist: databricks-sdk>=0.41.0
13
13
  Requires-Dist: pydantic>=2
14
14
  Requires-Dist: typing_extensions==4.10.0
@@ -24,6 +24,7 @@ dasl_client/preset_development/preview_parameters.py
24
24
  dasl_client/preset_development/stage.py
25
25
  dasl_client/types/__init__.py
26
26
  dasl_client/types/admin_config.py
27
+ dasl_client/types/content.py
27
28
  dasl_client/types/datasource.py
28
29
  dasl_client/types/dbui.py
29
30
  dasl_client/types/helpers.py
@@ -1,4 +1,4 @@
1
- dasl_api==0.1.12
1
+ dasl_api==0.1.14
2
2
  databricks-sdk>=0.41.0
3
3
  pydantic>=2
4
4
  typing_extensions==4.10.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dasl_client"
7
- version = "1.0.9"
7
+ version = "1.0.11"
8
8
  description = "The DASL client library used for interacting with the DASL workspace"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -13,7 +13,7 @@ authors = [
13
13
  requires-python = ">=3.8"
14
14
 
15
15
  dependencies = [
16
- "dasl_api==0.1.12",
16
+ "dasl_api==0.1.14",
17
17
  "databricks-sdk>=0.41.0",
18
18
  "pydantic>=2",
19
19
  "typing_extensions==4.10.0"
File without changes
File without changes
File without changes
File without changes