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.
Files changed (234) hide show
  1. {etlplus-0.15.4/etlplus.egg-info → etlplus-0.16.0}/PKG-INFO +1 -1
  2. {etlplus-0.15.4 → etlplus-0.16.0}/docs/pipeline-guide.md +2 -2
  3. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/auth.py +1 -1
  4. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/config.py +2 -2
  5. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/endpoint_client.py +4 -4
  6. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/config.py +1 -1
  7. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/paginator.py +6 -7
  8. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/rate_limiting/config.py +4 -4
  9. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/rate_limiting/rate_limiter.py +1 -1
  10. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/retry_manager.py +2 -2
  11. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/transport.py +1 -1
  12. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/types.py +22 -12
  13. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/utils.py +1 -1
  14. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/constants.py +1 -1
  15. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/handlers.py +1 -1
  16. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/io.py +2 -2
  17. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/main.py +1 -1
  18. etlplus-0.16.0/etlplus/connector/__init__.py +43 -0
  19. etlplus-0.16.0/etlplus/connector/api.py +161 -0
  20. etlplus-0.16.0/etlplus/connector/connector.py +26 -0
  21. etlplus-0.16.0/etlplus/connector/core.py +132 -0
  22. etlplus-0.16.0/etlplus/connector/database.py +122 -0
  23. etlplus-0.16.0/etlplus/connector/enums.py +52 -0
  24. etlplus-0.16.0/etlplus/connector/file.py +120 -0
  25. etlplus-0.16.0/etlplus/connector/types.py +40 -0
  26. etlplus-0.16.0/etlplus/connector/utils.py +122 -0
  27. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/ddl.py +2 -2
  28. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/engine.py +1 -1
  29. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/enums.py +1 -33
  30. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/_imports.py +1 -0
  31. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/_io.py +15 -6
  32. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/accdb.py +3 -2
  33. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/arrow.py +3 -2
  34. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/avro.py +3 -2
  35. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/bson.py +3 -2
  36. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/cbor.py +3 -2
  37. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/cfg.py +3 -2
  38. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/conf.py +3 -2
  39. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/core.py +11 -8
  40. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/csv.py +3 -2
  41. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/dat.py +3 -2
  42. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/dta.py +3 -2
  43. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/duckdb.py +3 -2
  44. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/enums.py +1 -1
  45. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/feather.py +3 -2
  46. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/fwf.py +3 -2
  47. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/gz.py +3 -2
  48. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/hbs.py +3 -2
  49. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/hdf5.py +3 -2
  50. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ini.py +3 -2
  51. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ion.py +3 -2
  52. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/jinja2.py +3 -2
  53. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/json.py +3 -2
  54. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/log.py +3 -2
  55. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/mat.py +3 -2
  56. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/mdb.py +3 -2
  57. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/msgpack.py +3 -2
  58. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/mustache.py +3 -2
  59. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/nc.py +3 -2
  60. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ndjson.py +3 -2
  61. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/numbers.py +3 -2
  62. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/ods.py +3 -2
  63. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/orc.py +3 -2
  64. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/parquet.py +3 -2
  65. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/pb.py +3 -2
  66. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/pbf.py +3 -2
  67. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/properties.py +3 -2
  68. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/proto.py +3 -2
  69. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/psv.py +3 -2
  70. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/rda.py +3 -2
  71. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/rds.py +3 -2
  72. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sas7bdat.py +3 -2
  73. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sav.py +3 -2
  74. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sqlite.py +3 -2
  75. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/stub.py +1 -0
  76. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/sylk.py +3 -2
  77. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/tab.py +3 -2
  78. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/toml.py +3 -2
  79. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/tsv.py +3 -2
  80. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/txt.py +4 -3
  81. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/vm.py +3 -2
  82. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/wks.py +3 -2
  83. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xls.py +3 -2
  84. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xlsm.py +3 -2
  85. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xlsx.py +3 -2
  86. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xml.py +9 -3
  87. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/xpt.py +3 -2
  88. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/yaml.py +3 -2
  89. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/zip.py +3 -2
  90. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/zsav.py +3 -2
  91. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/extract.py +13 -1
  92. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/load.py +15 -2
  93. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/run.py +4 -4
  94. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/transform.py +2 -2
  95. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/utils.py +2 -2
  96. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/types.py +1 -1
  97. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/utils.py +32 -32
  98. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/__init__.py +0 -11
  99. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/jobs.py +1 -1
  100. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/pipeline.py +2 -2
  101. {etlplus-0.15.4 → etlplus-0.16.0/etlplus.egg-info}/PKG-INFO +1 -1
  102. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/SOURCES.txt +11 -3
  103. {etlplus-0.15.4 → etlplus-0.16.0}/tests/conftest.py +1 -1
  104. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/conftest.py +2 -2
  105. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_endpoint_client.py +1 -1
  106. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_request_manager.py +1 -1
  107. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/conftest.py +2 -2
  108. 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
  109. etlplus-0.16.0/tests/unit/connector/test_u_connector_enums.py +47 -0
  110. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_load.py +1 -6
  111. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_enums.py +0 -27
  112. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/workflow/test_u_workflow_pipeline.py +3 -3
  113. {etlplus-0.15.4 → etlplus-0.16.0}/tools/update_demo_snippets.py +1 -1
  114. etlplus-0.15.4/etlplus/workflow/connector.py +0 -386
  115. etlplus-0.15.4/etlplus/workflow/types.py +0 -115
  116. {etlplus-0.15.4 → etlplus-0.16.0}/.coveragerc +0 -0
  117. {etlplus-0.15.4 → etlplus-0.16.0}/.editorconfig +0 -0
  118. {etlplus-0.15.4 → etlplus-0.16.0}/.gitattributes +0 -0
  119. {etlplus-0.15.4 → etlplus-0.16.0}/.github/actions/python-bootstrap/action.yml +0 -0
  120. {etlplus-0.15.4 → etlplus-0.16.0}/.github/workflows/ci.yml +0 -0
  121. {etlplus-0.15.4 → etlplus-0.16.0}/.gitignore +0 -0
  122. {etlplus-0.15.4 → etlplus-0.16.0}/.pre-commit-config.yaml +0 -0
  123. {etlplus-0.15.4 → etlplus-0.16.0}/.ruff.toml +0 -0
  124. {etlplus-0.15.4 → etlplus-0.16.0}/CODE_OF_CONDUCT.md +0 -0
  125. {etlplus-0.15.4 → etlplus-0.16.0}/CONTRIBUTING.md +0 -0
  126. {etlplus-0.15.4 → etlplus-0.16.0}/DEMO.md +0 -0
  127. {etlplus-0.15.4 → etlplus-0.16.0}/LICENSE +0 -0
  128. {etlplus-0.15.4 → etlplus-0.16.0}/MANIFEST.in +0 -0
  129. {etlplus-0.15.4 → etlplus-0.16.0}/Makefile +0 -0
  130. {etlplus-0.15.4 → etlplus-0.16.0}/README.md +0 -0
  131. {etlplus-0.15.4 → etlplus-0.16.0}/REFERENCES.md +0 -0
  132. {etlplus-0.15.4 → etlplus-0.16.0}/SECURITY.md +0 -0
  133. {etlplus-0.15.4 → etlplus-0.16.0}/SUPPORT.md +0 -0
  134. {etlplus-0.15.4 → etlplus-0.16.0}/docs/README.md +0 -0
  135. {etlplus-0.15.4 → etlplus-0.16.0}/docs/snippets/installation_version.md +0 -0
  136. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/README.md +0 -0
  137. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/__init__.py +0 -0
  138. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/__main__.py +0 -0
  139. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/__version__.py +0 -0
  140. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/README.md +0 -0
  141. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/__init__.py +0 -0
  142. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/enums.py +0 -0
  143. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/errors.py +0 -0
  144. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/__init__.py +0 -0
  145. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/pagination/client.py +0 -0
  146. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/rate_limiting/__init__.py +0 -0
  147. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/api/request_manager.py +0 -0
  148. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/README.md +0 -0
  149. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/__init__.py +0 -0
  150. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/commands.py +0 -0
  151. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/options.py +0 -0
  152. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/state.py +0 -0
  153. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/cli/types.py +0 -0
  154. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/README.md +0 -0
  155. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/__init__.py +0 -0
  156. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/orm.py +0 -0
  157. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/schema.py +0 -0
  158. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/database/types.py +0 -0
  159. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/README.md +0 -0
  160. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/file/__init__.py +0 -0
  161. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/mixins.py +0 -0
  162. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/README.md +0 -0
  163. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/__init__.py +0 -0
  164. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/ops/validate.py +0 -0
  165. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/py.typed +0 -0
  166. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/README.md +0 -0
  167. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/__init__.py +0 -0
  168. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/ddl.sql.j2 +0 -0
  169. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/templates/view.sql.j2 +0 -0
  170. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/README.md +0 -0
  171. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/dag.py +0 -0
  172. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus/workflow/profile.py +0 -0
  173. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/dependency_links.txt +0 -0
  174. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/entry_points.txt +0 -0
  175. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/requires.txt +0 -0
  176. {etlplus-0.15.4 → etlplus-0.16.0}/etlplus.egg-info/top_level.txt +0 -0
  177. {etlplus-0.15.4 → etlplus-0.16.0}/examples/README.md +0 -0
  178. {etlplus-0.15.4 → etlplus-0.16.0}/examples/configs/ddl_spec.yml +0 -0
  179. {etlplus-0.15.4 → etlplus-0.16.0}/examples/configs/pipeline.yml +0 -0
  180. {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.csv +0 -0
  181. {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.json +0 -0
  182. {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.xml +0 -0
  183. {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.xsd +0 -0
  184. {etlplus-0.15.4 → etlplus-0.16.0}/examples/data/sample.yaml +0 -0
  185. {etlplus-0.15.4 → etlplus-0.16.0}/examples/quickstart_python.py +0 -0
  186. {etlplus-0.15.4 → etlplus-0.16.0}/pyproject.toml +0 -0
  187. {etlplus-0.15.4 → etlplus-0.16.0}/pytest.ini +0 -0
  188. {etlplus-0.15.4 → etlplus-0.16.0}/setup.cfg +0 -0
  189. {etlplus-0.15.4 → etlplus-0.16.0}/setup.py +0 -0
  190. {etlplus-0.15.4 → etlplus-0.16.0}/tests/__init__.py +0 -0
  191. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_cli.py +0 -0
  192. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_examples_data_parity.py +0 -0
  193. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_pagination_strategy.py +0 -0
  194. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_pipeline_smoke.py +0 -0
  195. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_pipeline_yaml_load.py +0 -0
  196. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_run.py +0 -0
  197. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_run_profile_pagination_defaults.py +0 -0
  198. {etlplus-0.15.4 → etlplus-0.16.0}/tests/integration/test_i_run_profile_rate_limit_defaults.py +0 -0
  199. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/conftest.py +0 -0
  200. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_api_enums.py +0 -0
  201. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_api_utils.py +0 -0
  202. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_auth.py +0 -0
  203. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_config.py +0 -0
  204. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_mocks.py +0 -0
  205. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_pagination_client.py +0 -0
  206. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_pagination_config.py +0 -0
  207. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_paginator.py +0 -0
  208. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_rate_limit_config.py +0 -0
  209. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_rate_limiter.py +0 -0
  210. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_retry_manager.py +0 -0
  211. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_transport.py +0 -0
  212. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/api/test_u_types.py +0 -0
  213. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_handlers.py +0 -0
  214. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_io.py +0 -0
  215. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_main.py +0 -0
  216. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/cli/test_u_cli_state.py +0 -0
  217. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/conftest.py +0 -0
  218. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_ddl.py +0 -0
  219. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_engine.py +0 -0
  220. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_orm.py +0 -0
  221. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/database/test_u_database_schema.py +0 -0
  222. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/file/test_u_file_core.py +0 -0
  223. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/file/test_u_file_enums.py +0 -0
  224. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/file/test_u_file_yaml.py +0 -0
  225. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_extract.py +0 -0
  226. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_run.py +0 -0
  227. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_transform.py +0 -0
  228. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_utils.py +0 -0
  229. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/ops/test_u_ops_validate.py +0 -0
  230. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_main.py +0 -0
  231. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_mixins.py +0 -0
  232. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_utils.py +0 -0
  233. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/test_u_version.py +0 -0
  234. {etlplus-0.15.4 → etlplus-0.16.0}/tests/unit/workflow/test_u_workflow_jobs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: etlplus
3
- Version: 0.15.4
3
+ Version: 0.16.0
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
@@ -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.workflow.ConnectorType` (values: `"file" | "database" | "api"`).
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.workflow.connector`
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
@@ -136,7 +136,7 @@ def _truncate(
136
136
  limit: int = MAX_LOG_BODY,
137
137
  ) -> str:
138
138
  """
139
- Return ``text`` shortened to ``limit`` characters for logging.
139
+ Return *text* shortened to *limit* characters for logging.
140
140
 
141
141
  Parameters
142
142
  ----------
@@ -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 ``profiles`` when present.
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 ``fallback_base`` is not a string.
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 ``endpoint_key`` is unknown or a required placeholder in the
763
- path has no corresponding entry in ``path_parameters``.
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 ``sleeper`` is useful for tests (e.g., pass
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 ``rate_limit``.
873
+ Per-call overrides that take precedence over *rate_limit*.
874
874
 
875
875
  Returns
876
876
  -------
@@ -398,7 +398,7 @@ class PaginationConfig(BoundsWarningsMixin):
398
398
  Returns
399
399
  -------
400
400
  Self | None
401
- Parsed pagination configuration, or ``None`` if ``obj`` isn't a
401
+ Parsed pagination configuration, or ``None`` if *obj* isn't a
402
402
  mapping.
403
403
 
404
404
  Notes
@@ -66,14 +66,14 @@ def _resolve_path(
66
66
  path: str | None,
67
67
  ) -> Any:
68
68
  """
69
- Resolve dotted ``path`` within ``obj`` or return ``_MISSING``.
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 ``obj``.
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 ``records_path`` resolves to
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 ``records_path`` and handles
679
- lists, mappings, and scalars by coercing non-dict items into
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 ``default`` if not found.
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 ``rate_limit`` and ``overrides`` honoring override precedence.
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 ``rate_limit``.
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 ``rate_limit``.
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 ``obj`` isn't a mapping.
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 ``rate_limit``.
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 ``func`` with exponential-backoff retries.
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 ``func``
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 ``adapters_cfg`` onto a new session.
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 ApiConfig.from_obj.
64
+ Top-level API config shape parsed by
65
+ :meth:`etlplus.api.config.ApiConfig.from_obj`.
65
66
 
66
- Either provide a ``base_url`` with optional ``headers`` and ``endpoints``,
67
- or provide ``profiles`` with at least one profile having a ``base_url``.
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 ApiConfigMap.profiles.
84
+ Shape accepted for a profile entry under
85
+ :meth:`etlplus.api.config.ApiConfig.from_obj`.
83
86
 
84
87
  Notes
85
88
  -----
86
- ``base_url`` is required at runtime when profiles are provided.
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; typing remains permissive.
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: Any
117
- rate_limit: Any
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 ``path`` or ``url`` should be provided.
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: Any
138
- rate_limit: Any
147
+ pagination: StrAnyMap # PaginationConfigMap | StrAnyMap
148
+ rate_limit: StrAnyMap # RateLimitConfigMap | StrAnyMap
139
149
 
140
150
 
141
151
  # SECTION: DATA CLASSES ===================================================== #
@@ -172,7 +172,7 @@ def _coalesce(
172
172
  *args: Any,
173
173
  ) -> Any | None:
174
174
  """
175
- Return the first non-``None`` value from ``args``.
175
+ Return the first non-``None`` value from *args*.
176
176
 
177
177
  Parameters
178
178
  ----------
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  from typing import Final
10
10
 
11
- from ..enums import DataConnectorType
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 ``job``. Default is ``None``.
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 ``output_path``.
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 ``source`` references a file.
125
+ Return structured payloads when *source* references a file.
126
126
 
127
127
  Parameters
128
128
  ----------
@@ -44,7 +44,7 @@ def _emit_context_help(
44
44
  Returns
45
45
  -------
46
46
  bool
47
- ``True`` when help was emitted, ``False`` when ``ctx`` was ``None``.
47
+ ``True`` when help was emitted, ``False`` when *ctx* was ``None``.
48
48
  """
49
49
  if ctx is None:
50
50
  return False
@@ -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