etlplus 0.16.7__tar.gz → 0.16.9__tar.gz

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