etlplus 0.10.4__py3-none-any.whl → 0.12.2__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 (45) hide show
  1. etlplus/README.md +37 -0
  2. etlplus/api/README.md +20 -3
  3. etlplus/cli/README.md +40 -0
  4. etlplus/cli/commands.py +1 -1
  5. etlplus/cli/constants.py +1 -1
  6. etlplus/cli/handlers.py +1 -1
  7. etlplus/cli/io.py +2 -2
  8. etlplus/config/README.md +52 -0
  9. etlplus/config/pipeline.py +2 -2
  10. etlplus/database/README.md +48 -0
  11. etlplus/database/ddl.py +1 -1
  12. etlplus/database/engine.py +1 -1
  13. etlplus/database/schema.py +1 -1
  14. etlplus/enums.py +2 -270
  15. etlplus/extract.py +5 -7
  16. etlplus/file/README.md +105 -0
  17. etlplus/file/__init__.py +25 -0
  18. etlplus/file/avro.py +198 -0
  19. etlplus/file/core.py +287 -0
  20. etlplus/file/csv.py +91 -0
  21. etlplus/file/enums.py +238 -0
  22. etlplus/file/feather.py +144 -0
  23. etlplus/file/gz.py +123 -0
  24. etlplus/file/json.py +98 -0
  25. etlplus/file/ndjson.py +109 -0
  26. etlplus/file/orc.py +142 -0
  27. etlplus/file/parquet.py +146 -0
  28. etlplus/file/tsv.py +91 -0
  29. etlplus/file/txt.py +99 -0
  30. etlplus/file/xls.py +132 -0
  31. etlplus/file/xlsx.py +142 -0
  32. etlplus/file/xml.py +174 -0
  33. etlplus/file/yaml.py +136 -0
  34. etlplus/file/zip.py +175 -0
  35. etlplus/load.py +9 -12
  36. etlplus/run.py +6 -9
  37. etlplus/templates/README.md +46 -0
  38. etlplus/validation/README.md +50 -0
  39. {etlplus-0.10.4.dist-info → etlplus-0.12.2.dist-info}/METADATA +58 -14
  40. {etlplus-0.10.4.dist-info → etlplus-0.12.2.dist-info}/RECORD +44 -20
  41. etlplus/file.py +0 -652
  42. {etlplus-0.10.4.dist-info → etlplus-0.12.2.dist-info}/WHEEL +0 -0
  43. {etlplus-0.10.4.dist-info → etlplus-0.12.2.dist-info}/entry_points.txt +0 -0
  44. {etlplus-0.10.4.dist-info → etlplus-0.12.2.dist-info}/licenses/LICENSE +0 -0
  45. {etlplus-0.10.4.dist-info → etlplus-0.12.2.dist-info}/top_level.txt +0 -0
etlplus/run.py CHANGED
@@ -23,7 +23,6 @@ from .api import RetryPolicy
23
23
  from .api import Url
24
24
  from .config import load_pipeline_config
25
25
  from .enums import DataConnectorType
26
- from .enums import coerce_data_connector_type
27
26
  from .extract import extract
28
27
  from .load import load
29
28
  from .run_helpers import compose_api_request_env
