cloe-nessy 0.3.17.0__py3-none-any.whl → 0.3.19__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.
Files changed (39) hide show
  1. cloe_nessy/clients/api_client/__init__.py +10 -1
  2. cloe_nessy/clients/api_client/api_client.py +19 -8
  3. cloe_nessy/clients/api_client/api_response.py +7 -4
  4. cloe_nessy/clients/api_client/pagination_config.py +84 -0
  5. cloe_nessy/clients/api_client/pagination_strategy.py +500 -0
  6. cloe_nessy/integration/delta_loader/delta_loader.py +1 -1
  7. cloe_nessy/integration/reader/__init__.py +2 -2
  8. cloe_nessy/integration/reader/api_reader.py +463 -72
  9. cloe_nessy/integration/reader/catalog_reader.py +49 -10
  10. cloe_nessy/integration/reader/excel_reader.py +3 -3
  11. cloe_nessy/integration/reader/file_reader.py +3 -1
  12. cloe_nessy/integration/reader/reader.py +1 -1
  13. cloe_nessy/integration/writer/catalog_writer.py +64 -2
  14. cloe_nessy/integration/writer/delta_writer/delta_merge_writer.py +5 -1
  15. cloe_nessy/models/column.py +3 -2
  16. cloe_nessy/models/schema.py +1 -0
  17. cloe_nessy/models/templates/create_table.sql.j2 +22 -0
  18. cloe_nessy/object_manager/table_manager.py +29 -7
  19. cloe_nessy/pipeline/actions/__init__.py +1 -1
  20. cloe_nessy/pipeline/actions/read_api.py +272 -75
  21. cloe_nessy/pipeline/actions/read_catalog_table.py +73 -10
  22. cloe_nessy/pipeline/actions/read_excel.py +1 -1
  23. cloe_nessy/pipeline/actions/read_metadata_yaml.py +61 -33
  24. cloe_nessy/pipeline/actions/transform_decode.py +2 -1
  25. cloe_nessy/pipeline/actions/transform_join.py +98 -24
  26. cloe_nessy/pipeline/actions/transform_union.py +2 -2
  27. cloe_nessy/pipeline/actions/write_catalog_table.py +66 -21
  28. cloe_nessy/pipeline/actions/write_delta_merge.py +1 -0
  29. cloe_nessy/pipeline/pipeline_config.py +2 -0
  30. cloe_nessy/pipeline/pipeline_context.py +1 -1
  31. cloe_nessy/pipeline/pipeline_parsing_service.py +104 -39
  32. cloe_nessy/pipeline/pipeline_step.py +2 -0
  33. cloe_nessy/session/__init__.py +2 -1
  34. cloe_nessy/session/pyspark_compat.py +15 -0
  35. cloe_nessy/session/session_manager.py +1 -1
  36. {cloe_nessy-0.3.17.0.dist-info → cloe_nessy-0.3.19.dist-info}/METADATA +19 -19
  37. {cloe_nessy-0.3.17.0.dist-info → cloe_nessy-0.3.19.dist-info}/RECORD +38 -36
  38. {cloe_nessy-0.3.17.0.dist-info → cloe_nessy-0.3.19.dist-info}/WHEEL +1 -2
  39. cloe_nessy-0.3.17.0.dist-info/top_level.txt +0 -1
@@ -3,6 +3,7 @@ import re
3
3
  from collections import OrderedDict
4
4
  from enum import Enum
5
5
  from pathlib import Path
6
+ from typing import Any
6
7
 
7
8
  import yaml
8
9
 
@@ -10,7 +11,7 @@ from ..logging import LoggerMixin
10
11
  from ..session import SessionManager
11
12
  from .actions import PipelineActionType, pipeline_actions
12
13
  from .pipeline import Pipeline
13
- from .pipeline_config import PipelineConfig
14
+ from .pipeline_config import PipelineConfig, PipelineStepConfig
14
15
  from .pipeline_step import PipelineStep
15
16
 
16
17
 
@@ -63,49 +64,22 @@ class PipelineParsingService:
63
64
  if not yaml_str:
64
65
  raise ValueError("YAML content is empty.")
65
66
 
66
- final_yaml_str = PipelineParsingService._replace_variables(yaml_str)
67
- config = yaml.safe_load(final_yaml_str)
67
+ secrets_repl_yaml_str = PipelineParsingService._replace_secret_refs(yaml_str)
68
+ fixed_yaml_str = PipelineParsingService._fix_yaml_str_with_templates(secrets_repl_yaml_str)
69
+ config = yaml.safe_load(fixed_yaml_str)
68
70
  pipeline_config = PipelineConfig.metadata_to_instance(config)
69
- steps = PipelineParsingService._get_steps(pipeline_config.steps)
71
+ steps = PipelineParsingService._get_steps(pipeline_config.steps, pipeline_config.env)
70
72
  pipeline = Pipeline(name=pipeline_config.name, steps=steps) # type: ignore
71
73
  console_logger.info("Pipeline [ '%s' ] parsed successfully with %d steps.", pipeline.name, len(pipeline.steps))
72
74
  return pipeline
73
75
 
74
76
  @staticmethod
