cloe-nessy 1.0.7__py3-none-any.whl → 1.0.9__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.
- cloe_nessy/integration/delta_loader/delta_loader.py +2 -1
- cloe_nessy/integration/delta_loader/strategies/delta_cdf_loader.py +1 -10
- cloe_nessy/integration/writer/delta_writer/delta_merge_writer.py +9 -4
- cloe_nessy/models/table.py +2 -2
- cloe_nessy/models/volume.py +2 -2
- cloe_nessy/object_manager/table_manager.py +1 -1
- cloe_nessy/pipeline/actions/transform_with_column.py +72 -40
- cloe_nessy/pipeline/actions/write_catalog_table.py +5 -4
- cloe_nessy/pipeline/actions/write_delta_merge.py +1 -1
- cloe_nessy/pipeline/pipeline_parsing_service.py +2 -2
- {cloe_nessy-1.0.7.dist-info → cloe_nessy-1.0.9.dist-info}/METADATA +1 -1
- {cloe_nessy-1.0.7.dist-info → cloe_nessy-1.0.9.dist-info}/RECORD +13 -13
- {cloe_nessy-1.0.7.dist-info → cloe_nessy-1.0.9.dist-info}/WHEEL +0 -0
|
@@ -144,7 +144,8 @@ class DeltaLoader(ABC, LoggerMixin):
|
|
|
144
144
|
& ~F.col("is_processed")
|
|
145
145
|
& ~F.col("is_stale"),
|
|
146
146
|
)
|
|
147
|
-
|
|
147
|
+
# Select the most recent unprocessed entry by __DCR timestamp
|
|
148
|
+
df = df.orderBy(F.desc("__DCR")).limit(1).select("BK", "delta_load_identifier")
|
|
148
149
|
self._console_logger.info(
|
|
149
150
|
f"Mark metadata for table as processed: [ {self.table_identifier} ] with Delta Load Identifier: [ {self.delta_load_identifier} ].",
|
|
150
151
|
)
|
|
@@ -232,10 +232,6 @@ class DeltaCDFLoader(DeltaLoader):
|
|
|
232
232
|
# File path - use load method
|
|
233
233
|
df = self.table_reader.load(self.table_identifier)
|
|
234
234
|
|
|
235
|
-
# Cache the DataFrame since it will be used for both counting and returning
|
|
236
|
-
# Note: .cache() is not supported on serverless compute, so we suppress errors
|
|
237
|
-
with contextlib.suppress(Exception):
|
|
238
|
-
df.cache()
|
|
239
235
|
row_count = df.count()
|
|
240
236
|
|
|
241
237
|
self._create_metadata_entry(
|
|
@@ -341,12 +337,7 @@ class DeltaCDFLoader(DeltaLoader):
|
|
|
341
337
|
)
|
|
342
338
|
|
|
343
339
|
# Strip CDF metadata columns and unpersist the intermediate cache
|
|
344
|
-
result_df = df.drop("_commit_version", "_commit_timestamp")
|
|
345
|
-
|
|
346
|
-
# Unpersist the cached DataFrame to free memory
|
|
347
|
-
# Note: unpersist may fail if cache wasn't successful on serverless
|
|
348
|
-
with contextlib.suppress(Exception):
|
|
349
|
-
df.unpersist()
|
|
340
|
+
result_df = df.drop("_commit_version", "_commit_timestamp", "_change_type")
|
|
350
341
|
|
|
351
342
|
return result_df
|
|
352
343
|
|
|
@@ -146,15 +146,20 @@ class DeltaMergeWriter(BaseDeltaWriter):
|
|
|
146
146
|
|
|
147
147
|
def _validate_table_inputs(
|
|
148
148
|
self, table: Table | None, table_identifier: str | None, storage_path: str | None
|
|
149
|
-
) -> tuple[str, str]:
|
|
149
|
+
) -> tuple[str, str | None]:
|
|
150
150
|
"""Validates and retrieves table identifier and storage path."""
|
|
151
151
|
if table is None and (table_identifier is None or storage_path is None):
|
|
152
152
|
raise ValueError("Either a Table object or table_identifier and storage_path must be provided.")
|
|
153
153
|
if table is not None:
|
|
154
154
|
table_identifier = table.identifier
|
|
155
|
-
storage_path =
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
storage_path = table.storage_path
|
|
156
|
+
# For managed tables (is_external=False), storage_path can be None
|
|
157
|
+
if table.is_external and storage_path is None:
|
|
158
|
+
raise ValueError("Storage path must be provided for external tables.")
|
|
159
|
+
else:
|
|
160
|
+
# When table is not provided, storage_path is required
|
|
161
|
+
if not storage_path:
|
|
162
|
+
raise ValueError("Storage path must be provided when Table object is not provided.")
|
|
158
163
|
assert table_identifier is not None, "Table identifier must be provided."
|
|
159
164
|
return table_identifier, storage_path
|
|
160
165
|
|
cloe_nessy/models/table.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import pathlib
|
|
2
2
|
from pathlib import Path
|
|
3
|
-
from typing import Any, Self
|
|
3
|
+
from typing import Any, Self
|
|
4
4
|
|
|
5
5
|
import yaml
|
|
6
6
|
from jinja2 import TemplateNotFound
|
|
@@ -258,7 +258,7 @@ class Table(TemplateLoaderMixin, ReadInstancesMixin, LoggerMixin):
|
|
|
258
258
|
self._console_logger.error(f"Template [ {template_name} ] not found.")
|
|
259
259
|
raise err
|
|
260
260
|
render = template.render(table=self, replace=replace)
|
|
261
|
-
return
|
|
261
|
+
return render
|
|
262
262
|
|
|
263
263
|
def get_column_by_name(self, column_name: str) -> Column | None:
|
|
264
264
|
"""Get a column by name.
|
cloe_nessy/models/volume.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
|
-
from typing import Any
|
|
2
|
+
from typing import Any
|
|
3
3
|
|
|
4
4
|
from jinja2 import TemplateNotFound
|
|
5
5
|
from pydantic import BaseModel, field_validator
|
|
@@ -73,4 +73,4 @@ class Volume(TemplateLoaderMixin, LoggerMixin, BaseModel):
|
|
|
73
73
|
self._console_logger.error(f"Template [ {template_name} ] not found.")
|
|
74
74
|
raise err
|
|
75
75
|
render = template.render(volume=self, if_not_exists=if_not_exists)
|
|
76
|
-
return
|
|
76
|
+
return render
|
|
@@ -142,7 +142,7 @@ class TableManager(LoggerMixin):
|
|
|
142
142
|
raise ValueError("Either table or table_identifier and storage_location must be provided, but not both.")
|
|
143
143
|
if table is not None:
|
|
144
144
|
table_identifier = table.identifier
|
|
145
|
-
storage_location =
|
|
145
|
+
storage_location = table.storage_path
|
|
146
146
|
if delete_physical_data:
|
|
147
147
|
self._delete_physical_data(location=storage_location)
|
|
148
148
|
self.drop_table_from_catalog(table_identifier=table_identifier)
|
|
@@ -9,46 +9,55 @@ from cloe_nessy.pipeline.pipeline_context import PipelineContext
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class TransformWithColumnAction(PipelineAction):
|
|
12
|
-
"""Add or update
|
|
12
|
+
"""Add or update multiple columns in the DataFrame using SQL expressions.
|
|
13
13
|
|
|
14
14
|
This action uses PySpark's expr() function to evaluate SQL expressions and
|
|
15
|
-
create or update columns in the DataFrame.
|
|
15
|
+
create or update one or more columns in the DataFrame.
|
|
16
16
|
|
|
17
17
|
Examples:
|
|
18
|
-
=== "
|
|
18
|
+
=== "Single column transformation"
|
|
19
19
|
```yaml
|
|
20
20
|
Create Full Name:
|
|
21
21
|
action: TRANSFORM_WITH_COLUMN
|
|
22
22
|
options:
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
columns:
|
|
24
|
+
full_name: concat(first_name, ' ', last_name)
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
=== "
|
|
27
|
+
=== "Multiple column transformations"
|
|
28
28
|
```yaml
|
|
29
|
-
|
|
29
|
+
Transform Multiple Columns:
|
|
30
30
|
action: TRANSFORM_WITH_COLUMN
|
|
31
31
|
options:
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
columns:
|
|
33
|
+
full_name: concat(first_name, ' ', last_name)
|
|
34
|
+
email_lower: lower(email)
|
|
35
|
+
total_price: price * quantity
|
|
36
|
+
year: year(order_date)
|
|
34
37
|
```
|
|
35
38
|
|
|
36
|
-
=== "
|
|
39
|
+
=== "Complex expressions"
|
|
37
40
|
```yaml
|
|
38
|
-
Calculate
|
|
41
|
+
Calculate Fields:
|
|
39
42
|
action: TRANSFORM_WITH_COLUMN
|
|
40
43
|
options:
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
columns:
|
|
45
|
+
total_amount: price * quantity
|
|
46
|
+
discount_amount: total_amount * discount_rate
|
|
47
|
+
final_amount: total_amount - discount_amount
|
|
48
|
+
status_flag: case when final_amount > 1000 then 'high' else 'normal' end
|
|
43
49
|
```
|
|
44
50
|
|
|
45
|
-
=== "
|
|
51
|
+
=== "Date transformations"
|
|
46
52
|
```yaml
|
|
47
|
-
Extract
|
|
53
|
+
Extract Date Parts:
|
|
48
54
|
action: TRANSFORM_WITH_COLUMN
|
|
49
55
|
options:
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
columns:
|
|
57
|
+
order_year: year(order_date)
|
|
58
|
+
order_month: month(order_date)
|
|
59
|
+
order_day: day(order_date)
|
|
60
|
+
order_quarter: quarter(order_date)
|
|
52
61
|
```
|
|
53
62
|
"""
|
|
54
63
|
|
|
@@ -58,47 +67,70 @@ class TransformWithColumnAction(PipelineAction):
|
|
|
58
67
|
self,
|
|
59
68
|
context: PipelineContext,
|
|
60
69
|
*,
|
|
61
|
-
|
|
62
|
-
expression: str = "",
|
|
70
|
+
columns: dict[str, str] | None = None,
|
|
63
71
|
**_: Any,
|
|
64
72
|
) -> PipelineContext:
|
|
65
|
-
"""Add or update
|
|
73
|
+
"""Add or update one or more columns using SQL expressions.
|
|
66
74
|
|
|
67
75
|
Args:
|
|
68
76
|
context: The pipeline context containing the DataFrame
|
|
69
|
-
|
|
70
|
-
|
|
77
|
+
columns: Dictionary mapping column names to SQL expressions.
|
|
78
|
+
Format: {column_name: sql_expression}
|
|
71
79
|
**_: Additional unused keyword arguments
|
|
72
80
|
|
|
73
81
|
Returns:
|
|
74
82
|
PipelineContext: Updated context with the modified DataFrame
|
|
75
83
|
|
|
76
84
|
Raises:
|
|
77
|
-
ValueError: If
|
|
78
|
-
ValueError: If expression is not provided
|
|
85
|
+
ValueError: If columns is not provided or is empty
|
|
79
86
|
ValueError: If context.data is None
|
|
80
|
-
Exception: If
|
|
87
|
+
Exception: If any SQL expression is invalid
|
|
88
|
+
|
|
89
|
+
Example:
|
|
90
|
+
```python
|
|
91
|
+
action.run(
|
|
92
|
+
context=pipeline_context,
|
|
93
|
+
columns={
|
|
94
|
+
"full_name": "concat(first_name, ' ', last_name)",
|
|
95
|
+
"year": "year(order_date)",
|
|
96
|
+
"total": "price * quantity"
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
```
|
|
81
100
|
"""
|
|
82
|
-
if not
|
|
83
|
-
raise ValueError("No
|
|
101
|
+
if not columns:
|
|
102
|
+
raise ValueError("No columns provided. Expected a dictionary of {column_name: expression}.")
|
|
84
103
|
|
|
85
|
-
if not
|
|
86
|
-
raise ValueError("
|
|
104
|
+
if not isinstance(columns, dict):
|
|
105
|
+
raise ValueError("columns must be a dictionary mapping column names to SQL expressions.")
|
|
87
106
|
|
|
88
107
|
if context.data is None:
|
|
89
108
|
raise ValueError("Data from context is required for transform_with_column")
|
|
90
109
|
|
|
91
|
-
self._console_logger.info(f"Adding/updating column '{column_name}' with expression: {expression}")
|
|
92
|
-
|
|
93
110
|
df = context.data
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
111
|
+
column_count = len(columns)
|
|
112
|
+
|
|
113
|
+
self._console_logger.info(f"Adding/updating {column_count} column(s)")
|
|
114
|
+
|
|
115
|
+
for column_name, expression in columns.items():
|
|
116
|
+
if not column_name or not isinstance(column_name, str):
|
|
117
|
+
raise ValueError(f"Invalid column name: {column_name}. Column names must be non-empty strings.")
|
|
118
|
+
|
|
119
|
+
if not expression or not isinstance(expression, str):
|
|
120
|
+
raise ValueError(
|
|
121
|
+
f"Invalid expression for column '{column_name}': {expression}. "
|
|
122
|
+
"Expressions must be non-empty strings."
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
self._console_logger.info(f" - Adding/updating column '{column_name}' with expression: {expression}")
|
|
127
|
+
df = df.withColumn(column_name, F.expr(expression))
|
|
128
|
+
except Exception as e:
|
|
129
|
+
self._console_logger.error(
|
|
130
|
+
f"Failed to evaluate expression '{expression}' for column '{column_name}': {e}"
|
|
131
|
+
)
|
|
132
|
+
raise
|
|
133
|
+
|
|
134
|
+
self._console_logger.info(f"Successfully added/updated {column_count} column(s)")
|
|
103
135
|
|
|
104
136
|
return context.from_existing(data=df)
|
|
@@ -97,10 +97,6 @@ class WriteCatalogTableAction(PipelineAction):
|
|
|
97
97
|
manager = TableManager()
|
|
98
98
|
manager.create_table(table=table_metadata, ignore_if_exists=True, replace=False)
|
|
99
99
|
|
|
100
|
-
runtime_info = getattr(context, "runtime_info", None)
|
|
101
|
-
if runtime_info and runtime_info.get("is_delta_load"):
|
|
102
|
-
consume_delta_load(runtime_info)
|
|
103
|
-
|
|
104
100
|
writer = CatalogWriter()
|
|
105
101
|
|
|
106
102
|
if streaming:
|
|
@@ -121,4 +117,9 @@ class WriteCatalogTableAction(PipelineAction):
|
|
|
121
117
|
partition_by=partition_by,
|
|
122
118
|
options=options,
|
|
123
119
|
)
|
|
120
|
+
|
|
121
|
+
runtime_info = getattr(context, "runtime_info", None)
|
|
122
|
+
if runtime_info and runtime_info.get("is_delta_load"):
|
|
123
|
+
consume_delta_load(runtime_info)
|
|
124
|
+
|
|
124
125
|
return context.from_existing()
|
|
@@ -128,7 +128,7 @@ class WriteDeltaMergeAction(PipelineAction):
|
|
|
128
128
|
data_frame=context.data,
|
|
129
129
|
table=context.table_metadata,
|
|
130
130
|
table_identifier=context.table_metadata.identifier,
|
|
131
|
-
storage_path=
|
|
131
|
+
storage_path=context.table_metadata.storage_path,
|
|
132
132
|
key_columns=key_columns,
|
|
133
133
|
cols_to_exclude_from_update=cols_to_exclude_from_update or [],
|
|
134
134
|
column_mapping=column_mapping or {},
|
|
@@ -211,8 +211,8 @@ class PipelineParsingService:
|
|
|
211
211
|
|
|
212
212
|
@staticmethod
|
|
213
213
|
def _fix_yaml_str_with_templates(yaml_str: str) -> str:
|
|
214
|
-
"""Fixes unquoted {{env:...}} templates (with optional prefix/suffix) before yaml.safe_load."""
|
|
215
|
-
unquoted_template = re.compile(r"(:)\s*([^\s#]*\{\{env:[^}]+\}\}[^\s#]*)", re.MULTILINE)
|
|
214
|
+
"""Fixes unquoted {{env:...}} templates (with optional prefix/suffix) before yaml.safe_load. Skips values already quoted with ' or "."""
|
|
215
|
+
unquoted_template = re.compile(r"(:)\s*(?!['\"])([^\s#]*\{\{env:[^}]+\}\}[^\s#]*)", re.MULTILINE)
|
|
216
216
|
|
|
217
217
|
def replacer(match):
|
|
218
218
|
colon, template = match.groups()
|
|
@@ -21,11 +21,11 @@ cloe_nessy/file_utilities/strategies/utils_strategy.py,sha256=w4nrS6IcPPN7UBFBws
|
|
|
21
21
|
cloe_nessy/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
22
|
cloe_nessy/integration/delta_loader/__init__.py,sha256=ZdBDde1uPtTCL_KAhilVmtVmmGvH5dHb05QsOozkteE,438
|
|
23
23
|
cloe_nessy/integration/delta_loader/delta_load_options.py,sha256=W3P3gwtkBW3pWbUEOK6agvJfj7QivXhEr_s0dwxhJxQ,1369
|
|
24
|
-
cloe_nessy/integration/delta_loader/delta_loader.py,sha256=
|
|
24
|
+
cloe_nessy/integration/delta_loader/delta_loader.py,sha256=RiHCsCc5_70KVYT2tiZFbuJyb6xPKNtD1ExEtwLO-1c,6946
|
|
25
25
|
cloe_nessy/integration/delta_loader/delta_loader_factory.py,sha256=vB1cL6-Nc3SkLH1xtazMbMF1MnNYq8-g3GHZzRE3QmE,2251
|
|
26
26
|
cloe_nessy/integration/delta_loader/delta_loader_metadata_table.py,sha256=G_EWUY76ZlbsPZB9LCGlOLVezk7DK6peYXEgt7-sTQE,1683
|
|
27
27
|
cloe_nessy/integration/delta_loader/strategies/__init__.py,sha256=1o5fRWenL5KnUg1hf7kmTuTpG9pbMxchiQTub52Qvwo,255
|
|
28
|
-
cloe_nessy/integration/delta_loader/strategies/delta_cdf_loader.py,sha256=
|
|
28
|
+
cloe_nessy/integration/delta_loader/strategies/delta_cdf_loader.py,sha256=qDHmr2i953SBQxD2SLMXIF4iXXF0hzplUJ7CiuuwLvc,16676
|
|
29
29
|
cloe_nessy/integration/delta_loader/strategies/delta_timestamp_loader.py,sha256=QV2smynYVfi3W7goKotPrGMPkahvIFEWT32LO56eWEI,6191
|
|
30
30
|
cloe_nessy/integration/reader/__init__.py,sha256=NWQx-v6aKE8YOHhsxfeaZnMVq4KLKyRWXzUduf5aVsk,265
|
|
31
31
|
cloe_nessy/integration/reader/api_reader.py,sha256=H6alDoCuGsxuhxpuN-JbL9-eMDchE9ZMq9P0hnz7t1I,20007
|
|
@@ -40,7 +40,7 @@ cloe_nessy/integration/writer/file_writer.py,sha256=SUDbN13ZzDhbM8DpOGFgM_Gkg70T
|
|
|
40
40
|
cloe_nessy/integration/writer/writer.py,sha256=elFPLFrWR-qVE9qnBtzzzhyRALLQcRVuOsPS0rNmRt4,1741
|
|
41
41
|
cloe_nessy/integration/writer/delta_writer/__init__.py,sha256=h2CT6Hllmk0nodlek27uqwniCzVZKMkYcPGyG9K2Z24,164
|
|
42
42
|
cloe_nessy/integration/writer/delta_writer/delta_append_writer.py,sha256=nribgHmapp59v3Rw_AfJg0_BRYhP7x2IJIeE74Ia_6A,4748
|
|
43
|
-
cloe_nessy/integration/writer/delta_writer/delta_merge_writer.py,sha256=
|
|
43
|
+
cloe_nessy/integration/writer/delta_writer/delta_merge_writer.py,sha256=YD8PQrETQ-cSSxND94amG8Y-ccsoYHy2YZzAcb4ONCA,13433
|
|
44
44
|
cloe_nessy/integration/writer/delta_writer/delta_table_operation_type.py,sha256=m4YFY9_WgaOcnpBviVt3Km-w3wf3NF25wPS-n0NBGcE,970
|
|
45
45
|
cloe_nessy/integration/writer/delta_writer/delta_writer_base.py,sha256=B7PwPHKrsJL0ZxBT-H9wWSy0gn7shqNDJ0AbrpMHyMg,10135
|
|
46
46
|
cloe_nessy/integration/writer/delta_writer/exceptions.py,sha256=xPmGiYV0xQXauln5Oh34E5vbm0rVcs6xCh-SJSb2bw0,107
|
|
@@ -52,9 +52,9 @@ cloe_nessy/models/column.py,sha256=W4V1Ls1d60VyZ1Ko9Yu9eSipcMbxSzKicn0aloHPiR0,2
|
|
|
52
52
|
cloe_nessy/models/constraint.py,sha256=hsFlhn4n928z81O3dl3v5bMetewPWzMjkJK3_4kASSM,178
|
|
53
53
|
cloe_nessy/models/foreign_key.py,sha256=DwRVHs9sShqqPV-NL7ow_3AmPPWX0Od26yZn_I565pU,1001
|
|
54
54
|
cloe_nessy/models/schema.py,sha256=9RA31esHyj9saLeHvvYzK9wjK3GNnr15UO66NtSM368,3478
|
|
55
|
-
cloe_nessy/models/table.py,sha256
|
|
55
|
+
cloe_nessy/models/table.py,sha256=-MQLwKthcO4JE99lbikJL1cnt27aEZmt3o96R9CtoTU,12154
|
|
56
56
|
cloe_nessy/models/types.py,sha256=XRbuJGdTNa6aXyE3IAzs_J9gVjbfkzMDLfGl-k6jI_4,223
|
|
57
|
-
cloe_nessy/models/volume.py,sha256=
|
|
57
|
+
cloe_nessy/models/volume.py,sha256=BPEy6DW0Yig-mFQiNgm9P5JoO6Vcvtxcipnk2-H8Q_k,2456
|
|
58
58
|
cloe_nessy/models/adapter/__init__.py,sha256=m36W_mqwB3dCYnCIt0fLOSHS4E1VU8FRGoaum4Gf95o,90
|
|
59
59
|
cloe_nessy/models/adapter/unity_catalog_adapter.py,sha256=a-14Ys-AevVYQd0xeJU1syLxjT5Wzo4uog1hFSEs76M,12651
|
|
60
60
|
cloe_nessy/models/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -63,7 +63,7 @@ cloe_nessy/models/mixins/template_loader_mixin.py,sha256=5MXhEGBFlq3dwZvINEyBowS
|
|
|
63
63
|
cloe_nessy/models/templates/create_table.sql.j2,sha256=71JpUyUZ_ZYO2M0tfIrTXHR7JycypAGsELt2-2d3oO0,2479
|
|
64
64
|
cloe_nessy/models/templates/create_volume.sql.j2,sha256=XIUf1cHcvAxcGTyhzUiv4xpQ1cfDw_ra3_FKmOuLoBs,289
|
|
65
65
|
cloe_nessy/object_manager/__init__.py,sha256=3sle0vNpPwBOkycxA3XVS9m4XZf5LD3Qd4NGxdqcHno,186
|
|
66
|
-
cloe_nessy/object_manager/table_manager.py,sha256=
|
|
66
|
+
cloe_nessy/object_manager/table_manager.py,sha256=M4JWgga7A8MHll5QJ42TUU5X4eUrQzhbwaZtVBgoQPY,13902
|
|
67
67
|
cloe_nessy/object_manager/volume_manager.py,sha256=6epd3KXzcNH04EvaKubAfLsaUm9qBMeT3KNvMK04gGs,2727
|
|
68
68
|
cloe_nessy/pipeline/__init__.py,sha256=BUzL4HJaCXWmK7OgKaxdwK72JrrdzfzIvyxOGtM28U0,417
|
|
69
69
|
cloe_nessy/pipeline/pipeline.py,sha256=L4wk3b06LNWRj01nnAkuQpeRrwFTyaV1xTpgYAg4sak,10819
|
|
@@ -71,7 +71,7 @@ cloe_nessy/pipeline/pipeline_action.py,sha256=S7IVFdmG12fRBzHuE_DiWn7qlMtApz6Ilo
|
|
|
71
71
|
cloe_nessy/pipeline/pipeline_builder.py,sha256=_BBl43two0pherkTXZ-Yrpt6XcLW8Q-Z98qxbFIsMao,7929
|
|
72
72
|
cloe_nessy/pipeline/pipeline_config.py,sha256=oVQ-IH4etTGZVVEnE-5iDPLYOtWpvDlltWFv1nevnqQ,3229
|
|
73
73
|
cloe_nessy/pipeline/pipeline_context.py,sha256=eCOcjyE16rGRom3L85Gy_BbncfQD6i1x31yrWqZws-4,1881
|
|
74
|
-
cloe_nessy/pipeline/pipeline_parsing_service.py,sha256=
|
|
74
|
+
cloe_nessy/pipeline/pipeline_parsing_service.py,sha256=sMnUDAL0PBLbKupC_TWxBT1X9-Y9I5dPSqAxAkWyweA,9102
|
|
75
75
|
cloe_nessy/pipeline/pipeline_plotting_service.py,sha256=OjdYDQW19yXjdcqs7bDMlyWmv0cQz7Qn4I2cakBgN2E,13139
|
|
76
76
|
cloe_nessy/pipeline/pipeline_step.py,sha256=oTnlvRpB0fbOBQXbPe1URstA5fv-97igCHt_41fKCAk,2082
|
|
77
77
|
cloe_nessy/pipeline/actions/__init__.py,sha256=FfAnSIl-0T6pnaWhClkDqV8nfTdvLvZZJdwycsZMLPw,2990
|
|
@@ -98,10 +98,10 @@ cloe_nessy/pipeline/actions/transform_rename_columns.py,sha256=4zJcPCONMU4C67qeu
|
|
|
98
98
|
cloe_nessy/pipeline/actions/transform_replace_values.py,sha256=1OPHTrjcphfyGepcO7ozYfeqfwA18pjlyHpVKUS_AAU,2049
|
|
99
99
|
cloe_nessy/pipeline/actions/transform_select_columns.py,sha256=-GhSEsb7iNnZIsYRm3BG9BX4_qUDJMbpj1DsKPY046w,4574
|
|
100
100
|
cloe_nessy/pipeline/actions/transform_union.py,sha256=SZtEzh567CIExUj9yMEgshE28h4dXKT7Wr2TDj4zB4k,2718
|
|
101
|
-
cloe_nessy/pipeline/actions/transform_with_column.py,sha256=
|
|
102
|
-
cloe_nessy/pipeline/actions/write_catalog_table.py,sha256=
|
|
101
|
+
cloe_nessy/pipeline/actions/transform_with_column.py,sha256=5EG_H4MTiQVCfgkjfyof4qqw9xB3MJh-v0lsoYlbVCU,4967
|
|
102
|
+
cloe_nessy/pipeline/actions/write_catalog_table.py,sha256=rYK_V08D8w4CBClRBGwj18amhZOVmP6VTTO-xqy7We8,4849
|
|
103
103
|
cloe_nessy/pipeline/actions/write_delta_append.py,sha256=e1g4mDhwAZdKyt4Gb7ZzHcQrJ1duSl8qOn6ONizRsoM,2934
|
|
104
|
-
cloe_nessy/pipeline/actions/write_delta_merge.py,sha256=
|
|
104
|
+
cloe_nessy/pipeline/actions/write_delta_merge.py,sha256=5Svi9Z7xg2Ey0WPq4MzS509vMDOM7mDGUa5OBaWbjkc,6438
|
|
105
105
|
cloe_nessy/pipeline/actions/write_file.py,sha256=JZ8UZslxUn_ttYt5wDyvtHFq2FqYk3vOR8kvExJI8pk,3212
|
|
106
106
|
cloe_nessy/pipeline/utils/__init__.py,sha256=xi02UjBMiXWD7b9gDvww4gyRyowb0eRd_6Wbu0F_cro,118
|
|
107
107
|
cloe_nessy/pipeline/utils/delta_load_utils.py,sha256=KitMNruxePEkecI0h4Jint1JwJpaEog5mCOchMkgan8,1495
|
|
@@ -113,6 +113,6 @@ cloe_nessy/settings/settings.py,sha256=I4n129lrujriW-d8q4as2Kb4_kI932ModfZ5Ow_Up
|
|
|
113
113
|
cloe_nessy/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
114
114
|
cloe_nessy/utils/column_names.py,sha256=dCNtm61mc5aLkY2oE4rlfN3VLCrpot6fOESjAZmCmhA,361
|
|
115
115
|
cloe_nessy/utils/file_and_directory_handler.py,sha256=r2EVt9xG81p6ScaJCwETC5an6pMT6WseB0jMOR-JlpU,602
|
|
116
|
-
cloe_nessy-1.0.
|
|
117
|
-
cloe_nessy-1.0.
|
|
118
|
-
cloe_nessy-1.0.
|
|
116
|
+
cloe_nessy-1.0.9.dist-info/METADATA,sha256=imtWtMJfxQToZnS30gWkb_DW3XIahzqkbVjYk3cajVA,3289
|
|
117
|
+
cloe_nessy-1.0.9.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
118
|
+
cloe_nessy-1.0.9.dist-info/RECORD,,
|
|
File without changes
|