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.
- etlplus/__init__.py +26 -1
- etlplus/api/README.md +3 -51
- etlplus/api/__init__.py +0 -10
- etlplus/api/config.py +28 -39
- etlplus/api/endpoint_client.py +3 -3
- etlplus/api/pagination/client.py +1 -1
- etlplus/api/rate_limiting/config.py +1 -13
- etlplus/api/rate_limiting/rate_limiter.py +11 -8
- etlplus/api/request_manager.py +6 -11
- etlplus/api/transport.py +2 -14
- etlplus/api/types.py +6 -96
- etlplus/cli/commands.py +43 -76
- etlplus/cli/constants.py +1 -1
- etlplus/cli/handlers.py +12 -40
- etlplus/cli/io.py +2 -2
- etlplus/cli/main.py +1 -1
- etlplus/cli/state.py +7 -4
- etlplus/{workflow → config}/__init__.py +23 -10
- etlplus/{workflow → config}/connector.py +44 -58
- etlplus/{workflow → config}/jobs.py +32 -105
- etlplus/{workflow → config}/pipeline.py +51 -59
- etlplus/{workflow → config}/profile.py +5 -8
- etlplus/config/types.py +204 -0
- etlplus/config/utils.py +120 -0
- etlplus/database/ddl.py +1 -1
- etlplus/database/engine.py +3 -19
- etlplus/database/orm.py +0 -2
- etlplus/database/schema.py +1 -1
- etlplus/enums.py +288 -0
- etlplus/{ops/extract.py → extract.py} +99 -81
- etlplus/file.py +652 -0
- etlplus/{ops/load.py → load.py} +101 -78
- etlplus/{ops/run.py → run.py} +127 -159
- etlplus/{api/utils.py → run_helpers.py} +153 -209
- etlplus/{ops/transform.py → transform.py} +68 -75
- etlplus/types.py +4 -5
- etlplus/utils.py +2 -136
- etlplus/{ops/validate.py → validate.py} +12 -22
- etlplus/validation/__init__.py +44 -0
- etlplus/{ops → validation}/utils.py +17 -53
- {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/METADATA +17 -210
- etlplus-0.10.2.dist-info/RECORD +65 -0
- {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/WHEEL +1 -1
- etlplus/README.md +0 -37
- etlplus/api/enums.py +0 -51
- etlplus/cli/README.md +0 -40
- etlplus/database/README.md +0 -48
- etlplus/file/README.md +0 -105
- etlplus/file/__init__.py +0 -25
- etlplus/file/_imports.py +0 -141
- etlplus/file/_io.py +0 -160
- etlplus/file/accdb.py +0 -78
- etlplus/file/arrow.py +0 -78
- etlplus/file/avro.py +0 -176
- etlplus/file/bson.py +0 -77
- etlplus/file/cbor.py +0 -78
- etlplus/file/cfg.py +0 -79
- etlplus/file/conf.py +0 -80
- etlplus/file/core.py +0 -322
- etlplus/file/csv.py +0 -79
- etlplus/file/dat.py +0 -78
- etlplus/file/dta.py +0 -77
- etlplus/file/duckdb.py +0 -78
- etlplus/file/enums.py +0 -343
- etlplus/file/feather.py +0 -111
- etlplus/file/fwf.py +0 -77
- etlplus/file/gz.py +0 -123
- etlplus/file/hbs.py +0 -78
- etlplus/file/hdf5.py +0 -78
- etlplus/file/ini.py +0 -79
- etlplus/file/ion.py +0 -78
- etlplus/file/jinja2.py +0 -78
- etlplus/file/json.py +0 -98
- etlplus/file/log.py +0 -78
- etlplus/file/mat.py +0 -78
- etlplus/file/mdb.py +0 -78
- etlplus/file/msgpack.py +0 -78
- etlplus/file/mustache.py +0 -78
- etlplus/file/nc.py +0 -78
- etlplus/file/ndjson.py +0 -108
- etlplus/file/numbers.py +0 -75
- etlplus/file/ods.py +0 -79
- etlplus/file/orc.py +0 -111
- etlplus/file/parquet.py +0 -113
- etlplus/file/pb.py +0 -78
- etlplus/file/pbf.py +0 -77
- etlplus/file/properties.py +0 -78
- etlplus/file/proto.py +0 -77
- etlplus/file/psv.py +0 -79
- etlplus/file/rda.py +0 -78
- etlplus/file/rds.py +0 -78
- etlplus/file/sas7bdat.py +0 -78
- etlplus/file/sav.py +0 -77
- etlplus/file/sqlite.py +0 -78
- etlplus/file/stub.py +0 -84
- etlplus/file/sylk.py +0 -77
- etlplus/file/tab.py +0 -81
- etlplus/file/toml.py +0 -78
- etlplus/file/tsv.py +0 -80
- etlplus/file/txt.py +0 -102
- etlplus/file/vm.py +0 -78
- etlplus/file/wks.py +0 -77
- etlplus/file/xls.py +0 -88
- etlplus/file/xlsm.py +0 -79
- etlplus/file/xlsx.py +0 -99
- etlplus/file/xml.py +0 -185
- etlplus/file/xpt.py +0 -78
- etlplus/file/yaml.py +0 -95
- etlplus/file/zip.py +0 -175
- etlplus/file/zsav.py +0 -77
- etlplus/ops/README.md +0 -50
- etlplus/ops/__init__.py +0 -61
- etlplus/templates/README.md +0 -46
- etlplus/workflow/README.md +0 -52
- etlplus/workflow/dag.py +0 -105
- etlplus/workflow/types.py +0 -115
- etlplus-0.9.2.dist-info/RECORD +0 -134
- {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/entry_points.txt +0 -0
- {etlplus-0.9.2.dist-info → etlplus-0.10.2.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
]
|
etlplus/templates/README.md
DELETED
|
@@ -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)
|
etlplus/workflow/README.md
DELETED
|
@@ -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
|
etlplus-0.9.2.dist-info/RECORD
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|