75
- def _replace_variables(yaml_str: str) -> str:
76
- """Replace variable placeholders in a YAML string.
77
-
78
- Replaces environment variables with the pattern `{{env:var-name}}`. Where
79
- the var-name is the name of the environment variable. Replaces secret
80
- references with the pattern `{{secret-scope-name:secret-key}}`. Where
81
- scope-name is the name of the secret scope and secret-key is the key of
82
- the secret.
83
-
84
- Args:
85
- yaml_str: A string that can be parsed in YAML format.
86
-
87
- Returns:
88
- The same YAML string with environment variable placeholders replaced.
89
- """
90
- env_var_pattern = r"\{\{env:([^}]+)\}\}"
91
- secret_ref_pattern = r"\{\{(?!step|env)([^}]+):([^}]+)\}\}"
92
-
93
- def replace_with_env_var(match):
94
- env_var_name = match.group(1)
95
- env_var_value = os.getenv(env_var_name)
96
- return env_var_value
97
-
98
- def replace_with_secret(match):
99
- secret_scope_name = match.group(1)
100
- secret_key = match.group(2)
101
- return SessionManager.get_utils().secrets.get(scope=secret_scope_name, key=secret_key)
102
-
103
- env_replaced_yaml_string = re.sub(env_var_pattern, replace_with_env_var, yaml_str)
104
- final_yaml_string = re.sub(secret_ref_pattern, replace_with_secret, env_replaced_yaml_string)
105
- return final_yaml_string
106
-
107
- @staticmethod
108
- def _get_steps(step_configs, last_step_name: str | None = None):
77
+ def _get_steps(
78
+ step_configs: OrderedDict[str, PipelineStepConfig],
79
+ pipeline_env: dict[str, str],
80
+ last_step_name: str | None = None,
81
+ ) -> OrderedDict[str, PipelineStep]:
82
+ os_env = dict(os.environ)
109
83
  steps = OrderedDict()
110
84
  for step_name, step_config in step_configs.items():
111
85
  is_successor = step_config.is_successor
@@ -115,19 +89,99 @@ class PipelineParsingService:
115
89
  action = PipelineActionType[step_config.action.name].value()
116
90
  step = PipelineStep(
117
91
  name=step_name,
92
+ env=step_config.env,
118
93
  action=action,
119
94
  options=step_config.options,
120
95
  _context_ref=context_ref,
121
96
  _table_metadata_ref=step_config.table_metadata,
122
97
  )
123
- steps[step.name] = step
98
+ steps[step.name] = PipelineParsingService._resolve_env_vars(step, os_env, pipeline_env)
124
99
  last_step_name = step_name
125
100
  for step in steps.values():
126
101
  steps[step.name] = PipelineParsingService._replace_step_refs(steps, step)
127
102
  return steps
128
103
 
104
+ @staticmethod
105
+ def _replace_secret_refs(yaml_str: str) -> str:
106
+ """Replaces secret reference placeholders in a YAML string.
107
+
108
+ Replaces secret references with the pattern `{{secret-scope-name:secret-key}}`.
109
+ Where scope-name is the name of the secret scope and secret-key is the key of the secret.
110
+
111
+ Args:
112
+ yaml_str: A string that can be parsed in YAML format.
113
+
114
+ Returns:
115
+ The same YAML string with secret reference placeholders replaced.
116
+ """
117
+ secret_ref_pattern = r"\{\{(?!(?:env|step):)([^}]+):([^}]+)\}\}"
118
+
119
+ def replace_with_secret(match):
120
+ secret_scope_name = match.group(1)
121
+ secret_key = match.group(2)
122
+ return SessionManager.get_utils().secrets.get(scope=secret_scope_name, key=secret_key)
123
+
124
+ return re.sub(secret_ref_pattern, replace_with_secret, yaml_str)
125
+
126
+ @staticmethod
127
+ def _resolve_env_vars(step: PipelineStep, os_env: dict[str, str], pipeline_env: dict[str, str]) -> PipelineStep:
128
+ """Resolves environment variable placeholders in step definition.
129
+
130
+ Resolves environment variables with the pattern `{{env:var-name}}`,
131
+ where the `var-name` is the name of the environment variable.
132
+
133
+ Args:
134
+ step: Step definition, where replacement is occurred.
135
+ os_env: OS scope environment variable.
136
+ pipeline_env: Pipeline scope environment variables.
137
+
138
+ Returns:
139
+ The same step definition with environment variable placeholders replaced.
140
+
141
+ Raises:
142
+ KeyError: If the specified key is not found in the environment variables.
143
+ """
144
+ env_var_pattern = re.compile(r"\{\{env:([A-Z_][A-Z0-9_]*)\}\}")
145
+
146
+ def _resolve_object(obj: Any) -> Any:
147
+ if isinstance(obj, str):
148
+ return _resolve_string(obj)
149
+ if isinstance(obj, list):
150
+ return [_resolve_object(i) for i in obj]
151
+ if isinstance(obj, dict):
152
+ return {k: _resolve_object(v) for k, v in obj.items()}
153
+ return obj
154
+
155
+ def _resolve_string(value: str) -> str:
156
+ def repl(match):
157
+ key = match.group(1)
158
+ if key not in effective_env:
159
+ raise KeyError(f"Environment variable '{key}' is not defined")
160
+ return str(effective_env[key])
161
+
162
+ return env_var_pattern.sub(repl, value)
163
+
164
+ if step.options:
165
+ effective_env = {**os_env, **pipeline_env, **step.env}
166
+ for option, value in step.options.items():
167
+ step.options[option] = _resolve_object(value)
168
+
169
+ return step
170
+
129
171
  @staticmethod
130
172
  def _replace_step_refs(steps: OrderedDict[str, PipelineStep], step: PipelineStep) -> PipelineStep:
