etlplus 0.15.4__tar.gz → 0.15.5__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 (224) hide show
  1. {etlplus-0.15.4/etlplus.egg-info → etlplus-0.15.5}/PKG-INFO +1 -1
  2. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/auth.py +1 -1
  3. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/config.py +2 -2
  4. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/endpoint_client.py +4 -4
  5. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/pagination/config.py +1 -1
  6. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/pagination/paginator.py +6 -7
  7. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/rate_limiting/config.py +4 -4
  8. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/rate_limiting/rate_limiter.py +1 -1
  9. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/retry_manager.py +2 -2
  10. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/transport.py +1 -1
  11. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/types.py +22 -12
  12. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/utils.py +1 -1
  13. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/handlers.py +1 -1
  14. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/io.py +2 -2
  15. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/main.py +1 -1
  16. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/database/ddl.py +2 -2
  17. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/database/engine.py +1 -1
  18. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/enums.py +1 -1
  19. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/_imports.py +1 -0
  20. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/_io.py +15 -6
  21. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/accdb.py +3 -2
  22. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/arrow.py +3 -2
  23. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/avro.py +3 -2
  24. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/bson.py +3 -2
  25. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/cbor.py +3 -2
  26. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/cfg.py +3 -2
  27. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/conf.py +3 -2
  28. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/core.py +11 -8
  29. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/csv.py +3 -2
  30. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/dat.py +3 -2
  31. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/dta.py +3 -2
  32. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/duckdb.py +3 -2
  33. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/enums.py +1 -1
  34. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/feather.py +3 -2
  35. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/fwf.py +3 -2
  36. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/gz.py +3 -2
  37. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/hbs.py +3 -2
  38. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/hdf5.py +3 -2
  39. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/ini.py +3 -2
  40. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/ion.py +3 -2
  41. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/jinja2.py +3 -2
  42. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/json.py +3 -2
  43. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/log.py +3 -2
  44. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/mat.py +3 -2
  45. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/mdb.py +3 -2
  46. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/msgpack.py +3 -2
  47. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/mustache.py +3 -2
  48. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/nc.py +3 -2
  49. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/ndjson.py +3 -2
  50. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/numbers.py +3 -2
  51. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/ods.py +3 -2
  52. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/orc.py +3 -2
  53. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/parquet.py +3 -2
  54. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/pb.py +3 -2
  55. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/pbf.py +3 -2
  56. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/properties.py +3 -2
  57. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/proto.py +3 -2
  58. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/psv.py +3 -2
  59. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/rda.py +3 -2
  60. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/rds.py +3 -2
  61. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/sas7bdat.py +3 -2
  62. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/sav.py +3 -2
  63. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/sqlite.py +3 -2
  64. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/stub.py +1 -0
  65. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/sylk.py +3 -2
  66. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/tab.py +3 -2
  67. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/toml.py +3 -2
  68. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/tsv.py +3 -2
  69. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/txt.py +4 -3
  70. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/vm.py +3 -2
  71. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/wks.py +3 -2
  72. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/xls.py +3 -2
  73. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/xlsm.py +3 -2
  74. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/xlsx.py +3 -2
  75. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/xml.py +9 -3
  76. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/xpt.py +3 -2
  77. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/yaml.py +3 -2
  78. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/zip.py +3 -2
  79. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/zsav.py +3 -2
  80. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/extract.py +12 -0
  81. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/load.py +14 -1
  82. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/run.py +3 -3
  83. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/transform.py +2 -2
  84. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/utils.py +2 -2
  85. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/utils.py +32 -32
  86. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/jobs.py +1 -1
  87. {etlplus-0.15.4 → etlplus-0.15.5/etlplus.egg-info}/PKG-INFO +1 -1
  88. {etlplus-0.15.4 → etlplus-0.15.5}/tests/conftest.py +1 -1
  89. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_endpoint_client.py +1 -1
  90. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_request_manager.py +1 -1
  91. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/cli/conftest.py +2 -2
  92. {etlplus-0.15.4 → etlplus-0.15.5}/tools/update_demo_snippets.py +1 -1
  93. {etlplus-0.15.4 → etlplus-0.15.5}/.coveragerc +0 -0
  94. {etlplus-0.15.4 → etlplus-0.15.5}/.editorconfig +0 -0
  95. {etlplus-0.15.4 → etlplus-0.15.5}/.gitattributes +0 -0
  96. {etlplus-0.15.4 → etlplus-0.15.5}/.github/actions/python-bootstrap/action.yml +0 -0
  97. {etlplus-0.15.4 → etlplus-0.15.5}/.github/workflows/ci.yml +0 -0
  98. {etlplus-0.15.4 → etlplus-0.15.5}/.gitignore +0 -0
  99. {etlplus-0.15.4 → etlplus-0.15.5}/.pre-commit-config.yaml +0 -0
  100. {etlplus-0.15.4 → etlplus-0.15.5}/.ruff.toml +0 -0
  101. {etlplus-0.15.4 → etlplus-0.15.5}/CODE_OF_CONDUCT.md +0 -0
  102. {etlplus-0.15.4 → etlplus-0.15.5}/CONTRIBUTING.md +0 -0
  103. {etlplus-0.15.4 → etlplus-0.15.5}/DEMO.md +0 -0
  104. {etlplus-0.15.4 → etlplus-0.15.5}/LICENSE +0 -0
  105. {etlplus-0.15.4 → etlplus-0.15.5}/MANIFEST.in +0 -0
  106. {etlplus-0.15.4 → etlplus-0.15.5}/Makefile +0 -0
  107. {etlplus-0.15.4 → etlplus-0.15.5}/README.md +0 -0
  108. {etlplus-0.15.4 → etlplus-0.15.5}/REFERENCES.md +0 -0
  109. {etlplus-0.15.4 → etlplus-0.15.5}/SECURITY.md +0 -0
  110. {etlplus-0.15.4 → etlplus-0.15.5}/SUPPORT.md +0 -0
  111. {etlplus-0.15.4 → etlplus-0.15.5}/docs/README.md +0 -0
  112. {etlplus-0.15.4 → etlplus-0.15.5}/docs/pipeline-guide.md +0 -0
  113. {etlplus-0.15.4 → etlplus-0.15.5}/docs/snippets/installation_version.md +0 -0
  114. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/README.md +0 -0
  115. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/__init__.py +0 -0
  116. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/__main__.py +0 -0
  117. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/__version__.py +0 -0
  118. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/README.md +0 -0
  119. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/__init__.py +0 -0
  120. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/enums.py +0 -0
  121. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/errors.py +0 -0
  122. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/pagination/__init__.py +0 -0
  123. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/pagination/client.py +0 -0
  124. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/rate_limiting/__init__.py +0 -0
  125. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/api/request_manager.py +0 -0
  126. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/README.md +0 -0
  127. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/__init__.py +0 -0
  128. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/commands.py +0 -0
  129. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/constants.py +0 -0
  130. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/options.py +0 -0
  131. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/state.py +0 -0
  132. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/cli/types.py +0 -0
  133. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/database/README.md +0 -0
  134. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/database/__init__.py +0 -0
  135. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/database/orm.py +0 -0
  136. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/database/schema.py +0 -0
  137. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/database/types.py +0 -0
  138. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/README.md +0 -0
  139. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/file/__init__.py +0 -0
  140. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/mixins.py +0 -0
  141. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/README.md +0 -0
  142. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/__init__.py +0 -0
  143. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/ops/validate.py +0 -0
  144. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/py.typed +0 -0
  145. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/templates/README.md +0 -0
  146. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/templates/__init__.py +0 -0
  147. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/templates/ddl.sql.j2 +0 -0
  148. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/templates/view.sql.j2 +0 -0
  149. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/types.py +0 -0
  150. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/README.md +0 -0
  151. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/__init__.py +0 -0
  152. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/connector.py +0 -0
  153. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/dag.py +0 -0
  154. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/pipeline.py +0 -0
  155. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/profile.py +0 -0
  156. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus/workflow/types.py +0 -0
  157. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus.egg-info/SOURCES.txt +0 -0
  158. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus.egg-info/dependency_links.txt +0 -0
  159. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus.egg-info/entry_points.txt +0 -0
  160. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus.egg-info/requires.txt +0 -0
  161. {etlplus-0.15.4 → etlplus-0.15.5}/etlplus.egg-info/top_level.txt +0 -0
  162. {etlplus-0.15.4 → etlplus-0.15.5}/examples/README.md +0 -0
  163. {etlplus-0.15.4 → etlplus-0.15.5}/examples/configs/ddl_spec.yml +0 -0
  164. {etlplus-0.15.4 → etlplus-0.15.5}/examples/configs/pipeline.yml +0 -0
  165. {etlplus-0.15.4 → etlplus-0.15.5}/examples/data/sample.csv +0 -0
  166. {etlplus-0.15.4 → etlplus-0.15.5}/examples/data/sample.json +0 -0
  167. {etlplus-0.15.4 → etlplus-0.15.5}/examples/data/sample.xml +0 -0
  168. {etlplus-0.15.4 → etlplus-0.15.5}/examples/data/sample.xsd +0 -0
  169. {etlplus-0.15.4 → etlplus-0.15.5}/examples/data/sample.yaml +0 -0
  170. {etlplus-0.15.4 → etlplus-0.15.5}/examples/quickstart_python.py +0 -0
  171. {etlplus-0.15.4 → etlplus-0.15.5}/pyproject.toml +0 -0
  172. {etlplus-0.15.4 → etlplus-0.15.5}/pytest.ini +0 -0
  173. {etlplus-0.15.4 → etlplus-0.15.5}/setup.cfg +0 -0
  174. {etlplus-0.15.4 → etlplus-0.15.5}/setup.py +0 -0
  175. {etlplus-0.15.4 → etlplus-0.15.5}/tests/__init__.py +0 -0
  176. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/conftest.py +0 -0
  177. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_cli.py +0 -0
  178. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_examples_data_parity.py +0 -0
  179. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_pagination_strategy.py +0 -0
  180. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_pipeline_smoke.py +0 -0
  181. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_pipeline_yaml_load.py +0 -0
  182. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_run.py +0 -0
  183. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_run_profile_pagination_defaults.py +0 -0
  184. {etlplus-0.15.4 → etlplus-0.15.5}/tests/integration/test_i_run_profile_rate_limit_defaults.py +0 -0
  185. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/conftest.py +0 -0
  186. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_api_enums.py +0 -0
  187. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_api_utils.py +0 -0
  188. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_auth.py +0 -0
  189. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_config.py +0 -0
  190. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_mocks.py +0 -0
  191. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_pagination_client.py +0 -0
  192. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_pagination_config.py +0 -0
  193. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_paginator.py +0 -0
  194. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_rate_limit_config.py +0 -0
  195. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_rate_limiter.py +0 -0
  196. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_retry_manager.py +0 -0
  197. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_transport.py +0 -0
  198. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/api/test_u_types.py +0 -0
  199. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/cli/test_u_cli_handlers.py +0 -0
  200. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/cli/test_u_cli_io.py +0 -0
  201. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/cli/test_u_cli_main.py +0 -0
  202. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/cli/test_u_cli_state.py +0 -0
  203. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/conftest.py +0 -0
  204. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/database/test_u_database_ddl.py +0 -0
  205. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/database/test_u_database_engine.py +0 -0
  206. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/database/test_u_database_orm.py +0 -0
  207. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/database/test_u_database_schema.py +0 -0
  208. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/file/test_u_file_core.py +0 -0
  209. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/file/test_u_file_enums.py +0 -0
  210. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/file/test_u_file_yaml.py +0 -0
  211. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/ops/test_u_ops_extract.py +0 -0
  212. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/ops/test_u_ops_load.py +0 -0
  213. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/ops/test_u_ops_run.py +0 -0
  214. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/ops/test_u_ops_transform.py +0 -0
  215. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/ops/test_u_ops_utils.py +0 -0
  216. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/ops/test_u_ops_validate.py +0 -0
  217. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/test_u_enums.py +0 -0
  218. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/test_u_main.py +0 -0
  219. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/test_u_mixins.py +0 -0
  220. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/test_u_utils.py +0 -0
  221. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/test_u_version.py +0 -0
  222. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/workflow/test_u_workflow_connector.py +0 -0
  223. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/workflow/test_u_workflow_jobs.py +0 -0
  224. {etlplus-0.15.4 → etlplus-0.15.5}/tests/unit/workflow/test_u_workflow_pipeline.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.15.5
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
@@ -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
  ----------
