etlplus 0.7.2__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. {etlplus-0.7.2/etlplus.egg-info → etlplus-0.8.0}/PKG-INFO +1 -3
  2. {etlplus-0.7.2 → etlplus-0.8.0}/README.md +0 -2
  3. {etlplus-0.7.2 → etlplus-0.8.0}/docs/pipeline-guide.md +0 -3
  4. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/cli/app.py +0 -55
  5. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/cli/handlers.py +4 -48
  6. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/cli/main.py +0 -23
  7. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/database/ddl.py +1 -1
  8. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/database/types.py +0 -5
  9. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/types.py +5 -0
  10. {etlplus-0.7.2 → etlplus-0.8.0/etlplus.egg-info}/PKG-INFO +1 -3
  11. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_pagination_strategy.py +1 -1
  12. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/cli/test_u_cli_app.py +0 -45
  13. {etlplus-0.7.2 → etlplus-0.8.0}/.coveragerc +0 -0
  14. {etlplus-0.7.2 → etlplus-0.8.0}/.editorconfig +0 -0
  15. {etlplus-0.7.2 → etlplus-0.8.0}/.gitattributes +0 -0
  16. {etlplus-0.7.2 → etlplus-0.8.0}/.github/actions/python-bootstrap/action.yml +0 -0
  17. {etlplus-0.7.2 → etlplus-0.8.0}/.github/workflows/ci.yml +0 -0
  18. {etlplus-0.7.2 → etlplus-0.8.0}/.gitignore +0 -0
  19. {etlplus-0.7.2 → etlplus-0.8.0}/.pre-commit-config.yaml +0 -0
  20. {etlplus-0.7.2 → etlplus-0.8.0}/.ruff.toml +0 -0
  21. {etlplus-0.7.2 → etlplus-0.8.0}/CODE_OF_CONDUCT.md +0 -0
  22. {etlplus-0.7.2 → etlplus-0.8.0}/CONTRIBUTING.md +0 -0
  23. {etlplus-0.7.2 → etlplus-0.8.0}/DEMO.md +0 -0
  24. {etlplus-0.7.2 → etlplus-0.8.0}/LICENSE +0 -0
  25. {etlplus-0.7.2 → etlplus-0.8.0}/MANIFEST.in +0 -0
  26. {etlplus-0.7.2 → etlplus-0.8.0}/Makefile +0 -0
  27. {etlplus-0.7.2 → etlplus-0.8.0}/REFERENCES.md +0 -0
  28. {etlplus-0.7.2 → etlplus-0.8.0}/docs/snippets/installation_version.md +0 -0
  29. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/__init__.py +0 -0
  30. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/__main__.py +0 -0
  31. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/__version__.py +0 -0
  32. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/README.md +0 -0
  33. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/__init__.py +0 -0
  34. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/auth.py +0 -0
  35. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/config.py +0 -0
  36. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/endpoint_client.py +0 -0
  37. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/errors.py +0 -0
  38. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/pagination/__init__.py +0 -0
  39. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/pagination/client.py +0 -0
  40. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/pagination/config.py +0 -0
  41. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/pagination/paginator.py +0 -0
  42. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/rate_limiting/__init__.py +0 -0
  43. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/rate_limiting/config.py +0 -0
  44. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/rate_limiting/rate_limiter.py +0 -0
  45. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/request_manager.py +0 -0
  46. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/retry_manager.py +0 -0
  47. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/transport.py +0 -0
  48. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/api/types.py +0 -0
  49. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/cli/__init__.py +0 -0
  50. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/config/__init__.py +0 -0
  51. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/config/connector.py +0 -0
  52. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/config/jobs.py +0 -0
  53. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/config/pipeline.py +0 -0
  54. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/config/profile.py +0 -0
  55. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/config/types.py +0 -0
  56. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/config/utils.py +0 -0
  57. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/database/__init__.py +0 -0
  58. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/database/engine.py +0 -0
  59. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/database/orm.py +0 -0
  60. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/database/schema.py +0 -0
  61. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/enums.py +0 -0
  62. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/extract.py +0 -0
  63. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/file.py +0 -0
  64. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/load.py +0 -0
  65. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/mixins.py +0 -0
  66. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/py.typed +0 -0
  67. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/run.py +0 -0
  68. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/run_helpers.py +0 -0
  69. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/templates/__init__.py +0 -0
  70. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/templates/ddl.sql.j2 +0 -0
  71. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/templates/view.sql.j2 +0 -0
  72. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/transform.py +0 -0
  73. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/utils.py +0 -0
  74. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/validate.py +0 -0
  75. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/validation/__init__.py +0 -0
  76. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus/validation/utils.py +0 -0
  77. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus.egg-info/SOURCES.txt +0 -0
  78. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus.egg-info/dependency_links.txt +0 -0
  79. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus.egg-info/entry_points.txt +0 -0
  80. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus.egg-info/requires.txt +0 -0
  81. {etlplus-0.7.2 → etlplus-0.8.0}/etlplus.egg-info/top_level.txt +0 -0
  82. {etlplus-0.7.2 → etlplus-0.8.0}/examples/README.md +0 -0
  83. {etlplus-0.7.2 → etlplus-0.8.0}/examples/configs/ddl_spec.yml +0 -0
  84. {etlplus-0.7.2 → etlplus-0.8.0}/examples/configs/pipeline.yml +0 -0
  85. {etlplus-0.7.2 → etlplus-0.8.0}/examples/data/sample.csv +0 -0
  86. {etlplus-0.7.2 → etlplus-0.8.0}/examples/data/sample.json +0 -0
  87. {etlplus-0.7.2 → etlplus-0.8.0}/examples/data/sample.xml +0 -0
  88. {etlplus-0.7.2 → etlplus-0.8.0}/examples/data/sample.xsd +0 -0
  89. {etlplus-0.7.2 → etlplus-0.8.0}/examples/data/sample.yaml +0 -0
  90. {etlplus-0.7.2 → etlplus-0.8.0}/examples/quickstart_python.py +0 -0
  91. {etlplus-0.7.2 → etlplus-0.8.0}/pyproject.toml +0 -0
  92. {etlplus-0.7.2 → etlplus-0.8.0}/pytest.ini +0 -0
  93. {etlplus-0.7.2 → etlplus-0.8.0}/setup.cfg +0 -0
  94. {etlplus-0.7.2 → etlplus-0.8.0}/setup.py +0 -0
  95. {etlplus-0.7.2 → etlplus-0.8.0}/tests/__init__.py +0 -0
  96. {etlplus-0.7.2 → etlplus-0.8.0}/tests/conftest.py +0 -0
  97. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/conftest.py +0 -0
  98. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_cli.py +0 -0
  99. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_examples_data_parity.py +0 -0
  100. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_pipeline_smoke.py +0 -0
  101. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_pipeline_yaml_load.py +0 -0
  102. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_run.py +0 -0
  103. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_run_profile_pagination_defaults.py +0 -0
  104. {etlplus-0.7.2 → etlplus-0.8.0}/tests/integration/test_i_run_profile_rate_limit_defaults.py +0 -0
  105. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/conftest.py +0 -0
  106. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_auth.py +0 -0
  107. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_config.py +0 -0
  108. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_endpoint_client.py +0 -0
  109. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_mocks.py +0 -0
  110. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_pagination_client.py +0 -0
  111. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_pagination_config.py +0 -0
  112. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_paginator.py +0 -0
  113. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_rate_limit_config.py +0 -0
  114. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_rate_limiter.py +0 -0
  115. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_request_manager.py +0 -0
  116. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_retry_manager.py +0 -0
  117. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_transport.py +0 -0
  118. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/api/test_u_types.py +0 -0
  119. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/cli/conftest.py +0 -0
  120. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/cli/test_u_cli_handlers.py +0 -0
  121. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/cli/test_u_cli_main.py +0 -0
  122. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/config/test_u_config_utils.py +0 -0
  123. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/config/test_u_connector.py +0 -0
  124. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/config/test_u_jobs.py +0 -0
  125. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/config/test_u_pipeline.py +0 -0
  126. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/conftest.py +0 -0
  127. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/database/test_u_database_ddl.py +0 -0
  128. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/database/test_u_database_engine.py +0 -0
  129. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/database/test_u_database_orm.py +0 -0
  130. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/database/test_u_database_schema.py +0 -0
  131. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_enums.py +0 -0
  132. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_extract.py +0 -0
  133. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_file.py +0 -0
  134. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_load.py +0 -0
  135. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_main.py +0 -0
  136. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_mixins.py +0 -0
  137. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_run.py +0 -0
  138. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_run_helpers.py +0 -0
  139. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_transform.py +0 -0
  140. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_utils.py +0 -0
  141. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_validate.py +0 -0
  142. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/test_u_version.py +0 -0
  143. {etlplus-0.7.2 → etlplus-0.8.0}/tests/unit/validation/test_u_validation_utils.py +0 -0
  144. {etlplus-0.7.2 → etlplus-0.8.0}/tools/run_pipeline.py +0 -0
  145. {etlplus-0.7.2 → etlplus-0.8.0}/tools/update_demo_snippets.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: etlplus
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: A Swiss Army knife for simple ETL operations
5
5
  Home-page: https://github.com/Dagitali/ETLPlus