173
+ """Replaces other steps reference placeholders in a step definition.
174
+
175
+ Replaces other steps references with the pattern `((step:step-name))`.
176
+ Where the `step-name` is the name of the referenced step.
177
+
178
+ Args:
179
+ steps: All pipeline steps definitions.
180
+ step: Step definition, where replacement is occurred.
181
+
182
+ Returns:
183
+ The same step definition with referenced step names replaced.
184
+ """
131
185
  step_ref_pattern = r"\(\(step:([^)]+)\)\)"
132
186
 
133
187
  def _handle_string_value(value: str, option: str):
@@ -154,3 +208,14 @@ class PipelineParsingService:
154
208
  _handle_list_value(value, option)
155
209
 
156
210
  return step
211
+
212
+ @staticmethod
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)
216
+
217
+ def replacer(match):
218
+ colon, template = match.groups()
219
+ return f'{colon} "{template}"'
220
+
221
+ return unquoted_template.sub(replacer, yaml_str)
@@ -15,6 +15,7 @@ class PipelineStep:
15
15
  Attributes:
16
16
  name: The name of the step.
17
17
  action: The action to be executed.
18
+ env: The step environment variables.
18
19
  is_successor: A boolean indicating if the step is a successor and takes
19
20
  the previous steps context.
20
21
  context: The context of the step.
@@ -26,6 +27,7 @@ class PipelineStep:
26
27
 
27
28
  name: str
28
29
  action: PipelineAction
30
+ env: dict[str, str] = field(default_factory=lambda: {})
29
31
  context: PipelineContext = field(default_factory=lambda: PipelineContext())
30
32
  options: dict[str, Any] = field(default_factory=lambda: {})
31
33
  result: PipelineContext = field(default_factory=lambda: PipelineContext())
@@ -1,3 +1,4 @@
1
+ from .pyspark_compat import DataFrame, SparkSession
1
2
  from .session_manager import SessionManager
2
3
 
3
- __all__ = ["SessionManager"]
4
+ __all__ = ["SessionManager", "DataFrame", "SparkSession"]
@@ -0,0 +1,15 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from pyspark.sql.utils import is_remote
4
+
5
+ if TYPE_CHECKING:
6
+ from pyspark.sql import Column, DataFrame, SparkSession
7
+ else:
8
+ # Real runtime imports
9
+ if is_remote():
10
+ from pyspark.sql.connect.dataframe import DataFrame
11
+ from pyspark.sql.connect.session import SparkSession
12
+ else:
13
+ from pyspark.sql import DataFrame, SparkSession
14
+
15
+ __all__ = ["SparkSession", "DataFrame", "Column"]
@@ -3,7 +3,7 @@ import os
3
3
  from enum import Enum
4
4
  from typing import Any
5
5
 
6
- from pyspark.sql import SparkSession
6
+ from cloe_nessy.session import SparkSession
7
7
 
8
8
  from ..logging import LoggerMixin
9
9
 
@@ -1,36 +1,36 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloe-nessy
3
- Version: 0.3.17.0
3
+ Version: 0.3.19
4
4
  Summary: Your friendly datalake monster.
5
+ Project-URL: homepage, https://initions.com/
5
6
  Author-email: initions <ICSMC_EXT_PYPIORG@accenture.com>
6
7
  License: MIT
7
- Project-URL: homepage, https://initions.com/
8
8
  Classifier: Development Status :: 5 - Production/Stable
9
9
  Classifier: Environment :: Console
10
- Classifier: License :: OSI Approved :: MIT License
11
10
  Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Operating System :: OS Independent
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Classifier: Topic :: Database
15
15
  Requires-Python: <3.13,>=3.11
16
- Description-Content-Type: text/markdown
17
- Requires-Dist: pydantic<3.0.0,>=2.7.2
18
- Requires-Dist: pyyaml<7.0.0,>=6.0.1
19
- Requires-Dist: types-pyyaml<7.0.0.0,>=6.0.12.20240311
20
- Requires-Dist: jinja2<4.0.0,>=3.1.4
21
- Requires-Dist: pydantic-settings<3.0.0,>=2.4.0
22
- Requires-Dist: openpyxl<4.0.0,>=3.1.5
23
- Requires-Dist: requests<3.0.0,>=2.32.3
24
- Requires-Dist: types-requests<3.0.0.0,>=2.32.0.20240712
25
- Requires-Dist: pandas-stubs<3.0.0.0,>=2.2.2.240807
26
16
  Requires-Dist: azure-identity<2.0.0,>=1.19.0
27
- Requires-Dist: httpx<1.0.0,>=0.27.2
17
+ Requires-Dist: cloe-logging[databricks,log-analytics]<0.4,>=0.3.8
28
18
  Requires-Dist: databricks-sdk<1.0.0,>=0.36.0
29
- Requires-Dist: networkx<4.0,>=3.3
19
+ Requires-Dist: fsspec<2025.7.1,>=2025.7.0
20
+ Requires-Dist: httpx<1.0.0,>=0.27.2
21
+ Requires-Dist: jinja2<4.0.0,>=3.1.4
30
22
  Requires-Dist: matplotlib<4.0.0,>=3.9.2
23
+ Requires-Dist: networkx<4.0,>=3.3
24
+ Requires-Dist: openpyxl<4.0.0,>=3.1.5
25
+ Requires-Dist: pandas-stubs<3.0.0.0,>=2.2.2.240807
26
+ Requires-Dist: pydantic-settings<3.0.0,>=2.4.0
27
+ Requires-Dist: pydantic<3.0.0,>=2.7.2
28
+ Requires-Dist: pyyaml<7.0.0,>=6.0.1
29
+ Requires-Dist: requests<3.0.0,>=2.32.3
31
30
  Requires-Dist: types-networkx<4.0.0.0,>=3.2.1.20240820
