dasl-client 1.0.18__tar.gz → 1.0.20__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.
- {dasl_client-1.0.18 → dasl_client-1.0.20}/PKG-INFO +1 -1
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/preset_development/preview_engine.py +31 -5
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/preset_development/stage.py +6 -1
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/content.py +0 -2
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/dbui.py +0 -5
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client.egg-info/PKG-INFO +1 -1
- {dasl_client-1.0.18 → dasl_client-1.0.20}/pyproject.toml +1 -1
- {dasl_client-1.0.18 → dasl_client-1.0.20}/test/test_api_surface.py +5 -2
- {dasl_client-1.0.18 → dasl_client-1.0.20}/test/test_marshaling.py +0 -2
- {dasl_client-1.0.18 → dasl_client-1.0.20}/LICENSE +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/README.md +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/__init__.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/auth/__init__.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/auth/auth.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/client.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/conn/__init__.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/conn/client_identifier.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/conn/conn.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/errors/__init__.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/errors/errors.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/helpers.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/preset_development/__init__.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/preset_development/errors.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/preset_development/preview_parameters.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/__init__.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/admin_config.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/datasource.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/helpers.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/rule.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/types.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/types/workspace_config.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client.egg-info/SOURCES.txt +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client.egg-info/dependency_links.txt +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client.egg-info/requires.txt +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client.egg-info/top_level.txt +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/setup.cfg +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/setup.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/test/__init__.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/test/conftest.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/test/constants.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/test/test_api_changes.py +0 -0
- {dasl_client-1.0.18 → dasl_client-1.0.20}/test/test_databricks_secret_auth.py +0 -0
|
@@ -175,6 +175,7 @@ class PreviewEngine:
|
|
|
175
175
|
self,
|
|
176
176
|
input_df: DataFrame,
|
|
177
177
|
stage_dataframes: Tuple[DataFrame, Dict[str, DataFrame], Dict[str, DataFrame]],
|
|
178
|
+
gold_table_catalog: str,
|
|
178
179
|
gold_table_schema: str,
|
|
179
180
|
) -> None:
|
|
180
181
|
"""
|
|
@@ -247,12 +248,13 @@ class PreviewEngine:
|
|
|
247
248
|
# NOTE: Name is stored as Gold_name/Silver_input. So we need to get just the Gold table
|
|
248
249
|
# name that we are comparing the dataframe metadata to.
|
|
249
250
|
name = name.split("/")[0]
|
|
251
|
+
fqn_gold_table_name = f"{self.force_apply_backticks(gold_table_catalog)}.{self.force_apply_backticks(gold_table_schema)}.{self.force_apply_backticks(name)}"
|
|
250
252
|
|
|
251
|
-
if not self._spark.catalog.tableExists(f"{
|
|
253
|
+
if not self._spark.catalog.tableExists(f"{fqn_gold_table_name}"):
|
|
252
254
|
raise UnknownGoldTableError(name, gold_table_schema)
|
|
253
255
|
|
|
254
256
|
# Performs the type check.
|
|
255
|
-
delta_df = self._spark.table(f"
|
|
257
|
+
delta_df = self._spark.table(f"{fqn_gold_table_name}").limit(0)
|
|
256
258
|
unioned_df = delta_df.unionByName(df, allowMissingColumns=True)
|
|
257
259
|
|
|
258
260
|
# Now we check no new columns.
|
|
@@ -293,6 +295,25 @@ class PreviewEngine:
|
|
|
293
295
|
d("Resultant gold table preview", 3)
|
|
294
296
|
display(unioned_df)
|
|
295
297
|
|
|
298
|
+
def is_backtick_escaped(self, name: str) -> bool:
|
|
299
|
+
"""
|
|
300
|
+
check if a given (column) name is backtick escaped or not
|
|
301
|
+
:param name: column name
|
|
302
|
+
:return: bool
|
|
303
|
+
"""
|
|
304
|
+
return name.startswith("`") and name.endswith("`")
|
|
305
|
+
|
|
306
|
+
def force_apply_backticks(self, name: str) -> str:
|
|
307
|
+
"""
|
|
308
|
+
forces application of backticks to the given (column) name as a single unit
|
|
309
|
+
if it already has backticks this is a noop
|
|
310
|
+
:param name: column name
|
|
311
|
+
:return: str
|
|
312
|
+
"""
|
|
313
|
+
if self.is_backtick_escaped(name):
|
|
314
|
+
return name
|
|
315
|
+
return f"`{name}`"
|
|
316
|
+
|
|
296
317
|
def evaluate(self, gold_table_schema: str, display: bool = True) -> None:
|
|
297
318
|
"""
|
|
298
319
|
Evaluates the loaded preset YAML using the input datasource configuration to load
|
|
@@ -302,8 +323,8 @@ class PreviewEngine:
|
|
|
302
323
|
s = gold_table_schema.split(".")
|
|
303
324
|
if len(s) != 2:
|
|
304
325
|
raise InvalidGoldTableSchemaError(gold_table_schema)
|
|
305
|
-
catalog_name = s[0]
|
|
306
|
-
schema_name = s[1]
|
|
326
|
+
catalog_name = s[0].lstrip("`").rstrip("`")
|
|
327
|
+
schema_name = s[1].lstrip("`").rstrip("`")
|
|
307
328
|
if any(
|
|
308
329
|
row.catalog == catalog_name
|
|
309
330
|
for row in self._spark.sql("SHOW CATALOGS").collect()
|
|
@@ -352,7 +373,12 @@ class PreviewEngine:
|
|
|
352
373
|
self._bronze = df
|
|
353
374
|
self._result_df_map = self._run(df)
|
|
354
375
|
if display:
|
|
355
|
-
self._render_output(
|
|
376
|
+
self._render_output(
|
|
377
|
+
df,
|
|
378
|
+
self._result_df_map,
|
|
379
|
+
self.force_apply_backticks(catalog_name),
|
|
380
|
+
self.force_apply_backticks(schema_name),
|
|
381
|
+
)
|
|
356
382
|
|
|
357
383
|
def results(
|
|
358
384
|
self,
|
|
@@ -224,10 +224,15 @@ class Stage:
|
|
|
224
224
|
|
|
225
225
|
referenced_columns = self._referenced_columns()
|
|
226
226
|
omitted_columns = self._omitted_columns()
|
|
227
|
+
# omitted and referenced cols MAY be wrapped in backticks
|
|
228
|
+
# so we need to check for their existence here on top of just plain col name
|
|
227
229
|
preserved_columns = [
|
|
228
230
|
col
|
|
229
231
|
for col in df.columns
|
|
230
|
-
if col not in referenced_columns
|
|
232
|
+
if col not in referenced_columns
|
|
233
|
+
and col not in omitted_columns
|
|
234
|
+
and self.force_apply_backticks(col) not in referenced_columns
|
|
235
|
+
and self.force_apply_backticks(col) not in omitted_columns
|
|
231
236
|
]
|
|
232
237
|
duplicate_prefix = self._duplicate_prefix()
|
|
233
238
|
column_names = self._column_names()
|
|
@@ -107,7 +107,6 @@ class GoldPreset(BaseModel):
|
|
|
107
107
|
filter: Optional[str] = None
|
|
108
108
|
post_filter: Optional[str] = None
|
|
109
109
|
fields: Optional[List[Optional[FieldSpec]]] = None
|
|
110
|
-
utils: Optional[FieldUtils] = None
|
|
111
110
|
|
|
112
111
|
@staticmethod
|
|
113
112
|
def from_api_obj(
|
|
@@ -126,7 +125,6 @@ class GoldPreset(BaseModel):
|
|
|
126
125
|
filter=obj.filter,
|
|
127
126
|
post_filter=obj.post_filter,
|
|
128
127
|
fields=fields,
|
|
129
|
-
utils=FieldUtils.from_api_obj(obj.utils),
|
|
130
128
|
)
|
|
131
129
|
|
|
132
130
|
|
|
@@ -263,8 +263,6 @@ class TransformRequest(BaseModel):
|
|
|
263
263
|
transform_type (str):
|
|
264
264
|
The type of transform (one of SilverPreTransform,
|
|
265
265
|
SilverTransform, Gold).
|
|
266
|
-
use_pre_transform_preset (str):
|
|
267
|
-
Indicates which pre-transform preset to use if requested.
|
|
268
266
|
use_preset_table (str):
|
|
269
267
|
Indicates which table to use within the preset's transform
|
|
270
268
|
type for Silver and Gold.
|
|
@@ -309,7 +307,6 @@ class TransformRequest(BaseModel):
|
|
|
309
307
|
)
|
|
310
308
|
|
|
311
309
|
transform_type: str
|
|
312
|
-
use_pre_transform_preset: Optional[str] = None
|
|
313
310
|
use_preset_table: Optional[str] = None
|
|
314
311
|
filter: Optional[str] = None
|
|
315
312
|
post_filter: Optional[str] = None
|
|
@@ -328,7 +325,6 @@ class TransformRequest(BaseModel):
|
|
|
328
325
|
add_fields = [FieldSpec.from_api_obj(item) for item in obj.add_fields]
|
|
329
326
|
return TransformRequest.Transform(
|
|
330
327
|
transform_type=obj.transform_type,
|
|
331
|
-
use_pre_transform_preset=obj.use_pre_transform_preset,
|
|
332
328
|
use_preset_table=obj.use_preset_table,
|
|
333
329
|
filter=obj.filter,
|
|
334
330
|
post_filter=obj.post_filter,
|
|
@@ -346,7 +342,6 @@ class TransformRequest(BaseModel):
|
|
|
346
342
|
to_api_obj = lambda o: o.to_api_obj()
|
|
347
343
|
return DbuiV1TransformRequestTransformsInner(
|
|
348
344
|
transform_type=self.transform_type,
|
|
349
|
-
use_pre_transform_preset=self.use_pre_transform_preset,
|
|
350
345
|
use_preset_table=self.use_preset_table,
|
|
351
346
|
filter=self.filter,
|
|
352
347
|
post_filter=self.post_filter,
|
|
@@ -81,6 +81,7 @@ def test_workspace_config(api_client):
|
|
|
81
81
|
def test_minimal_data_source(api_client):
|
|
82
82
|
base_data_source = DataSource(
|
|
83
83
|
source="test",
|
|
84
|
+
source_type="test",
|
|
84
85
|
schedule=Schedule(
|
|
85
86
|
at_least_every="2h",
|
|
86
87
|
enabled=True,
|
|
@@ -89,8 +90,10 @@ def test_minimal_data_source(api_client):
|
|
|
89
90
|
bronze_table="test_bronze_table",
|
|
90
91
|
skip_bronze_loading=False,
|
|
91
92
|
),
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
autoloader=DataSource.Autoloader(
|
|
94
|
+
location="s3://aws-security-data-lake-us-east-1-k8vskbicklrtekgxvyufaavf36jjql/aws/S3_DATA/2.0/region=us-east-1/",
|
|
95
|
+
format="json",
|
|
96
|
+
),
|
|
94
97
|
)
|
|
95
98
|
|
|
96
99
|
base_ds_1 = api_client.create_datasource("test_1", base_data_source)
|
|
@@ -712,7 +712,6 @@ def test_transform_request_marshal_unmarshal():
|
|
|
712
712
|
transforms=[
|
|
713
713
|
TransformRequest.Transform(
|
|
714
714
|
transform_type="Gold",
|
|
715
|
-
use_pre_transform_preset="pre_preset",
|
|
716
715
|
use_preset_table="table_name",
|
|
717
716
|
filter="col > 0",
|
|
718
717
|
post_filter="col < 100",
|
|
@@ -784,7 +783,6 @@ def test_transform_request_marshal_unmarshal():
|
|
|
784
783
|
),
|
|
785
784
|
TransformRequest.Transform(
|
|
786
785
|
transform_type="SilverTransform",
|
|
787
|
-
use_pre_transform_preset="pre_preset_b",
|
|
788
786
|
use_preset_table="table_b",
|
|
789
787
|
filter="col >= 10",
|
|
790
788
|
post_filter="col <= 50",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dasl_client-1.0.18 → dasl_client-1.0.20}/dasl_client/preset_development/preview_parameters.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|