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.
- {composable_data_stack-0.4.0/composable_data_stack.egg-info → composable_data_stack-0.5.1}/PKG-INFO +20 -6
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/README.md +18 -4
- composable_data_stack-0.5.1/cli/constants.py +8 -0
- composable_data_stack-0.5.1/cli/getter.py +685 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/image_verification.py +2 -1
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/main.py +191 -48
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/planner.py +1 -7
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/renderer.py +3 -23
- composable_data_stack-0.5.1/cli/resources/contract.schema.json +71 -0
- composable_data_stack-0.5.1/cli/resources/module.schema.json +204 -0
- composable_data_stack-0.5.1/cli/resources/profile.schema.json +227 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resources/rule-set.json +2 -111
- composable_data_stack-0.5.1/cli/utils.py +21 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/validator.py +82 -28
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1/composable_data_stack.egg-info}/PKG-INFO +20 -6
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/SOURCES.txt +8 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/requires.txt +1 -1
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/pyproject.toml +2 -2
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_cds_workflow.py +37 -0
- composable_data_stack-0.5.1/tests/test_dagster_definitions_uri.py +135 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_environment_cli.py +9 -2
- composable_data_stack-0.5.1/tests/test_getter.py +669 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_image_security_scan_workflow.py +4 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_image_verification.py +31 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_main.py +256 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_overlay.py +9 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_planner.py +16 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_preflight.py +22 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_publish_images_workflow.py +1 -1
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_render_example_profile.py +9 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_security.py +18 -5
- composable_data_stack-0.5.1/tests/test_validator.py +496 -0
- composable_data_stack-0.4.0/tests/test_validator.py +0 -253
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/LICENSE +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/__init__.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/diagnostics.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/graph.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/image_updates.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/loader.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/overlay.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/preflight.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resolver.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resources/__init__.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/resources/rule-schema.json +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/secrets.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/security.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/security_common.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/state.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/cli/up_runner.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/dependency_links.txt +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/entry_points.txt +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/composable_data_stack.egg-info/top_level.txt +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/setup.cfg +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_completion.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_compose_runtime_smoke.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_dagster_config_generation.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_dagster_entrypoint_backend_guard.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_dagster_hardening.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_environment_classification.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_graph.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_image_updates.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_module_isolation.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_modules_no_committed_secrets.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_mvp_proof_workflow.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_python_version_alignment.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_release_version_check.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_renderer.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_resolve_profile_path.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_resolver.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_secrets.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_smoke_example_profile.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_state.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_superset_hardening.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_trivyignore.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_up_runner.py +0 -0
- {composable_data_stack-0.4.0 → composable_data_stack-0.5.1}/tests/test_upstream_image_hardening.py +0 -0
{composable_data_stack-0.4.0/composable_data_stack.egg-info → composable_data_stack-0.5.1}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: composable-data-stack
|
|
3
|
-
Version: 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.
|
|
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."""
|