@@ -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
@@ -233,7 +233,7 @@ def render_table_sql(
233
233
  template : TemplateKey | None, optional
234
234
  Template key to use (default: 'ddl').
235
235
  template_path : str | None, optional
236
- Path to a custom template file (overrides ``template``).
236
+ Path to a custom template file (overrides *template*).
237
237
 
238
238
  Returns
239
239
  -------
@@ -264,7 +264,7 @@ def render_tables(
264
264
  template : TemplateKey | None, optional
265
265
  Template key to use (default: 'ddl').
266
266
  template_path : str | None, optional
267
- Path to a custom template file (overrides ``template``).
267
+ Path to a custom template file (overrides *template*).
268
268
 
269
269
  Returns
270
270
  -------
@@ -87,7 +87,7 @@ def load_database_url_from_config(
87
87
  Extract a database URL/DSN from a YAML/JSON config file.
88
88
 
89
89
  The loader is schema-tolerant: it looks for a top-level "databases" map
90
- and then for a named entry (``name``). Each entry may contain either a
90
+ and then for a named entry (*name*). Each entry may contain either a
91
91
  ``connection_string``/``url``/``dsn`` or a nested ``default`` block with
92
92
  those fields.
93
93
 
@@ -76,7 +76,7 @@ class CoercibleStrEnum(enum.StrEnum):
76
76
  @classmethod
77
77
  def coerce(cls, value: Self | str | object) -> Self:
78
78
  """
79
- Convert an enum member or string-like input to a member of ``cls``.
79
+ Convert an enum member or string-like input to a member of *cls*.
80
80
 
81
81
  Parameters
82
82
  ----------
@@ -12,6 +12,7 @@ from typing import Any
12
12
  # SECTION: INTERNAL CONSTANTS =============================================== #
13
13
 
14
14
 
15
+ # Optional Python module support (lazy-loaded to avoid hard dependency)
15
16
  _MODULE_CACHE: dict[str, Any] = {}
16
17
 
17
18
 
@@ -24,7 +24,7 @@ def coerce_record_payload(
24
24
  format_name: str,
25
25
  ) -> JSONData:
26
26
  """
27
- Validate that ``payload`` is an object or list of objects.
27
+ Validate that *payload* is an object or list of objects.
28
28
 
29
29
  Parameters
30
30
  ----------
@@ -36,7 +36,7 @@ def coerce_record_payload(
36
36
  Returns
37
37
  -------
38
38
  JSONData
39
- ``payload`` when it is a dict or a list of dicts.
39
+ *payload* when it is a dict or a list of dicts.
40
40
 
41
41
  Raises
42
42
  ------
@@ -89,9 +89,13 @@ def normalize_records(
89
89
  return [cast(JSONDict, data)]
90
90
 
91
91
 
92
- def read_delimited(path: Path, *, delimiter: str) -> JSONList:
92
+ def read_delimited(
93
+ path: Path,
94
+ *,
95
+ delimiter: str,
96
+ ) -> JSONList:
93
97
  """
94
- Read delimited content from ``path``.
98
+ Read delimited content from *path*.
95
99
 
96
100
  Parameters
97
101
  ----------
@@ -118,9 +122,14 @@ def read_delimited(path: Path, *, delimiter: str) -> JSONList:
118
122
  return rows
119
123
 
120
124
 
121
- def write_delimited(path: Path, data: JSONData, *, delimiter: str) -> int:
125
+ def write_delimited(
126
+ path: Path,
127
+ data: JSONData,
128
+ *,
129
+ delimiter: str,
130
+ ) -> int:
122
131
  """
123
- Write ``data`` to a delimited file and return record count.
132
+ Write *data* to a delimited file and return record count.
124
133
 
125
134
  Parameters
126
135
  ----------
@@ -28,6 +28,7 @@ from . import stub
28
28
 
29
29
 
30
30
  __all__ = [
31
+ # Functions
31
32
  'read',
32
33
  'write',
33
34
  ]
@@ -40,7 +41,7 @@ def read(
40
41
  path: Path,
41
42
  ) -> JSONList:
42
43
  """
43
- Read ACCDB content from ``path``.
44
+ Read ACCDB content from *path*.
44
45
 
45
46
  Parameters
46
47
  ----------
@@ -60,7 +61,7 @@ def write(
60
61
  data: JSONData,
61
62
  ) -> int:
62
63
  """
63
- Write ``data`` to ACCDB at ``path`` and return record count.
64
+ Write *data* to ACCDB at *path* and return record count.
64
65
 
65
66
  Parameters
66
67
  ----------
@@ -28,6 +28,7 @@ from . import stub
28
28
 
29
29
 
30
30
  __all__ = [
31
+ # Functions
31
32
  'read',
32
33
  'write',
33
34
  ]
@@ -40,7 +41,7 @@ def read(
40
41
  path: Path,
41
42
  ) -> JSONList:
42
43
  """
43
- Read ARROW content from ``path``.
44
+ Read ARROW content from *path*.
44
45
 
45
46
  Parameters
46
47
  ----------
@@ -60,7 +61,7 @@ def write(
60
61
  data: JSONData,
61
62
  ) -> int:
62
63
  """
63
- Write ``data`` to ARROW at ``path`` and return record count.
64
+ Write *data* to ARROW at *path* and return record count.
64
65
 
65
66
  Parameters
66
67
  ----------
@@ -33,6 +33,7 @@ from ._io import normalize_records
33
33
 
34
34
 
35
35
  __all__ = [
36
+ # Functions
36
37
  'read',
37
38
  'write',
38
39
  ]
@@ -124,7 +125,7 @@ def read(
124
125
  path: Path,
125
126
  ) -> JSONList:
126
127
  """
127
- Read AVRO content from ``path``.
128
+ Read AVRO content from *path*.
128
129
 
129
130
  Parameters
130
131
  ----------
@@ -147,7 +148,7 @@ def write(
147
148
  data: JSONData,
148
149
  ) -> int:
149
150
  """
150
- Write ``data`` to AVRO at ``path`` and return record count.
151
+ Write *data* to AVRO at *path* and return record count.
151
152
 
152
153
  Parameters
153
154
  ----------
@@ -27,6 +27,7 @@ from . import stub
27
27
 
28
28
 
29
29
  __all__ = [
30
+ # Functions
30
31
  'read',
31
32
  'write',
32
33
  ]
@@ -39,7 +40,7 @@ def read(
39
40
  path: Path,
40
41
  ) -> JSONList:
41
42
  """
42
- Read BSON content from ``path``.
43
+ Read BSON content from *path*.
43
44
 
44
45
  Parameters
45
46
  ----------
@@ -59,7 +60,7 @@ def write(
59
60
  data: JSONData,
60
61
  ) -> int:
61
62
  """
62
- Write ``data`` to BSON at ``path`` and return record count.
63
+ Write *data* to BSON at *path* and return record count.
63
64
 
64
65
  Parameters
65
66
  ----------
@@ -28,6 +28,7 @@ from . import stub
28
28
 
29
29
 
30
30
  __all__ = [
31
+ # Functions
31
32
  'read',
32
33
  'write',
33
34
  ]
@@ -40,7 +41,7 @@ def read(
40
41
  path: Path,
41
42
  ) -> JSONList:
42
43
  """
43
- Read CBOR content from ``path``.
44
+ Read CBOR content from *path*.
44
45
 
45
46
  Parameters
46
47
  ----------
@@ -60,7 +61,7 @@ def write(
60
61
  data: JSONData,
61
62
  ) -> int:
62
63
  """
63
- Write ``data`` to CBOR at ``path`` and return record count.
64
+ Write *data* to CBOR at *path* and return record count.
64
65
 
65
66
  Parameters
66
67
  ----------
@@ -29,6 +29,7 @@ from . import stub
29
29
 
30
30
 
31
31
  __all__ = [
32
+ # Functions
32
33
  'read',
33
34
  'write',
34
35
  ]
@@ -41,7 +42,7 @@ def read(
41
42
  path: Path,
42
43
  ) -> JSONList:
43
44
  """
44
- Read CFG content from ``path``.
45
+ Read CFG content from *path*.
45
46
 
46
47
  Parameters
47
48
  ----------
@@ -61,7 +62,7 @@ def write(
61
62
  data: JSONData,
62
63
  ) -> int:
63
64
  """
64
- Write ``data`` to CFG file at ``path`` and return record count.
65
+ Write *data* to CFG file at *path* and return record count.
65
66
 
66
67
  Parameters
67
68
  ----------
@@ -30,6 +30,7 @@ from . import stub
30
30
 
31
31
 
32
32
  __all__ = [
33
+ # Functions
33
34
  'read',
34
35
  'write',
35
36
  ]
@@ -42,7 +43,7 @@ def read(
42
43
  path: Path,
43
44
  ) -> JSONList:
44
45
  """
45
- Read CONF content from ``path``.
46
+ Read CONF content from *path*.
46
47
 
47
48
  Parameters
48
49
  ----------
@@ -62,7 +63,7 @@ def write(
62
63
  data: JSONData,
63
64
  ) -> int:
64
65
  """
65
- Write ``data`` to CONF at ``path`` and return record count.
66
+ Write *data* to CONF at *path* and return record count.
66
67
 
67
68
  Parameters
68
69
  ----------