cloe-nessy 1.0.6__py3-none-any.whl → 1.0.8__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.
@@ -144,7 +144,8 @@ class DeltaLoader(ABC, LoggerMixin):
144
144
  & ~F.col("is_processed")
145
145
  & ~F.col("is_stale"),
146
146
  )
147
- df = df.groupBy("BK", "delta_load_identifier").agg(F.max("__DCR")).limit(1)
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 = str(table.storage_path)
156
- if not storage_path:
157
- raise ValueError("Storage path must be provided or extracted from the Table object.")
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
 
@@ -1,6 +1,6 @@
1
1
  import pathlib
2
2
  from pathlib import Path
3
- from typing import Any, Self, cast
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 cast(str, render)
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.
@@ -1,5 +1,5 @@
1
1
  from pathlib import Path
2
- from typing import Any, cast
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 cast(str, render)
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 = str(table.storage_path)
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 a column in the DataFrame using a SQL expression.
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
- === "Create new column"
18
+ === "Single column transformation"
19
19
  ```yaml
20
20
  Create Full Name:
21
21
  action: TRANSFORM_WITH_COLUMN
22
22
  options:
23
- column_name: full_name
24
- expression: concat(first_name, ' ', last_name)
23
+ columns:
24
+ full_name: concat(first_name, ' ', last_name)
25
25
  ```
26
26
 
27
- === "Update existing column"
27
+ === "Multiple column transformations"
28
28
  ```yaml
29
- Lowercase Email:
29
+ Transform Multiple Columns:
30
30
  action: TRANSFORM_WITH_COLUMN
31
31
  options:
32
- column_name: email
33
- expression: lower(email)
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
- === "Calculated column"
39
+ === "Complex expressions"
37
40
  ```yaml
38
- Calculate Total:
41
+ Calculate Fields:
39
42
  action: TRANSFORM_WITH_COLUMN
40
43
  options:
41
- column_name: total_price
42
- expression: price * quantity * (1 + tax_rate)
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
- === "Extract date parts"
51
+ === "Date transformations"
46
52
  ```yaml
47
- Extract Year:
53
+ Extract Date Parts:
48
54
  action: TRANSFORM_WITH_COLUMN
49
55
  options:
50
- column_name: year
51
- expression: year(order_date)
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
- column_name: str = "",
62
- expression: str = "",
70
+ columns: dict[str, str] | None = None,
63
71
  **_: Any,
64
72
  ) -> PipelineContext:
65
- """Add or update a column using a SQL expression.
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
- column_name: Name of the column to create or update
70
- expression: SQL expression to evaluate for the column value
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 column_name is not provided
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 the SQL expression is invalid
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 column_name:
83
- raise ValueError("No column_name provided.")
101
+ if not columns:
102
+ raise ValueError("No columns provided. Expected a dictionary of {column_name: expression}.")
84
103
 
85
- if not expression:
86
- raise ValueError("No expression provided.")
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
- try:
96
- # Use F.expr() to evaluate the SQL expression
97
- df = df.withColumn(column_name, F.expr(expression))
98
- except Exception as e:
99
- self._console_logger.error(f"Failed to evaluate expression '{expression}' for column '{column_name}': {e}")
100
- raise
101
-
102
- self._console_logger.info(f"Successfully added/updated column '{column_name}'")
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=str(context.table_metadata.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 before yaml.safe_load."""
215
- unquoted_template = re.compile(r"(:)\s*(\{\{env:[^}]+\}\})(?=\s*$|\s+#)", re.MULTILINE)
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)
216
216
 
217
217
  def replacer(match):
218
218
  colon, template = match.groups()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloe-nessy
3
- Version: 1.0.6
3
+ Version: 1.0.8
4
4
  Summary: Your friendly datalake monster.
5
5
  Project-URL: homepage, https://initions.com/
6
6
  Author-email: initions <ICSMC_EXT_PYPIORG@accenture.com>
@@ -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=WOl44Udvo6hZ5PVFgabpehs8tt5nl9AYyDnnYBba5Ck,6872
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=kbBr0w5yqIwyohWjDosRBzEPKFyebPGxB96uB5f0FyY,17104
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=FvYNXK5k7tHC7Ek4j-q_oAQnuWyDnqWSDtkA9111wvk,13118
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=XG6MazeamF53AV44L-MCnkKBceXbnVU76mCs9GTB5Lg,12171
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=kfDDaCL6GzZsv6SshsyXO0NMe7a-yYv_GlLEWk6DOjo,2473
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=1LcwHvwRlHF8o4iiECg1gkAGVy5Wkpo1HBXsZlFGJXU,13907
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=eeC4RbGBILGN6zkbUyjH-qGgEMtOWV4Kv_VxrHbHMY0,9021
74
+ cloe_nessy/pipeline/pipeline_parsing_service.py,sha256=gpaxt5v-1i9JGz5kvu3esf0nwfhNHZ_eawl7Ei45zos,9052
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=c-E1yYkeYmovbN1maT7ImpdQlW0nYvYsHCtDvfe4wt8,3357
102
- cloe_nessy/pipeline/actions/write_catalog_table.py,sha256=rb4UOzJhe4tU3GEhAerPKWlzxW87FftyeqgMrRGTnYk,4848
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=kZL2PTIwB6Mj4UKg5f9SvU1VaakuYfFoymlcLf-L7dA,6443
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.6.dist-info/METADATA,sha256=wN6TtcRYZiwt-HofDf5IriH6HG2YkvpdFP_uXj7O1Es,3289
117
- cloe_nessy-1.0.6.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
118
- cloe_nessy-1.0.6.dist-info/RECORD,,
116
+ cloe_nessy-1.0.8.dist-info/METADATA,sha256=vDP-sVDSaxM_mjoeFfBockvenN5MAXE4i1OaE45Ru-M,3289
117
+ cloe_nessy-1.0.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
118
+ cloe_nessy-1.0.8.dist-info/RECORD,,