etlplus 0.3.8__tar.gz
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-0.3.8/.editorconfig +156 -0
- etlplus-0.3.8/.gitattributes +13 -0
- etlplus-0.3.8/.github/actions/python-bootstrap/action.yml +38 -0
- etlplus-0.3.8/.github/workflows/ci.yml +121 -0
- etlplus-0.3.8/.gitignore +493 -0
- etlplus-0.3.8/.pre-commit-config.yaml +167 -0
- etlplus-0.3.8/.ruff.toml +33 -0
- etlplus-0.3.8/CODE_OF_CONDUCT.md +132 -0
- etlplus-0.3.8/CONTRIBUTING.md +137 -0
- etlplus-0.3.8/DEMO.md +244 -0
- etlplus-0.3.8/LICENSE +21 -0
- etlplus-0.3.8/Makefile +461 -0
- etlplus-0.3.8/PKG-INFO +546 -0
- etlplus-0.3.8/README.md +505 -0
- etlplus-0.3.8/REFERENCES.md +115 -0
- etlplus-0.3.8/docs/pipeline-guide.md +507 -0
- etlplus-0.3.8/docs/snippets/installation_version.md +2 -0
- etlplus-0.3.8/etlplus/__init__.py +43 -0
- etlplus-0.3.8/etlplus/__main__.py +23 -0
- etlplus-0.3.8/etlplus/__version__.py +14 -0
- etlplus-0.3.8/etlplus/api/README.md +237 -0
- etlplus-0.3.8/etlplus/api/__init__.py +136 -0
- etlplus-0.3.8/etlplus/api/auth.py +432 -0
- etlplus-0.3.8/etlplus/api/config.py +633 -0
- etlplus-0.3.8/etlplus/api/endpoint_client.py +885 -0
- etlplus-0.3.8/etlplus/api/errors.py +170 -0
- etlplus-0.3.8/etlplus/api/pagination/__init__.py +47 -0
- etlplus-0.3.8/etlplus/api/pagination/client.py +188 -0
- etlplus-0.3.8/etlplus/api/pagination/config.py +440 -0
- etlplus-0.3.8/etlplus/api/pagination/paginator.py +775 -0
- etlplus-0.3.8/etlplus/api/rate_limiting/__init__.py +38 -0
- etlplus-0.3.8/etlplus/api/rate_limiting/config.py +343 -0
- etlplus-0.3.8/etlplus/api/rate_limiting/rate_limiter.py +266 -0
- etlplus-0.3.8/etlplus/api/request_manager.py +589 -0
- etlplus-0.3.8/etlplus/api/retry_manager.py +430 -0
- etlplus-0.3.8/etlplus/api/transport.py +325 -0
- etlplus-0.3.8/etlplus/api/types.py +172 -0
- etlplus-0.3.8/etlplus/cli.py +868 -0
- etlplus-0.3.8/etlplus/config/__init__.py +56 -0
- etlplus-0.3.8/etlplus/config/connector.py +372 -0
- etlplus-0.3.8/etlplus/config/jobs.py +311 -0
- etlplus-0.3.8/etlplus/config/pipeline.py +328 -0
- etlplus-0.3.8/etlplus/config/profile.py +78 -0
- etlplus-0.3.8/etlplus/config/types.py +204 -0
- etlplus-0.3.8/etlplus/config/utils.py +120 -0
- etlplus-0.3.8/etlplus/enums.py +414 -0
- etlplus-0.3.8/etlplus/extract.py +218 -0
- etlplus-0.3.8/etlplus/file.py +657 -0
- etlplus-0.3.8/etlplus/load.py +336 -0
- etlplus-0.3.8/etlplus/mixins.py +62 -0
- etlplus-0.3.8/etlplus/py.typed +0 -0
- etlplus-0.3.8/etlplus/run.py +368 -0
- etlplus-0.3.8/etlplus/run_helpers.py +843 -0
- etlplus-0.3.8/etlplus/transform.py +1037 -0
- etlplus-0.3.8/etlplus/types.py +227 -0
- etlplus-0.3.8/etlplus/utils.py +638 -0
- etlplus-0.3.8/etlplus/validate.py +493 -0
- etlplus-0.3.8/etlplus/validation/__init__.py +44 -0
- etlplus-0.3.8/etlplus/validation/utils.py +389 -0
- etlplus-0.3.8/etlplus.egg-info/PKG-INFO +546 -0
- etlplus-0.3.8/etlplus.egg-info/SOURCES.txt +112 -0
- etlplus-0.3.8/etlplus.egg-info/dependency_links.txt +1 -0
- etlplus-0.3.8/etlplus.egg-info/entry_points.txt +2 -0
- etlplus-0.3.8/etlplus.egg-info/requires.txt +20 -0
- etlplus-0.3.8/etlplus.egg-info/top_level.txt +1 -0
- etlplus-0.3.8/examples/README.md +72 -0
- etlplus-0.3.8/examples/configs/pipeline.yml +448 -0
- etlplus-0.3.8/examples/data/sample.csv +6 -0
- etlplus-0.3.8/examples/data/sample.json +7 -0
- etlplus-0.3.8/examples/data/sample.xml +33 -0
- etlplus-0.3.8/examples/data/sample.xsd +26 -0
- etlplus-0.3.8/examples/data/sample.yaml +22 -0
- etlplus-0.3.8/examples/quickstart_python.py +48 -0
- etlplus-0.3.8/pyproject.toml +109 -0
- etlplus-0.3.8/pytest.ini +12 -0
- etlplus-0.3.8/setup.cfg +4 -0
- etlplus-0.3.8/setup.py +68 -0
- etlplus-0.3.8/tests/__init__.py +10 -0
- etlplus-0.3.8/tests/conftest.py +11 -0
- etlplus-0.3.8/tests/integration/conftest.py +308 -0
- etlplus-0.3.8/tests/integration/test_i_cli.py +348 -0
- etlplus-0.3.8/tests/integration/test_i_examples_data_parity.py +73 -0
- etlplus-0.3.8/tests/integration/test_i_pagination_strategy.py +452 -0
- etlplus-0.3.8/tests/integration/test_i_pipeline_smoke.py +104 -0
- etlplus-0.3.8/tests/integration/test_i_pipeline_yaml_load.py +51 -0
- etlplus-0.3.8/tests/integration/test_i_run.py +133 -0
- etlplus-0.3.8/tests/integration/test_i_run_profile_pagination_defaults.py +106 -0
- etlplus-0.3.8/tests/integration/test_i_run_profile_rate_limit_defaults.py +77 -0
- etlplus-0.3.8/tests/unit/api/conftest.py +193 -0
- etlplus-0.3.8/tests/unit/api/test_u_auth.py +320 -0
- etlplus-0.3.8/tests/unit/api/test_u_config.py +637 -0
- etlplus-0.3.8/tests/unit/api/test_u_endpoint_client.py +1490 -0
- etlplus-0.3.8/tests/unit/api/test_u_mocks.py +205 -0
- etlplus-0.3.8/tests/unit/api/test_u_pagination_client.py +177 -0
- etlplus-0.3.8/tests/unit/api/test_u_pagination_config.py +260 -0
- etlplus-0.3.8/tests/unit/api/test_u_paginator.py +386 -0
- etlplus-0.3.8/tests/unit/api/test_u_rate_limit_config.py +239 -0
- etlplus-0.3.8/tests/unit/api/test_u_rate_limiter.py +365 -0
- etlplus-0.3.8/tests/unit/api/test_u_request_manager.py +134 -0
- etlplus-0.3.8/tests/unit/api/test_u_retry_manager.py +73 -0
- etlplus-0.3.8/tests/unit/api/test_u_transport.py +147 -0
- etlplus-0.3.8/tests/unit/config/test_u_connector.py +54 -0
- etlplus-0.3.8/tests/unit/config/test_u_pipeline.py +194 -0
- etlplus-0.3.8/tests/unit/conftest.py +798 -0
- etlplus-0.3.8/tests/unit/test_u_cli.py +124 -0
- etlplus-0.3.8/tests/unit/test_u_extract.py +288 -0
- etlplus-0.3.8/tests/unit/test_u_file.py +100 -0
- etlplus-0.3.8/tests/unit/test_u_load.py +484 -0
- etlplus-0.3.8/tests/unit/test_u_transform.py +483 -0
- etlplus-0.3.8/tests/unit/test_u_utils.py +161 -0
- etlplus-0.3.8/tests/unit/test_u_validate.py +193 -0
- etlplus-0.3.8/tests/unit/validation/test_u_validation_utils.py +183 -0
- etlplus-0.3.8/tools/run_pipeline.py +561 -0
- etlplus-0.3.8/tools/update_demo_snippets.py +186 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# .editorconfig
|
|
2
|
+
# ETLPlus
|
|
3
|
+
#
|
|
4
|
+
# Copyright © 2025 Dagitali LLC. All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# The EditorConfig file. Defines coding styles and a collection of text editor
|
|
7
|
+
# plugins that enable editors to read the file format and adhere to defined
|
|
8
|
+
# styles. Helps maintain consistent coding styles for multiple developers
|
|
9
|
+
# working on the same project across various editors and IDEs.
|
|
10
|
+
#
|
|
11
|
+
# See:
|
|
12
|
+
# 1. https://editorconfig.org/#file-format-details
|
|
13
|
+
# 2. https://github.com/jokeyrhyme/standard-editorconfig
|
|
14
|
+
|
|
15
|
+
# Top-most EditorConfig file
|
|
16
|
+
root = true
|
|
17
|
+
|
|
18
|
+
# Defaults
|
|
19
|
+
[*]
|
|
20
|
+
charset = utf-8
|
|
21
|
+
end_of_line = lf
|
|
22
|
+
insert_final_newline = true
|
|
23
|
+
trim_trailing_whitespace = true
|
|
24
|
+
|
|
25
|
+
# Bazel
|
|
26
|
+
# https://bazel.build/
|
|
27
|
+
# https://github.com/bazelbuild/buildtools/blob/master/BUILD.bazel
|
|
28
|
+
[*.{bazel,bzl}]
|
|
29
|
+
indent_size = 4
|
|
30
|
+
indent_style = space
|
|
31
|
+
|
|
32
|
+
# CSS
|
|
33
|
+
# https://google.github.io/styleguide/htmlcssguide.xml#General_Formatting_Rules
|
|
34
|
+
# http://cssguidelin.es/#syntax-and-formatting
|
|
35
|
+
[*.css]
|
|
36
|
+
indent_size = 2
|
|
37
|
+
indent_style = space
|
|
38
|
+
trim_trailing_whitespace = true
|
|
39
|
+
|
|
40
|
+
# GNU Make
|
|
41
|
+
# https://www.gnu.org/software/make/manual/html_node/Recipe-Syntax.html
|
|
42
|
+
[Makefile,*.mk]
|
|
43
|
+
indent_style = tab
|
|
44
|
+
|
|
45
|
+
# Go
|
|
46
|
+
# https://golang.org/cmd/gofmt/
|
|
47
|
+
[{go.mod,*.go}]
|
|
48
|
+
indent_style = tab
|
|
49
|
+
|
|
50
|
+
# GraphQL
|
|
51
|
+
# https://graphql.org/learn/
|
|
52
|
+
# https://prettier.io
|
|
53
|
+
[*.graphql]
|
|
54
|
+
indent_size = 2
|
|
55
|
+
indent_style = space
|
|
56
|
+
|
|
57
|
+
# HTML
|
|
58
|
+
# https://google.github.io/styleguide/htmlcssguide.xml#General_Formatting_Rules
|
|
59
|
+
[*.{htm,html}]
|
|
60
|
+
indent_size = 2
|
|
61
|
+
indent_style = space
|
|
62
|
+
trim_trailing_whitespace = true
|
|
63
|
+
|
|
64
|
+
# Java
|
|
65
|
+
# https://google.github.io/styleguide/javaguide.html#s4.2-block-indentation
|
|
66
|
+
[*.java]
|
|
67
|
+
indent_size = 2
|
|
68
|
+
indent_style = space
|
|
69
|
+
|
|
70
|
+
# JavaScript, JSON, JSX, JavaScript Modules, TypeScript
|
|
71
|
+
# https://github.com/feross/standard
|
|
72
|
+
# https://prettier.io
|
|
73
|
+
[*.{cjs,js,json,jsx,mjs,ts,tsx}]
|
|
74
|
+
indent_size = 2
|
|
75
|
+
indent_style = space
|
|
76
|
+
|
|
77
|
+
# Kotlin
|
|
78
|
+
# https://android.github.io/kotlin-guides/style.html#indentation
|
|
79
|
+
[*.{kt,kts}]
|
|
80
|
+
indent_size = 4
|
|
81
|
+
indent_style = space
|
|
82
|
+
|
|
83
|
+
# LESS
|
|
84
|
+
# https://github.com/less/less-docs#less-standards
|
|
85
|
+
[*.less]
|
|
86
|
+
indent_size = 2
|
|
87
|
+
indent_style = space
|
|
88
|
+
|
|
89
|
+
# Lua
|
|
90
|
+
# http://lua-users.org/wiki/LuaStyleGuide
|
|
91
|
+
[*.{lua,luacheckrc}]
|
|
92
|
+
indent_size = 2
|
|
93
|
+
indent_style = space
|
|
94
|
+
|
|
95
|
+
# PHP
|
|
96
|
+
# http://www.php-fig.org/psr/psr-2/
|
|
97
|
+
[*.php]
|
|
98
|
+
indent_size = 4
|
|
99
|
+
indent_style = space
|
|
100
|
+
|
|
101
|
+
# Python
|
|
102
|
+
# https://www.python.org/dev/peps/pep-0008/#code-lay-out
|
|
103
|
+
[*.py]
|
|
104
|
+
indent_size = 4
|
|
105
|
+
indent_style = space
|
|
106
|
+
|
|
107
|
+
# Ruby
|
|
108
|
+
# http://www.caliban.org/ruby/rubyguide.shtml#indentation
|
|
109
|
+
[*.rb]
|
|
110
|
+
indent_size = 2
|
|
111
|
+
indent_style = space
|
|
112
|
+
|
|
113
|
+
# Rust
|
|
114
|
+
# https://github.com/rust-lang/rust/blob/master/src/doc/style/style/whitespace.md
|
|
115
|
+
[*.rs]
|
|
116
|
+
indent_size = 4
|
|
117
|
+
indent_style = space
|
|
118
|
+
insert_final_newline = false
|
|
119
|
+
trim_trailing_whitespace = true
|
|
120
|
+
|
|
121
|
+
# SASS
|
|
122
|
+
# https://sass-guidelin.es/#syntax--formatting
|
|
123
|
+
[*.{sass,scss}]
|
|
124
|
+
indent_size = 2
|
|
125
|
+
indent_style = space
|
|
126
|
+
|
|
127
|
+
# Shell
|
|
128
|
+
# https://google.github.io/styleguide/shell.xml#Indentation
|
|
129
|
+
[*.{bash,sh,zsh}]
|
|
130
|
+
indent_size = 2
|
|
131
|
+
indent_style = space
|
|
132
|
+
|
|
133
|
+
# Svelte
|
|
134
|
+
# https://github.com/sveltejs/svelte/blob/master/.editorconfig
|
|
135
|
+
[*.svelte]
|
|
136
|
+
indent_size = 2
|
|
137
|
+
indent_style = tab
|
|
138
|
+
|
|
139
|
+
# TOML
|
|
140
|
+
# https://github.com/toml-lang/toml/tree/master/examples
|
|
141
|
+
[*.toml]
|
|
142
|
+
indent_size = 2
|
|
143
|
+
indent_style = space
|
|
144
|
+
|
|
145
|
+
# Vue.js
|
|
146
|
+
# https://eslint.vuejs.org/rules/html-indent.html
|
|
147
|
+
# https://eslint.vuejs.org/rules/script-indent.html
|
|
148
|
+
[*.vue]
|
|
149
|
+
indent_size = 2
|
|
150
|
+
indent_style = space
|
|
151
|
+
|
|
152
|
+
# YAML
|
|
153
|
+
# http://yaml.org/spec/1.2/2009-07-21/spec.html#id2576668
|
|
154
|
+
[*.{yaml,yml}]
|
|
155
|
+
indent_size = 2
|
|
156
|
+
indent_style = space
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# .gitattributes
|
|
2
|
+
# ETLPlus
|
|
3
|
+
#
|
|
4
|
+
# Copyright © 2025 Dagitali LLC. All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# An optional Git configuration file. Defines attributes per pathname.
|
|
7
|
+
#
|
|
8
|
+
# See:
|
|
9
|
+
# 1. https://fileinfo.com/extension/gitattributes
|
|
10
|
+
# 2. https://git-scm.com/docs/gitattributes
|
|
11
|
+
|
|
12
|
+
# Auto detect text files and perform LF normalization
|
|
13
|
+
* text=auto
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# action.yml
|
|
2
|
+
# ETLPlus
|
|
3
|
+
#
|
|
4
|
+
# Copyright © 2025 Dagitali LLC. All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# A GitHub Actions action to set up Python and install Python package
|
|
7
|
+
# dependencies.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
name: Setup Python and Install Dependencies
|
|
12
|
+
|
|
13
|
+
description: >-
|
|
14
|
+
Sets up the requested Python runtime, upgrades pip, and installs the provided
|
|
15
|
+
dependency list to keep workflow jobs consistent.
|
|
16
|
+
|
|
17
|
+
inputs:
|
|
18
|
+
python-version:
|
|
19
|
+
description: Python version to install via actions/setup-python
|
|
20
|
+
required: true
|
|
21
|
+
python-bootstrap:
|
|
22
|
+
description: Arguments passed to "pip install"
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
runs:
|
|
26
|
+
using: composite
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/setup-python@v5
|
|
29
|
+
with:
|
|
30
|
+
python-version: ${{ inputs.python-version }}
|
|
31
|
+
|
|
32
|
+
- name: Upgrade pip
|
|
33
|
+
shell: bash
|
|
34
|
+
run: python -m pip install --upgrade pip
|
|
35
|
+
|
|
36
|
+
- name: Install dependencies
|
|
37
|
+
shell: bash
|
|
38
|
+
run: pip install ${{ inputs.python-bootstrap }}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# ci.yml
|
|
2
|
+
# ETLPlus
|
|
3
|
+
#
|
|
4
|
+
# Copyright © 2025 Dagitali LLC. All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# A GitHub Actions workflow configuration file for Continuous Integration (CI).
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
name: CI
|
|
11
|
+
|
|
12
|
+
on:
|
|
13
|
+
push:
|
|
14
|
+
branches: [ main, '**/feature/**', '**/fix/**', '**/chore/**' ]
|
|
15
|
+
tags: [ 'v*.*.*' ]
|
|
16
|
+
pull_request:
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
id-token: write
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
lint:
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
with:
|
|
28
|
+
fetch-depth: 0
|
|
29
|
+
- uses: ./.github/actions/python-bootstrap
|
|
30
|
+
with:
|
|
31
|
+
python-version: '3.13'
|
|
32
|
+
python-bootstrap: ".[dev]"
|
|
33
|
+
- name: Ruff check
|
|
34
|
+
run: |
|
|
35
|
+
ruff version
|
|
36
|
+
ruff check .
|
|
37
|
+
ruff format --check .
|
|
38
|
+
|
|
39
|
+
test:
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
strategy:
|
|
42
|
+
matrix:
|
|
43
|
+
python-version: ['3.13', '3.14']
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@v4
|
|
46
|
+
with:
|
|
47
|
+
fetch-depth: 0
|
|
48
|
+
- uses: ./.github/actions/python-bootstrap
|
|
49
|
+
with:
|
|
50
|
+
python-version: ${{ matrix.python-version }}
|
|
51
|
+
python-bootstrap: "-e .[dev,yaml]"
|
|
52
|
+
- name: Run tests
|
|
53
|
+
run: |
|
|
54
|
+
pytest -q
|
|
55
|
+
|
|
56
|
+
build:
|
|
57
|
+
name: Build distributions
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
60
|
+
needs: [lint, test]
|
|
61
|
+
steps:
|
|
62
|
+
- uses: actions/checkout@v4
|
|
63
|
+
with:
|
|
64
|
+
fetch-depth: 0
|
|
65
|
+
- uses: ./.github/actions/python-bootstrap
|
|
66
|
+
with:
|
|
67
|
+
python-version: '3.13'
|
|
68
|
+
python-bootstrap: build
|
|
69
|
+
- name: Build distributions
|
|
70
|
+
run: |
|
|
71
|
+
python -m build
|
|
72
|
+
- name: Upload distributions
|
|
73
|
+
uses: actions/upload-artifact@v4
|
|
74
|
+
with:
|
|
75
|
+
name: dist-artifacts
|
|
76
|
+
path: dist/*
|
|
77
|
+
if-no-files-found: error
|
|
78
|
+
|
|
79
|
+
release:
|
|
80
|
+
name: Publish GitHub Release
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
83
|
+
needs: build
|
|
84
|
+
permissions:
|
|
85
|
+
contents: write
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v4
|
|
88
|
+
with:
|
|
89
|
+
fetch-depth: 0
|
|
90
|
+
- name: Download distributions
|
|
91
|
+
uses: actions/download-artifact@v4
|
|
92
|
+
with:
|
|
93
|
+
name: dist-artifacts
|
|
94
|
+
path: dist
|
|
95
|
+
- name: Publish GitHub release
|
|
96
|
+
uses: softprops/action-gh-release@v2
|
|
97
|
+
with:
|
|
98
|
+
files: dist/*
|
|
99
|
+
generate_release_notes: true
|
|
100
|
+
|
|
101
|
+
publish:
|
|
102
|
+
name: Publish to PyPI
|
|
103
|
+
runs-on: ubuntu-latest
|
|
104
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
105
|
+
needs: build
|
|
106
|
+
environment:
|
|
107
|
+
name: pypi
|
|
108
|
+
url: https://pypi.org/project/etlplus/
|
|
109
|
+
steps:
|
|
110
|
+
- uses: actions/checkout@v4
|
|
111
|
+
with:
|
|
112
|
+
fetch-depth: 0
|
|
113
|
+
- name: Download distributions
|
|
114
|
+
uses: actions/download-artifact@v4
|
|
115
|
+
with:
|
|
116
|
+
name: dist-artifacts
|
|
117
|
+
path: dist
|
|
118
|
+
- name: Publish to PyPI
|
|
119
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
120
|
+
with:
|
|
121
|
+
verbose: true
|