@@ -185,8 +184,7 @@ def run(
185
184
 
186
185
  data: Any
187
186
  stype_raw = getattr(source_obj, 'type', None)
188
- stype = coerce_data_connector_type(stype_raw or '')
189
- match stype:
187
+ match DataConnectorType.coerce(stype_raw or ''):
190
188
  case DataConnectorType.FILE:
191
189
  path = getattr(source_obj, 'path', None)
192
190
  fmt = ex_opts.get('format') or getattr(
@@ -261,8 +259,8 @@ def run(
261
259
  sleep_seconds=cast(float, env.get('sleep_seconds', 0.0)),
262
260
  )
263
261
  case _:
264
- # ``coerce_data_connector_type`` already raises for invalid
265
- # connector types; this branch is defensive only.
262
+ # :meth:`coerce` already raises for invalid connector types, but
263
+ # keep explicit guard for defensive programming.
266
264
  raise ValueError(f'Unsupported source type: {stype_raw}')
267
265
 
268
266
  # DRY: unified validation helper (pre/post transform)
@@ -318,8 +316,7 @@ def run(
318
316
  overrides = job_obj.load.overrides or {}
319
317
 
320
318
  ttype_raw = getattr(target_obj, 'type', None)
321
- ttype = coerce_data_connector_type(ttype_raw or '')
322
- match ttype:
319
+ match DataConnectorType.coerce(ttype_raw or ''):
323
320
  case DataConnectorType.FILE:
324
321
  path = overrides.get('path') or getattr(target_obj, 'path', None)
325
322
  fmt = overrides.get('format') or getattr(
@@ -357,8 +354,8 @@ def run(
357
354
  )
358
355
  result = load(data, 'database', str(conn))
359
356
  case _:
360
- # ``coerce_data_connector_type`` already raises for invalid
361
- # connector types; this branch is defensive only.
357
+ # :meth:`coerce` already raises for invalid connector types, but
358
+ # keep explicit guard for defensive programming.
362
359
  raise ValueError(f'Unsupported target type: {ttype_raw}')
363
360
 
364
361
  # Return the terminal load result directly; callers (e.g., CLI) can wrap
@@ -0,0 +1,46 @@
1
+ # etlplus.templates subpackage
2
+
3
+ Documentation for the `etlplus.templates` subpackage: SQL and DDL template helpers.
4
+
5
+ - Provides Jinja2 templates for DDL and view generation
6
+ - Supports templated SQL for multiple database backends
7
+ - Includes helpers for rendering templates with schema metadata
8
+
9
+ Back to project overview: see the top-level [README](../../README.md).
10
+
11
+ - [etlplus.templates subpackage](#etlpustemplates-subpackage)
12
+ - [Available Templates](#available-templates)
13
+ - [Rendering Templates](#rendering-templates)
14
+ - [Example: Rendering a DDL Template](#example-rendering-a-ddl-template)
15
+ - [See Also](#see-also)
16
+
17
+ ## Available Templates
18
+
19
+ - `ddl.sql.j2`: Generic DDL (CREATE TABLE) template
20
+ - `view.sql.j2`: Generic view creation template
21
+
22
+ ## Rendering Templates
23
+
24
+ Use the helpers to render templates with your schema or table metadata:
25
+
26
+ ```python
27
+ from etlplus.templates import render_template
28
+
29
+ sql = render_template("ddl.sql.j2", schema=my_schema)
30
+ ```
31
+
32
+ ## Example: Rendering a DDL Template
33
+
34
+ ```python
35
+ from etlplus.templates import render_template
36
+
37
+ schema = {"name": "users", "columns": [ ... ]}
38
+ sql = render_template("ddl.sql.j2", schema=schema)
39
+ print(sql)
40
+ ```
41
+
42
+ ## See Also
43
+
44
+ - Top-level CLI and library usage in the main [README](../../README.md)
45
+ - DDL template in [ddl.sql.j2](ddl.sql.j2)
46
+ - View template in [view.sql.j2](view.sql.j2)
@@ -0,0 +1,50 @@
1
+ # etlplus.validation subpackage
2
+
3
+ Documentation for the `etlplus.validation` subpackage: data validation utilities and helpers.
4
+
5
+ - Provides flexible data validation for ETL pipelines
6
+ - Supports type checking, required fields, and custom rules
7
+ - Includes utilities for rule definition and validation logic
8
+
9
+ Back to project overview: see the top-level [README](../../README.md).
10
+
11
+ - [etlplus.validation subpackage](#etlplusvalidation-subpackage)
12
+ - [Validation Features](#validation-features)
13
+ - [Defining Validation Rules](#defining-validation-rules)
14
+ - [Example: Validating Data](#example-validating-data)
15
+ - [See Also](#see-also)
16
+
17
+ ## Validation Features
18
+
19
+ - Type checking (string, number, boolean, etc.)
20
+ - Required/optional fields
21
+ - Enum and pattern validation
22
+ - Custom rule support
23
+
24
+ ## Defining Validation Rules
25
+
26
+ Validation rules are defined as dictionaries specifying field types, requirements, and constraints:
27
+
28
+ ```python
29
+ rules = {
30
+ "name": {"type": "string", "required": True},
31
+ "age": {"type": "number", "min": 0, "max": 120},
32
+ }
33
+ ```
34
+
35
+ ## Example: Validating Data
36
+
37
+ ```python
38
+ from etlplus.validation import validate
39
+
40
+ result = validate({"name": "Alice", "age": 30}, rules)
41
+ if result["valid"]:
42
+ print("Data is valid!")
43
+ else:
44
+ print(result["errors"])
45
+ ```
46
+
47
+ ## See Also
48
+
49
+ - Top-level CLI and library usage in the main [README](../../README.md)
50
+ - Validation utilities in [utils.py](utils.py)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: etlplus
3
- Version: 0.10.4
3
+ Version: 0.12.2
4
4
  Summary: A Swiss Army knife for simple ETL operations
5
5
  Home-page: https://github.com/Dagitali/ETLPlus
6
6
  Author: ETLPlus Team
@@ -17,8 +17,11 @@ Classifier: Programming Language :: Python :: 3.14
17
17
  Requires-Python: >=3.13,<3.15
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
+ Requires-Dist: fastavro>=1.12.1
20
21
  Requires-Dist: jinja2>=3.1.6
22
+ Requires-Dist: openpyxl>=3.1.5
21
23
  Requires-Dist: pyodbc>=5.3.0
24
+ Requires-Dist: pyarrow>=22.0.0
22
25
  Requires-Dist: python-dotenv>=1.2.1
23
26
  Requires-Dist: pandas>=2.3.3
24
27
  Requires-Dist: pydantic>=2.12.5
@@ -26,6 +29,8 @@ Requires-Dist: PyYAML>=6.0.3
26
29
  Requires-Dist: requests>=2.32.5
27
30
  Requires-Dist: SQLAlchemy>=2.0.45
28
31
  Requires-Dist: typer>=0.21.0
32
+ Requires-Dist: xlrd>=2.0.2
33
+ Requires-Dist: xlwt>=1.3.0
29
34
  Provides-Extra: dev
30
35
  Requires-Dist: black>=25.9.0; extra == "dev"
31
36
  Requires-Dist: build>=1.2.2; extra == "dev"
@@ -59,6 +64,7 @@ ETLPlus is a veritable Swiss Army knife for enabling simple ETL operations, offe
59
64
  package and command-line interface for data extraction, validation, transformation, and loading.
60
65
 
61
66
  - [ETLPlus](#etlplus)
67
+ - [Getting Started](#getting-started)
62
68
  - [Features](#features)
63
69
  - [Installation](#installation)
64
70
  - [Quickstart](#quickstart)
@@ -87,11 +93,27 @@ package and command-line interface for data extraction, validation, transformati
87
93
  - [Linting](#linting)
88
94
  - [Updating Demo Snippets](#updating-demo-snippets)
89
95
  - [Releasing to PyPI](#releasing-to-pypi)
90
- - [Links](#links)
91
96
  - [License](#license)
92
97
  - [Contributing](#contributing)
98
+ - [Documentation](#documentation)
99
+ - [Python Packages/Subpackage](#python-packagessubpackage)
100
+ - [Community Health](#community-health)
101
+ - [Other](#other)
93
102
  - [Acknowledgments](#acknowledgments)
94
103
 
104
+ ## Getting Started
105
+
106
+ ETLPlus helps you extract, validate, transform, and load data from files, databases, and APIs, either
107
+ as a Python library or from the command line.
108
+
109
+ To get started:
110
+
111
+ - See [Installation](#installation) for setup instructions.
112
+ - Try the [Quickstart](#quickstart) for a minimal working example (CLI and Python).
113
+ - Explore [Usage](#usage) for more detailed options and workflows.
114
+
115
+ ETLPlus supports Python 3.13 and above.
116
+
95
117
  ## Features
96
118
 
97
119
  - **Check** data pipeline definitions before running them:
@@ -416,7 +438,7 @@ etlplus transform \
416
438
  # 3. Validate transformed data
417
439
  etlplus validate \
418
440
  --rules '{"name": {"type": "string", "required": true}, "email": {"type": "string", "required": true}}' \
419
- temo/sample_transformed.json
441
+ temp/sample_transformed.json
420
442
 
421
443
  # 4. Load to CSV
422
444
  cat temp/sample_transformed.json \
@@ -603,17 +625,6 @@ git push origin v1.4.0
603
625
  If you want an extra smoke-test before tagging, run `make dist && pip install dist/*.whl` locally;
604
626
  this exercises the same build path the workflow uses.
605
627
 
606
- ## Links
607
-
608
- - API client docs: [`etlplus/api/README.md`](etlplus/api/README.md)
609
- - Examples: [`examples/README.md`](examples/README.md)
610
- - Pipeline authoring guide: [`docs/pipeline-guide.md`](docs/pipeline-guide.md)
611
- - Runner internals: [`docs/run-module.md`](docs/run-module.md)
612
- - Design notes (Mapping inputs, dict outputs): [`docs/pipeline-guide.md#design-notes-mapping-inputs-dict-outputs`](docs/pipeline-guide.md#design-notes-mapping-inputs-dict-outputs)
613
- - Typing philosophy: [`CONTRIBUTING.md#typing-philosophy`](CONTRIBUTING.md#typing-philosophy)
614
- - Demo and walkthrough: [`DEMO.md`](DEMO.md)
615
- - Additional references: [`REFERENCES.md`](`REFERENCES.md)
616
-
617
628
  ## License
618
629
 
619
630
  This project is licensed under the [MIT License](LICENSE).
@@ -637,6 +648,39 @@ If you choose to be a code contributor, please first refer these documents:
637
648
  - Typing philosophy (TypedDicts as editor hints, permissive runtime):
638
649
  [`CONTRIBUTING.md#typing-philosophy`](CONTRIBUTING.md#typing-philosophy)
639
650
 
651
+ ## Documentation
652
+
653
+ ### Python Packages/Subpackage
654
+
655
+ Navigate to detailed documentation for each subpackage:
656
+
657
+ - [etlplus.api](etlplus/api/README.md): Lightweight HTTP client and paginated REST helpers
658
+ - [etlplus.file](etlplus/file/README.md): Unified file format support and helpers
659
+ - [etlplus.config](etlplus/config/README.md): Configuration helpers for connectors, pipelines, jobs,
660
+ and profiles
661
+ - [etlplus.cli](etlplus/cli/README.md): Command-line interface for ETLPlus workflows
662
+ - [etlplus.database](etlplus/database/README.md): Database engine, schema, and ORM helpers
663
+ - [etlplus.templates](etlplus/templates/README.md): SQL and DDL template helpers
664
+ - [etlplus.validation](etlplus/validation/README.md): Data validation utilities and helpers
665
+
666
+ ### Community Health
667
+
668
+ - [Contributing Guidelines](CONTRIBUTING.md): How to contribute, report issues, and submit PRs
669
+ - [Code of Conduct](CODE_OF_CONDUCT.md): Community standards and expectations
670
+ - [Security Policy](SECURITY.md): Responsible disclosure and vulnerability reporting
671
+ - [Support](SUPPORT.md): Where to get help
672
+
673
+ ### Other
674
+
675
+ - API client docs: [`etlplus/api/README.md`](etlplus/api/README.md)
676
+ - Examples: [`examples/README.md`](examples/README.md)
677
+ - Pipeline authoring guide: [`docs/pipeline-guide.md`](docs/pipeline-guide.md)
678
+ - Runner internals: [`docs/run-module.md`](docs/run-module.md)
679
+ - Design notes (Mapping inputs, dict outputs): [`docs/pipeline-guide.md#design-notes-mapping-inputs-dict-outputs`](docs/pipeline-guide.md#design-notes-mapping-inputs-dict-outputs)
680
+ - Typing philosophy: [`CONTRIBUTING.md#typing-philosophy`](CONTRIBUTING.md#typing-philosophy)
681
+ - Demo and walkthrough: [`DEMO.md`](DEMO.md)
682
+ - Additional references: [`REFERENCES.md`](REFERENCES.md)
683
+
640
684
  ## Acknowledgments
641
685
 
642
686
  ETLPlus is inspired by common work patterns in data engineering and software engineering patterns in
@@ -1,19 +1,19 @@
1
+ etlplus/README.md,sha256=5jNes37UIy_THNmUr5HSAyS5mTCTa5tqRfEPnvsgV4s,1455
1
2
  etlplus/__init__.py,sha256=M2gScnyir6WOMAh_EuoQIiAzdcTls0_5hbd_Q6of8I0,1021
2
3
  etlplus/__main__.py,sha256=btoROneNiigyfBU7BSzPKZ1R9gzBMpxcpsbPwmuHwTM,479
3
4
  etlplus/__version__.py,sha256=1E0GMK_yUWCMQFKxXjTvyMwofi0qT2k4CDNiHWiymWE,327
4
- etlplus/enums.py,sha256=8hzprOLyeCCzlHaXpG4VfgmxPSEdlZeOnHLFzBneKNs,15969
5
- etlplus/extract.py,sha256=f44JdHhNTACxgn44USx05paKTwq7LQY-V4wANCW9hVM,6173
6
- etlplus/file.py,sha256=B-zebTrIFDKaaKzA9Fq5-L0JwDNYa2T--_6veR3N03s,17939
7
- etlplus/load.py,sha256=R_y0_vtsEo1bwxWVQu2bfhB5ZIJoIoWu2ycCdvY4RnE,8737
5
+ etlplus/enums.py,sha256=WyxpUEUPdYdXlueKDXGaSEo7o9OqCXyzjDOOPqmW8tw,8326
6
+ etlplus/extract.py,sha256=LOyL8_KCOaIGemTxSnKbN_ttfLWUljqT4OQxANe7G3k,6089
7
+ etlplus/load.py,sha256=aufl-2CpuI_J1hKBY1uFsoVf9Gfl9bKQjs233dYFf00,8631
8
8
  etlplus/mixins.py,sha256=ifGpHwWv7U00yqGf-kN93vJax2IiK4jaGtTsPsO3Oak,1350
9
9
  etlplus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- etlplus/run.py,sha256=X4kp5FQlIWVf1_d9oSrchKau7BFDCE1Zkscvu7WPaWw,12340
10
+ etlplus/run.py,sha256=FjcMF56HUbSw2PAvB_dZWP-xTFP-Pa_QLYTsrjmFurw,12262
11
11
  etlplus/run_helpers.py,sha256=bj6MkaeFxjl3CeKG1HoXKx5DwAlXNERVW-GX-z1P_qQ,24373
12
12
  etlplus/transform.py,sha256=uAUVDDHYCgx7GpVez9IK3OAZM-CnCuMa9iox3vwGGJA,25296
13
13
  etlplus/types.py,sha256=1hsDlnF6r76zAwaUYay-i6pCM-Y0IU5nP7Crj8PLCQ4,6157
14
14
  etlplus/utils.py,sha256=BMLTWAvCJj3zLEcffBgURYnu0UGhhXsfH2WWpAt7fV8,13363
15
15
  etlplus/validate.py,sha256=7rJoEI_SIILdPpoBqqh2UJqg9oeReDz34mYSlc3t7Qg,12989
16
- etlplus/api/README.md,sha256=ZiyjxLz0LfFCzeYKXwtH8yY1OJ4hXCju7t2ICroFoU8,7215
16
+ etlplus/api/README.md,sha256=aGTbcL-EqaiMTS7GToibmeTIzjX-viP2OtUDfIJnZEo,7913
17
17
  etlplus/api/__init__.py,sha256=P2JUYFy6Ep4t6xnsBiCBfQCkQLHYYhA-yXPXCobS8Y0,4295
18
18
  etlplus/api/auth.py,sha256=GOO5on-LoMS1GXTAhtK9rFcfpjbBcNeA6NE5UZwIq0g,12158
19
19
  etlplus/api/config.py,sha256=wRpOaZ31sPReVzEMme0jKl_37nqgraESwuYSNxP_xDo,17397
@@ -30,36 +30,60 @@ etlplus/api/pagination/paginator.py,sha256=wtdY_er4yfjx5yTUQJ1gPq-IuWmpLAHeG5buB
30
30
  etlplus/api/rate_limiting/__init__.py,sha256=ZySB1dZettEDnWvI1EHf_TZ9L08M_kKsNR-Y_lbU6kI,1070
31
31
  etlplus/api/rate_limiting/config.py,sha256=2b4wIynblN-1EyMqI4aXa71SljzSjXYh5N1Nngr3jOg,9406
32
32
  etlplus/api/rate_limiting/rate_limiter.py,sha256=Uxozqd_Ej5Lsj-M-mLT2WexChgWh7x35_YP10yqYPQA,7159
33
+ etlplus/cli/README.md,sha256=rl9VYNH5MluV0rh-eP7TbxJZ5BTMEIaksxhl_JXpYio,1233
33
34
  etlplus/cli/__init__.py,sha256=J97-Rv931IL1_b4AXnB7Fbbd7HKnHBpx18NQfC_kE6c,299
34
- etlplus/cli/commands.py,sha256=BK2qmFsser6AXOgEvpiadrYMIiwviAzqkSxMlBhRXRw,24670
35
- etlplus/cli/constants.py,sha256=KIZj7J2tNf5mJbkqAdZmu5FXYW2FQmxwgeOKWc3-3Hg,1944
36
- etlplus/cli/handlers.py,sha256=K0GazvrPgocJ-63HZqF0xhyJk8TB1Gcj-eIbWltXKRU,17759
37
- etlplus/cli/io.py,sha256=7sldiZz4-Geomge5IO_XYykXPa6UiORfUWzLCdQePG8,7846
35
+ etlplus/cli/commands.py,sha256=g8_m3A8HEMyTRu2HctNiRoi2gtB5oSZCUEcyq-PIXos,24669
36
+ etlplus/cli/constants.py,sha256=E6Uy4WauLa_0zkzxqImXh-bb1gKdb9sBZQVc8QOzr2Q,1943
37
+ etlplus/cli/handlers.py,sha256=FvnYWKRg4u7iCcIvAJtpjDEbqw2DHj3G34NXJbMwnHk,17754
38
+ etlplus/cli/io.py,sha256=EFaBPYaBOyOllfMQWXgTjy-MPiGfNejicpD7ROrPyAE,7840
38
39
  etlplus/cli/main.py,sha256=IgeqxypixfwLHR-QcpgVMQ7vMZ865bXOh2oO9v-BWeM,5234
39
40
  etlplus/cli/options.py,sha256=vfXT3YLh7wG1iC-aTdSg6ItMC8l6n0Lozmy53XjqLbA,1199
40
41
  etlplus/cli/state.py,sha256=Pfd8ru0wYIN7eGp1_A0tioqs1LiCDZCuJ6AnjZb6yYQ,8027
41
42
  etlplus/cli/types.py,sha256=tclhKVJXDqHzlTQBYKARfqMgDOcuBJ-Zej2pvFy96WM,652
43
+ etlplus/config/README.md,sha256=ot6oFZxTz4x83mj1_FrQ13dO0z2QkRFDnkCkx7NPsSs,1636
42
44
  etlplus/config/__init__.py,sha256=VZWzOg7d2YR9NT6UwKTv44yf2FRUMjTHynkm1Dl5Qzo,1486
43
45
  etlplus/config/connector.py,sha256=0-TIwevHbKRHVmucvyGpPd-3tB1dKHB-dj0yJ6kq5eY,9809
44
46
  etlplus/config/jobs.py,sha256=hmzRCqt0OvCEZZR4ONKrd3lvSv0OmayjLc4yOBk3ug8,7399
45
- etlplus/config/pipeline.py,sha256=Va4MQY6KEyKqHGMKPmh09ZcGpx95br-iNUjpkqtzVbw,9500
47
+ etlplus/config/pipeline.py,sha256=m4Jh0ctFcKrIx6zR7LEC0sYY5wq0o8NqOruWPlz6qmA,9494
46
48
  etlplus/config/profile.py,sha256=Ss2zedQGjkaGSpvBLTD4SZaWViMJ7TJPLB8Q2_BTpPg,1898
47
49
  etlplus/config/types.py,sha256=a0epJ3z16HQ5bY3Ctf8s_cQPa3f0HHcwdOcjCP2xoG4,4954
48
50
  etlplus/config/utils.py,sha256=4SUHMkt5bKBhMhiJm-DrnmE2Q4TfOgdNCKz8PJDS27o,3443
51
+ etlplus/database/README.md,sha256=nUQVwLwGzmpA5_u4oYJYkPIhIuJAIdWsoeRgr4joAIE,1431
49
52
  etlplus/database/__init__.py,sha256=AKJsDl2RHuRGPS-eXgNJeh4aSncJP5Y0yLApBF6i7i8,1052
50
- etlplus/database/ddl.py,sha256=z9KvHi1MPhPBLHxMDdqJgLTp3A2-lcz0gqhZ7HIE6kU,7916
51
- etlplus/database/engine.py,sha256=7rr7YndA8LwyWJL8k1YhQbqxxmW4gWEUQjp0NwQcYtc,4061
53
+ etlplus/database/ddl.py,sha256=0dEM9SJMMabkhI_h-Fc0j9a1Sl5lSyZdI0bIeBVGm10,7913
54
+ etlplus/database/engine.py,sha256=PUxXLvLPyc-KaxuW7fXe12wYci7EvUp-Ad1H3bGhUog,4058
52
55
  etlplus/database/orm.py,sha256=gCSqH-CjQz6tV9133-VqgiwokK5ylun0BwXaIWfImAo,10008
53
- etlplus/database/schema.py,sha256=HNTgglI8qvQLInr7gq--2lLmLKHzAZTL2MJUOIw9DlY,7025
56
+ etlplus/database/schema.py,sha256=813C0Dd3WE53KTYot4dgjAxctgKXLXx-8_Rk_4r2e28,7022
54
57
  etlplus/database/types.py,sha256=_pkQyC14TzAlgyeIqZG4F5LWYknZbHw3TW68Auk7Ya0,795
58
+ etlplus/file/README.md,sha256=avWnyeKfs3uP3qa-DVBJ6t05jS2oFUPeQ3xf1Ph0eC0,3626
59
+ etlplus/file/__init__.py,sha256=X03bosSM-uSd6dh3ur0un6_ozFRw2Tm4PE6kVUjtXK8,475
60
+ etlplus/file/avro.py,sha256=CsHJ8spxfGPgGwGsOLBS5_-sEvXAF23bTwEvFo46X9E,5007
61
+ etlplus/file/core.py,sha256=BkCliUez8SBEgpagxSeDbJixnX9QvD5XQp0dbYOOw0k,8692
62
+ etlplus/file/csv.py,sha256=ZH4M98F_Xm97YC5EYADmAMddshyh0gZFDOjiBmU9oC4,2007
63
+ etlplus/file/enums.py,sha256=rwrbwj6PejG0c5v6jzcsmeNu9cSqDyWB1foIuM5UyJo,6648
64
+ etlplus/file/feather.py,sha256=zCjrnc34v6SdgZJv7AaKbrhl0rAIkmjRwiLIB-QIWlw,3426
65
+ etlplus/file/gz.py,sha256=NKsvIV7TIWn8USbvuZmRH9hr6OrXh4TzTfDykHD41Kk,2631
66
+ etlplus/file/json.py,sha256=_KAXb4rZ1C8xnaV10IkihuFh1lhbWvajFOlMrBCNVjQ,2099
67
+ etlplus/file/ndjson.py,sha256=gT-kgcqCUUSxtm2j-JMejoh65jk-njMvFwxKCquLZw0,2393
68
+ etlplus/file/orc.py,sha256=LRQocbfXqvAldegXXj2Q8jfNmqbZIZWaHMJOQtqx3vI,3356
69
+ etlplus/file/parquet.py,sha256=7oHwAxaNMRTXBXeVgn-h8yvkDnlT1g1SG_OmPdbM4Fo,3525
70
+ etlplus/file/tsv.py,sha256=WAZpyGCzjqVJpBURgB2QXbC8AKpJrEq7InDQitKFmh8,2039
71
+ etlplus/file/txt.py,sha256=BStC7crpkGT4qddEeAD1_1mi_2-vQSXLj2DI-ddPFQE,2206
72
+ etlplus/file/xls.py,sha256=9LyjIdoj-pRpro7x83ogT58BjKJerynZmBxWMndVX2s,3055
73
+ etlplus/file/xlsx.py,sha256=2xvEVY9i10xVm_6y_nxct8LXU7oYo_ShgTXbV2LGmdM,3397
74
+ etlplus/file/xml.py,sha256=rYtCPvyLn9djClN2xKeqRCPsMXnvCH4R8zj94NJRdQc,4018
75
+ etlplus/file/yaml.py,sha256=pWJf0rWyiRpOVOBAwVOosPsdIzuywZ_Cv8_tXLZ6RFw,3183
76
+ etlplus/file/zip.py,sha256=nd26V3S0edklriKnKOGDTLlO8RBXTda_zLLEQrJgKL4,4185
77
+ etlplus/templates/README.md,sha256=kHSZ8FWcrlrcWz0hBIbho-k1Bi-PL-DQ7g02o-g70c8,1355
55
78
  etlplus/templates/__init__.py,sha256=tsniN7XJYs3NwYxJ6c2HD5upHP3CDkLx-bQCMt97UOM,106
56
79
  etlplus/templates/ddl.sql.j2,sha256=s8fMWvcb4eaJVXkifuib1aQPljtZ8buuyB_uA-ZdU3Q,4734
57
80
  etlplus/templates/view.sql.j2,sha256=Iy8DHfhq5yyvrUKDxqp_aHIEXY4Tm6j4wT7YDEFWAhk,2180
81
+ etlplus/validation/README.md,sha256=qusyiyJu2DsaK80jlwfXVZ0iDgeuTPOX2EL3a_fcFiw,1401
58
82
  etlplus/validation/__init__.py,sha256=Pe5Xg1_EA4uiNZGYu5WTF3j7odjmyxnAJ8rcioaplSQ,1254
59
83
  etlplus/validation/utils.py,sha256=Mtqg449VIke0ziy_wd2r6yrwJzQkA1iulZC87FzXMjo,10201
60
- etlplus-0.10.4.dist-info/licenses/LICENSE,sha256=MuNO63i6kWmgnV2pbP2SLqP54mk1BGmu7CmbtxMmT-U,1069
61
- etlplus-0.10.4.dist-info/METADATA,sha256=M_lQUZ5o-JaD1KuZk_t0LeHbaOj_SdqqaJQSbDCW-zY,21036
62
- etlplus-0.10.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
63
- etlplus-0.10.4.dist-info/entry_points.txt,sha256=6w-2-jzuPa55spzK34h-UKh2JTEShh38adFRONNP9QE,45
64
- etlplus-0.10.4.dist-info/top_level.txt,sha256=aWWF-udn_sLGuHTM6W6MLh99ArS9ROkUWO8Mi8y1_2U,8
65
- etlplus-0.10.4.dist-info/RECORD,,
84
+ etlplus-0.12.2.dist-info/licenses/LICENSE,sha256=MuNO63i6kWmgnV2pbP2SLqP54mk1BGmu7CmbtxMmT-U,1069
85
+ etlplus-0.12.2.dist-info/METADATA,sha256=y2wnRX4-3zOF5lWbXfsH3W6dmaaH0iQz9Dovws7wkEc,22878
86
+ etlplus-0.12.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
87
+ etlplus-0.12.2.dist-info/entry_points.txt,sha256=6w-2-jzuPa55spzK34h-UKh2JTEShh38adFRONNP9QE,45
88
+ etlplus-0.12.2.dist-info/top_level.txt,sha256=aWWF-udn_sLGuHTM6W6MLh99ArS9ROkUWO8Mi8y1_2U,8
89
+ etlplus-0.12.2.dist-info/RECORD,,