etlplus 0.12.9__tar.gz → 0.14.1__tar.gz

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