etlplus 0.15.4__tar.gz → 0.16.0__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.15.4/etlplus.egg-info → etlplus-0.16.0}/PKG-INFO +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/docs/pipeline-guide.md +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/auth.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/config.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/endpoint_client.py +4 -4
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/config.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/paginator.py +6 -7
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/rate_limiting/config.py +4 -4
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/rate_limiting/rate_limiter.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/retry_manager.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/transport.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/types.py +22 -12
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/utils.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/constants.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/handlers.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/io.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/main.py +1 -1
- etlplus-0.16.0/etlplus/connector/__init__.py +43 -0
- etlplus-0.16.0/etlplus/connector/api.py +161 -0
- etlplus-0.16.0/etlplus/connector/connector.py +26 -0
- etlplus-0.16.0/etlplus/connector/core.py +132 -0
- etlplus-0.16.0/etlplus/connector/database.py +122 -0
- etlplus-0.16.0/etlplus/connector/enums.py +52 -0
- etlplus-0.16.0/etlplus/connector/file.py +120 -0
- etlplus-0.16.0/etlplus/connector/types.py +40 -0
- etlplus-0.16.0/etlplus/connector/utils.py +122 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/ddl.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/engine.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/enums.py +1 -33
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/_imports.py +1 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/_io.py +15 -6
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/accdb.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/arrow.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/avro.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/bson.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/cbor.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/cfg.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/conf.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/core.py +11 -8
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/csv.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/dat.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/dta.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/duckdb.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/enums.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/feather.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/fwf.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/gz.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/hbs.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/hdf5.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ini.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ion.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/jinja2.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/json.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/log.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/mat.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/mdb.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/msgpack.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/mustache.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/nc.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ndjson.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/numbers.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ods.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/orc.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/parquet.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/pb.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/pbf.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/properties.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/proto.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/psv.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/rda.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/rds.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sas7bdat.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sav.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sqlite.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/stub.py +1 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sylk.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/tab.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/toml.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/tsv.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/txt.py +4 -3
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/vm.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/wks.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xls.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xlsm.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xlsx.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xml.py +9 -3
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xpt.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/yaml.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/zip.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/zsav.py +3 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/extract.py +13 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/load.py +15 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/run.py +4 -4
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/transform.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/utils.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/types.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/utils.py +32 -32
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/__init__.py +0 -11
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/jobs.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/pipeline.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0/etlplus.egg-info}/PKG-INFO +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/SOURCES.txt +11 -3
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/conftest.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/conftest.py +2 -2
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_endpoint_client.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_request_manager.py +1 -1
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/conftest.py +2 -2
- etlplus-0.15.4/tests/unit/workflow/test_u_workflow_connector.py → etlplus-0.16.0/tests/unit/connector/test_u_connector_connector.py +6 -6
- etlplus-0.16.0/tests/unit/connector/test_u_connector_enums.py +47 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_load.py +1 -6
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_enums.py +0 -27
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/workflow/test_u_workflow_pipeline.py +3 -3
- {etlplus-0.15.4 → etlplus-0.16.0}/tools/update_demo_snippets.py +1 -1
- etlplus-0.15.4/etlplus/workflow/connector.py +0 -386
- etlplus-0.15.4/etlplus/workflow/types.py +0 -115
- {etlplus-0.15.4 → etlplus-0.16.0}/.coveragerc +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/.editorconfig +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/.gitattributes +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/.github/actions/python-bootstrap/action.yml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/.github/workflows/ci.yml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/.gitignore +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/.pre-commit-config.yaml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/.ruff.toml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/CODE_OF_CONDUCT.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/CONTRIBUTING.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/DEMO.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/LICENSE +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/MANIFEST.in +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/Makefile +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/REFERENCES.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/SECURITY.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/SUPPORT.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/docs/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/docs/snippets/installation_version.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/__main__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/__version__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/enums.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/errors.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/client.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/rate_limiting/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/request_manager.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/commands.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/options.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/state.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/types.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/orm.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/schema.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/types.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/mixins.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/validate.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/py.typed +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/ddl.sql.j2 +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/view.sql.j2 +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/dag.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/profile.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/dependency_links.txt +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/entry_points.txt +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/requires.txt +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/top_level.txt +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/README.md +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/configs/ddl_spec.yml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/configs/pipeline.yml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.csv +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.json +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.xml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.xsd +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.yaml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/examples/quickstart_python.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/pyproject.toml +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/pytest.ini +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/setup.cfg +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/setup.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/__init__.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_cli.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_examples_data_parity.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_pagination_strategy.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_pipeline_smoke.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_pipeline_yaml_load.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_run.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_run_profile_pagination_defaults.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_run_profile_rate_limit_defaults.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/conftest.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_api_enums.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_api_utils.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_auth.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_config.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_mocks.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_pagination_client.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_pagination_config.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_paginator.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_rate_limit_config.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_rate_limiter.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_retry_manager.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_transport.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_types.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_handlers.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_io.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_main.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_state.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/conftest.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_ddl.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_engine.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_orm.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_schema.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/file/test_u_file_core.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/file/test_u_file_enums.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/file/test_u_file_yaml.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_extract.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_run.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_transform.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_utils.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_validate.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_main.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_mixins.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_utils.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_version.py +0 -0
- {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/workflow/test_u_workflow_jobs.py +0 -0
|
@@ -377,9 +377,9 @@ Details:
|
|
|
377
377
|
- Unknown or malformed entries are skipped rather than failing the whole load (keeping pipeline
|
|
378
378
|
authoring permissive).
|
|
379
379
|
- The connector kind is also available as a type-safe literal in code as
|
|
380
|
-
`etlplus.
|
|
380
|
+
`etlplus.connector.ConnectorType` (values: `"file" | "database" | "api"`).
|
|
381
381
|
|
|
382
|
-
To add new connector kinds in the future, implement a new dataclass in `etlplus.
|
|
382
|
+
To add new connector kinds in the future, implement a new dataclass in `etlplus.connector`
|
|
383
383
|
and extend the internal parser to handle its `type` value.
|
|
384
384
|
|
|
385
385
|
## Jobs
|
|
@@ -68,7 +68,7 @@ def _effective_service_defaults(
|
|
|
68
68
|
fallback_headers: dict[str, str],
|
|
69
69
|
) -> tuple[str, dict[str, str]]:
|
|
70
70
|
"""
|
|
71
|
-
Return ``(base_url, headers)`` using
|
|
71
|
+
Return ``(base_url, headers)`` using *profiles* when present.
|
|
72
72
|
|
|
73
73
|
Parameters
|
|
74
74
|
----------
|
|
@@ -87,7 +87,7 @@ def _effective_service_defaults(
|
|
|
87
87
|
Raises
|
|
88
88
|
------
|
|
89
89
|
TypeError
|
|
90
|
-
If no profiles are defined and
|
|
90
|
+
If no profiles are defined and *fallback_base* is not a string.
|
|
91
91
|
"""
|
|
92
92
|
if profiles:
|
|
93
93
|
name = 'default' if 'default' in profiles else next(iter(profiles))
|
|
@@ -759,8 +759,8 @@ class EndpointClient:
|
|
|
759
759
|
Raises
|
|
760
760
|
------
|
|
761
761
|
KeyError
|
|
762
|
-
If
|
|
763
|
-
|
|
762
|
+
If *endpoint_key* is unknown or a required placeholder in the path
|
|
763
|
+
has no corresponding entry in *path_parameters*.
|
|
764
764
|
ValueError
|
|
765
765
|
If the path template is invalid.
|
|
766
766
|
|
|
@@ -836,7 +836,7 @@ class EndpointClient:
|
|
|
836
836
|
"""
|
|
837
837
|
Sleep for the specified seconds if positive.
|
|
838
838
|
|
|
839
|
-
The optional
|
|
839
|
+
The optional *sleeper* is useful for tests (e.g., pass
|
|
840
840
|
``lambda s: None``). Defaults to using time.sleep when not provided.
|
|
841
841
|
|
|
842
842
|
Parameters
|
|
@@ -870,7 +870,7 @@ class EndpointClient:
|
|
|
870
870
|
rate_limit : RateLimitConfigMap | None
|
|
871
871
|
Client-wide rate limit configuration.
|
|
872
872
|
overrides : RateLimitOverrides, optional
|
|
873
|
-
Per-call overrides that take precedence over
|
|
873
|
+
Per-call overrides that take precedence over *rate_limit*.
|
|
874
874
|
|
|
875
875
|
Returns
|
|
876
876
|
-------
|
|
@@ -66,14 +66,14 @@ def _resolve_path(
|
|
|
66
66
|
path: str | None,
|
|
67
67
|
) -> Any:
|
|
68
68
|
"""
|
|
69
|
-
Resolve dotted
|
|
69
|
+
Resolve dotted *path* within *obj* or return ``_MISSING``.
|
|
70
70
|
|
|
71
71
|
Parameters
|
|
72
72
|
----------
|
|
73
73
|
obj : Any
|
|
74
74
|
JSON payload from an API response.
|
|
75
75
|
path : str | None
|
|
76
|
-
Dotted path to the target value within
|
|
76
|
+
Dotted path to the target value within *obj*.
|
|
77
77
|
|
|
78
78
|
Returns
|
|
79
79
|
-------
|
|
@@ -665,7 +665,7 @@ class Paginator:
|
|
|
665
665
|
records_path : str | None
|
|
666
666
|
Optional dotted path to the records within the payload.
|
|
667
667
|
fallback_path : str | None
|
|
668
|
-
Secondary dotted path consulted when
|
|
668
|
+
Secondary dotted path consulted when *records_path* resolves to
|
|
669
669
|
``None`` or an empty list.
|
|
670
670
|
|
|
671
671
|
Returns
|
|
@@ -675,9 +675,8 @@ class Paginator:
|
|
|
675
675
|
|
|
676
676
|
Notes
|
|
677
677
|
-----
|
|
678
|
-
Supports dotted path extraction via
|
|
679
|
-
|
|
680
|
-
``{"value": x}``.
|
|
678
|
+
Supports dotted path extraction via *records_path* and handles lists,
|
|
679
|
+
mappings, and scalars by coercing non-dict items into ``{"value": x}``.
|
|
681
680
|
"""
|
|
682
681
|
resolver = partial(_resolve_path, x)
|
|
683
682
|
data = resolver(records_path)
|
|
@@ -729,7 +728,7 @@ class Paginator:
|
|
|
729
728
|
Returns
|
|
730
729
|
-------
|
|
731
730
|
PaginationType | None
|
|
732
|
-
Detected pagination type, or
|
|
731
|
+
Detected pagination type, or *default* if not found.
|
|
733
732
|
"""
|
|
734
733
|
if not config:
|
|
735
734
|
return default
|
|
@@ -84,14 +84,14 @@ def _merge_rate_limit(
|
|
|
84
84
|
overrides: RateLimitOverrides = None,
|
|
85
85
|
) -> dict[str, Any]:
|
|
86
86
|
"""
|
|
87
|
-
Merge
|
|
87
|
+
Merge *rate_limit* and *overrides* honoring override precedence.
|
|
88
88
|
|
|
89
89
|
Parameters
|
|
90
90
|
----------
|
|
91
91
|
rate_limit : StrAnyMap | None
|
|
92
92
|
Base rate-limit configuration.
|
|
93
93
|
overrides : RateLimitOverrides, optional
|
|
94
|
-
Override configuration with precedence over
|
|
94
|
+
Override configuration with precedence over *rate_limit*.
|
|
95
95
|
|
|
96
96
|
Returns
|
|
97
97
|
-------
|
|
@@ -274,7 +274,7 @@ class RateLimitConfig(BoundsWarningsMixin):
|
|
|
274
274
|
rate_limit : StrAnyMap | RateLimitConfig | None, optional
|
|
275
275
|
Base rate-limit configuration to normalize.
|
|
276
276
|
overrides : RateLimitOverrides, optional
|
|
277
|
-
Override values that take precedence over
|
|
277
|
+
Override values that take precedence over *rate_limit*.
|
|
278
278
|
|
|
279
279
|
Returns
|
|
280
280
|
-------
|
|
@@ -330,7 +330,7 @@ class RateLimitConfig(BoundsWarningsMixin):
|
|
|
330
330
|
Returns
|
|
331
331
|
-------
|
|
332
332
|
Self | None
|
|
333
|
-
Parsed instance, or ``None`` if
|
|
333
|
+
Parsed instance, or ``None`` if *obj* isn't a mapping.
|
|
334
334
|
"""
|
|
335
335
|
if obj is None:
|
|
336
336
|
return None
|
|
@@ -235,7 +235,7 @@ class RateLimiter:
|
|
|
235
235
|
Base rate-limit configuration. May contain ``"sleep_seconds"`` or
|
|
236
236
|
``"max_per_sec"``.
|
|
237
237
|
overrides : RateLimitOverrides, optional
|
|
238
|
-
Optional overrides with the same keys as
|
|
238
|
+
Optional overrides with the same keys as *rate_limit*.
|
|
239
239
|
|
|
240
240
|
Returns
|
|
241
241
|
-------
|
|
@@ -278,7 +278,7 @@ class RetryManager:
|
|
|
278
278
|
**kwargs: Any,
|
|
279
279
|
) -> JSONData:
|
|
280
280
|
"""
|
|
281
|
-
Execute
|
|
281
|
+
Execute *func* with exponential-backoff retries.
|
|
282
282
|
|
|
283
283
|
Parameters
|
|
284
284
|
----------
|
|
@@ -287,7 +287,7 @@ class RetryManager:
|
|
|
287
287
|
url : str
|
|
288
288
|
URL for the API request.
|
|
289
289
|
**kwargs : Any
|
|
290
|
-
Additional keyword arguments to pass to
|
|
290
|
+
Additional keyword arguments to pass to *func*
|
|
291
291
|
|
|
292
292
|
Returns
|
|
293
293
|
-------
|
|
@@ -309,7 +309,7 @@ def build_session_with_adapters(
|
|
|
309
309
|
adapters_cfg: Sequence[HTTPAdapterMountConfig],
|
|
310
310
|
) -> requests.Session:
|
|
311
311
|
"""
|
|
312
|
-
Mount adapters described by
|
|
312
|
+
Mount adapters described by *adapters_cfg* onto a new session.
|
|
313
313
|
|
|
314
314
|
Ignores invalid adapter configurations so that a usable session is always
|
|
315
315
|
returned.
|
|
@@ -61,10 +61,12 @@ _UNSET = object()
|
|
|
61
61
|
|
|
62
62
|
class ApiConfigMap(TypedDict, total=False):
|
|
63
63
|
"""
|
|
64
|
-
Top-level API config shape parsed by
|
|
64
|
+
Top-level API config shape parsed by
|
|
65
|
+
:meth:`etlplus.api.config.ApiConfig.from_obj`.
|
|
65
66
|
|
|
66
|
-
Either provide a
|
|
67
|
-
or provide
|
|
67
|
+
Either provide a :attr:`base_url` with optional :attr:`headers` and
|
|
68
|
+
:attr:`endpoints`, or provide :attr:`profiles` with at least one profile
|
|
69
|
+
having a :attr:`base_url`.
|
|
68
70
|
|
|
69
71
|
See Also
|
|
70
72
|
--------
|
|
@@ -79,11 +81,14 @@ class ApiConfigMap(TypedDict, total=False):
|
|
|
79
81
|
|
|
80
82
|
class ApiProfileConfigMap(TypedDict, total=False):
|
|
81
83
|
"""
|
|
82
|
-
Shape accepted for a profile entry under
|
|
84
|
+
Shape accepted for a profile entry under
|
|
85
|
+
:meth:`etlplus.api.config.ApiConfig.from_obj`.
|
|
83
86
|
|
|
84
87
|
Notes
|
|
85
88
|
-----
|
|
86
|
-
|
|
89
|
+
- :attr:`base_url` is required at runtime when :attr:`profiles` key/value
|
|
90
|
+
pairs are provided.
|
|
91
|
+
- :meth:`etlplus.api.config.ApiProfileConfig.from_obj` parses this mapping.
|
|
87
92
|
|
|
88
93
|
See Also
|
|
89
94
|
--------
|
|
@@ -103,7 +108,12 @@ class ApiProfileDefaultsMap(TypedDict, total=False):
|
|
|
103
108
|
|
|
104
109
|
Notes
|
|
105
110
|
-----
|
|
106
|
-
Runtime expects header values to be str
|
|
111
|
+
- Runtime expects header values to be ``str``; typing remains permissive.
|
|
112
|
+
- :meth:`etlplus.api.config.ApiProfileConfig.from_obj` consumes this block.
|
|
113
|
+
- :meth:`etlplus.api.pagination.PaginationConfig.from_obj` parses
|
|
114
|
+
:attr:`pagination`.
|
|
115
|
+
- :meth:`etlplus.api.rate_limiting.RateLimitConfig.from_obj` parses
|
|
116
|
+
:attr:`rate_limit`.
|
|
107
117
|
|
|
108
118
|
See Also
|
|
109
119
|
--------
|
|
@@ -113,15 +123,15 @@ class ApiProfileDefaultsMap(TypedDict, total=False):
|
|
|
113
123
|
"""
|
|
114
124
|
|
|
115
125
|
headers: StrAnyMap
|
|
116
|
-
pagination:
|
|
117
|
-
rate_limit:
|
|
126
|
+
pagination: StrAnyMap # PaginationConfigMap | StrAnyMap
|
|
127
|
+
rate_limit: StrAnyMap # RateLimitConfigMap | StrAnyMap
|
|
118
128
|
|
|
119
129
|
|
|
120
130
|
class EndpointMap(TypedDict, total=False):
|
|
121
131
|
"""
|
|
122
|
-
Shape accepted by EndpointConfig.from_obj
|
|
132
|
+
Shape accepted by :meth:`etlplus.api.config.EndpointConfig.from_obj`.
|
|
123
133
|
|
|
124
|
-
One of
|
|
134
|
+
One of :attr:`path` or :attr:`url` should be provided.
|
|
125
135
|
|
|
126
136
|
See Also
|
|
127
137
|
--------
|
|
@@ -134,8 +144,8 @@ class EndpointMap(TypedDict, total=False):
|
|
|
134
144
|
path_params: StrAnyMap
|
|
135
145
|
query_params: StrAnyMap
|
|
136
146
|
body: Any
|
|
137
|
-
pagination:
|
|
138
|
-
rate_limit:
|
|
147
|
+
pagination: StrAnyMap # PaginationConfigMap | StrAnyMap
|
|
148
|
+
rate_limit: StrAnyMap # RateLimitConfigMap | StrAnyMap
|
|
139
149
|
|
|
140
150
|
|
|
141
151
|
# SECTION: DATA CLASSES ===================================================== #
|
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
from typing import Final
|
|
10
10
|
|
|
11
|
-
from ..
|
|
11
|
+
from ..connector import DataConnectorType
|
|
12
12
|
from ..file import FileFormat
|
|
13
13
|
|
|
14
14
|
# SECTION: EXPORTS ========================================================== #
|
|
@@ -505,7 +505,7 @@ def run_handler(
|
|
|
505
505
|
Name of the job to run. If not provided, runs the entire pipeline.
|
|
506
506
|
Default is ``None``.
|
|
507
507
|
pipeline : str | None, optional
|
|
508
|
-
Alias for
|
|
508
|
+
Alias for *job*. Default is ``None``.
|
|
509
509
|
pretty : bool, optional
|
|
510
510
|
Whether to pretty-print output. Default is ``True``.
|
|
511
511
|
|
|
@@ -71,7 +71,7 @@ def emit_or_write(
|
|
|
71
71
|
success_message: str,
|
|
72
72
|
) -> None:
|
|
73
73
|
"""
|
|
74
|
-
Emit JSON or persist to disk based on
|
|
74
|
+
Emit JSON or persist to disk based on *output_path*.
|
|
75
75
|
|
|
76
76
|
Parameters
|
|
77
77
|
----------
|
|
@@ -122,7 +122,7 @@ def materialize_file_payload(
|
|
|
122
122
|
format_explicit: bool,
|
|
123
123
|
) -> JSONData | object:
|
|
124
124
|
"""
|
|
125
|
-
Return structured payloads when
|
|
125
|
+
Return structured payloads when *source* references a file.
|
|
126
126
|
|
|
127
127
|
Parameters
|
|
128
128
|
----------
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
:mod:`etlplus.connector` package.
|
|
3
|
+
|
|
4
|
+
Connector configuration types and enums.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from .api import ConnectorApi
|
|
10
|
+
from .api import ConnectorApiConfigMap
|
|
11
|
+
from .connector import Connector
|
|
12
|
+
from .core import ConnectorBase
|
|
13
|
+
from .core import ConnectorProtocol
|
|
14
|
+
from .database import ConnectorDb
|
|
15
|
+
from .database import ConnectorDbConfigMap
|
|
16
|
+
from .enums import DataConnectorType
|
|
17
|
+
from .file import ConnectorFile
|
|
18
|
+
from .file import ConnectorFileConfigMap
|
|
19
|
+
from .types import ConnectorType
|
|
20
|
+
from .utils import parse_connector
|
|
21
|
+
|
|
22
|
+
# SECTION: EXPORTS ========================================================== #
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
# Data Classes
|
|
27
|
+
'ConnectorApi',
|
|
28
|
+
'ConnectorDb',
|
|
29
|
+
'ConnectorFile',
|
|
30
|
+
# Enums
|
|
31
|
+
'DataConnectorType',
|
|
32
|
+
# Functions
|
|
33
|
+
'parse_connector',
|
|
34
|
+
# Type Aliases
|
|
35
|
+
'Connector',
|
|
36
|
+
'ConnectorBase',
|
|
37
|
+
'ConnectorProtocol',
|
|
38
|
+
'ConnectorType',
|
|
39
|
+
# Typed Dicts
|
|
40
|
+
'ConnectorApiConfigMap',
|
|
41
|
+
'ConnectorDbConfigMap',
|
|
42
|
+
'ConnectorFileConfigMap',
|
|
43
|
+
]
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
:mod:`etlplus.connector.api` module.
|
|
3
|
+
|
|
4
|
+
API connector configuration dataclass.
|
|
5
|
+
|
|
6
|
+
Notes
|
|
7
|
+
-----
|
|
8
|
+
- TypedDicts in this module are intentionally ``total=False`` and are not
|
|
9
|
+
enforced at runtime.
|
|
10
|
+
- :meth:`*.from_obj` constructors accept :class:`Mapping[str, Any]` and perform
|
|
11
|
+
tolerant parsing and light casting. This keeps the runtime permissive while
|
|
12
|
+
improving autocomplete and static analysis for contributors.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from dataclasses import field
|
|
19
|
+
from typing import Any
|
|
20
|
+
from typing import Self
|
|
21
|
+
from typing import TypedDict
|
|
22
|
+
from typing import overload
|
|
23
|
+
|
|
24
|
+
from ..api import PaginationConfig
|
|
25
|
+
from ..api import PaginationConfigMap
|
|
26
|
+
from ..api import RateLimitConfig
|
|
27
|
+
from ..api import RateLimitConfigMap
|
|
28
|
+
from ..types import StrAnyMap
|
|
29
|
+
from ..types import StrStrMap
|
|
30
|
+
from ..utils import cast_str_dict
|
|
31
|
+
from ..utils import coerce_dict
|
|
32
|
+
from ..utils import maybe_mapping
|
|
33
|
+
from .core import ConnectorBase
|
|
34
|
+
from .enums import DataConnectorType
|
|
35
|
+
from .types import ConnectorType
|
|
36
|
+
|
|
37
|
+
# SECTION: EXPORTS ========================================================== #
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
'ConnectorApi',
|
|
42
|
+
'ConnectorApiConfigMap',
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# SECTION: TYPED DICTS ====================================================== #
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ConnectorApiConfigMap(TypedDict, total=False):
|
|
50
|
+
"""
|
|
51
|
+
Shape accepted by :meth:`ConnectorApi.from_obj` (all keys optional).
|
|
52
|
+
|
|
53
|
+
See Also
|
|
54
|
+
--------
|
|
55
|
+
- :meth:`etlplus.connector.api.ConnectorApi.from_obj`
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
name: str
|
|
59
|
+
type: ConnectorType
|
|
60
|
+
url: str
|
|
61
|
+
method: str
|
|
62
|
+
headers: StrStrMap
|
|
63
|
+
query_params: StrAnyMap
|
|
64
|
+
pagination: PaginationConfigMap
|
|
65
|
+
rate_limit: RateLimitConfigMap
|
|
66
|
+
api: str
|
|
67
|
+
endpoint: str
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# SECTION: DATA CLASSES ===================================================== #
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(kw_only=True, slots=True)
|
|
74
|
+
class ConnectorApi(ConnectorBase):
|
|
75
|
+
"""
|
|
76
|
+
Configuration for an API-based data connector.
|
|
77
|
+
|
|
78
|
+
Attributes
|
|
79
|
+
----------
|
|
80
|
+
type : ConnectorType
|
|
81
|
+
Connector kind, always ``'api'``.
|
|
82
|
+
url : str | None
|
|
83
|
+
Direct absolute URL (when not using ``service``/``endpoint`` refs).
|
|
84
|
+
method : str | None
|
|
85
|
+
Optional HTTP method; typically omitted for sources (defaults to
|
|
86
|
+
GET) and used for targets (e.g., ``'post'``).
|
|
87
|
+
headers : dict[str, str]
|
|
88
|
+
Additional request headers.
|
|
89
|
+
query_params : dict[str, Any]
|
|
90
|
+
Default query parameters.
|
|
91
|
+
pagination : PaginationConfig | None
|
|
92
|
+
Pagination settings (optional).
|
|
93
|
+
rate_limit : RateLimitConfig | None
|
|
94
|
+
Rate limiting settings (optional).
|
|
95
|
+
api : str | None
|
|
96
|
+
Service reference into the pipeline ``apis`` block (a.k.a.
|
|
97
|
+
``service``).
|
|
98
|
+
endpoint : str | None
|
|
99
|
+
Endpoint name within the referenced service.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
# -- Attributes -- #
|
|
103
|
+
|
|
104
|
+
type: ConnectorType = DataConnectorType.API
|
|
105
|
+
|
|
106
|
+
# Direct form
|
|
107
|
+
url: str | None = None
|
|
108
|
+
# Optional HTTP method; typically omitted for sources (defaults to GET)
|
|
109
|
+
# at runtime) and used for targets (e.g., 'post', 'put').
|
|
110
|
+
method: str | None = None
|
|
111
|
+
headers: dict[str, str] = field(default_factory=dict)
|
|
112
|
+
query_params: dict[str, Any] = field(default_factory=dict)
|
|
113
|
+
pagination: PaginationConfig | None = None
|
|
114
|
+
rate_limit: RateLimitConfig | None = None
|
|
115
|
+
|
|
116
|
+
# Reference form (to top-level APIs/endpoints)
|
|
117
|
+
api: str | None = None
|
|
118
|
+
endpoint: str | None = None
|
|
119
|
+
|
|
120
|
+
# -- Class Methods -- #
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
@overload
|
|
124
|
+
def from_obj(cls, obj: ConnectorApiConfigMap) -> Self: ...
|
|
125
|
+
|
|
126
|
+
@classmethod
|
|
127
|
+
@overload
|
|
128
|
+
def from_obj(cls, obj: StrAnyMap) -> Self: ...
|
|
129
|
+
|
|
130
|
+
@classmethod
|
|
131
|
+
def from_obj(
|
|
132
|
+
cls,
|
|
133
|
+
obj: StrAnyMap,
|
|
134
|
+
) -> Self:
|
|
135
|
+
"""
|
|
136
|
+
Parse a mapping into a ``ConnectorApi`` instance.
|
|
137
|
+
|
|
138
|
+
Parameters
|
|
139
|
+
----------
|
|
140
|
+
obj : StrAnyMap
|
|
141
|
+
Mapping with at least ``name``.
|
|
142
|
+
|
|
143
|
+
Returns
|
|
144
|
+
-------
|
|
145
|
+
Self
|
|
146
|
+
Parsed connector instance.
|
|
147
|
+
"""
|
|
148
|
+
name = cls._require_name(obj, kind='Api')
|
|
149
|
+
headers = cast_str_dict(maybe_mapping(obj.get('headers')))
|
|
150
|
+
|
|
151
|
+
return cls(
|
|
152
|
+
name=name,
|
|
153
|
+
url=obj.get('url'),
|
|
154
|
+
method=obj.get('method'),
|
|
155
|
+
headers=headers,
|
|
156
|
+
query_params=coerce_dict(obj.get('query_params')),
|
|
157
|
+
pagination=PaginationConfig.from_obj(obj.get('pagination')),
|
|
158
|
+
rate_limit=RateLimitConfig.from_obj(obj.get('rate_limit')),
|
|
159
|
+
api=obj.get('api') or obj.get('service'),
|
|
160
|
+
endpoint=obj.get('endpoint'),
|
|
161
|
+
)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""
|
|
2
|
+
:mod:`etlplus.connector.connector` module.
|
|
3
|
+
|
|
4
|
+
Compatibility re-exports for connector configuration classes.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from .api import ConnectorApi
|
|
10
|
+
from .database import ConnectorDb
|
|
11
|
+
from .file import ConnectorFile
|
|
12
|
+
|
|
13
|
+
# SECTION: EXPORTS ========================================================== #
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
# Type aliases
|
|
18
|
+
'Connector',
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# SECTION: TYPED ALIASES ==================================================== #
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# Type alias representing any supported connector
|
|
26
|
+
type Connector = ConnectorApi | ConnectorDb | ConnectorFile
|