6
6
  Author: ETLPlus Team
@@ -366,8 +366,6 @@ etlplus check --config examples/configs/pipeline.yml --summary
366
366
 
367
367
  # Run a job
368
368
  etlplus run --config examples/configs/pipeline.yml --job file_to_file_customers
369
-
370
- # Deprecated shim (will be removed): etlplus pipeline
371
369
  ```
372
370
 
373
371
  ### Complete ETL Pipeline Example
@@ -321,8 +321,6 @@ etlplus check --config examples/configs/pipeline.yml --summary
321
321
 
322
322
  # Run a job
323
323
  etlplus run --config examples/configs/pipeline.yml --job file_to_file_customers
324
-
325
- # Deprecated shim (will be removed): etlplus pipeline
326
324
  ```
327
325
 
328
326
  ### Complete ETL Pipeline Example
@@ -401,9 +401,6 @@ Notes:
401
401
  - For more details on the orchestration implementation, see
402
402
  [Runner internals: etlplus.run](run-module.md).
403
403
 
404
- Deprecated: `etlplus pipeline` is still available as a shim but will be removed in a future release;
405
- prefer `check` and `run`.
406
-
407
404
  ### Python: `etlplus.run.run`
408
405
 
409
406
  To trigger a job programmatically, use the high-level runner function exposed by the package:
