etlplus 0.16.7__tar.gz → 0.16.9__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.16.7 → etlplus-0.16.9}/CONTRIBUTING.md +10 -4
- {etlplus-0.16.7/etlplus.egg-info → etlplus-0.16.9}/PKG-INFO +6 -5
- {etlplus-0.16.7 → etlplus-0.16.9}/README.md +5 -4
- {etlplus-0.16.7 → etlplus-0.16.9}/docs/README.md +9 -4
- {etlplus-0.16.7 → etlplus-0.16.9}/docs/pipeline-guide.md +35 -11
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/main.py +1 -22
- {etlplus-0.16.7 → etlplus-0.16.9/etlplus.egg-info}/PKG-INFO +6 -5
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus.egg-info/SOURCES.txt +2 -1
- etlplus-0.16.9/pytest.ini +13 -0
- etlplus-0.16.9/tests/README.md +38 -0
- etlplus-0.16.7/tests/integration/test_i_pipeline_smoke.py → etlplus-0.16.9/tests/smoke/test_s_pipeline.py +6 -7
- etlplus-0.16.7/pytest.ini +0 -12
- {etlplus-0.16.7 → etlplus-0.16.9}/.coveragerc +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/.editorconfig +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/.gitattributes +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/.github/actions/python-bootstrap/action.yml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/.github/workflows/ci.yml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/.gitignore +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/.pre-commit-config.yaml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/.ruff.toml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/CODE_OF_CONDUCT.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/DEMO.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/LICENSE +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/MANIFEST.in +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/Makefile +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/REFERENCES.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/SECURITY.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/SUPPORT.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/docs/snippets/installation_version.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/__main__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/__version__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/auth.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/endpoint_client.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/errors.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/pagination/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/pagination/client.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/pagination/config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/pagination/paginator.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/rate_limiting/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/rate_limiting/config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/rate_limiting/rate_limiter.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/request_manager.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/retry_manager.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/transport.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/types.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/api/utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/commands.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/constants.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/handlers.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/io.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/options.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/state.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/cli/types.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/api.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/connector.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/core.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/database.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/file.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/types.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/connector/utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/database/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/database/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/database/ddl.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/database/engine.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/database/orm.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/database/schema.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/database/types.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/_imports.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/_io.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/accdb.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/arrow.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/avro.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/bson.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/cbor.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/cfg.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/conf.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/core.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/csv.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/dat.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/dta.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/duckdb.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/feather.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/fwf.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/gz.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/hbs.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/hdf5.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/ini.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/ion.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/jinja2.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/json.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/log.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/mat.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/mdb.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/msgpack.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/mustache.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/nc.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/ndjson.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/numbers.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/ods.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/orc.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/parquet.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/pb.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/pbf.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/properties.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/proto.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/psv.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/rda.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/rds.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/sas7bdat.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/sav.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/sqlite.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/stub.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/sylk.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/tab.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/toml.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/tsv.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/txt.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/vm.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/wks.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/xls.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/xlsm.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/xlsx.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/xml.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/xpt.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/yaml.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/zip.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/file/zsav.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/mixins.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/extract.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/load.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/run.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/transform.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/types.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/ops/validate.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/py.typed +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/templates/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/templates/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/templates/ddl.sql.j2 +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/templates/view.sql.j2 +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/types.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/workflow/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/workflow/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/workflow/dag.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/workflow/jobs.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus/workflow/profile.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus.egg-info/dependency_links.txt +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus.egg-info/entry_points.txt +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus.egg-info/requires.txt +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/etlplus.egg-info/top_level.txt +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/README.md +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/configs/ddl_spec.yml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/configs/pipeline.yml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/data/sample.csv +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/data/sample.json +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/data/sample.xml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/data/sample.xsd +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/data/sample.yaml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/examples/quickstart.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/pyproject.toml +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/setup.cfg +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/setup.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/__init__.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/conftest.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/conftest.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/test_i_cli.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/test_i_config_load.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/test_i_examples_data_parity.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/test_i_pagination_strategy.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/test_i_run.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/test_i_run_profile_pagination_defaults.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/integration/test_i_run_profile_rate_limit_defaults.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/conftest.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_auth.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_endpoint_client.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_mocks.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_pagination_client.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_pagination_config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_paginator.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_rate_limit_config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_rate_limiter.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_request_manager.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_retry_manager.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_transport.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_types.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/api/test_u_api_utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/cli/conftest.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/cli/test_u_cli_handlers.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/cli/test_u_cli_io.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/cli/test_u_cli_main.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/cli/test_u_cli_state.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/conftest.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/connector/test_u_connector_enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/connector/test_u_connector_utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/database/test_u_database_ddl.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/database/test_u_database_engine.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/database/test_u_database_orm.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/database/test_u_database_schema.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/file/test_u_file_core.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/file/test_u_file_enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/file/test_u_file_yaml.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/ops/test_u_ops_enums.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/ops/test_u_ops_extract.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/ops/test_u_ops_load.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/ops/test_u_ops_run.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/ops/test_u_ops_transform.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/ops/test_u_ops_utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/ops/test_u_ops_validate.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/test_u_config.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/test_u_main.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/test_u_mixins.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/test_u_utils.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/test_u_version.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tests/unit/workflow/test_u_workflow_jobs.py +0 -0
- {etlplus-0.16.7 → etlplus-0.16.9}/tools/update_demo_snippets.py +0 -0
|
@@ -14,7 +14,7 @@ email, or any other method with the owners of this repository before making a ch
|
|
|
14
14
|
- [Type Checking](#type-checking)
|
|
15
15
|
- [Typing Philosophy](#typing-philosophy)
|
|
16
16
|
- [Testing](#testing)
|
|
17
|
-
- [Unit vs. Integration](#unit-vs-integration)
|
|
17
|
+
- [Unit vs. Smoke vs. Integration](#unit-vs-smoke-vs-integration)
|
|
18
18
|
- [Where to put tests](#where-to-put-tests)
|
|
19
19
|
- [Common patterns](#common-patterns)
|
|
20
20
|
|
|
@@ -104,9 +104,9 @@ class ExampleConfig:
|
|
|
104
104
|
|
|
105
105
|
## Testing
|
|
106
106
|
|
|
107
|
-
### Unit vs. Integration
|
|
107
|
+
### Unit vs. Smoke vs. Integration
|
|
108
108
|
|
|
109
|
-
Use these guidelines to decide whether a test belongs in the unit or integration suite:
|
|
109
|
+
Use these guidelines to decide whether a test belongs in the unit, smoke, or integration suite:
|
|
110
110
|
|
|
111
111
|
- Unit tests (put under `tests/unit/`):
|
|
112
112
|
- Exercise a single function or class in isolation (no orchestration across modules).
|
|
@@ -117,13 +117,19 @@ Use these guidelines to decide whether a test belongs in the unit or integration
|
|
|
117
117
|
- Integration tests (put under `tests/integration/`):
|
|
118
118
|
- Exercise end-to-end flows across modules and boundaries (CLI `main()`, `run()` pipeline orchestration, file connectors, API client pagination wiring).
|
|
119
119
|
- Can use temporary files/directories, and stub network with fakes/mocks.
|
|
120
|
-
- Examples in this repo: CLI end-to-end,
|
|
120
|
+
- Examples in this repo: CLI end-to-end, pagination strategy, runner defaults for pagination/rate limits, target URL composition.
|
|
121
|
+
|
|
122
|
+
- Smoke tests (put under `tests/smoke/`):
|
|
123
|
+
- Minimal end-to-end checks for core flows; very fast and stable.
|
|
124
|
+
- May touch temporary files but avoid external network calls.
|
|
125
|
+
- Examples in this repo: pipeline smoke tests.
|
|
121
126
|
|
|
122
127
|
If a test calls `etlplus.cli.main()` or `etlplus.ops.run.run()`, it is integration by default.
|
|
123
128
|
|
|
124
129
|
### Where to put tests
|
|
125
130
|
|
|
126
131
|
- Unit tests live in `tests/unit/` and should import and test specific functions/classes directly.
|
|
132
|
+
- Smoke tests live in `tests/smoke/` and should focus on minimal end-to-end CLI/pipeline checks.
|
|
127
133
|
- Integration tests live in `tests/integration/` and may simulate real usage using CLI argv, temporary files, and fake clients.
|
|
128
134
|
- The `tests/integration/conftest.py` applies `@pytest.mark.integration` to all tests in that folder. You don’t need to add the marker per test.
|
|
129
135
|
- Markers are declared in `pytest.ini`. Avoid introducing ad-hoc markers without adding them there.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: etlplus
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.9
|
|
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
|
|
@@ -355,9 +355,8 @@ etlplus --help
|
|
|
355
355
|
etlplus --version
|
|
356
356
|
```
|
|
357
357
|
|
|
358
|
-
The CLI is implemented with Typer (Click-based). The legacy argparse parser has been removed
|
|
359
|
-
|
|
360
|
-
--help` for current options.
|
|
358
|
+
The CLI is implemented with Typer (Click-based). The legacy argparse parser has been removed, so
|
|
359
|
+
rely on the documented commands/flags and run `etlplus <command> --help` for current options.
|
|
361
360
|
|
|
362
361
|
**Example error messages:**
|
|
363
362
|
|
|
@@ -722,10 +721,12 @@ pytest tests/ -v
|
|
|
722
721
|
|
|
723
722
|
#### Test Layers
|
|
724
723
|
|
|
725
|
-
We split tests into
|
|
724
|
+
We split tests into three layers:
|
|
726
725
|
|
|
727
726
|
- **Unit (`tests/unit/`)**: single function or class, no real I/O, fast, uses stubs/monkeypatch
|
|
728
727
|
(e.g. small helpers in `etlplus.utils`, transform + validate helpers).
|
|
728
|
+
- **Smoke (`tests/smoke/`)**: minimal end-to-end checks for core flows; may touch temp files but
|
|
729
|
+
avoids external network calls.
|
|
729
730
|
- **Integration (`tests/integration/`)**: end-to-end flows (CLI `main()`, pipeline `run()`,
|
|
730
731
|
pagination + rate limit defaults, file/API connector interactions) may touch temp files and use
|
|
731
732
|
fake clients.
|
|
@@ -305,9 +305,8 @@ etlplus --help
|
|
|
305
305
|
etlplus --version
|
|
306
306
|
```
|
|
307
307
|
|
|
308
|
-
The CLI is implemented with Typer (Click-based). The legacy argparse parser has been removed
|
|
309
|
-
|
|
310
|
-
--help` for current options.
|
|
308
|
+
The CLI is implemented with Typer (Click-based). The legacy argparse parser has been removed, so
|
|
309
|
+
rely on the documented commands/flags and run `etlplus <command> --help` for current options.
|
|
311
310
|
|
|
312
311
|
**Example error messages:**
|
|
313
312
|
|
|
@@ -672,10 +671,12 @@ pytest tests/ -v
|
|
|
672
671
|
|
|
673
672
|
#### Test Layers
|
|
674
673
|
|
|
675
|
-
We split tests into
|
|
674
|
+
We split tests into three layers:
|
|
676
675
|
|
|
677
676
|
- **Unit (`tests/unit/`)**: single function or class, no real I/O, fast, uses stubs/monkeypatch
|
|
678
677
|
(e.g. small helpers in `etlplus.utils`, transform + validate helpers).
|
|
678
|
+
- **Smoke (`tests/smoke/`)**: minimal end-to-end checks for core flows; may touch temp files but
|
|
679
|
+
avoids external network calls.
|
|
679
680
|
- **Integration (`tests/integration/`)**: end-to-end flows (CLI `main()`, pipeline `run()`,
|
|
680
681
|
pagination + rate limit defaults, file/API connector interactions) may touch temp files and use
|
|
681
682
|
fake clients.
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
# Documentation Notes
|
|
2
2
|
|
|
3
|
+
- [Documentation Notes](#documentation-notes)
|
|
4
|
+
- [CLI Parser Status](#cli-parser-status)
|
|
5
|
+
- [Migration Hints](#migration-hints)
|
|
6
|
+
|
|
3
7
|
## CLI Parser Status
|
|
4
|
-
|
|
5
|
-
|
|
8
|
+
|
|
9
|
+
- The CLI is Typer/Click-only. The historical `argparse` parser has been removed.
|
|
6
10
|
- Downstream tools should invoke the Typer app exported at `etlplus.cli.commands.app` (e.g., `python
|
|
7
11
|
-m etlplus` or `etlplus ...`).
|
|
8
12
|
- Handler functions still accept keyword arguments; the legacy namespace shim is temporary and will
|
|
@@ -10,8 +14,9 @@
|
|
|
10
14
|
handlers with explicit keyword arguments if you integrate programmatically.
|
|
11
15
|
|
|
12
16
|
## Migration Hints
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
|
|
18
|
+
- Replace any `argparse`-based integrations with Typer invocations (`etlplus` binary or `app`
|
|
19
|
+
directly).
|
|
15
20
|
- If you maintained custom subcommands around the old parser, port them to Typer by attaching to
|
|
16
21
|
`app` or wrapping the `etlplus` executable.
|
|
17
22
|
- Tests and examples now target the Typer surface; expect argparse-focused helpers (e.g., namespace
|
|
@@ -3,15 +3,39 @@
|
|
|
3
3
|
This guide explains how to author an ETLPlus pipeline YAML, using the example at `in/pipeline.yml`
|
|
4
4
|
as a reference.
|
|
5
5
|
|
|
6
|
+
- [Pipeline Authoring Guide](#pipeline-authoring-guide)
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Running a Pipeline from YAML (CLI)](#running-a-pipeline-from-yaml-cli)
|
|
9
|
+
- [Top-Level Structure](#top-level-structure)
|
|
10
|
+
- [APIs](#apis)
|
|
11
|
+
- [Profiles, base\_path, and auth](#profiles-base_path-and-auth)
|
|
12
|
+
- [Runner behavior with `base_path` (sources and targets)](#runner-behavior-with-base_path-sources-and-targets)
|
|
13
|
+
- [Databases](#databases)
|
|
14
|
+
- [File Systems](#file-systems)
|
|
15
|
+
- [Sources](#sources)
|
|
16
|
+
- [Validations](#validations)
|
|
17
|
+
- [Transforms](#transforms)
|
|
18
|
+
- [Targets](#targets)
|
|
19
|
+
- [Connector Parsing and Extension](#connector-parsing-and-extension)
|
|
20
|
+
- [Jobs](#jobs)
|
|
21
|
+
- [Running Pipelines (CLI and Python)](#running-pipelines-cli-and-python)
|
|
22
|
+
- [CLI: `etlplus check` (Inspect) and `etlplus run` (Execute)](#cli-etlplus-check-inspect-and-etlplus-run-execute)
|
|
23
|
+
- [Python: `etlplus.ops.run.run`](#python-etlplusopsrunrun)
|
|
24
|
+
- [Tips](#tips)
|
|
25
|
+
- [Design notes: Mapping inputs, dict outputs](#design-notes-mapping-inputs-dict-outputs)
|
|
26
|
+
- [Merge Semantics (Python 3.13)](#merge-semantics-python-313)
|
|
27
|
+
- [Extending Config Shapes](#extending-config-shapes)
|
|
28
|
+
|
|
29
|
+
## Overview
|
|
30
|
+
|
|
6
31
|
ETLPlus focuses on simple, JSON-first ETL. The pipeline file is a declarative description that your
|
|
7
32
|
runner (a script, Makefile, CI job) can parse and execute using ETLPlus primitives: `extract`,
|
|
8
33
|
`validate`, `transform`, and `load`.
|
|
9
34
|
|
|
10
|
-
CLI note: ETLPlus uses Typer for command parsing. The legacy argparse parser has been removed
|
|
11
|
-
|
|
12
|
-
--help`) when wiring your runner.
|
|
35
|
+
CLI note: ETLPlus uses Typer for command parsing. The legacy argparse parser has been removed. Use
|
|
36
|
+
the documented `etlplus` commands and flags (check `etlplus --help`) when wiring your runner.
|
|
13
37
|
|
|
14
|
-
## Running a
|
|
38
|
+
## Running a Pipeline from YAML (CLI)
|
|
15
39
|
|
|
16
40
|
Use the built-in `etlplus run` command to execute jobs defined in a pipeline YAML. The command reads
|
|
17
41
|
your config, resolves vars and env placeholders, then runs the requested job:
|
|
@@ -30,7 +54,7 @@ etlplus run --config examples/configs/pipeline.yml --job api_to_file_github_repo
|
|
|
30
54
|
For scripted usage inside a larger Python project, prefer importing the Python API directly (e.g.,
|
|
31
55
|
`extract`, `transform`, `validate`, `load`) instead of invoking the CLI subprocess.
|
|
32
56
|
|
|
33
|
-
## Top-
|
|
57
|
+
## Top-Level Structure
|
|
34
58
|
|
|
35
59
|
A pipeline file typically includes:
|
|
36
60
|
|
|
@@ -205,7 +229,7 @@ databases:
|
|
|
205
229
|
Note: Database extract/load in ETLPlus is minimal today; consider this a placeholder for
|
|
206
230
|
orchestration that calls into DB clients.
|
|
207
231
|
|
|
208
|
-
## File
|
|
232
|
+
## File Systems
|
|
209
233
|
|
|
210
234
|
Point to local/cloud locations and logical folders:
|
|
211
235
|
|
|
@@ -362,7 +386,7 @@ targets:
|
|
|
362
386
|
Content-Type: application/json
|
|
363
387
|
```
|
|
364
388
|
|
|
365
|
-
## Connector
|
|
389
|
+
## Connector Parsing and Extension
|
|
366
390
|
|
|
367
391
|
Under the hood, source and target entries are parsed via a single tolerant constructor that looks at
|
|
368
392
|
the `type` field and builds a concrete connector dataclass:
|
|
@@ -405,12 +429,12 @@ Notes:
|
|
|
405
429
|
- `depends_on` is optional and can be a string or list of job names.
|
|
406
430
|
- Jobs without dependencies run first when ordered as a DAG.
|
|
407
431
|
|
|
408
|
-
## Running
|
|
432
|
+
## Running Pipelines (CLI and Python)
|
|
409
433
|
|
|
410
434
|
Once you have a pipeline YAML, you can run jobs either from the
|
|
411
435
|
command line or directly from Python.
|
|
412
436
|
|
|
413
|
-
### CLI: `etlplus check` (
|
|
437
|
+
### CLI: `etlplus check` (Inspect) and `etlplus run` (Execute)
|
|
414
438
|
|
|
415
439
|
List jobs or show a summary from a pipeline file:
|
|
416
440
|
|
|
@@ -508,7 +532,7 @@ Any]` rather than `dict[str, Any]` for inputs. Why?
|
|
|
508
532
|
|
|
509
533
|
Practically, you can pass a plain `dict` everywhere and it will work.
|
|
510
534
|
|
|
511
|
-
### Merge
|
|
535
|
+
### Merge Semantics (Python 3.13)
|
|
512
536
|
|
|
513
537
|
We use the dict union operator for clarity:
|
|
514
538
|
|
|
@@ -521,7 +545,7 @@ Header precedence (lowest → highest):
|
|
|
521
545
|
2. `profiles.<name>.headers`
|
|
522
546
|
3. API top-level `headers`
|
|
523
547
|
|
|
524
|
-
### Extending
|
|
548
|
+
### Extending Config Shapes
|
|
525
549
|
|
|
526
550
|
When adding new config objects or fields:
|
|
527
551
|
|
|
@@ -3,15 +3,13 @@
|
|
|
3
3
|
|
|
4
4
|
Entry point helpers for the Typer-powered ``etlplus`` CLI.
|
|
5
5
|
|
|
6
|
-
This module exposes :func:`main` for the console script
|
|
7
|
-
:func:`create_parser`, which is kept for compatibility but now raises.
|
|
6
|
+
This module exposes :func:`main` for the console script.
|
|
8
7
|
"""
|
|
9
8
|
|
|
10
9
|
from __future__ import annotations
|
|
11
10
|
|
|
12
11
|
import contextlib
|
|
13
12
|
import sys
|
|
14
|
-
import warnings
|
|
15
13
|
|
|
16
14
|
import click
|
|
17
15
|
import typer
|
|
@@ -121,25 +119,6 @@ def _is_unknown_command_error(
|
|
|
121
119
|
# SECTION: FUNCTIONS ======================================================== #
|
|
122
120
|
|
|
123
121
|
|
|
124
|
-
def create_parser() -> object:
|
|
125
|
-
"""
|
|
126
|
-
Deprecated legacy entrypoint.
|
|
127
|
-
|
|
128
|
-
The argparse-based parser has been removed. Use the Typer-powered
|
|
129
|
-
``etlplus`` CLI instead (``etlplus.cli.commands.app``).
|
|
130
|
-
"""
|
|
131
|
-
warnings.warn(
|
|
132
|
-
'create_parser is deprecated and no longer returns an argparse '
|
|
133
|
-
'parser. Use the Typer CLI entrypoint instead.',
|
|
134
|
-
DeprecationWarning,
|
|
135
|
-
stacklevel=2,
|
|
136
|
-
)
|
|
137
|
-
raise RuntimeError(
|
|
138
|
-
'The legacy argparse parser has been removed. Invoke the Typer-based '
|
|
139
|
-
'CLI via `etlplus` or import `etlplus.cli.commands.app`.',
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
|
|
143
122
|
def main(
|
|
144
123
|
argv: list[str] | None = None,
|
|
145
124
|
) -> int:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: etlplus
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.9
|
|
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
|
|
@@ -355,9 +355,8 @@ etlplus --help
|
|
|
355
355
|
etlplus --version
|
|
356
356
|
```
|
|
357
357
|
|
|
358
|
-
The CLI is implemented with Typer (Click-based). The legacy argparse parser has been removed
|
|
359
|
-
|
|
360
|
-
--help` for current options.
|
|
358
|
+
The CLI is implemented with Typer (Click-based). The legacy argparse parser has been removed, so
|
|
359
|
+
rely on the documented commands/flags and run `etlplus <command> --help` for current options.
|
|
361
360
|
|
|
362
361
|
**Example error messages:**
|
|
363
362
|
|
|
@@ -722,10 +721,12 @@ pytest tests/ -v
|
|
|
722
721
|
|
|
723
722
|
#### Test Layers
|
|
724
723
|
|
|
725
|
-
We split tests into
|
|
724
|
+
We split tests into three layers:
|
|
726
725
|
|
|
727
726
|
- **Unit (`tests/unit/`)**: single function or class, no real I/O, fast, uses stubs/monkeypatch
|
|
728
727
|
(e.g. small helpers in `etlplus.utils`, transform + validate helpers).
|
|
728
|
+
- **Smoke (`tests/smoke/`)**: minimal end-to-end checks for core flows; may touch temp files but
|
|
729
|
+
avoids external network calls.
|
|
729
730
|
- **Integration (`tests/integration/`)**: end-to-end flows (CLI `main()`, pipeline `run()`,
|
|
730
731
|
pagination + rate limit defaults, file/API connector interactions) may touch temp files and use
|
|
731
732
|
fake clients.
|
|
@@ -174,6 +174,7 @@ examples/data/sample.json
|
|
|
174
174
|
examples/data/sample.xml
|
|
175
175
|
examples/data/sample.xsd
|
|
176
176
|
examples/data/sample.yaml
|
|
177
|
+
tests/README.md
|
|
177
178
|
tests/__init__.py
|
|
178
179
|
tests/conftest.py
|
|
179
180
|
tests/integration/conftest.py
|
|
@@ -181,10 +182,10 @@ tests/integration/test_i_cli.py
|
|
|
181
182
|
tests/integration/test_i_config_load.py
|
|
182
183
|
tests/integration/test_i_examples_data_parity.py
|
|
183
184
|
tests/integration/test_i_pagination_strategy.py
|
|
184
|
-
tests/integration/test_i_pipeline_smoke.py
|
|
185
185
|
tests/integration/test_i_run.py
|
|
186
186
|
tests/integration/test_i_run_profile_pagination_defaults.py
|
|
187
187
|
tests/integration/test_i_run_profile_rate_limit_defaults.py
|
|
188
|
+
tests/smoke/test_s_pipeline.py
|
|
188
189
|
tests/unit/conftest.py
|
|
189
190
|
tests/unit/test_u_config.py
|
|
190
191
|
tests/unit/test_u_main.py
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# pytest.ini
|
|
2
|
+
# ETLPlus
|
|
3
|
+
#
|
|
4
|
+
# Copyright © 2025 Dagitali LLC. All rights reserved.
|
|
5
|
+
|
|
6
|
+
[pytest]
|
|
7
|
+
testpaths = tests/unit tests/smoke tests/integration
|
|
8
|
+
addopts = -ra
|
|
9
|
+
markers =
|
|
10
|
+
property: property-based tests (Hypothesis) for URL composition and encoding
|
|
11
|
+
smoke: fast end-to-end tests covering core flows
|
|
12
|
+
integration: tests that exercise multiple modules or external I/O boundaries
|
|
13
|
+
unit: tests that isolate individual modules or functions
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Tests Overview
|
|
2
|
+
|
|
3
|
+
ETLPlus uses three categories of tests. Each category lives in its own folder and is tagged with a
|
|
4
|
+
pytest marker to make selection easy.
|
|
5
|
+
|
|
6
|
+
## Unit tests (`tests/unit/`)
|
|
7
|
+
|
|
8
|
+
- Scope: single function or class in isolation
|
|
9
|
+
- I/O: no real file system or network I/O (use stubs/monkeypatch)
|
|
10
|
+
- Speed: fast, deterministic
|
|
11
|
+
- Marker: `unit`
|
|
12
|
+
|
|
13
|
+
## Smoke tests (`tests/smoke/`)
|
|
14
|
+
|
|
15
|
+
- Scope: minimal end-to-end sanity checks for core flows
|
|
16
|
+
- I/O: may touch temp files; no external network calls
|
|
17
|
+
- Speed: very fast; intended to catch obvious regressions
|
|
18
|
+
- Marker: `smoke`
|
|
19
|
+
|
|
20
|
+
## Integration tests (`tests/integration/`)
|
|
21
|
+
|
|
22
|
+
- Scope: cross-module workflows and CLI/pipeline paths
|
|
23
|
+
- I/O: may touch temp files; may use fakes/mocks for HTTP clients
|
|
24
|
+
- Speed: slower than unit/smoke
|
|
25
|
+
- Marker: `integration`
|
|
26
|
+
|
|
27
|
+
## Running tests
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pytest tests/unit
|
|
31
|
+
pytest tests/smoke
|
|
32
|
+
pytest tests/integration
|
|
33
|
+
|
|
34
|
+
# Marker-based selection
|
|
35
|
+
pytest -m unit
|
|
36
|
+
pytest -m smoke
|
|
37
|
+
pytest -m integration
|
|
38
|
+
```
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"""
|
|
2
|
-
:mod:`tests.
|
|
2
|
+
:mod:`tests.smoke.test_s_pipeline` module.
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
and non-empty inputs.
|
|
4
|
+
Smoke test suite exercising a minimal file→file job via the CLI. Parametrized
|
|
5
|
+
to verify both empty and non-empty inputs.
|
|
7
6
|
|
|
8
7
|
Notes
|
|
9
8
|
-----
|
|
@@ -28,14 +27,14 @@ if TYPE_CHECKING: # pragma: no cover - typing helpers only
|
|
|
28
27
|
# SECTION: HELPERS ========================================================== #
|
|
29
28
|
|
|
30
29
|
|
|
31
|
-
pytestmark = pytest.mark.
|
|
30
|
+
pytestmark = pytest.mark.smoke
|
|
32
31
|
|
|
33
32
|
|
|
34
33
|
# SECTION: TESTS ============================================================ #
|
|
35
34
|
|
|
36
35
|
|
|
37
|
-
class
|
|
38
|
-
"""
|
|
36
|
+
class TestPipeline:
|
|
37
|
+
"""Smoke test suite for file→file job via CLI."""
|
|
39
38
|
|
|
40
39
|
@pytest.mark.parametrize(
|
|
41
40
|
'data_in',
|
etlplus-0.16.7/pytest.ini
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# pytest.ini
|
|
2
|
-
# ETLPlus
|
|
3
|
-
#
|
|
4
|
-
# Copyright © 2025 Dagitali LLC. All rights reserved.
|
|
5
|
-
|
|
6
|
-
[pytest]
|
|
7
|
-
testpaths = tests/unit tests/integration
|
|
8
|
-
addopts = -ra
|
|
9
|
-
markers =
|
|
10
|
-
property: property-based tests (Hypothesis) for URL composition and encoding
|
|
11
|
-
integration: tests that exercise multiple modules or external I/O boundaries
|
|
12
|
-
unit: tests that isolate individual modules or functions
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|