composable-data-stack 0.4.0__tar.gz → 0.5.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 (76) hide show
  1. {composable_data_stack-0.4.0/composable_data_stack.egg-info → composable_data_stack-0.5.1}/PKG-INFO +20 -6
  2. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/README.md +18 -4
  3. composable_data_stack-0.5.1/cli/constants.py +8 -0
  4. composable_data_stack-0.5.1/cli/getter.py +685 -0
  5. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/image_verification.py +2 -1
  6. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/main.py +191 -48
  7. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/planner.py +1 -7
  8. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/renderer.py +3 -23
  9. composable_data_stack-0.5.1/cli/resources/contract.schema.json +71 -0
  10. composable_data_stack-0.5.1/cli/resources/module.schema.json +204 -0
  11. composable_data_stack-0.5.1/cli/resources/profile.schema.json +227 -0
  12. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resources/rule-set.json +2 -111
  13. composable_data_stack-0.5.1/cli/utils.py +21 -0
  14. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/validator.py +82 -28
  15. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1/composable_data_stack.egg-info}/PKG-INFO +20 -6
  16. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/SOURCES.txt +8 -0
  17. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/requires.txt +1 -1
  18. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/pyproject.toml +2 -2
  19. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_cds_workflow.py +37 -0
  20. composable_data_stack-0.5.1/tests/test_dagster_definitions_uri.py +135 -0
  21. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_environment_cli.py +9 -2
  22. composable_data_stack-0.5.1/tests/test_getter.py +669 -0
  23. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_image_security_scan_workflow.py +4 -0
  24. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_image_verification.py +31 -0
  25. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_main.py +256 -0
  26. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_overlay.py +9 -0
  27. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_planner.py +16 -0
  28. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_preflight.py +22 -0
  29. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_publish_images_workflow.py +1 -1
  30. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_render_example_profile.py +9 -0
  31. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_security.py +18 -5
  32. composable_data_stack-0.5.1/tests/test_validator.py +496 -0
  33. composable_data_stack-0.4.0/tests/test_validator.py +0 -253
  34. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/LICENSE +0 -0
  35. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/__init__.py +0 -0
  36. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/diagnostics.py +0 -0
  37. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/graph.py +0 -0
  38. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/image_updates.py +0 -0
  39. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/loader.py +0 -0
  40. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/overlay.py +0 -0
  41. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/preflight.py +0 -0
  42. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resolver.py +0 -0
  43. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resources/__init__.py +0 -0
  44. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resources/rule-schema.json +0 -0
  45. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/secrets.py +0 -0
  46. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/security.py +0 -0
  47. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/security_common.py +0 -0
  48. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/state.py +0 -0
  49. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/up_runner.py +0 -0
  50. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/dependency_links.txt +0 -0
  51. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/entry_points.txt +0 -0
  52. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/top_level.txt +0 -0
  53. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/setup.cfg +0 -0
  54. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_completion.py +0 -0
  55. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_compose_runtime_smoke.py +0 -0
  56. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_dagster_config_generation.py +0 -0
  57. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_dagster_entrypoint_backend_guard.py +0 -0
  58. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_dagster_hardening.py +0 -0
  59. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_environment_classification.py +0 -0
  60. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_graph.py +0 -0
  61. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_image_updates.py +0 -0
  62. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_module_isolation.py +0 -0
  63. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_modules_no_committed_secrets.py +0 -0
  64. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_mvp_proof_workflow.py +0 -0
  65. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_python_version_alignment.py +0 -0
  66. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_release_version_check.py +0 -0
  67. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_renderer.py +0 -0
  68. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_resolve_profile_path.py +0 -0
  69. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_resolver.py +0 -0
  70. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_secrets.py +0 -0
  71. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_smoke_example_profile.py +0 -0
  72. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_state.py +0 -0
  73. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_superset_hardening.py +0 -0
  74. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_trivyignore.py +0 -0
  75. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_up_runner.py +0 -0
  76. {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_upstream_image_hardening.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: composable-data-stack
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: CLI for validating and composing composable data stack profiles
5
5
  Author: Ronald Hensbergen
6
6
  License-Expression: Apache-2.0
@@ -31,7 +31,7 @@ Provides-Extra: dev
31
31
  Requires-Dist: coverage>=7.6; extra == "dev"
32
32
  Requires-Dist: bandit>=1.7; extra == "dev"
33
33
  Requires-Dist: pip-audit>=2.7; extra == "dev"
34
- Requires-Dist: ruff==0.16.2; extra == "dev"
34
+ Requires-Dist: ruff==0.16.4; extra == "dev"
35
35
  Dynamic: license-file
36
36
 
37
37
  # 🚀 Composable Data Stack (CDS)
@@ -55,6 +55,10 @@ Composable Data Stack (CDS) is a framework for defining and assembling data plat
55
55
 
56
56
  > **Note:** Development helper tools are located in the `tools/` directory (git-ignored). See `tools/pr-cli/README.md` for PR creation scripts.
57
57
 
58
+ ---
59
+
60
+ ## ⚡ Why CDS
61
+
58
62
  Instead of hardcoding integrations or relying on fragile pipelines, CDS introduces:
59
63
 
60
64
  - 🔧 **Modules**: reusable components (Dagster, Postgres, Superset)
@@ -63,10 +67,6 @@ Instead of hardcoding integrations or relying on fragile pipelines, CDS introduc
63
67
 
64
68
  Think of it as Infrastructure as Code, but for data platforms.
65
69
 
66
- ---
67
-
68
- ## ⚡ Why CDS
69
-
70
70
  Modern data platforms force a trade-off:
71
71
 
72
72
  |Approach|Problem|
@@ -642,6 +642,7 @@ before and never look for an `environments/` directory.
642
642
 
643
643
  |Command|Description|
644
644
  |---|---|
645
+ |cds get \<profile\> [--remote \<owner/repo\>] [--ref \<ref\>] [--local \<dir\>] [--into \<dir\>]|Fetch a profile plus its dependent module/runtime assets from GitHub into a local CDS layout|
645
646
  |cds init [profile]|Generate a project `.env` template from profile secret definitions|
646
647
  |cds validate [profile]|Validate modules and contracts|
647
648
  |cds preflight [profile]|Check runtime tools, required environment values, and host ports without starting services|
@@ -660,6 +661,19 @@ all accept `--environment <name>` (or `-e <name>`) to merge
660
661
  `environments/<name>.yaml` over the base profile before resolving; see
661
662
  [Environment Overlays](#environment-overlays).
662
663
 
664
+ `cds get` copies the selected `profiles/<name>/` tree, every referenced module
665
+ directory, and any local build-context assets referenced by those modules'
666
+ Dockerfiles. By design it downloads from GitHub rather than a local checkout:
667
+ by default it fetches this project's upstream repository at the `main` branch,
668
+ downloading a tarball via the GitHub API (no `git` binary required). Use
669
+ `--remote <owner/repo>` (or a `github.com/...` URL) to fetch a fork, and
670
+ `--ref <branch|tag|sha>` to select a specific revision. Pass `--local <dir>`
671
+ to use an existing local directory instead of downloading (mutually exclusive
672
+ with `--remote`/`--ref`) for offline/dev workflows. Use `--into` to choose a
673
+ destination root, `--dry-run` to inspect the copy plan first, and `--force` to
674
+ replace conflicting local files. Successful fetches record tracking metadata
675
+ in `.cds/get-manifest.json` for future update workflows.
676
+
663
677
  `[profile]` accepts:
664
678
 
665
679
  | Form | Example |
@@ -19,6 +19,10 @@ Composable Data Stack (CDS) is a framework for defining and assembling data plat
19
19
 
20
20
  > **Note:** Development helper tools are located in the `tools/` directory (git-ignored). See `tools/pr-cli/README.md` for PR creation scripts.
21
21
 
22
+ ---
23
+
24
+ ## ⚡ Why CDS
25
+
22
26
  Instead of hardcoding integrations or relying on fragile pipelines, CDS introduces:
23
27
 
24
28
  - 🔧 **Modules**: reusable components (Dagster, Postgres, Superset)
@@ -27,10 +31,6 @@ Instead of hardcoding integrations or relying on fragile pipelines, CDS introduc
27
31
 
28
32
  Think of it as Infrastructure as Code, but for data platforms.
29
33
 
30
- ---
31
-
32
- ## ⚡ Why CDS
33
-
34
34
  Modern data platforms force a trade-off:
35
35
 
36
36
  |Approach|Problem|
@@ -606,6 +606,7 @@ before and never look for an `environments/` directory.
606
606
 
607
607
  |Command|Description|
608
608
  |---|---|
609
+ |cds get \<profile\> [--remote \<owner/repo\>] [--ref \<ref\>] [--local \<dir\>] [--into \<dir\>]|Fetch a profile plus its dependent module/runtime assets from GitHub into a local CDS layout|
609
610
  |cds init [profile]|Generate a project `.env` template from profile secret definitions|
610
611
  |cds validate [profile]|Validate modules and contracts|
611
612
  |cds preflight [profile]|Check runtime tools, required environment values, and host ports without starting services|
@@ -624,6 +625,19 @@ all accept `--environment <name>` (or `-e <name>`) to merge
624
625
  `environments/<name>.yaml` over the base profile before resolving; see
625
626
  [Environment Overlays](#environment-overlays).
626
627
 
628
+ `cds get` copies the selected `profiles/<name>/` tree, every referenced module
629
+ directory, and any local build-context assets referenced by those modules'
630
+ Dockerfiles. By design it downloads from GitHub rather than a local checkout:
631
+ by default it fetches this project's upstream repository at the `main` branch,
632
+ downloading a tarball via the GitHub API (no `git` binary required). Use
633
+ `--remote <owner/repo>` (or a `github.com/...` URL) to fetch a fork, and
634
+ `--ref <branch|tag|sha>` to select a specific revision. Pass `--local <dir>`
635
+ to use an existing local directory instead of downloading (mutually exclusive
636
+ with `--remote`/`--ref`) for offline/dev workflows. Use `--into` to choose a
637
+ destination root, `--dry-run` to inspect the copy plan first, and `--force` to
638
+ replace conflicting local files. Successful fetches record tracking metadata
639
+ in `.cds/get-manifest.json` for future update workflows.
640
+
627
641
  `[profile]` accepts:
628
642
 
629
643
  | Form | Example |
@@ -0,0 +1,8 @@
1
+ # Guards recursive traversal of user-controlled YAML structures (schema
2
+ # defaults, contract/config interpolation) against maliciously or accidentally
3
+ # deeply nested documents that would otherwise raise an unhandled
4
+ # RecursionError / stack overflow.
5
+ MAX_NESTING_DEPTH = 100
6
+
7
+ class MaxNestingDepthExceeded(Exception):
8
+ """Raised when a recursive structure exceeds MAX_NESTING_DEPTH."""