@@ -60,7 +60,6 @@ from ..utils import json_type
60
60
  from .handlers import check_handler
61
61
  from .handlers import extract_handler
62
62
  from .handlers import load_handler
63
- from .handlers import pipeline_handler
64
63
  from .handlers import render_handler
65
64
  from .handlers import run_handler
66
65
  from .handlers import transform_handler
@@ -1010,60 +1009,6 @@ def load_cmd(
1010
1009
  return int(load_handler(ns))
1011
1010
 
1012
1011
 
1013
- @app.command('pipeline')
1014
- def pipeline_cmd(
1015
- ctx: typer.Context,
1016
- config: PipelineConfigOption,
1017
- job: str | None = typer.Option(
1018
- None,
1019
- '--job',
1020
- metavar='JOB',
1021
- help='Run a specific job by name',
1022
- ),
1023
- jobs: bool = typer.Option(
1024
- False,
1025
- '--jobs',
1026
- help='List available job names and exit',
1027
- ),
1028
- pipeline: str | None = typer.Option(
1029
- None,
1030
- '--pipeline',
1031
- help='Run a specific pipeline by name',
1032
- ),
1033
- ) -> int:
1034
- """
1035
- Deprecated wrapper to inspect or run a pipeline YAML configuration.
1036
-
1037
- Parameters
1038
- ----------
1039
- ctx : typer.Context
1040
- Typer execution context provided to the command.
1041
- config : PipelineConfigOption
1042
- Path to pipeline YAML configuration file.
1043
- job : str | None, optional
1044
- Name of a specific job to run.
1045
- jobs : bool, optional
1046
- If True, list available job names and exit.
1047
- pipeline : str | None, optional
1048
- Name of a specific pipeline to run.
1049
-
1050
- Returns
1051
- -------
1052
- int
1053
- Zero on success.
1054
- """
1055
- state = _ensure_state(ctx)
1056
- run_target = job or pipeline
1057
- ns = _stateful_namespace(
1058
- state,
1059
- command='pipeline',
1060
- config=config,
1061
- list=jobs,
1062
- run=run_target,
1063
- )
1064
- return int(pipeline_handler(ns))
1065
-
1066
-
1067
1012
  @app.command('render')
1068
1013
  def render_cmd(
1069
1014
  ctx: typer.Context,
@@ -27,6 +27,7 @@ from ..load import load
27
27
  from ..run import run
28
28
  from ..transform import transform
29
29
  from ..types import JSONData
30
+ from ..types import TemplateKey
30
31
  from ..utils import json_type
31
32
  from ..utils import print_json
32
33
  from ..validate import validate
@@ -39,7 +40,6 @@ __all__ = [
39
40
  'extract_handler',
40
41
  'check_handler',
41
42
  'load_handler',
42
- 'pipeline_handler',
43
43
  'render_handler',
44
44
  'run_handler',
45
45
  'transform_handler',
@@ -72,7 +72,7 @@ def _collect_table_specs(
72
72
  specs: list[dict[str, Any]] = []
73
73
 
74
74
  if spec_path:
75
- specs.append(load_table_spec(Path(spec_path)))
75
+ specs.append(dict(load_table_spec(Path(spec_path))))
76
76
 
77
77
  if config_path:
78
78
  cfg = load_pipeline_config(config_path, substitute=True)
@@ -552,57 +552,13 @@ def load_handler(
552
552
  return 0
553
553
 
554
554
 
555
- def pipeline_handler(
556
- args: argparse.Namespace,
557
- ) -> int:
558
- """
559
- Inspect or run a pipeline YAML configuration.
560
-
561
- Parameters
562
- ----------
563
- args : argparse.Namespace
564
- Parsed command-line arguments.
565
-
566
- Returns
567
- -------
568
- int
569
- Zero on success.
570
- """
571
- print(
572
- 'DEPRECATED: use "etlplus check --summary|--jobs" or '
573
- '"etlplus run --job/--pipeline" instead of "etlplus pipeline".',
574
- file=sys.stderr,
575
- )
576
-
577
- cfg = load_pipeline_config(args.config, substitute=True)
578
-
579
- list_flag = getattr(args, 'list', False) or getattr(args, 'jobs', False)
580
- run_target = (
581
- getattr(args, 'run', None)
582
- or getattr(args, 'job', None)
583
- or getattr(args, 'pipeline', None)
584
- )
585
-
586
- if list_flag and not run_target:
587
- print_json({'jobs': _pipeline_summary(cfg)['jobs']})
588
- return 0
589
-
590
- if run_target:
591
- result = run(job=run_target, config_path=args.config)
592
- print_json({'status': 'ok', 'result': result})
593
- return 0
594
-
595
- print_json(_pipeline_summary(cfg))
596
- return 0
597
-
598
-
599
555
  def render_handler(
600
556
  args: argparse.Namespace,
601
557
  ) -> int:
602
558
  """Render SQL DDL statements from table schema specs."""
603
559
  _, quiet = _presentation_flags(args)
604
560
 
605
- template_value = getattr(args, 'template', 'ddl') or 'ddl'
561
+ template_value: TemplateKey = getattr(args, 'template', 'ddl') or 'ddl'
606
562
  template_path = getattr(args, 'template_path', None)
607
563
  table_filter = getattr(args, 'table', None)
608
564
  spec_path = getattr(args, 'spec', None)
@@ -610,7 +566,7 @@ def render_handler(
610
566
 
611
567
  # If the provided template points to a file, treat it as a path override.
612
568
  file_override = template_path
613
- template_key = template_value
569
+ template_key: TemplateKey | None = template_value
614
570
  if template_path is None:
615
571
  candidate_path = Path(template_value)
616
572
  if candidate_path.exists():
@@ -27,7 +27,6 @@ from .app import app
27
27
  from .handlers import check_handler
28
28
  from .handlers import extract_handler
29
29
  from .handlers import load_handler
30
- from .handlers import pipeline_handler
31
30
  from .handlers import render_handler
32
31
  from .handlers import run_handler
33
32
  from .handlers import transform_handler
@@ -420,28 +419,6 @@ def create_parser() -> argparse.ArgumentParser:
420
419
  _add_format_options(load_parser, context='target')
421
420
  load_parser.set_defaults(func=load_handler)
422
421
 
423
- pipe_parser = subparsers.add_parser(
424
- 'pipeline',
425
- help=(
426
- 'DEPRECATED: use "list" (for summary/jobs) or "run" (to execute); '
427
- 'see '
428
- f'{PROJECT_URL}/blob/main/docs/pipeline-guide.md'
429
- ),
430
- formatter_class=argparse.ArgumentDefaultsHelpFormatter,
431
- )
432
- _add_config_option(pipe_parser)
433
- pipe_parser.add_argument(
434
- '--list',
435
- action='store_true',
436
- help='List available job names and exit',
437
- )
438
- pipe_parser.add_argument(
439
- '--run',
440
- metavar='JOB',
441
- help='Run a specific job by name',
442
- )
443
- pipe_parser.set_defaults(func=pipeline_handler)
444
-
445
422
  render_parser = subparsers.add_parser(
446
423
  'render',
447
424
  help='Render SQL DDL from table schema specs',
@@ -25,7 +25,7 @@ from jinja2 import StrictUndefined
25
25
  from ..file import File
26
26
  from ..types import StrAnyMap
27
27
  from ..types import StrPath
28
- from .types import TemplateKey
28
+ from ..types import TemplateKey
29
29
 
30
30
  # SECTION: EXPORTS ========================================================== #
31
31
 
@@ -7,7 +7,6 @@ Shared type aliases leveraged across :mod:`etlplus.database` modules.
7
7
  from __future__ import annotations
8
8
 
9
9
  from collections.abc import Callable
10
- from typing import Literal
11
10
 
12
11
  from sqlalchemy.orm import DeclarativeBase
13
12
  from sqlalchemy.types import TypeEngine
@@ -18,7 +17,6 @@ from sqlalchemy.types import TypeEngine
18
17
  __all__ = [
19
18
  # Type Aliases
20
19
  'ModelRegistry',
21
- 'TemplateKey',
22
20
  'TypeFactory',
23
21
  ]
24
22
 
@@ -31,8 +29,5 @@ __all__ = [
31
29
  # Registry mapping fully qualified table names to declarative classes.
32
30
  type ModelRegistry = dict[str, type[DeclarativeBase]]
33
31
 
34
- # Allowed template keys for bundled DDL rendering.
35
- type TemplateKey = Literal['ddl', 'view']
36
-
37
32
  # Callable producing a SQLAlchemy TypeEngine from parsed parameters.
38
33
  type TypeFactory = Callable[[list[int]], TypeEngine]
@@ -225,3 +225,8 @@ type Sleeper = Callable[[float], None]
225
225
 
226
226
  # Numeric timeout in seconds or ``None`` for no timeout.
227
227
  type Timeout = float | None
228
+
229
+ # -- Templates -- #
230
+
231
+ # Allowed template keys for bundled DDL rendering.
232
+ type TemplateKey = Literal['ddl', 'view']
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: etlplus
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: A Swiss Army knife for simple ETL operations
5
5
  Home-page: https://github.com/Dagitali/ETLPlus
6
6
  Author: ETLPlus Team
@@ -366,8 +366,6 @@ etlplus check --config examples/configs/pipeline.yml --summary
366
366
 
367
367
  # Run a job
368
368
  etlplus run --config examples/configs/pipeline.yml --job file_to_file_customers
369
-
370
- # Deprecated shim (will be removed): etlplus pipeline
371
369
  ```
372
370
 
373
371
  ### Complete ETL Pipeline Example
@@ -317,7 +317,7 @@ def pipeline_cli_runner_fixture(
317
317
  monkeypatch.setattr(
318
318
  sys,
319
319
  'argv',
320
- ['etlplus', 'pipeline', '--config', cfg_path, '--job', run_name],
320
+ ['etlplus', 'run', '--config', cfg_path, '--job', run_name],
321
321
  )
322
322
  rc = main()
323
323
  assert rc == 0
@@ -386,51 +386,6 @@ class TestTyperCliAppWiring:
386
386
  assert result.exit_code == 0
387
387
  assert 'ETLPlus' in result.stdout
388
388
 
389
- def test_pipeline_maps_flags(
390
- self,
391
- invoke_cli: InvokeCli,
392
- ) -> None:
393
- """
394
- Test that ``pipeline`` maps list flags into the handler namespace.
395
- """
396
- result, ns, cmd = invoke_cli(
397
- 'pipeline_handler',
398
- 'pipeline',
399
- '--config',
400
- 'p.yml',
401
- '--jobs',
402
- )
403
- assert result.exit_code == 0
404
- cmd.assert_called_once()
405
-
406
- assert isinstance(ns, argparse.Namespace)
407
- assert ns.command == 'pipeline'
408
- assert ns.config == 'p.yml'
409
- assert ns.list is True
410
- assert ns.run is None
411
-
412
- def test_pipeline_run_sets_run_option(
413
- self,
414
- invoke_cli: InvokeCli,
415
- ) -> None:
416
- """
417
- Test that ``pipeline --job`` wires run metadata into the namespace.
418
- """
419
- result, ns, cmd = invoke_cli(
420
- 'pipeline_handler',
421
- 'pipeline',
422
- '--config',
423
- 'p.yml',
424
- '--job',
425
- 'job-2',
426
- )
427
-
428
- assert result.exit_code == 0
429
- cmd.assert_called_once()
430
- assert isinstance(ns, argparse.Namespace)
431
- assert ns.run == 'job-2'
432
- assert ns.list is False
433
-
434
389
  def test_render_maps_namespace(
435
390
  self,
436
391
  invoke_cli: InvokeCli,
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes