etlplus 0.12.9__tar.gz → 0.14.1__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.12.9 → etlplus-0.14.1}/CONTRIBUTING.md +1 -1
- {etlplus-0.12.9 → etlplus-0.14.1}/DEMO.md +1 -1
- {etlplus-0.12.9/etlplus.egg-info → etlplus-0.14.1}/PKG-INFO +97 -36
- {etlplus-0.12.9 → etlplus-0.14.1}/README.md +96 -35
- {etlplus-0.12.9 → etlplus-0.14.1}/docs/pipeline-guide.md +15 -5
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/README.md +1 -1
- etlplus-0.14.1/etlplus/__init__.py +18 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/__init__.py +8 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/endpoint_client.py +3 -3
- etlplus-0.12.9/etlplus/run_helpers.py → etlplus-0.14.1/etlplus/api/utils.py +121 -79
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/handlers.py +17 -7
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/jobs.py +14 -4
- etlplus-0.14.1/etlplus/dag.py +103 -0
- etlplus-0.14.1/etlplus/file/accdb.py +78 -0
- etlplus-0.14.1/etlplus/file/arrow.py +78 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/avro.py +13 -1
- etlplus-0.14.1/etlplus/file/bson.py +77 -0
- etlplus-0.14.1/etlplus/file/cbor.py +78 -0
- etlplus-0.14.1/etlplus/file/cfg.py +79 -0
- etlplus-0.14.1/etlplus/file/conf.py +80 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/csv.py +13 -1
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/dat.py +13 -1
- etlplus-0.14.1/etlplus/file/dta.py +77 -0
- etlplus-0.14.1/etlplus/file/duckdb.py +78 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/enums.py +11 -5
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/feather.py +13 -1
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/fwf.py +12 -1
- etlplus-0.14.1/etlplus/file/hbs.py +78 -0
- etlplus-0.14.1/etlplus/file/hdf5.py +78 -0
- etlplus-0.14.1/etlplus/file/ini.py +79 -0
- etlplus-0.14.1/etlplus/file/ion.py +78 -0
- etlplus-0.14.1/etlplus/file/jinja2.py +78 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/json.py +13 -1
- etlplus-0.14.1/etlplus/file/log.py +78 -0
- etlplus-0.14.1/etlplus/file/mat.py +78 -0
- etlplus-0.14.1/etlplus/file/mdb.py +78 -0
- etlplus-0.14.1/etlplus/file/msgpack.py +78 -0
- etlplus-0.14.1/etlplus/file/mustache.py +78 -0
- etlplus-0.14.1/etlplus/file/nc.py +78 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/ndjson.py +12 -6
- etlplus-0.14.1/etlplus/file/numbers.py +75 -0
- etlplus-0.14.1/etlplus/file/ods.py +79 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/orc.py +13 -1
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/parquet.py +13 -1
- etlplus-0.14.1/etlplus/file/pb.py +78 -0
- etlplus-0.14.1/etlplus/file/pbf.py +77 -0
- etlplus-0.14.1/etlplus/file/properties.py +78 -0
- etlplus-0.14.1/etlplus/file/proto.py +77 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/psv.py +14 -1
- etlplus-0.14.1/etlplus/file/rda.py +78 -0
- etlplus-0.14.1/etlplus/file/rds.py +78 -0
- etlplus-0.14.1/etlplus/file/sas7bdat.py +78 -0
- etlplus-0.14.1/etlplus/file/sav.py +77 -0
- etlplus-0.14.1/etlplus/file/sqlite.py +78 -0
- etlplus-0.14.1/etlplus/file/sylk.py +77 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/tab.py +3 -4
- etlplus-0.14.1/etlplus/file/toml.py +78 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/tsv.py +14 -1
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/txt.py +11 -1
- etlplus-0.14.1/etlplus/file/vm.py +78 -0
- etlplus-0.14.1/etlplus/file/wks.py +77 -0
- etlplus-0.14.1/etlplus/file/xlsm.py +79 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/xml.py +12 -1
- etlplus-0.14.1/etlplus/file/xpt.py +78 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/yaml.py +12 -1
- etlplus-0.14.1/etlplus/file/zsav.py +77 -0
- {etlplus-0.12.9/etlplus/validation → etlplus-0.14.1/etlplus/ops}/README.md +2 -2
- etlplus-0.14.1/etlplus/ops/__init__.py +61 -0
- {etlplus-0.12.9/etlplus → etlplus-0.14.1/etlplus/ops}/extract.py +78 -94
- {etlplus-0.12.9/etlplus → etlplus-0.14.1/etlplus/ops}/load.py +73 -93
- {etlplus-0.12.9/etlplus → etlplus-0.14.1/etlplus/ops}/run.py +140 -110
- {etlplus-0.12.9/etlplus → etlplus-0.14.1/etlplus/ops}/transform.py +75 -68
- {etlplus-0.12.9/etlplus/validation → etlplus-0.14.1/etlplus/ops}/utils.py +62 -15
- {etlplus-0.12.9/etlplus → etlplus-0.14.1/etlplus/ops}/validate.py +19 -9
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/types.py +2 -2
- {etlplus-0.12.9 → etlplus-0.14.1/etlplus.egg-info}/PKG-INFO +97 -36
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus.egg-info/SOURCES.txt +54 -16
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/README.md +2 -2
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/configs/pipeline.yml +4 -4
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/quickstart_python.py +5 -5
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/conftest.py +4 -4
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_pagination_strategy.py +2 -2
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_run.py +1 -1
- etlplus-0.12.9/tests/unit/test_u_run_helpers.py → etlplus-0.14.1/tests/unit/api/test_u_api_utils.py +17 -15
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/file/test_u_file_core.py +38 -0
- etlplus-0.12.9/tests/unit/test_u_extract.py → etlplus-0.14.1/tests/unit/ops/test_u_ops_extract.py +12 -12
- etlplus-0.12.9/tests/unit/test_u_load.py → etlplus-0.14.1/tests/unit/ops/test_u_ops_load.py +17 -16
- etlplus-0.12.9/tests/unit/test_u_run.py → etlplus-0.14.1/tests/unit/ops/test_u_ops_run.py +4 -4
- etlplus-0.12.9/tests/unit/test_u_transform.py → etlplus-0.14.1/tests/unit/ops/test_u_ops_transform.py +65 -64
- etlplus-0.12.9/tests/unit/validation/test_u_validation_utils.py → etlplus-0.14.1/tests/unit/ops/test_u_ops_utils.py +4 -4
- etlplus-0.12.9/tests/unit/test_u_validate.py → etlplus-0.14.1/tests/unit/ops/test_u_ops_validate.py +9 -9
- etlplus-0.12.9/etlplus/__init__.py +0 -43
- etlplus-0.12.9/etlplus/validation/__init__.py +0 -44
- {etlplus-0.12.9 → etlplus-0.14.1}/.coveragerc +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/.editorconfig +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/.gitattributes +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/.github/actions/python-bootstrap/action.yml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/.github/workflows/ci.yml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/.gitignore +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/.pre-commit-config.yaml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/.ruff.toml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/CODE_OF_CONDUCT.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/LICENSE +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/MANIFEST.in +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/Makefile +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/REFERENCES.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/SECURITY.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/SUPPORT.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/docs/README.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/docs/snippets/installation_version.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/__main__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/__version__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/README.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/auth.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/config.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/errors.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/pagination/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/pagination/client.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/pagination/config.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/pagination/paginator.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/rate_limiting/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/rate_limiting/config.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/rate_limiting/rate_limiter.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/request_manager.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/retry_manager.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/transport.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/api/types.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/README.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/commands.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/constants.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/io.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/main.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/options.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/state.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/cli/types.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/README.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/connector.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/pipeline.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/profile.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/types.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/config/utils.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/database/README.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/database/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/database/ddl.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/database/engine.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/database/orm.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/database/schema.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/database/types.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/enums.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/README.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/_imports.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/_io.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/core.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/gz.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/stub.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/xls.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/xlsx.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/file/zip.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/mixins.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/py.typed +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/templates/README.md +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/templates/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/templates/ddl.sql.j2 +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/templates/view.sql.j2 +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus/utils.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus.egg-info/dependency_links.txt +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus.egg-info/entry_points.txt +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus.egg-info/requires.txt +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/etlplus.egg-info/top_level.txt +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/configs/ddl_spec.yml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/data/sample.csv +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/data/sample.json +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/data/sample.xml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/data/sample.xsd +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/examples/data/sample.yaml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/pyproject.toml +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/pytest.ini +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/setup.cfg +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/setup.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/__init__.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/conftest.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_cli.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_examples_data_parity.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_pipeline_smoke.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_pipeline_yaml_load.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_run_profile_pagination_defaults.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/integration/test_i_run_profile_rate_limit_defaults.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/conftest.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_auth.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_config.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_endpoint_client.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_mocks.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_pagination_client.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_pagination_config.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_paginator.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_rate_limit_config.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_rate_limiter.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_request_manager.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_retry_manager.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_transport.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/api/test_u_types.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/cli/conftest.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/cli/test_u_cli_handlers.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/cli/test_u_cli_io.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/cli/test_u_cli_main.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/cli/test_u_cli_state.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/config/test_u_config_utils.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/config/test_u_connector.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/config/test_u_jobs.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/config/test_u_pipeline.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/conftest.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/database/test_u_database_ddl.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/database/test_u_database_engine.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/database/test_u_database_orm.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/database/test_u_database_schema.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/file/test_u_file_enums.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/file/test_u_file_yaml.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/test_u_enums.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/test_u_main.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/test_u_mixins.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/test_u_utils.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tests/unit/test_u_version.py +0 -0
- {etlplus-0.12.9 → etlplus-0.14.1}/tools/update_demo_snippets.py +0 -0
|
@@ -119,7 +119,7 @@ Use these guidelines to decide whether a test belongs in the unit or integration
|
|
|
119
119
|
- Can use temporary files/directories, and stub network with fakes/mocks.
|
|
120
120
|
- Examples in this repo: CLI end-to-end, pipeline smoke tests, pagination strategy, runner defaults for pagination/rate limits, target URL composition.
|
|
121
121
|
|
|
122
|
-
If a test calls `etlplus.cli.main()` or `etlplus.run.run()`, it is integration by default.
|
|
122
|
+
If a test calls `etlplus.cli.main()` or `etlplus.ops.run.run()`, it is integration by default.
|
|
123
123
|
|
|
124
124
|
### Where to put tests
|
|
125
125
|
|
|
@@ -196,7 +196,7 @@ $ etlplus load transformed.json file final_output.csv
|
|
|
196
196
|
## Demo 6: Using Python API
|
|
197
197
|
|
|
198
198
|
```python
|
|
199
|
-
from etlplus import extract, validate, transform, load
|
|
199
|
+
from etlplus.ops import extract, validate, transform, load
|
|
200
200
|
|
|
201
201
|
# Extract
|
|
202
202
|
data = extract("file", "data.csv", format="csv")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: etlplus
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.1
|
|
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
|
|
@@ -77,8 +77,12 @@ package and command-line interface for data extraction, validation, transformati
|
|
|
77
77
|
- [Semi-Structured Text](#semi-structured-text)
|
|
78
78
|
- [Columnar / Analytics-Friendly](#columnar--analytics-friendly)
|
|
79
79
|
- [Binary Serialization and Interchange](#binary-serialization-and-interchange)
|
|
80
|
+
- [Databases and Embedded Storage](#databases-and-embedded-storage)
|
|
80
81
|
- [Spreadsheets](#spreadsheets)
|
|
82
|
+
- [Statistical / Scientific / Numeric Computing](#statistical--scientific--numeric-computing)
|
|
83
|
+
- [Logs and Event Streams](#logs-and-event-streams)
|
|
81
84
|
- [Data Archives](#data-archives)
|
|
85
|
+
- [Templates](#templates)
|
|
82
86
|
- [Usage](#usage)
|
|
83
87
|
- [Command Line Interface](#command-line-interface)
|
|
84
88
|
- [Argument Order and Required Options](#argument-order-and-required-options)
|
|
@@ -192,7 +196,7 @@ etlplus extract file examples/data/sample.csv \
|
|
|
192
196
|
[Python API](#python-api):
|
|
193
197
|
|
|
194
198
|
```python
|
|
195
|
-
from etlplus import extract, transform, validate, load
|
|
199
|
+
from etlplus.ops import extract, transform, validate, load
|
|
196
200
|
|
|
197
201
|
data = extract("file", "input.csv")
|
|
198
202
|
ops = {"filter": {"field": "age", "op": "gt", "value": 25}, "select": ["name", "email"]}
|
|
@@ -219,65 +223,122 @@ DDL can be rendered from table specs for migrations or schema checks.
|
|
|
219
223
|
|
|
220
224
|
### Files (`file`)
|
|
221
225
|
|
|
222
|
-
|
|
226
|
+
Recognized file formats are listed in the tables below. Support for reading to or writing from a recognized file format is marked as:
|
|
223
227
|
|
|
224
228
|
- **Y**: implemented (may require optional dependencies)
|
|
225
229
|
- **N**: stubbed or not yet implemented
|
|
226
230
|
|
|
227
231
|
#### Stubbed / Placeholder
|
|
228
232
|
|
|
229
|
-
| Format |
|
|
230
|
-
| --- | --- | --- |
|
|
233
|
+
| Format | Read | Write | Description |
|
|
234
|
+
| --- | --- | --- | --- |
|
|
231
235
|
| `stub` | N | Placeholder format for tests and future connectors. |
|
|
232
236
|
|
|
233
237
|
#### Tabular & Delimited Text
|
|
234
238
|
|
|
235
|
-
| Format |
|
|
236
|
-
| --- | --- | --- |
|
|
237
|
-
| `csv` | Y | Comma-Separated Values |
|
|
238
|
-
| `
|
|
239
|
-
| `
|
|
240
|
-
| `psv` | N | Pipe-Separated Values |
|
|
241
|
-
| `tab` | N | Often synonymous with TSV |
|
|
242
|
-
| `tsv` | Y | Tab-Separated Values |
|
|
243
|
-
| `txt` | Y | Plain text, often delimited or fixed-width |
|
|
239
|
+
| Format | Read | Write | Description |
|
|
240
|
+
| --- | --- | --- | --- |
|
|
241
|
+
| `csv` | Y | Y | Comma-Separated Values |
|
|
242
|
+
| `dat` | N | N | Generic data file, often delimited or fixed-width |
|
|
243
|
+
| `fwf` | N | N | Fixed-Width Fields |
|
|
244
|
+
| `psv` | N | N | Pipe-Separated Values |
|
|
245
|
+
| `tab` | N | N | Often synonymous with TSV |
|
|
246
|
+
| `tsv` | Y | Y | Tab-Separated Values |
|
|
247
|
+
| `txt` | Y | Y | Plain text, often delimited or fixed-width |
|
|
244
248
|
|
|
245
249
|
#### Semi-Structured Text
|
|
246
250
|
|
|
247
|
-
| Format |
|
|
248
|
-
| --- | --- | --- |
|
|
249
|
-
| `
|
|
250
|
-
| `
|
|
251
|
-
| `
|
|
252
|
-
| `
|
|
251
|
+
| Format | Read | Write | Description |
|
|
252
|
+
| --- | --- | --- | --- |
|
|
253
|
+
| `cfg` | N | N | Config-style key-value pairs |
|
|
254
|
+
| `conf` | N | N | Config-style key-value pairs |
|
|
255
|
+
| `ini` | N | N | Config-style key-value pairs |
|
|
256
|
+
| `json` | Y | Y | JavaScript Object Notation |
|
|
257
|
+
| `ndjson` | Y | Y | Newline-Delimited JSON |
|
|
258
|
+
| `properties` | N | N | Java-style key-value pairs |
|
|
259
|
+
| `toml` | N | N | Tom's Obvious Minimal Language |
|
|
260
|
+
| `xml` | Y | Y | Extensible Markup Language |
|
|
261
|
+
| `yaml` | Y | Y | YAML Ain't Markup Language |
|
|
253
262
|
|
|
254
263
|
#### Columnar / Analytics-Friendly
|
|
255
264
|
|
|
256
|
-
| Format |
|
|
257
|
-
| --- | --- | --- |
|
|
258
|
-
| `
|
|
259
|
-
| `
|
|
260
|
-
| `
|
|
265
|
+
| Format | Read | Write | Description |
|
|
266
|
+
| --- | --- | --- | --- |
|
|
267
|
+
| `arrow` | N | N | Apache Arrow IPC |
|
|
268
|
+
| `feather` | Y | Y | Apache Arrow Feather |
|
|
269
|
+
| `orc` | Y | Y | Optimized Row Columnar; common in Hadoop |
|
|
270
|
+
| `parquet` | Y | Y | Apache Parquet; common in Big Data |
|
|
261
271
|
|
|
262
272
|
#### Binary Serialization and Interchange
|
|
263
273
|
|
|
264
|
-
| Format |
|
|
265
|
-
| --- | --- | --- |
|
|
266
|
-
| `avro` | Y | Apache Avro |
|
|
274
|
+
| Format | Read | Write | Description |
|
|
275
|
+
| --- | --- | --- | --- |
|
|
276
|
+
| `avro` | Y | Y | Apache Avro |
|
|
277
|
+
| `bson` | N | N | Binary JSON; common with MongoDB exports/dumps |
|
|
278
|
+
| `cbor` | N | N | Concise Binary Object Representation |
|
|
279
|
+
| `ion` | N | N | Amazon Ion |
|
|
280
|
+
| `msgpack` | N | N | MessagePack |
|
|
281
|
+
| `pb` | N | N | Protocol Buffers (Google Protobuf) |
|
|
282
|
+
| `pbf` | N | N | Protocolbuffer Binary Format; often for GIS data |
|
|
283
|
+
| `proto` | N | N | Protocol Buffers schema; often in .pb / .bin |
|
|
284
|
+
|
|
285
|
+
#### Databases and Embedded Storage
|
|
286
|
+
|
|
287
|
+
| Format | Read | Write | Description |
|
|
288
|
+
| --- | --- | --- | --- |
|
|
289
|
+
| `accdb` | N | N | Microsoft Access (newer format) |
|
|
290
|
+
| `duckdb` | N | N | DuckDB |
|
|
291
|
+
| `mdb` | N | N | Microsoft Access (older format) |
|
|
292
|
+
| `sqlite` | N | N | SQLite |
|
|
267
293
|
|
|
268
294
|
#### Spreadsheets
|
|
269
295
|
|
|
296
|
+
| Format | Read | Write | Description |
|
|
297
|
+
| --- | --- | --- | --- |
|
|
298
|
+
| `numbers` | N | N | Apple Numbers |
|
|
299
|
+
| `ods` | N | N | OpenDocument |
|
|
300
|
+
| `wks` | N | N | Lotus 1-2-3 |
|
|
301
|
+
| `xls` | Y | Y | Microsoft Excel (BIFF) |
|
|
302
|
+
| `xlsm` | N | N | Microsoft Excel Macro-Enabled (Open XML) |
|
|
303
|
+
| `xlsx` | Y | Y | Microsoft Excel (Open XML) |
|
|
304
|
+
|
|
305
|
+
#### Statistical / Scientific / Numeric Computing
|
|
306
|
+
|
|
307
|
+
| Format | Read | Write | Description |
|
|
308
|
+
| --- | --- | --- | --- |
|
|
309
|
+
| `dta` | N | N | Stata |
|
|
310
|
+
| `hdf5` | N | N | Hierarchical Data Format |
|
|
311
|
+
| `mat` | N | N | MATLAB |
|
|
312
|
+
| `nc` | N | N | NetCDF |
|
|
313
|
+
| `rda` | N | N | RData workspace/object |
|
|
314
|
+
| `rds` | N | N | R data |
|
|
315
|
+
| `sas7bdat` | N | N | SAS data |
|
|
316
|
+
| `sav` | N | N | SPSS data |
|
|
317
|
+
| `sylk` | N | N | Symbolic Link |
|
|
318
|
+
| `xpt` | N | N | SAS Transport |
|
|
319
|
+
| `zsav` | N | N | Compressed SPSS data |
|
|
320
|
+
|
|
321
|
+
#### Logs and Event Streams
|
|
322
|
+
|
|
270
323
|
| Format | Supported | Description |
|
|
271
324
|
| --- | --- | --- |
|
|
272
|
-
| `
|
|
273
|
-
| `xlsx` | Y | Microsoft Excel (Open XML) |
|
|
325
|
+
| `log` | N | N | Generic log file |
|
|
274
326
|
|
|
275
327
|
#### Data Archives
|
|
276
328
|
|
|
277
|
-
| Format |
|
|
278
|
-
| --- | --- | --- |
|
|
279
|
-
| `gz` | Y | Gzip-compressed file |
|
|
280
|
-
| `zip` | Y | ZIP archive |
|
|
329
|
+
| Format | Read | Write | Description |
|
|
330
|
+
| --- | --- | --- | --- |
|
|
331
|
+
| `gz` | Y | Y | Gzip-compressed file |
|
|
332
|
+
| `zip` | Y | Y | ZIP archive |
|
|
333
|
+
|
|
334
|
+
#### Templates
|
|
335
|
+
|
|
336
|
+
| Format | Read | Write | Description |
|
|
337
|
+
| --- | --- | --- | --- |
|
|
338
|
+
| `hbs` | N | N | Handlebars |
|
|
339
|
+
| `jinja2` | N | N | Jinja2 |
|
|
340
|
+
| `mustache` | N | N | Mustache |
|
|
341
|
+
| `vm` | N | N | Apache Velocity |
|
|
281
342
|
|
|
282
343
|
## Usage
|
|
283
344
|
|
|
@@ -470,7 +531,7 @@ cat examples/data/sample.json \
|
|
|
470
531
|
Use ETLPlus as a Python library:
|
|
471
532
|
|
|
472
533
|
```python
|
|
473
|
-
from etlplus import extract, validate, transform, load
|
|
534
|
+
from etlplus.ops import extract, validate, transform, load
|
|
474
535
|
|
|
475
536
|
# Extract data
|
|
476
537
|
data = extract("file", "data.json")
|
|
@@ -665,7 +726,7 @@ We split tests into two layers:
|
|
|
665
726
|
pagination + rate limit defaults, file/API connector interactions) may touch temp files and use
|
|
666
727
|
fake clients.
|
|
667
728
|
|
|
668
|
-
If a test calls `etlplus.cli.main()` or `etlplus.run.run()` it’s integration by default.
|
|
729
|
+
If a test calls `etlplus.cli.main()` or `etlplus.ops.run.run()` it’s integration by default. Full
|
|
669
730
|
criteria: [`CONTRIBUTING.md#testing`](CONTRIBUTING.md#testing).
|
|
670
731
|
|
|
671
732
|
### Code Coverage
|
|
@@ -27,8 +27,12 @@ package and command-line interface for data extraction, validation, transformati
|
|
|
27
27
|
- [Semi-Structured Text](#semi-structured-text)
|
|
28
28
|
- [Columnar / Analytics-Friendly](#columnar--analytics-friendly)
|
|
29
29
|
- [Binary Serialization and Interchange](#binary-serialization-and-interchange)
|
|
30
|
+
- [Databases and Embedded Storage](#databases-and-embedded-storage)
|
|
30
31
|
- [Spreadsheets](#spreadsheets)
|
|
32
|
+
- [Statistical / Scientific / Numeric Computing](#statistical--scientific--numeric-computing)
|
|
33
|
+
- [Logs and Event Streams](#logs-and-event-streams)
|
|
31
34
|
- [Data Archives](#data-archives)
|
|
35
|
+
- [Templates](#templates)
|
|
32
36
|
- [Usage](#usage)
|
|
33
37
|
- [Command Line Interface](#command-line-interface)
|
|
34
38
|
- [Argument Order and Required Options](#argument-order-and-required-options)
|
|
@@ -142,7 +146,7 @@ etlplus extract file examples/data/sample.csv \
|
|
|
142
146
|
[Python API](#python-api):
|
|
143
147
|
|
|
144
148
|
```python
|
|
145
|
-
from etlplus import extract, transform, validate, load
|
|
149
|
+
from etlplus.ops import extract, transform, validate, load
|
|
146
150
|
|
|
147
151
|
data = extract("file", "input.csv")
|
|
148
152
|
ops = {"filter": {"field": "age", "op": "gt", "value": 25}, "select": ["name", "email"]}
|
|
@@ -169,65 +173,122 @@ DDL can be rendered from table specs for migrations or schema checks.
|
|
|
169
173
|
|
|
170
174
|
### Files (`file`)
|
|
171
175
|
|
|
172
|
-
|
|
176
|
+
Recognized file formats are listed in the tables below. Support for reading to or writing from a recognized file format is marked as:
|
|
173
177
|
|
|
174
178
|
- **Y**: implemented (may require optional dependencies)
|
|
175
179
|
- **N**: stubbed or not yet implemented
|
|
176
180
|
|
|
177
181
|
#### Stubbed / Placeholder
|
|
178
182
|
|
|
179
|
-
| Format |
|
|
180
|
-
| --- | --- | --- |
|
|
183
|
+
| Format | Read | Write | Description |
|
|
184
|
+
| --- | --- | --- | --- |
|
|
181
185
|
| `stub` | N | Placeholder format for tests and future connectors. |
|
|
182
186
|
|
|
183
187
|
#### Tabular & Delimited Text
|
|
184
188
|
|
|
185
|
-
| Format |
|
|
186
|
-
| --- | --- | --- |
|
|
187
|
-
| `csv` | Y | Comma-Separated Values |
|
|
188
|
-
| `
|
|
189
|
-
| `
|
|
190
|
-
| `psv` | N | Pipe-Separated Values |
|
|
191
|
-
| `tab` | N | Often synonymous with TSV |
|
|
192
|
-
| `tsv` | Y | Tab-Separated Values |
|
|
193
|
-
| `txt` | Y | Plain text, often delimited or fixed-width |
|
|
189
|
+
| Format | Read | Write | Description |
|
|
190
|
+
| --- | --- | --- | --- |
|
|
191
|
+
| `csv` | Y | Y | Comma-Separated Values |
|
|
192
|
+
| `dat` | N | N | Generic data file, often delimited or fixed-width |
|
|
193
|
+
| `fwf` | N | N | Fixed-Width Fields |
|
|
194
|
+
| `psv` | N | N | Pipe-Separated Values |
|
|
195
|
+
| `tab` | N | N | Often synonymous with TSV |
|
|
196
|
+
| `tsv` | Y | Y | Tab-Separated Values |
|
|
197
|
+
| `txt` | Y | Y | Plain text, often delimited or fixed-width |
|
|
194
198
|
|
|
195
199
|
#### Semi-Structured Text
|
|
196
200
|
|
|
197
|
-
| Format |
|
|
198
|
-
| --- | --- | --- |
|
|
199
|
-
| `
|
|
200
|
-
| `
|
|
201
|
-
| `
|
|
202
|
-
| `
|
|
201
|
+
| Format | Read | Write | Description |
|
|
202
|
+
| --- | --- | --- | --- |
|
|
203
|
+
| `cfg` | N | N | Config-style key-value pairs |
|
|
204
|
+
| `conf` | N | N | Config-style key-value pairs |
|
|
205
|
+
| `ini` | N | N | Config-style key-value pairs |
|
|
206
|
+
| `json` | Y | Y | JavaScript Object Notation |
|
|
207
|
+
| `ndjson` | Y | Y | Newline-Delimited JSON |
|
|
208
|
+
| `properties` | N | N | Java-style key-value pairs |
|
|
209
|
+
| `toml` | N | N | Tom's Obvious Minimal Language |
|
|
210
|
+
| `xml` | Y | Y | Extensible Markup Language |
|
|
211
|
+
| `yaml` | Y | Y | YAML Ain't Markup Language |
|
|
203
212
|
|
|
204
213
|
#### Columnar / Analytics-Friendly
|
|
205
214
|
|
|
206
|
-
| Format |
|
|
207
|
-
| --- | --- | --- |
|
|
208
|
-
| `
|
|
209
|
-
| `
|
|
210
|
-
| `
|
|
215
|
+
| Format | Read | Write | Description |
|
|
216
|
+
| --- | --- | --- | --- |
|
|
217
|
+
| `arrow` | N | N | Apache Arrow IPC |
|
|
218
|
+
| `feather` | Y | Y | Apache Arrow Feather |
|
|
219
|
+
| `orc` | Y | Y | Optimized Row Columnar; common in Hadoop |
|
|
220
|
+
| `parquet` | Y | Y | Apache Parquet; common in Big Data |
|
|
211
221
|
|
|
212
222
|
#### Binary Serialization and Interchange
|
|
213
223
|
|
|
214
|
-
| Format |
|
|
215
|
-
| --- | --- | --- |
|
|
216
|
-
| `avro` | Y | Apache Avro |
|
|
224
|
+
| Format | Read | Write | Description |
|
|
225
|
+
| --- | --- | --- | --- |
|
|
226
|
+
| `avro` | Y | Y | Apache Avro |
|
|
227
|
+
| `bson` | N | N | Binary JSON; common with MongoDB exports/dumps |
|
|
228
|
+
| `cbor` | N | N | Concise Binary Object Representation |
|
|
229
|
+
| `ion` | N | N | Amazon Ion |
|
|
230
|
+
| `msgpack` | N | N | MessagePack |
|
|
231
|
+
| `pb` | N | N | Protocol Buffers (Google Protobuf) |
|
|
232
|
+
| `pbf` | N | N | Protocolbuffer Binary Format; often for GIS data |
|
|
233
|
+
| `proto` | N | N | Protocol Buffers schema; often in .pb / .bin |
|
|
234
|
+
|
|
235
|
+
#### Databases and Embedded Storage
|
|
236
|
+
|
|
237
|
+
| Format | Read | Write | Description |
|
|
238
|
+
| --- | --- | --- | --- |
|
|
239
|
+
| `accdb` | N | N | Microsoft Access (newer format) |
|
|
240
|
+
| `duckdb` | N | N | DuckDB |
|
|
241
|
+
| `mdb` | N | N | Microsoft Access (older format) |
|
|
242
|
+
| `sqlite` | N | N | SQLite |
|
|
217
243
|
|
|
218
244
|
#### Spreadsheets
|
|
219
245
|
|
|
246
|
+
| Format | Read | Write | Description |
|
|
247
|
+
| --- | --- | --- | --- |
|
|
248
|
+
| `numbers` | N | N | Apple Numbers |
|
|
249
|
+
| `ods` | N | N | OpenDocument |
|
|
250
|
+
| `wks` | N | N | Lotus 1-2-3 |
|
|
251
|
+
| `xls` | Y | Y | Microsoft Excel (BIFF) |
|
|
252
|
+
| `xlsm` | N | N | Microsoft Excel Macro-Enabled (Open XML) |
|
|
253
|
+
| `xlsx` | Y | Y | Microsoft Excel (Open XML) |
|
|
254
|
+
|
|
255
|
+
#### Statistical / Scientific / Numeric Computing
|
|
256
|
+
|
|
257
|
+
| Format | Read | Write | Description |
|
|
258
|
+
| --- | --- | --- | --- |
|
|
259
|
+
| `dta` | N | N | Stata |
|
|
260
|
+
| `hdf5` | N | N | Hierarchical Data Format |
|
|
261
|
+
| `mat` | N | N | MATLAB |
|
|
262
|
+
| `nc` | N | N | NetCDF |
|
|
263
|
+
| `rda` | N | N | RData workspace/object |
|
|
264
|
+
| `rds` | N | N | R data |
|
|
265
|
+
| `sas7bdat` | N | N | SAS data |
|
|
266
|
+
| `sav` | N | N | SPSS data |
|
|
267
|
+
| `sylk` | N | N | Symbolic Link |
|
|
268
|
+
| `xpt` | N | N | SAS Transport |
|
|
269
|
+
| `zsav` | N | N | Compressed SPSS data |
|
|
270
|
+
|
|
271
|
+
#### Logs and Event Streams
|
|
272
|
+
|
|
220
273
|
| Format | Supported | Description |
|
|
221
274
|
| --- | --- | --- |
|
|
222
|
-
| `
|
|
223
|
-
| `xlsx` | Y | Microsoft Excel (Open XML) |
|
|
275
|
+
| `log` | N | N | Generic log file |
|
|
224
276
|
|
|
225
277
|
#### Data Archives
|
|
226
278
|
|
|
227
|
-
| Format |
|
|
228
|
-
| --- | --- | --- |
|
|
229
|
-
| `gz` | Y | Gzip-compressed file |
|
|
230
|
-
| `zip` | Y | ZIP archive |
|
|
279
|
+
| Format | Read | Write | Description |
|
|
280
|
+
| --- | --- | --- | --- |
|
|
281
|
+
| `gz` | Y | Y | Gzip-compressed file |
|
|
282
|
+
| `zip` | Y | Y | ZIP archive |
|
|
283
|
+
|
|
284
|
+
#### Templates
|
|
285
|
+
|
|
286
|
+
| Format | Read | Write | Description |
|
|
287
|
+
| --- | --- | --- | --- |
|
|
288
|
+
| `hbs` | N | N | Handlebars |
|
|
289
|
+
| `jinja2` | N | N | Jinja2 |
|
|
290
|
+
| `mustache` | N | N | Mustache |
|
|
291
|
+
| `vm` | N | N | Apache Velocity |
|
|
231
292
|
|
|
232
293
|
## Usage
|
|
233
294
|
|
|
@@ -420,7 +481,7 @@ cat examples/data/sample.json \
|
|
|
420
481
|
Use ETLPlus as a Python library:
|
|
421
482
|
|
|
422
483
|
```python
|
|
423
|
-
from etlplus import extract, validate, transform, load
|
|
484
|
+
from etlplus.ops import extract, validate, transform, load
|
|
424
485
|
|
|
425
486
|
# Extract data
|
|
426
487
|
data = extract("file", "data.json")
|
|
@@ -615,7 +676,7 @@ We split tests into two layers:
|
|
|
615
676
|
pagination + rate limit defaults, file/API connector interactions) may touch temp files and use
|
|
616
677
|
fake clients.
|
|
617
678
|
|
|
618
|
-
If a test calls `etlplus.cli.main()` or `etlplus.run.run()` it’s integration by default.
|
|
679
|
+
If a test calls `etlplus.cli.main()` or `etlplus.ops.run.run()` it’s integration by default. Full
|
|
619
680
|
criteria: [`CONTRIBUTING.md#testing`](CONTRIBUTING.md#testing).
|
|
620
681
|
|
|
621
682
|
### Code Coverage
|
|
@@ -281,7 +281,7 @@ section.
|
|
|
281
281
|
|
|
282
282
|
## Validations
|
|
283
283
|
|
|
284
|
-
Validation rule sets map field names to rules, mirroring `etlplus.validate.FieldRules`:
|
|
284
|
+
Validation rule sets map field names to rules, mirroring `etlplus.ops.validate.FieldRules`:
|
|
285
285
|
|
|
286
286
|
```yaml
|
|
287
287
|
validations:
|
|
@@ -297,7 +297,7 @@ validations:
|
|
|
297
297
|
|
|
298
298
|
## Transforms
|
|
299
299
|
|
|
300
|
-
Transformation pipelines follow `etlplus.transform` shapes exactly:
|
|
300
|
+
Transformation pipelines follow `etlplus.ops.transform` shapes exactly:
|
|
301
301
|
|
|
302
302
|
```yaml
|
|
303
303
|
transforms:
|
|
@@ -390,10 +390,20 @@ target:
|
|
|
390
390
|
```yaml
|
|
391
391
|
jobs:
|
|
392
392
|
- name: file_to_file_customers
|
|
393
|
+
depends_on: [seed_customers]
|
|
393
394
|
extract: { source: customers_csv }
|
|
394
395
|
validate: { ruleset: customers_basic }
|
|
395
396
|
transform: { pipeline: clean_customers }
|
|
396
397
|
load: { target: customers_json_out }
|
|
398
|
+
- name: seed_customers
|
|
399
|
+
extract: { source: seed_customers_csv }
|
|
400
|
+
load: { target: customers_db_out }
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
Notes:
|
|
404
|
+
|
|
405
|
+
- `depends_on` is optional and can be a string or list of job names.
|
|
406
|
+
- Jobs without dependencies run first when ordered as a DAG.
|
|
397
407
|
|
|
398
408
|
## Running pipelines (CLI and Python)
|
|
399
409
|
|
|
@@ -421,14 +431,14 @@ Notes:
|
|
|
421
431
|
- Environment-variable substitution (e.g. `${GITHUB_TOKEN}`) is applied the same way as when loading
|
|
422
432
|
configs via the Python API.
|
|
423
433
|
- For more details on the orchestration implementation, see
|
|
424
|
-
[Runner internals: etlplus.run](run-module.md).
|
|
434
|
+
[Runner internals: etlplus.ops.run](run-module.md).
|
|
425
435
|
|
|
426
|
-
### Python: `etlplus.run.run`
|
|
436
|
+
### Python: `etlplus.ops.run.run`
|
|
427
437
|
|
|
428
438
|
To trigger a job programmatically, use the high-level runner function exposed by the package:
|
|
429
439
|
|
|
430
440
|
```python
|
|
431
|
-
from etlplus.run import run as run_job
|
|
441
|
+
from etlplus.ops.run import run as run_job
|
|
432
442
|
|
|
433
443
|
result = run_job(
|
|
434
444
|
job="file_to_file_customers",
|
|
@@ -23,7 +23,7 @@ Back to project overview: see the top-level [README](../README.md).
|
|
|
23
23
|
## Quickstart
|
|
24
24
|
|
|
25
25
|
```python
|
|
26
|
-
from etlplus import extract, validate, transform, load
|
|
26
|
+
from etlplus.ops import extract, validate, transform, load
|
|
27
27
|
|
|
28
28
|
data = extract("file", "input.csv")
|
|
29
29
|
filtered = transform(data, {"filter": {"field": "age", "op": "gt", "value": 25}})
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""
|
|
2
|
+
:mod:`etlplus` package.
|
|
3
|
+
|
|
4
|
+
Top-level facade for the ETLPlus toolkit.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .__version__ import __version__
|
|
8
|
+
|
|
9
|
+
__author__ = 'ETLPlus Team'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# SECTION: EXPORTS ========================================================== #
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
'__author__',
|
|
17
|
+
'__version__',
|
|
18
|
+
]
|
|
@@ -98,6 +98,10 @@ from .types import Headers
|
|
|
98
98
|
from .types import Params
|
|
99
99
|
from .types import RequestOptions
|
|
100
100
|
from .types import Url
|
|
101
|
+
from .utils import compose_api_request_env
|
|
102
|
+
from .utils import compose_api_target_env
|
|
103
|
+
from .utils import paginate_with_client
|
|
104
|
+
from .utils import resolve_request
|
|
101
105
|
|
|
102
106
|
# SECTION: EXPORTS ========================================================== #
|
|
103
107
|
|
|
@@ -122,6 +126,10 @@ __all__ = [
|
|
|
122
126
|
'PaginationType',
|
|
123
127
|
# Functions
|
|
124
128
|
'build_http_adapter',
|
|
129
|
+
'compose_api_request_env',
|
|
130
|
+
'compose_api_target_env',
|
|
131
|
+
'paginate_with_client',
|
|
132
|
+
'resolve_request',
|
|
125
133
|
# Type Aliases
|
|
126
134
|
'CursorPaginationConfigMap',
|
|
127
135
|
'Headers',
|
|
@@ -455,7 +455,7 @@ class EndpointClient:
|
|
|
455
455
|
-------
|
|
456
456
|
JSONData
|
|
457
457
|
Parsed JSON payload or fallback structure matching
|
|
458
|
-
:func:`etlplus.extract.extract_from_api` semantics.
|
|
458
|
+
:func:`etlplus.ops.extract.extract_from_api` semantics.
|
|
459
459
|
"""
|
|
460
460
|
return self._request_manager.get(url, **kwargs)
|
|
461
461
|
|
|
@@ -479,7 +479,7 @@ class EndpointClient:
|
|
|
479
479
|
-------
|
|
480
480
|
JSONData
|
|
481
481
|
Parsed JSON payload or fallback structure matching
|
|
482
|
-
:func:`etlplus.extract.extract_from_api` semantics.
|
|
482
|
+
:func:`etlplus.ops.extract.extract_from_api` semantics.
|
|
483
483
|
"""
|
|
484
484
|
return self._request_manager.post(url, **kwargs)
|
|
485
485
|
|
|
@@ -506,7 +506,7 @@ class EndpointClient:
|
|
|
506
506
|
-------
|
|
507
507
|
JSONData
|
|
508
508
|
Parsed JSON payload or fallback structure matching
|
|
509
|
-
:func:`etlplus.extract.extract_from_api` semantics.
|
|
509
|
+
:func:`etlplus.ops.extract.extract_from_api` semantics.
|
|
510
510
|
"""
|
|
511
511
|
return self._request_manager.request(method, url, **kwargs)
|
|
512
512
|
|