etlplus 0.9.2__py3-none-any.whl → 0.10.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 (120) hide show
  1. etlplus/__init__.py +26 -1
  2. etlplus/api/README.md +3 -51
  3. etlplus/api/__init__.py +0 -10
  4. etlplus/api/config.py +28 -39
  5. etlplus/api/endpoint_client.py +3 -3
  6. etlplus/api/pagination/client.py +1 -1
  7. etlplus/api/rate_limiting/config.py +1 -13
  8. etlplus/api/rate_limiting/rate_limiter.py +11 -8
  9. etlplus/api/request_manager.py +6 -11
  10. etlplus/api/transport.py +2 -14
  11. etlplus/api/types.py +6 -96
  12. etlplus/cli/commands.py +43 -76
  13. etlplus/cli/constants.py +1 -1
  14. etlplus/cli/handlers.py +12 -40
  15. etlplus/cli/io.py +2 -2
  16. etlplus/cli/main.py +1 -1
  17. etlplus/cli/state.py +7 -4
  18. etlplus/{workflow → config}/__init__.py +23 -10
  19. etlplus/{workflow → config}/connector.py +44 -58
  20. etlplus/{workflow → config}/jobs.py +32 -105
  21. etlplus/{workflow → config}/pipeline.py +51 -59
  22. etlplus/{workflow → config}/profile.py +5 -8
  23. etlplus/config/types.py +204 -0
  24. etlplus/config/utils.py +120 -0
  25. etlplus/database/ddl.py +1 -1
  26. etlplus/database/engine.py +3 -19
  27. etlplus/database/orm.py +0 -2
  28. etlplus/database/schema.py +1 -1
  29. etlplus/enums.py +288 -0
  30. etlplus/{ops/extract.py → extract.py} +99 -81
  31. etlplus/file.py +652 -0
  32. etlplus/{ops/load.py → load.py} +101 -78
  33. etlplus/{ops/run.py → run.py} +127 -159
  34. etlplus/{api/utils.py → run_helpers.py} +153 -209
  35. etlplus/{ops/transform.py → transform.py} +68 -75
  36. etlplus/types.py +4 -5
  37. etlplus/utils.py +2 -136
  38. etlplus/{ops/validate.py → validate.py} +12 -22
  39. etlplus/validation/__init__.py +44 -0
  40. etlplus/{ops → validation}/utils.py +17 -53
  41. {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/METADATA +17 -210
  42. etlplus-0.10.2.dist-info/RECORD +65 -0
  43. {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/WHEEL +1 -1
  44. etlplus/README.md +0 -37
  45. etlplus/api/enums.py +0 -51
  46. etlplus/cli/README.md +0 -40
  47. etlplus/database/README.md +0 -48
  48. etlplus/file/README.md +0 -105
  49. etlplus/file/__init__.py +0 -25
  50. etlplus/file/_imports.py +0 -141
  51. etlplus/file/_io.py +0 -160
  52. etlplus/file/accdb.py +0 -78
  53. etlplus/file/arrow.py +0 -78
  54. etlplus/file/avro.py +0 -176
  55. etlplus/file/bson.py +0 -77
  56. etlplus/file/cbor.py +0 -78
  57. etlplus/file/cfg.py +0 -79
  58. etlplus/file/conf.py +0 -80
  59. etlplus/file/core.py +0 -322
  60. etlplus/file/csv.py +0 -79
  61. etlplus/file/dat.py +0 -78
  62. etlplus/file/dta.py +0 -77
  63. etlplus/file/duckdb.py +0 -78
  64. etlplus/file/enums.py +0 -343
  65. etlplus/file/feather.py +0 -111
  66. etlplus/file/fwf.py +0 -77
  67. etlplus/file/gz.py +0 -123
  68. etlplus/file/hbs.py +0 -78
  69. etlplus/file/hdf5.py +0 -78
  70. etlplus/file/ini.py +0 -79
  71. etlplus/file/ion.py +0 -78
  72. etlplus/file/jinja2.py +0 -78
  73. etlplus/file/json.py +0 -98
  74. etlplus/file/log.py +0 -78
  75. etlplus/file/mat.py +0 -78
  76. etlplus/file/mdb.py +0 -78
  77. etlplus/file/msgpack.py +0 -78
  78. etlplus/file/mustache.py +0 -78
  79. etlplus/file/nc.py +0 -78
  80. etlplus/file/ndjson.py +0 -108
  81. etlplus/file/numbers.py +0 -75
  82. etlplus/file/ods.py +0 -79
  83. etlplus/file/orc.py +0 -111
  84. etlplus/file/parquet.py +0 -113
  85. etlplus/file/pb.py +0 -78
  86. etlplus/file/pbf.py +0 -77
  87. etlplus/file/properties.py +0 -78
  88. etlplus/file/proto.py +0 -77
  89. etlplus/file/psv.py +0 -79
  90. etlplus/file/rda.py +0 -78
  91. etlplus/file/rds.py +0 -78
  92. etlplus/file/sas7bdat.py +0 -78
  93. etlplus/file/sav.py +0 -77
  94. etlplus/file/sqlite.py +0 -78
  95. etlplus/file/stub.py +0 -84
  96. etlplus/file/sylk.py +0 -77
  97. etlplus/file/tab.py +0 -81
  98. etlplus/file/toml.py +0 -78
  99. etlplus/file/tsv.py +0 -80
  100. etlplus/file/txt.py +0 -102
  101. etlplus/file/vm.py +0 -78
  102. etlplus/file/wks.py +0 -77
  103. etlplus/file/xls.py +0 -88
  104. etlplus/file/xlsm.py +0 -79
  105. etlplus/file/xlsx.py +0 -99
  106. etlplus/file/xml.py +0 -185
  107. etlplus/file/xpt.py +0 -78
  108. etlplus/file/yaml.py +0 -95
  109. etlplus/file/zip.py +0 -175
  110. etlplus/file/zsav.py +0 -77
  111. etlplus/ops/README.md +0 -50
  112. etlplus/ops/__init__.py +0 -61
  113. etlplus/templates/README.md +0 -46
  114. etlplus/workflow/README.md +0 -52
  115. etlplus/workflow/dag.py +0 -105
  116. etlplus/workflow/types.py +0 -115
  117. etlplus-0.9.2.dist-info/RECORD +0 -134
  118. {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/entry_points.txt +0 -0
  119. {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/licenses/LICENSE +0 -0
  120. {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/top_level.txt +0 -0
etlplus/ops/__init__.py DELETED
@@ -1,61 +0,0 @@
1
- """
2
- :mod:`etlplus.ops` package.
3
-
4
- Data operations helpers.
5
-
6
- Importing :mod:`etlplus.ops` exposes the coarse-grained helpers most users care
7
- about: ``extract``, ``transform``, ``load``, ``validate``, ``run``, and
8
- ``run_pipeline``. Each helper delegates to the richer modules under
9
- ``etlplus.ops.*`` while presenting a compact public API surface. Conditional
10
- validation orchestration is available via
11
- :func:`etlplus.ops.utils.maybe_validate`. The legacy compatibility module
12
- :mod:`etlplus.ops.__init__validation` is deprecated in favor of this package.
13
-
14
- Examples
15
- --------
16
- >>> from etlplus.ops import extract, transform
17
- >>> raw = extract('file', 'input.json')
18
- >>> curated = transform(raw, {'select': ['id', 'name']})
19
-
20
- >>> from etlplus.ops.utils import maybe_validate
21
- >>> payload = {'name': 'Alice'}
22
- >>> rules = {'required': ['name']}
23
- >>> def validator(data, config):
24
- ... missing = [field for field in config['required'] if field not in data]
25
- ... return {'valid': not missing, 'errors': missing, 'data': data}
26
- >>> maybe_validate(
27
- ... payload,
28
- ... when='both',
29
- ... enabled=True,
30
- ... rules=rules,
31
- ... phase='before_transform',
32
- ... severity='warn',
33
- ... validate_fn=validator,
34
- ... print_json_fn=lambda message: message,
35
- ... )
36
- {'name': 'Alice'}
37
-
38
- See Also
39
- --------
40
- :mod:`etlplus.ops.run`
41
- :mod:`etlplus.ops.utils`
42
- """
43
-
44
- from .extract import extract
45
- from .load import load
46
- from .run import run
47
- from .run import run_pipeline
48
- from .transform import transform
49
- from .validate import validate
50
-
51
- # SECTION: EXPORTS ========================================================== #
52
-
53
-
54
- __all__ = [
55
- 'extract',
56
- 'load',
57
- 'run',
58
- 'run_pipeline',
59
- 'transform',
60
- 'validate',
61
- ]
@@ -1,46 +0,0 @@
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](#etlplus-templates-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)
@@ -1,52 +0,0 @@
1
- # `etlplus.workflow` Subpackage
2
-
3
- Documentation for the `etlplus.workflow` subpackage: configuration helpers for connectors,
4
- pipelines, jobs, and profiles.
5
-
6
- - Provides classes and utilities for managing ETL pipeline configuration
7
- - Supports YAML/JSON config loading and validation
8
- - Includes helpers for connectors, jobs, pipelines, and profiles
9
- - Exposes type definitions for config schemas
10
-
11
- Back to project overview: see the top-level [README](../../README.md).
12
-
13
- - [`etlplus.workflow` Subpackage](#etlplusworkflow-subpackage)
14
- - [Supported Configuration Types](#supported-configuration-types)
15
- - [Loading and Validating Configs](#loading-and-validating-configs)
16
- - [Example: Loading a Pipeline Config](#example-loading-a-pipeline-config)
17
- - [See Also](#see-also)
18
-
19
- ## Supported Configuration Types
20
-
21
- - **Connector**: Connection details for databases, files, or APIs
22
- - **Job**: ETL job definitions and scheduling
23
- - **Pipeline**: End-to-end pipeline configuration
24
- - **Profile**: User or environment-specific settings
25
-
26
- ## Loading and Validating Configs
27
-
28
- Use the provided classes to load and validate configuration files:
29
-
30
- ```python
31
- from etlplus.workflow import PipelineConfig
32
-
33
- cfg = PipelineConfig.from_yaml("pipeline.yml")
34
- ```
35
-
36
- - Supports YAML and JSON formats
37
- - Validates against expected schema
38
-
39
- ## Example: Loading a Pipeline Config
40
-
41
- ```python
42
- from etlplus.workflow import PipelineConfig
43
-
44
- pipeline = PipelineConfig.from_yaml("configs/pipeline.yml")
45
- print(pipeline)
46
- ```
47
-
48
- ## See Also
49
-
50
- - Top-level CLI and library usage in the main [README](../../README.md)
51
- - Config type definitions in [types.py](types.py)
52
- - Config utilities in [utils.py](utils.py)
etlplus/workflow/dag.py DELETED
@@ -1,105 +0,0 @@
1
- """
2
- :mod:`etlplus.workflow.dag` module.
3
-
4
- Lightweight directed acyclic graph (DAG) helpers for ordering jobs based on
5
- :attr:`depends_on`.
6
- """
7
-
8
- from __future__ import annotations
9
-
10
- from collections import deque
11
- from dataclasses import dataclass
12
-
13
- from .jobs import JobConfig
14
-
15
- # SECTION: EXPORTS ========================================================== #
16
-
17
-
18
- __all__ = [
19
- # Errors
20
- 'DagError',
21
- # Functions
22
- 'topological_sort_jobs',
23
- ]
24
-
25
-
26
- # SECTION: ERRORS =========================================================== #
27
-
28
-
29
- @dataclass(slots=True)
30
- class DagError(ValueError):
31
- """
32
- Raised when the job dependency graph is invalid.
33
-
34
- Attributes
35
- ----------
36
- message : str
37
- Error message.
38
- """
39
-
40
- # -- Attributes -- #
41
-
42
- message: str
43
-
44
- # -- Magic Methods (Object Representation) -- #
45
-
46
- def __str__(self) -> str:
47
- return self.message
48
-
49
-
50
- # SECTION: FUNCTIONS ======================================================== #
51
-
52
-
53
- def topological_sort_jobs(
54
- jobs: list[JobConfig],
55
- ) -> list[JobConfig]:
56
- """
57
- Return jobs in topological order based on :attr:`depends_on`.
58
-
59
- Parameters
60
- ----------
61
- jobs : list[JobConfig]
62
- List of job configurations to sort.
63
-
64
- Returns
65
- -------
66
- list[JobConfig]
67
- Jobs sorted in topological order.
68
-
69
- Raises
70
- ------
71
- DagError
72
- If a dependency is missing, self-referential, or when a cycle is
73
- detected.
74
- """
75
- index = {job.name: job for job in jobs}
76
- edges: dict[str, set[str]] = {name: set() for name in index}
77
- indegree: dict[str, int] = {name: 0 for name in index}
78
-
79
- for job in jobs:
80
- for dep in job.depends_on:
81
- if dep not in index:
82
- raise DagError(
83
- f'Unknown dependency "{dep}" in job "{job.name}"',
84
- )
85
- if dep == job.name:
86
- raise DagError(f'Job "{job.name}" depends on itself')
87
- if job.name not in edges[dep]:
88
- edges[dep].add(job.name)
89
- indegree[job.name] += 1
90
-
91
- queue = deque(sorted(name for name, deg in indegree.items() if deg == 0))
92
- ordered: list[str] = []
93
-
94
- while queue:
95
- name = queue.popleft()
96
- ordered.append(name)
97
- for child in sorted(edges[name]):
98
- indegree[child] -= 1
99
- if indegree[child] == 0:
100
- queue.append(child)
101
-
102
- if len(ordered) != len(jobs):
103
- raise DagError('Dependency cycle detected')
104
-
105
- return [index[name] for name in ordered]
etlplus/workflow/types.py DELETED
@@ -1,115 +0,0 @@
1
- """
2
- :mod:`etlplus.workflow.types` module.
3
-
4
- Type aliases and editor-only :class:`TypedDict`s for :mod:`etlplus.workflow`.
5
-
6
- These types improve IDE autocomplete and static analysis while the runtime
7
- parsers remain permissive.
8
-
9
- Notes
10
- -----
11
- - TypedDicts in this module are intentionally ``total=False`` and are not
12
- enforced at runtime.
13
- - :meth:`*.from_obj` constructors accept :class:`Mapping[str, Any]` and perform
14
- tolerant parsing and light casting. This keeps the runtime permissive while
15
- improving autocomplete and static analysis for contributors.
16
-
17
- Examples
18
- --------
19
- >>> from etlplus.workflow import Connector
20
- >>> src: Connector = {
21
- >>> "type": "file",
22
- >>> "path": "/data/input.csv",
23
- >>> }
24
- >>> tgt: Connector = {
25
- >>> "type": "database",
26
- >>> "connection_string": "postgresql://user:pass@localhost/db",
27
- >>> }
28
- >>> from etlplus.api import RetryPolicy
29
- >>> rp: RetryPolicy = {"max_attempts": 3, "backoff": 0.5}
30
- """
31
-
32
- from __future__ import annotations
33
-
34
- from typing import Literal
35
- from typing import TypedDict
36
-
37
- from ..api import PaginationConfigMap
38
- from ..api import RateLimitConfigMap
39
- from ..types import StrAnyMap
40
-
41
- # SECTION: EXPORTS ========================================================= #
42
-
43
-
44
- __all__ = [
45
- # Type Aliases
46
- 'ConnectorType',
47
- # Typed Dicts
48
- 'ConnectorApiConfigMap',
49
- 'ConnectorDbConfigMap',
50
- 'ConnectorFileConfigMap',
51
- ]
52
-
53
-
54
- # SECTION: TYPE ALIASES ===================================================== #
55
-
56
-
57
- # Literal type for supported connector kinds
58
- type ConnectorType = Literal['api', 'database', 'file']
59
-
60
-
61
- # SECTION: TYPED DICTS ====================================================== #
62
-
63
-
64
- class ConnectorApiConfigMap(TypedDict, total=False):
65
- """
66
- Shape accepted by :meth:`ConnectorApi.from_obj` (all keys optional).
67
-
68
- See Also
69
- --------
70
- - :meth:`etlplus.workflow.connector.ConnectorApi.from_obj`
71
- """
72
-
73
- name: str
74
- type: ConnectorType
75
- url: str
76
- method: str
77
- headers: StrAnyMap
78
- query_params: StrAnyMap
79
- pagination: PaginationConfigMap
80
- rate_limit: RateLimitConfigMap
81
- api: str
82
- endpoint: str
83
-
84
-
85
- class ConnectorDbConfigMap(TypedDict, total=False):
86
- """
87
- Shape accepted by :meth:`ConnectorDb.from_obj` (all keys optional).
88
-
89
- See Also
90
- --------
91
- - :meth:`etlplus.workflow.connector.ConnectorDb.from_obj`
92
- """
93
-
94
- name: str
95
- type: ConnectorType
96
- connection_string: str
97
- query: str
98
- table: str
99
- mode: str
100
-
101
-
102
- class ConnectorFileConfigMap(TypedDict, total=False):
103
- """
104
- Shape accepted by :meth:`ConnectorFile.from_obj` (all keys optional).
105
-
106
- See Also
107
- --------
108
- - :meth:`etlplus.workflow.connector.ConnectorFile.from_obj`
109
- """
110
-
111
- name: str
112
- type: ConnectorType
113
- format: str
114
- path: str
115
- options: StrAnyMap
@@ -1,134 +0,0 @@
1
- etlplus/README.md,sha256=JaMSomnMsHrTruDnonHqe83Rv4K0-e7Wy46tMeVoleU,1468
2
- etlplus/__init__.py,sha256=mgTP4PJmRmsEjTCAizzzdtzAmhuHtarmPzphzdjvLgM,277
3
- etlplus/__main__.py,sha256=btoROneNiigyfBU7BSzPKZ1R9gzBMpxcpsbPwmuHwTM,479
4
- etlplus/__version__.py,sha256=1E0GMK_yUWCMQFKxXjTvyMwofi0qT2k4CDNiHWiymWE,327
5
- etlplus/enums.py,sha256=ZxObavNilITJNT4Mf2hBy1s4kKtTFUTmrc8_whkxKNg,7541
6
- etlplus/mixins.py,sha256=ifGpHwWv7U00yqGf-kN93vJax2IiK4jaGtTsPsO3Oak,1350
7
- etlplus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- etlplus/types.py,sha256=-knM5bWRq49k4o-KlW-GRsENcj2P-h6oPnEmuz3EJso,6214
9
- etlplus/utils.py,sha256=JVOBPyjIv1C9EZWZuYdqCISS-Dpa-PHrFvvruu1R0HA,17171
10
- etlplus/api/README.md,sha256=amxS_eIcsnNuVvD0x_w8nkyfedOTYbhlY0gGhaFg0DE,8705
11
- etlplus/api/__init__.py,sha256=PK2lQv1FbsE7ZZS_ejevFZQSuOUHGApBc22YfHAzMqA,4615
12
- etlplus/api/auth.py,sha256=GOO5on-LoMS1GXTAhtK9rFcfpjbBcNeA6NE5UZwIq0g,12158
13
- etlplus/api/config.py,sha256=_8_iXpaHXQN6RQ1z0e3q0LTY936IYsc1SVcE6_sPT6E,17639
14
- etlplus/api/endpoint_client.py,sha256=OPAvw3NkpSzeITqgRP1reyqX9Nc_XC8lAj6Yp7nV4Tw,30705
15
- etlplus/api/enums.py,sha256=Tvkru6V8fzQh2JM2FDLcA_yaPENOKz5JgzxLhieqEvc,1141
16
- etlplus/api/errors.py,sha256=XjI2xW-sypMUNUbqfc2S57-IGyWnH3oCDFhCmKYYI_Q,4648
17
- etlplus/api/request_manager.py,sha256=fhzPV5x7DqpKqoLvfDR8GKhBX_QBMtvZsRXxVnQQElY,18674
18
- etlplus/api/retry_manager.py,sha256=0GDhJVyIlb1Ww35JUWlYoa8QYUPjKLBtxQeZj3TdLbY,11306
19
- etlplus/api/transport.py,sha256=DVWzWFZLfQQXaTJ60w-SzdXRxiOE8llPprpUB5CtSyg,9410
20
- etlplus/api/types.py,sha256=geuKmnf6C2P9_tpRpOF90Uu7J160OL3RQpQ_CgJsSrM,6695
21
- etlplus/api/utils.py,sha256=U39OXcrPiLD9m0Y03pACXIIOyuuDPO6RRKuTcwEayBE,26249
22
- etlplus/api/pagination/__init__.py,sha256=a4UX2J0AG8RMvmHt_CCofUm5vSmFo6GAfkb8XnSXypM,1395
23
- etlplus/api/pagination/client.py,sha256=yMEpWqRxTCD4zRc9OYtEyUtShpGH5atiHFEAt95v2FE,5394
24
- etlplus/api/pagination/config.py,sha256=3dXDJ-nMbO9Zk6i344n4roBFbUlHsa294D1_plPmm6E,13579
25
- etlplus/api/pagination/paginator.py,sha256=wtdY_er4yfjx5yTUQJ1gPq-IuWmpLAHeG5buBQZJm54,24453
26
- etlplus/api/rate_limiting/__init__.py,sha256=ZySB1dZettEDnWvI1EHf_TZ9L08M_kKsNR-Y_lbU6kI,1070
27
- etlplus/api/rate_limiting/config.py,sha256=eB-dSOG-c5awYeEpnDsQJ5pO8BJtEpGYxOunBetWiB0,9775
28
- etlplus/api/rate_limiting/rate_limiter.py,sha256=heAasm1KLeBFmoJKPz6W-eQbNuahMgG1E9-z8zGEUro,7035
29
- etlplus/cli/README.md,sha256=8H_G2d3HteYIU6ReX9K9DM485QjWDT5vHMQbGD_vv20,1237
30
- etlplus/cli/__init__.py,sha256=J97-Rv931IL1_b4AXnB7Fbbd7HKnHBpx18NQfC_kE6c,299
31
- etlplus/cli/commands.py,sha256=HFlg29tO6Jwv1NXWAHmvniLCyRSlboL55Arn9B8nZAM,25028
32
- etlplus/cli/constants.py,sha256=E6Uy4WauLa_0zkzxqImXh-bb1gKdb9sBZQVc8QOzr2Q,1943
33
- etlplus/cli/handlers.py,sha256=hXsgG3c6n8JDN4U3Svq6i2r21vetw5NcmXE1bGSwb9w,18560
34
- etlplus/cli/io.py,sha256=EFaBPYaBOyOllfMQWXgTjy-MPiGfNejicpD7ROrPyAE,7840
35
- etlplus/cli/main.py,sha256=d5yhCS6aNo_TKMvhdTS7qeJm4yb1S58gGBrUoBV7SCs,5241
36
- etlplus/cli/options.py,sha256=vfXT3YLh7wG1iC-aTdSg6ItMC8l6n0Lozmy53XjqLbA,1199
37
- etlplus/cli/state.py,sha256=3Dq5BKct0uAvRajtc2yHbsX7wqepZOwlAMKsyvQcnqk,7918
38
- etlplus/cli/types.py,sha256=tclhKVJXDqHzlTQBYKARfqMgDOcuBJ-Zej2pvFy96WM,652
39
- etlplus/database/README.md,sha256=3Af5BEGLkBmMoGOLtS1GQuj4wKPh_CwSp5NEPMf2uaY,1435
40
- etlplus/database/__init__.py,sha256=AKJsDl2RHuRGPS-eXgNJeh4aSncJP5Y0yLApBF6i7i8,1052
41
- etlplus/database/ddl.py,sha256=0dEM9SJMMabkhI_h-Fc0j9a1Sl5lSyZdI0bIeBVGm10,7913
42
- etlplus/database/engine.py,sha256=gWgTjGoo1HYHrBuYX5l2P8avAR3XithzAiqUOpLHP-8,4386
43
- etlplus/database/orm.py,sha256=ZCHkeVEUns2eievlFzmLyVKA3YVPea1xs6vrcUBZ7Jw,10010
44
- etlplus/database/schema.py,sha256=813C0Dd3WE53KTYot4dgjAxctgKXLXx-8_Rk_4r2e28,7022
45
- etlplus/database/types.py,sha256=_pkQyC14TzAlgyeIqZG4F5LWYknZbHw3TW68Auk7Ya0,795
46
- etlplus/file/README.md,sha256=ivU8svVs1fktQiW5ozvh1N-IOSLCAQ3oM9bW8DUFwIw,3630
47
- etlplus/file/__init__.py,sha256=X03bosSM-uSd6dh3ur0un6_ozFRw2Tm4PE6kVUjtXK8,475
48
- etlplus/file/_imports.py,sha256=9e8CWjyNIRcmiULEPuwtnJELUOXd4EvVv_vDnDYiB9c,3121
49
- etlplus/file/_io.py,sha256=2Dj7MH6r-yp_SsCe5GmuNN7Ta70qYzF_jKoMgnD3rME,3925
50
- etlplus/file/accdb.py,sha256=xdBLrXHDonVJ1Z6-qZRrLBXpUwqw5nZYxDuxYMJHzVs,1681
51
- etlplus/file/arrow.py,sha256=rYPqoCAI3cBHETYN3c0Xi7R5Nq7_prIdyESm3ll3Zos,1694
52
- etlplus/file/avro.py,sha256=yFQMnWPcvC0CbDCyagoB9SHRIuvl2SXIoQJTBIlw4dA,4437
53
- etlplus/file/bson.py,sha256=okCWQveCnaRxJ47Oy7-HpByEkiwmiSLSWc0a9eISuVg,1613
54
- etlplus/file/cbor.py,sha256=hpXTqQ-ei4jYKt6-zq3frDXy-SWRpx1ThQUce6b01xU,1667
55
- etlplus/file/cfg.py,sha256=cT2RKFgEMsAJaT9_EIPvYCzS4F9HdRJhEZTDMCVMZ4s,1710
56
- etlplus/file/conf.py,sha256=TKkiuGf_r4pNlxKEgxn8d1Pza-4oeWZiYjvlpMk-un4,1768
57
- etlplus/file/core.py,sha256=71AFsVwvAP6crsAphMkAmhqTwk_-TkEw9eByG6gwzpA,8862
58
- etlplus/file/csv.py,sha256=6zXt7OKXm_6k8MrDyw8DdEwpQQrmrxG6myrDplF87_E,1744
59
- etlplus/file/dat.py,sha256=j-GpY49SmkZtDUzZK6CbrHY9k6N83pyGcMqVGgJZ9cs,1642
60
- etlplus/file/dta.py,sha256=cEprcahuYEncDYEBZiEoHyg-1jgBsr9eCHPLdI-naXM,1616
61
- etlplus/file/duckdb.py,sha256=hQ8PWcvYILpkgPEtWeqbT_0yhQpJN9bJh1OwQQCcRD4,1631
62
- etlplus/file/enums.py,sha256=d3VGF1IbI2Vye3A9WLeMyo5dqlo2Q1TrUp9GaG7a62g,11067
63
- etlplus/file/feather.py,sha256=U19T5V_08ooK1STclE9nDvsnUFzu7nvQvi6J09iC-_0,2669
64
- etlplus/file/fwf.py,sha256=WLbvL94cyLCOYfhABJvoIQc1fljtz3yOuA7X4Fc4QGo,1589
65
- etlplus/file/gz.py,sha256=NKsvIV7TIWn8USbvuZmRH9hr6OrXh4TzTfDykHD41Kk,2631
66
- etlplus/file/hbs.py,sha256=iz0tIVNmsCYjTLnE5x-m3Smh5QKbfuQA-sgOHOZ_T3g,1614
67
- etlplus/file/hdf5.py,sha256=SZ-UbXTJGOYA82hdma7AFulWo9emH5Kih_RXC7f-Bfk,1624
68
- etlplus/file/ini.py,sha256=HlvQyQC00oBD8KFBfznPjBx9wF1ZwXH7Yo1JaXqCq8I,1701
69
- etlplus/file/ion.py,sha256=9q938jROTAcuUT5sRYvS1qIeoz9p8KkVWYDDS2-2A_4,1710
70
- etlplus/file/jinja2.py,sha256=FFqGQjBnRgPQ-oJ3WqiKspJMj6g_J0fDKGwsoOJAEzk,1630
71
- etlplus/file/json.py,sha256=m4eM8cPGHYAEppwLqBdq-t9gC2GtKPLptRTBeBfRimY,2130
72
- etlplus/file/log.py,sha256=OmsGijXZn1VhN7BUklF8saoktxkmHh1MPLI_BbGDLyc,1681
73
- etlplus/file/mat.py,sha256=u3jWMK8c4k9L0uVRiQSd7JgVQF-efoJj3QiKYtt1arA,1654
74
- etlplus/file/mdb.py,sha256=hSCaxBbc_b9dGTBpR-Gb0UTY2r3zYUxoEiKuwpnx0kI,1657
75
- etlplus/file/msgpack.py,sha256=9PTitVGnZM0yB2iiwsgLokai6DRmp2l2zfhyjEcajg8,1658
76
- etlplus/file/mustache.py,sha256=F-xVUH69evPQkunUx746B4rnOHxgAUP6KVpexK3zI_Q,1647
77
- etlplus/file/nc.py,sha256=3RFCl7OvCFAiwyVJJHF5_oa3UdGtDGsVU69OTMpiOdk,1670
78
- etlplus/file/ndjson.py,sha256=fSMAAdyucGIVl6zVqylWSBosOg899wgIpIWCGm2HOWU,2432
79
- etlplus/file/numbers.py,sha256=RSRC6sFYyWxmeTHWM7-D14MQQlDaz-FVehbSyG9u9Ds,1610
80
- etlplus/file/ods.py,sha256=6XsWkcrBsvQxzMdeMulqwExl3BjRe8gR-kNu0-hiRPE,1800
81
- etlplus/file/orc.py,sha256=fOO2jQwUr5FHbDve7ztmrE1Mb8uBMQtDo0yp-elVn8Q,2602
82
- etlplus/file/parquet.py,sha256=nzMrUNQux7Of8Nn0c4d2WYuIJQwZY_xQiO_AuVMCzrI,2758
83
- etlplus/file/pb.py,sha256=sg72vrjbp7azgEK_oRigmNdSqtEnsrBF24VjOohZhow,1615
84
- etlplus/file/pbf.py,sha256=lcdehGK_g2drs0VFqTAxZO9-sv65SAkW894ttmlBG8I,1620
85
- etlplus/file/properties.py,sha256=zsdaIWbSGGXH1bvlI8XPtc0eQCb-CeeA5CHJaqupNrE,1718
86
- etlplus/file/proto.py,sha256=QnZMGYHmr6jyiQ08W7hx_MHzNDrPEmMmnbttNRlY4Pg,1668
87
- etlplus/file/psv.py,sha256=-pfGvLSNOMWVl1mGoKJ_Rh5p5wDyCaxLEd09U23Iub0,1726
88
- etlplus/file/rda.py,sha256=oFbnf6SQrbgKdNDvQ94aeubwVlSEY0K_2BMIEqp22pY,1668
89
- etlplus/file/rds.py,sha256=9E2IfTaI6XRqfwdy-m-6laG7cTq9tlm8kMhldLJznPw,1625
90
- etlplus/file/sas7bdat.py,sha256=y_SOBwGPksIvMdO60PoYIVrmppWKvZQfhJSHMABDDlg,1706
91
- etlplus/file/sav.py,sha256=9cd1curI6gkhXNJPTQP30CUwXdH45qGmPau5JCNmxqg,1597
92
- etlplus/file/sqlite.py,sha256=3YRGMB5cRwdZeUVq3J_jSKauad7s8wWHWviqx7yfrUw,1652
93
- etlplus/file/stub.py,sha256=UPiKD_CYkz66X6bZtSqWX3ShBFrMlf-Se83z4qYnIR4,1733
94
- etlplus/file/sylk.py,sha256=ZqWNAuJenydVYG75a4atRtSQ1iPAscvx-v6lUqdDqvg,1657
95
- etlplus/file/tab.py,sha256=yIbgIM8jkbOmCmewYnDeL4751tHSjVszMIxNlm9C3q8,1984
96
- etlplus/file/toml.py,sha256=Z9UgUJ-PKdlA78osRyARK5AVN7AepSuq4dbUUXTGNAE,1626
97
- etlplus/file/tsv.py,sha256=hKlJd8Q7waZs9_jhRANhmb-fQdPsbvaVG46gYuNVtq0,1766
98
- etlplus/file/txt.py,sha256=46gSCxPn3SsixtR3RQ-kziaY5cnApHgRbW7UP__9ryE,2313
99
- etlplus/file/vm.py,sha256=_EiHtFOxcSwoLb5qegZ0sDr5z9TwKQPbB-MQolb6I2A,1589
100
- etlplus/file/wks.py,sha256=QwsjgcIpaYMZb-NEzgNSRKdBEqhahuoTeAVA5VEmsag,1655
101
- etlplus/file/xls.py,sha256=P94lEH8ZMex_G5x1hotidcj-dvGHAnUY7ouzvSYaV7o,1772
102
- etlplus/file/xlsm.py,sha256=6meoukAvpEIm_mvVomIo2oefPYfmHHXfE1XmFfeFpvY,1738
103
- etlplus/file/xlsx.py,sha256=vtiAS8Ng9FV1vCWYTd1YO2ORKIJG3HDfmqy3NkVpt0A,2182
104
- etlplus/file/xml.py,sha256=p5P60DiV6hyiz-t970d0d0ZXB41gVvAm3MT7dTMULa8,4360
105
- etlplus/file/xpt.py,sha256=JLqOkZ60awNsPXSqLKcPUwqZLPhPR05zk4EVRdEfvoU,1702
106
- etlplus/file/yaml.py,sha256=P9xzginPVVyvIPbFAp6MYWwARhK50GzgMbjZB7HwOrs,2052
107
- etlplus/file/zip.py,sha256=nd26V3S0edklriKnKOGDTLlO8RBXTda_zLLEQrJgKL4,4185
108
- etlplus/file/zsav.py,sha256=2WxjXamvzj0adDbWGMWM3-cj_LsCRjyZz4J907lNkPk,1664
109
- etlplus/ops/README.md,sha256=8omi7DYZhelc26JKk8Cm8QR8I3OGwziysPj1ivx41iQ,1380
110
- etlplus/ops/__init__.py,sha256=NIIr2f-AZj5B0piBt6gjv46Yn0SzGYxEe6BPoopRh38,1702
111
- etlplus/ops/extract.py,sha256=OJozX25qTjME7m9aTdVPJScT3GHHgopGM8uHo_rHm1Y,5783
112
- etlplus/ops/load.py,sha256=RgEKnVygRN2cPDpzihU8UsIhd4eVoj0cPe0jBuNC0u4,8328
113
- etlplus/ops/run.py,sha256=JOPQxrciRUQ67FJhUcZ-pW1aiYGZUdxHLwhzWLNCaDo,13528
114
- etlplus/ops/transform.py,sha256=1P43WYUaw872JDU86FhbbbkP8xnBWpgEPn2Q-z4ywls,25421
115
- etlplus/ops/utils.py,sha256=mNUcbnLl3M6rA_BPoUqG-IFPqT1zrp_EkQTs7uvzBIQ,10839
116
- etlplus/ops/validate.py,sha256=-OLAwQNNCmmDbmj0SB7zzYXDkJfcyBP_z9nTpqImLP0,13271
117
- etlplus/templates/README.md,sha256=IfPXlj1TGVA-uFWosHJhE2rabFW-znxOlOMazO9Z5cE,1361
118
- etlplus/templates/__init__.py,sha256=tsniN7XJYs3NwYxJ6c2HD5upHP3CDkLx-bQCMt97UOM,106
119
- etlplus/templates/ddl.sql.j2,sha256=s8fMWvcb4eaJVXkifuib1aQPljtZ8buuyB_uA-ZdU3Q,4734
120
- etlplus/templates/view.sql.j2,sha256=Iy8DHfhq5yyvrUKDxqp_aHIEXY4Tm6j4wT7YDEFWAhk,2180
121
- etlplus/workflow/README.md,sha256=D1oloiJCOHiqpqgv3m3qpRSIUOMIQcWtIsOPv7KkNI0,1652
122
- etlplus/workflow/__init__.py,sha256=LxI9VGlDBUc9ADoK8JNn3oVsGeaz1Uhjonn4Y5KIJdM,967
123
- etlplus/workflow/connector.py,sha256=vnzq9-qcU4ThWeI3ZJcL8iCoaKWrSEtZ9Jixn4il2KE,9995
124
- etlplus/workflow/dag.py,sha256=kp31dORgk0GHbct_bipU5hu_0elwBtwLsXGjMWuhFHI,2503
125
- etlplus/workflow/jobs.py,sha256=5_jhPoT2hCGTgsbK_lIPKrB94f7tzOEUJxtU3tpvTjg,8947
126
- etlplus/workflow/pipeline.py,sha256=eF6OYMXZ_YdDPZ5FJC6OTCAM-zsb8HxhX3IHpbb_N8w,9631
127
- etlplus/workflow/profile.py,sha256=dZ6P50k_ZqXnrbgrbODUqgVkymbchcEqfZR-ExjTd3M,1935
128
- etlplus/workflow/types.py,sha256=Lv1MLyM45Ob5AsMQQBqzbUaD8g7HMVxu_HoQGPeiugU,2771
129
- etlplus-0.9.2.dist-info/licenses/LICENSE,sha256=MuNO63i6kWmgnV2pbP2SLqP54mk1BGmu7CmbtxMmT-U,1069
130
- etlplus-0.9.2.dist-info/METADATA,sha256=3wCUIvTSgSYH0AJeFIrHVniFGXaohQwhKHzX74ew5ZA,28113
131
- etlplus-0.9.2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
132
- etlplus-0.9.2.dist-info/entry_points.txt,sha256=6w-2-jzuPa55spzK34h-UKh2JTEShh38adFRONNP9QE,45
133
- etlplus-0.9.2.dist-info/top_level.txt,sha256=aWWF-udn_sLGuHTM6W6MLh99ArS9ROkUWO8Mi8y1_2U,8
134
- etlplus-0.9.2.dist-info/RECORD,,