32
- Requires-Dist: fsspec<2025.7.1,>=2025.7.0
33
- Requires-Dist: cloe-logging[databricks,log-analytics]<0.4,>=0.3.8
31
+ Requires-Dist: types-pyyaml<7.0.0.0,>=6.0.12.20240311
32
+ Requires-Dist: types-requests<3.0.0.0,>=2.32.0.20240712
33
+ Description-Content-Type: text/markdown
34
34
 
35
35
  # cloe-nessy
36
36
 
@@ -58,12 +58,12 @@ Extract-Transform-Load (ETL) Workflow.
58
58
 
59
59
  When you are contributing, please refer to our Contribution Guide in the *nessy*
60
60
  Docs
61
- [here](https://yellow-mud-0b9177e03.2.azurestaticapps.net/tool_docs/nessy/Developer-Guide/)!
61
+ [here](https://mango-tree-0b8dd3b03.1.azurestaticapps.net/tool_docs/nessy/Developer-Guide/)!
62
62
 
63
63
  ## Usage
64
64
 
65
65
  Please find the User Guide
66
- [here](https://yellow-mud-0b9177e03.2.azurestaticapps.net/tool_docs/nessy/User-Guide/)!
66
+ [here](https://mango-tree-0b8dd3b03.1.azurestaticapps.net/tool_docs/nessy/User-Guide/)!
67
67
 
68
68
  ## Contact
69
69
 
@@ -1,11 +1,13 @@
1
1
  cloe_nessy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  cloe_nessy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  cloe_nessy/clients/__init__.py,sha256=GhiRvemNZ4TMS5rrHdmZEF73zozmrhvom2R5Oj6j9FI,71
4
- cloe_nessy/clients/api_client/__init__.py,sha256=hPp8ByXw7mYfroIfDjD2ya79f-ZHAuaNJ07ff1dCe9Y,62
5
- cloe_nessy/clients/api_client/api_client.py,sha256=7_hhj9bogS9sR21f0nDCx-O8-k0kzGsumBLKPF3gOvQ,7074
6
- cloe_nessy/clients/api_client/api_response.py,sha256=f5KQbHdl47JTS-6luY34GlGx_l2qUxK49_ihmn3P--w,2884
4
+ cloe_nessy/clients/api_client/__init__.py,sha256=4ucfQnSQScLsvitTOdwTlPME5FX7p7vIt7ZJ-JQ_egc,529
5
+ cloe_nessy/clients/api_client/api_client.py,sha256=DYMxGPOueaBbY2qEA40HkREsf5n5UvB0s8dhApr4-fw,7703
6
+ cloe_nessy/clients/api_client/api_response.py,sha256=51_s6QjfQZLug3gEnojhuF_i3E1Mv-HdWiq6PRiFse0,2958
7
7
  cloe_nessy/clients/api_client/auth.py,sha256=TNJQeSfBQ6O6jmqZvoeS-vyyG4PnhpyqbNIwfyElhpM,6737
8
8
  cloe_nessy/clients/api_client/exceptions.py,sha256=VR9nYMHWzIRLlMZMrPpOsEX0X_P0jXJCTSBLTEhtN1E,403
9
+ cloe_nessy/clients/api_client/pagination_config.py,sha256=mSv1WjQSifnnpD1Ggl2ExUip_icMAMLpP3pcxske8RE,3722
10
+ cloe_nessy/clients/api_client/pagination_strategy.py,sha256=YcvAee8CrJiOxEvuFQ4KQJlNzHX3Kp0thOJyijnJMcE,17297
9
11
  cloe_nessy/file_utilities/__init__.py,sha256=nY8H48jYHvTy0VYSRHVhZaFMlzfch4-T7y3N73tgMpI,73
10
12
  cloe_nessy/file_utilities/exceptions.py,sha256=RDeV2S6AQnFhFINRo84HDV_hk2RMrf5oNQ7GhHmAZy0,97
11
13
  cloe_nessy/file_utilities/factory.py,sha256=JONYGI8MCkNwG2_ujvjN3iB7BIdl7SqXKgV05YY_i4E,1735
@@ -19,26 +21,26 @@ cloe_nessy/file_utilities/strategies/utils_strategy.py,sha256=urayKfOUpSaXKgTs1K
19
21
  cloe_nessy/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
22
  cloe_nessy/integration/delta_loader/__init__.py,sha256=ZdBDde1uPtTCL_KAhilVmtVmmGvH5dHb05QsOozkteE,438
21
23
  cloe_nessy/integration/delta_loader/delta_load_options.py,sha256=bbPGhC0n8L6CmcmV91Xqq6fWRimxlUHUkr22uVqG0g4,1363
22
- cloe_nessy/integration/delta_loader/delta_loader.py,sha256=D5oOvVLWRwl0z0iQScXVOapErAl6Z5Kt3qXedchgq0s,6878
24
+ cloe_nessy/integration/delta_loader/delta_loader.py,sha256=WOl44Udvo6hZ5PVFgabpehs8tt5nl9AYyDnnYBba5Ck,6872
23
25
  cloe_nessy/integration/delta_loader/delta_loader_factory.py,sha256=vB1cL6-Nc3SkLH1xtazMbMF1MnNYq8-g3GHZzRE3QmE,2251
24
26
  cloe_nessy/integration/delta_loader/delta_loader_metadata_table.py,sha256=G_EWUY76ZlbsPZB9LCGlOLVezk7DK6peYXEgt7-sTQE,1683
25
27
  cloe_nessy/integration/delta_loader/strategies/__init__.py,sha256=1o5fRWenL5KnUg1hf7kmTuTpG9pbMxchiQTub52Qvwo,255
26
28
  cloe_nessy/integration/delta_loader/strategies/delta_cdf_loader.py,sha256=FOOZqtMwp8_LoyG2ab2N19a074CFa2ArCEvNkl7wRWM,16682
27
29
  cloe_nessy/integration/delta_loader/strategies/delta_timestamp_loader.py,sha256=YYFH0DkdRPvITUc1JMgkmgIHjwDyZDCjqvEk2qhBMfE,6185
28
- cloe_nessy/integration/reader/__init__.py,sha256=J5vlORqHLBpHEvzIwfIjzN5xEdOat-8jlmdLcGj8nsA,239
29
- cloe_nessy/integration/reader/api_reader.py,sha256=3Mf-txOTJ1dXCzdNtRTLC8UKftKms4NxOoLVgzcc2eo,5691
30
- cloe_nessy/integration/reader/catalog_reader.py,sha256=7jFuqIPpuz03opULh2I0TCLPfW6AqkxjaW2kCc0oM1g,3292
31
- cloe_nessy/integration/reader/excel_reader.py,sha256=8KCqKBYFE6RGCiahJimQOAtbYZzaUzlnoslW9yca5P8,8035
30
+ cloe_nessy/integration/reader/__init__.py,sha256=NWQx-v6aKE8YOHhsxfeaZnMVq4KLKyRWXzUduf5aVsk,265
31
+ cloe_nessy/integration/reader/api_reader.py,sha256=FbOyfLVG1ryL2GC-MgE1uClHICsQKBj9yZbY4TG5qrk,19637
32
+ cloe_nessy/integration/reader/catalog_reader.py,sha256=DlnykmFjV_v8SCBh3qaCvf24QM-6TdMFVHx5Mqv7Nvs,4850
33
+ cloe_nessy/integration/reader/excel_reader.py,sha256=JGmxQ16ux0HT-MLvAUp-9XMdKUToMb7cdObciZNsYSs,8027
32
34
  cloe_nessy/integration/reader/exceptions.py,sha256=_A9jFpe_RIDZCGY76qzjic9bsshxns6yXPSl141dq1c,203
33
- cloe_nessy/integration/reader/file_reader.py,sha256=Za_DZKUq1vATp8kIS8uY9IDHiaReZO0k80rrPHAhi5A,8132
34
- cloe_nessy/integration/reader/reader.py,sha256=e2KVPePQme8SBQJEbL-3zpGasOgTiEvKFTslow2wGPw,1034
35
+ cloe_nessy/integration/reader/file_reader.py,sha256=t5zF-cmZo1X0a1rki6ry1rSiFEu5uXRP2rNGd90fwoY,8163
36
+ cloe_nessy/integration/reader/reader.py,sha256=YHriYkzsBduBjfI2FnP03VEo15a8UCRZ_sXtre8eaEs,1041
35
37
  cloe_nessy/integration/writer/__init__.py,sha256=3yzCAGiWZdQWtsbzlTih01sxVTJV2DDYwvl34lEAUlE,243
36
- cloe_nessy/integration/writer/catalog_writer.py,sha256=Gb-hMdADgO_uUJ7mZPHBYyNme2qXsdFFnzwo7GcShHM,2192
38
+ cloe_nessy/integration/writer/catalog_writer.py,sha256=dQeXmtfs7J6rP6Ye3OCvxBraFScFX_3SHs7Md58hEeM,5296
37
39
  cloe_nessy/integration/writer/file_writer.py,sha256=SUDbN13ZzDhbM8DpOGFgM_Gkg70To4L6Q182pXx2HRM,5454
38
40
  cloe_nessy/integration/writer/writer.py,sha256=elFPLFrWR-qVE9qnBtzzzhyRALLQcRVuOsPS0rNmRt4,1741
39
41
  cloe_nessy/integration/writer/delta_writer/__init__.py,sha256=h2CT6Hllmk0nodlek27uqwniCzVZKMkYcPGyG9K2Z24,164
40
42
  cloe_nessy/integration/writer/delta_writer/delta_append_writer.py,sha256=TbpW-j87_H9dcUza34uR6VWslJez406y3_5N1ip0SnM,4740
41
- cloe_nessy/integration/writer/delta_writer/delta_merge_writer.py,sha256=no2GOLqMAJd0fEy2mqMevMj_CvutcJPRmXJC2tD4icA,10112
43
+ cloe_nessy/integration/writer/delta_writer/delta_merge_writer.py,sha256=Yp_q_ycasW2_wwmzty_6fZeBVcW_0o8gLrr6F1gaUjQ,10195
42
44
  cloe_nessy/integration/writer/delta_writer/delta_table_operation_type.py,sha256=m4YFY9_WgaOcnpBviVt3Km-w3wf3NF25wPS-n0NBGcE,970
43
45
  cloe_nessy/integration/writer/delta_writer/delta_writer_base.py,sha256=upUtDZMzwYFU0kzmkelVgkpFToXkrypcR3h_jvGjz14,8596
44
46
  cloe_nessy/integration/writer/delta_writer/exceptions.py,sha256=xPmGiYV0xQXauln5Oh34E5vbm0rVcs6xCh-SJSb2bw0,107
@@ -46,10 +48,10 @@ cloe_nessy/logging/__init__.py,sha256=ySVCVbdyR3Dno_tl2ZfiER_7EVaDoQMHVkNyfdMZum
46
48
  cloe_nessy/logging/logger_mixin.py,sha256=H8MyMEyb_kEDP0Ow5QStAFLuOkTIeUnneGaj916fKlU,7443
47
49
  cloe_nessy/models/__init__.py,sha256=-FmWEJ1Oq1njSopjc0R7GmT64mLSmALkm8PkHNzy9Y8,327
48
50
  cloe_nessy/models/catalog.py,sha256=ayC1sMp4cNLAZtu0ICVV3Us6-o4hn8U9tpzzvxC9RAs,177
49
- cloe_nessy/models/column.py,sha256=t-MX9GMs7l5W0APvsUxiE1TI9SWkKdFKblmz24s4IHY,1995
51
+ cloe_nessy/models/column.py,sha256=W4V1Ls1d60VyZ1Ko9Yu9eSipcMbxSzKicn0aloHPiR0,2027
50
52
  cloe_nessy/models/constraint.py,sha256=hsFlhn4n928z81O3dl3v5bMetewPWzMjkJK3_4kASSM,178
51
53
  cloe_nessy/models/foreign_key.py,sha256=DwRVHs9sShqqPV-NL7ow_3AmPPWX0Od26yZn_I565pU,1001
52
- cloe_nessy/models/schema.py,sha256=yUrjjEhAH5zbCymE67Az_jPnVB8hGO-_UNfqzeZCD_Y,3376
54
+ cloe_nessy/models/schema.py,sha256=cNSrH7K4hLRrkg1E6fW6DUIBMZdR2A5B21POj5iQ4GA,3429
53
55
  cloe_nessy/models/table.py,sha256=3AUBUKLJv1x-xN9KYc5Ndjf-lAlT83rUYdhRKy8wFU4,12105
54
56
  cloe_nessy/models/types.py,sha256=XRbuJGdTNa6aXyE3IAzs_J9gVjbfkzMDLfGl-k6jI_4,223
55
57
  cloe_nessy/models/volume.py,sha256=51BE06FrL1Wv6zblFwJ_HTiR6WQqH7pSmrdH90rqwLg,2444
@@ -58,56 +60,56 @@ cloe_nessy/models/adapter/unity_catalog_adapter.py,sha256=a-14Ys-AevVYQd0xeJU1sy
58
60
  cloe_nessy/models/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
61
  cloe_nessy/models/mixins/read_instance_mixin.py,sha256=j5Y4aNWOh1jlskEaxNooZFJgPyxRmik00gAVLJnAaRs,4507
60
62
  cloe_nessy/models/mixins/template_loader_mixin.py,sha256=5MXhEGBFlq3dwZvINEyBowSlipNnVun2H_TmhI_fsS4,549
61
- cloe_nessy/models/templates/create_table.sql.j2,sha256=QWbiTXwmGaIlZUAIGL4pAlHkDbP9mq1vGAkdKCPOqm4,1669
63
+ cloe_nessy/models/templates/create_table.sql.j2,sha256=71JpUyUZ_ZYO2M0tfIrTXHR7JycypAGsELt2-2d3oO0,2479
62
64
  cloe_nessy/models/templates/create_volume.sql.j2,sha256=XIUf1cHcvAxcGTyhzUiv4xpQ1cfDw_ra3_FKmOuLoBs,289
63
65
  cloe_nessy/object_manager/__init__.py,sha256=3sle0vNpPwBOkycxA3XVS9m4XZf5LD3Qd4NGxdqcHno,186
64
- cloe_nessy/object_manager/table_manager.py,sha256=m6u_KFYCPoqq1hagwt3s7eQopjV2oOJNlmXDVAfku-k,12703
66
+ cloe_nessy/object_manager/table_manager.py,sha256=4eQG-zMiuBpeJmvWdL3KdhHRiPFf8TS0RFNRp8Yz6rY,13887
65
67
  cloe_nessy/object_manager/volume_manager.py,sha256=6epd3KXzcNH04EvaKubAfLsaUm9qBMeT3KNvMK04gGs,2727
66
68
  cloe_nessy/pipeline/__init__.py,sha256=sespmJ5JsgyiFyZiedTiL2kg--zGIX7cjTYsD5vemEg,325
67
69
  cloe_nessy/pipeline/pipeline.py,sha256=L4wk3b06LNWRj01nnAkuQpeRrwFTyaV1xTpgYAg4sak,10819
68
70
  cloe_nessy/pipeline/pipeline_action.py,sha256=S7IVFdmG12fRBzHuE_DiWn7qlMtApz6IloVd2Fj31Sg,1944
69
- cloe_nessy/pipeline/pipeline_config.py,sha256=BN3ZSbr6bC-X9edoh-n5vRfPHFMbgtAU7mQ3dBrcWO8,3131
70
- cloe_nessy/pipeline/pipeline_context.py,sha256=csElDc6BsynDUtRXgQOSCH7ONc_b-ag0YEg0zlQTz58,1874
71
- cloe_nessy/pipeline/pipeline_parsing_service.py,sha256=c_nAsgw81QYBM9AFiTxGgqRhNXABkDKplbeoCJPtbpE,6434
71
+ cloe_nessy/pipeline/pipeline_config.py,sha256=oVQ-IH4etTGZVVEnE-5iDPLYOtWpvDlltWFv1nevnqQ,3229
72
+ cloe_nessy/pipeline/pipeline_context.py,sha256=eCOcjyE16rGRom3L85Gy_BbncfQD6i1x31yrWqZws-4,1881
73
+ cloe_nessy/pipeline/pipeline_parsing_service.py,sha256=eeC4RbGBILGN6zkbUyjH-qGgEMtOWV4Kv_VxrHbHMY0,9021
72
74
  cloe_nessy/pipeline/pipeline_plotting_service.py,sha256=goMQj73FzUVchKn5c2SsPcWR6fr7DtVkVrcQfJsKCq4,13111
73
- cloe_nessy/pipeline/pipeline_step.py,sha256=UlnmpS6gm_dZ7m9dD1mZvye7mvUF_DA7HjOZo0oGYDU,1977
74
- cloe_nessy/pipeline/actions/__init__.py,sha256=RZ1UVSn9v88F4GKgHy6UYDzx8zSAMQScJLCeiHO5f8A,2802
75
- cloe_nessy/pipeline/actions/read_api.py,sha256=RBv5XeHtjTXuCP09Fqo6JNx6iIhQQI-nuAHCuSaGs2s,7778
76
- cloe_nessy/pipeline/actions/read_catalog_table.py,sha256=TBlJaXJAQwLtwvh7dXsX9ebNN3rS6En6951MnT8xGG8,4101
77
- cloe_nessy/pipeline/actions/read_excel.py,sha256=Mhl3r_2Hqk2XN7Fl5WqqAyE4JdnwSiivbhWMglyBtkE,7961
75
+ cloe_nessy/pipeline/pipeline_step.py,sha256=oTnlvRpB0fbOBQXbPe1URstA5fv-97igCHt_41fKCAk,2082
76
+ cloe_nessy/pipeline/actions/__init__.py,sha256=Qad9kxOQHoMQ1sj-4AxABNNIdaN5QkZAB14DUFKAtUA,2808
77
+ cloe_nessy/pipeline/actions/read_api.py,sha256=MAc7QfmhnaRUMdE09Ywt41RSAsuW4co8zF0zXHwbM8U,16193
78
+ cloe_nessy/pipeline/actions/read_catalog_table.py,sha256=EkP3JSI7VQMkvUsb97ieUeGnnfvyyUI7egvqNWMqK0I,6894
79
+ cloe_nessy/pipeline/actions/read_excel.py,sha256=IG_VmDEt1TvGVEO0SY9Fm3awHNjfisR1_7DUmhC3NEE,7968
78
80
  cloe_nessy/pipeline/actions/read_files.py,sha256=hRcM7wG35vxxLVajW3SK5euHW02qxiXCYSkIl11xiQ0,7308
79
- cloe_nessy/pipeline/actions/read_metadata_yaml.py,sha256=3ZDy9qiDYtM1oDQzHPC23hLOvHjhdk5zg1wVHE60m9k,2295
81
+ cloe_nessy/pipeline/actions/read_metadata_yaml.py,sha256=i8fQceV63eAqx_x0ANisCkXWfMHyhqsfFHVFH5yP2po,3544
80
82
  cloe_nessy/pipeline/actions/transform_change_datatype.py,sha256=24Tn6R3TvUkWCh8V6naLdyNbCbqvyPOOoer-hy_Ebq4,2077
81
83
  cloe_nessy/pipeline/actions/transform_clean_column_names.py,sha256=VxvWqENW63c50L96JA1V_ioe4By6gGzx_iY86njOXEM,3044
82
84
  cloe_nessy/pipeline/actions/transform_concat_columns.py,sha256=Nk8YbhxDnFZsWzW9Dj5Yl76Uq6VrcMlevQPHGms65L8,3777
83
85
  cloe_nessy/pipeline/actions/transform_convert_timestamp.py,sha256=2SL078tBcOmytDbt-cR81jZbclwqELsUB4XDLjaCnNo,3579
84
- cloe_nessy/pipeline/actions/transform_decode.py,sha256=JajMwHREtxa8u_1Q3RZDBVMjncoSel-WzQFVTO0MREg,4455
86
+ cloe_nessy/pipeline/actions/transform_decode.py,sha256=_TQc2GFcgdJvtt6BVrCe1xVnJiSHB_J6mEHH01xIKMY,4464
85
87
  cloe_nessy/pipeline/actions/transform_deduplication.py,sha256=SfTDrOL0TNSC4wITbozabC0jYvceTLnqU4urnEjYk9g,4910
86
88
  cloe_nessy/pipeline/actions/transform_distinct.py,sha256=c7aBxANyqT4aKhm0cSELDtD-bP0Se9vxlBF0K4AgQWs,1976
87
89
  cloe_nessy/pipeline/actions/transform_filter.py,sha256=Nz_ggRfKIcNzYFfFOsgq1QeatjdEis0up4I7cOWBdyo,1446
88
90
  cloe_nessy/pipeline/actions/transform_generic_sql.py,sha256=_naWfmPdYAUKjPNeHu5qJAohOL7DHCSYz_kwoeRv3OI,2741
89
91
  cloe_nessy/pipeline/actions/transform_group_aggregate.py,sha256=KUHeeP-RIDi34dpbsPEJkzea5zFJA6MuyjNpOsFud9o,4045
90
92
  cloe_nessy/pipeline/actions/transform_hash_columns.py,sha256=H8j_Xadnm3npVNA_nu7Be7v0bJV20ELKMxSsVHHl6CY,8407
91
- cloe_nessy/pipeline/actions/transform_join.py,sha256=e_tvMk8YJTAWcUK_EmOgNt0s31ICZoMX_MKOTWx4lBY,3645
93
+ cloe_nessy/pipeline/actions/transform_join.py,sha256=ez1M1wVc9khOZj1swMArJbBKXxEpjenUHrW1wL8H330,7200
92
94
  cloe_nessy/pipeline/actions/transform_json_normalize.py,sha256=petF7pnNq1EKc8MqVdG0weFALAHNILSe_eAu4Z5XxIo,4833
93
95
  cloe_nessy/pipeline/actions/transform_rename_columns.py,sha256=4zJcPCONMU4C67qeuzsrX3AORRRHoq_selUI7FJyeg0,1952
94
96
  cloe_nessy/pipeline/actions/transform_replace_values.py,sha256=1OPHTrjcphfyGepcO7ozYfeqfwA18pjlyHpVKUS_AAU,2049
95
97
  cloe_nessy/pipeline/actions/transform_select_columns.py,sha256=-GhSEsb7iNnZIsYRm3BG9BX4_qUDJMbpj1DsKPY046w,4574
96
- cloe_nessy/pipeline/actions/transform_union.py,sha256=s81Vge0AbYPc7VkskCYfOQ_LEjqcmfNFyDkytfjcZyo,2720
97
- cloe_nessy/pipeline/actions/write_catalog_table.py,sha256=vZ7bZcrZY47P_EVYNshMNZ34l7Orhs8Q9--5Ud5hhLI,2906
98
+ cloe_nessy/pipeline/actions/transform_union.py,sha256=SZtEzh567CIExUj9yMEgshE28h4dXKT7Wr2TDj4zB4k,2718
99
+ cloe_nessy/pipeline/actions/write_catalog_table.py,sha256=FyC0scQU8Ul3Uigpk6IN2IJpf_4jRjAqF5yHtDVwG00,4852
98
100
  cloe_nessy/pipeline/actions/write_delta_append.py,sha256=2F5qnKPsY_F-2672Ce4Gub7qdna157jEqHHc429fO2A,2962
99
- cloe_nessy/pipeline/actions/write_delta_merge.py,sha256=kQE4xLbVEUnpYImZLnpZxp88Tuf6VNSeU1W-zI8Wuvw,5805
101
+ cloe_nessy/pipeline/actions/write_delta_merge.py,sha256=zcOk4ytZFUxyGY8U2fdFPLFnw2g_yhaS_vOx_e3wCuE,5847
100
102
  cloe_nessy/pipeline/actions/write_file.py,sha256=JZ8UZslxUn_ttYt5wDyvtHFq2FqYk3vOR8kvExJI8pk,3212
101
103
  cloe_nessy/pipeline/utils/__init__.py,sha256=xi02UjBMiXWD7b9gDvww4gyRyowb0eRd_6Wbu0F_cro,118
102
104
  cloe_nessy/pipeline/utils/delta_load_utils.py,sha256=KitMNruxePEkecI0h4Jint1JwJpaEog5mCOchMkgan8,1495
103
- cloe_nessy/session/__init__.py,sha256=t7_YjUhJYW3km_FrucaUdbIl1boQtwkyhw_8yE10qzc,74
104
- cloe_nessy/session/session_manager.py,sha256=VCUPhACeN5armd4D0TqDeH4Ih9nu6XvXSREFqHUwt4s,9710
105
+ cloe_nessy/session/__init__.py,sha256=-MifkekjFu_3A9rWm30CGFQZ4yjruGaydNpbu3uq7Ww,155
106
+ cloe_nessy/session/pyspark_compat.py,sha256=NrgSWAaWz3GgMNLmzpY4cPgneQytNQlOq_dWrD1MveE,444
107
+ cloe_nessy/session/session_manager.py,sha256=d6qMTkaWJcN4QG261IoxIfQlNlB0ELtVNjTCNx2Elas,9717
105
108
  cloe_nessy/settings/__init__.py,sha256=ZbkneO3WaKOxon7qHFHnou7EnBOSnBFyKMDZblIEvzM,101
106
109
  cloe_nessy/settings/settings.py,sha256=I4n129lrujriW-d8q4as2Kb4_kI932ModfZ5Ow_UpVM,3653
107
110
  cloe_nessy/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
111
  cloe_nessy/utils/column_names.py,sha256=dCNtm61mc5aLkY2oE4rlfN3VLCrpot6fOESjAZmCmhA,361
109
112
  cloe_nessy/utils/file_and_directory_handler.py,sha256=r2EVt9xG81p6ScaJCwETC5an6pMT6WseB0jMOR-JlpU,602
110
- cloe_nessy-0.3.17.0.dist-info/METADATA,sha256=hR0GqdboYwzBrbZY_ese9kt250DIOHgMlAj3QOqLhF8,3292
111
- cloe_nessy-0.3.17.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
112
- cloe_nessy-0.3.17.0.dist-info/top_level.txt,sha256=Z7izn8HmQpg2wBUb-0jzaKlYKMU7Ypzuc9__9vPtW_I,11
113
- cloe_nessy-0.3.17.0.dist-info/RECORD,,
113
+ cloe_nessy-0.3.19.dist-info/METADATA,sha256=O3LES1mWSPONQE6q47c_j9s_sQcvU2a5RfL1WQW3JPk,3290
114
+ cloe_nessy-0.3.19.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
115
+ cloe_nessy-0.3.19.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -1 +0,0 @@
1
- cloe_nessy