framework-py 0.1.0.dev0__tar.gz → 0.1.0.dev1__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.
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/PKG-INFO +9 -2
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/README.md +7 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/parity.toml +1 -1
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/pyproject.toml +2 -2
- framework_py-0.1.0.dev1/tests/integration/test_cloud_staging.py +108 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/LICENSE +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/__init__.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/check_parity.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/make_golden_trees.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/make_r_fixtures.R +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/sync_assets.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/__init__.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/__main__.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/hooks/pre-commit +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/init.sql +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/layer.v1.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/layers.v1.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/spec.v1.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_log.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_paths.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_secretservice.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_time.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_wincred.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_yaml.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/ai.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/bootstrap.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/cache.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/catalog.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/cloud.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/config_home.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/connections.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/console.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/create.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/data.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/db.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/dotenv.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/errors.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/global_config.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/hooks.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/integrity.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/notebooks.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/outputs.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/packages.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/project.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/py.typed +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/quarto.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/scratch.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/security.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/settings.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/__init__.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/check.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/merge.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/resolve.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/storage.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/defaults.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/course +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/presentation +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/project +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/sensitive +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-sensitive-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-default.ipynb +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-default.qmd +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-minimal.qmd +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-revealjs.qmd +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/script-default.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/__init__.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/conftest.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/CLAUDE.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/fixture-study.Rproj +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/fixture-study.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/framework.db +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/intermediate/r_clean.csv +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/private/ids.csv +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/raw/survey.csv +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/raw/visits.tsv +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/reference/test.dta +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/reference/test.sav +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/reference/test.xpt +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/notebooks/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/outputs/cache/r_value.rds +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/outputs/tables/r_summary.csv +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/scaffold.R +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/ai.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/author.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/connections.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/data.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/git.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/packages.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/scaffold.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project.expected.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/CLAUDE.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/assignments/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/course_docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/golden-course.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/modules/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/slides/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.claude/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.claude/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.claude/skills/study-protocol/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.claude/skills/study-protocol/references/consort.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/CLAUDE.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/README.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/golden-files-and-skills.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/notebooks/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/notes.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/ai.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/author.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/connections.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/data.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/git.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/scaffold.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.agents/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.agents/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.agents/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.agents/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/golden-no-assistants.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/notebooks/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/ai.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/author.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/connections.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/data.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/git.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/scaffold.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/CLAUDE.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/golden-presentation.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/presentation.qmd +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/CLAUDE.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/golden-project.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/notebooks/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/ai.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/author.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/connections.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/data.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/git.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/scaffold.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.claude/settings.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.claude/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.claude/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.claude/skills/framework-sensitive-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/CLAUDE.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/golden-project-sensitive.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/notebooks/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/ai.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/author.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/connections.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/data.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/git.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/scaffold.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.agents/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.agents/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.agents/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.agents/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.github/copilot-instructions.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/golden-removals-and-assistants.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/notebooks/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/ai.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/author.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/connections.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/data.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/git.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/scaffold.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.claude/settings.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.claude/skills/framework-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.claude/skills/framework-packages/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.claude/skills/framework-sensitive-data/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.env +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.framework/spec.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.gitignore +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/AGENTS.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/CLAUDE.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/docs/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/golden-sensitive-facet.code-workspace +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/notebooks/_quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/pyproject.toml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/ai.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/author.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/connections.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/data.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/git.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/quarto.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/scaffold.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/layers.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/compose.yml +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/mariadb/init.sql +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/mysql/init.sql +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/postgres/init.sql +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/sqlserver/init.sql +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/test_servers.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/NAMESPACE +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/README.md +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/atomic-entries.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/conflicts-and-labels.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/empty-sections.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/gitignore-and-assistants.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/maps-and-null-removal.json +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_bootstrap.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_cache.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_catalog.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_cloud.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_config_home.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_conformance.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_connections.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_create.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_data.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_db.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_dotenv.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_global_config.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_hooks.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_notebooks.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_outputs.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_package.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_packages.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_r_compat.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_r_live.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_scaffold.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_secretservice.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_security.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_settings.py +0 -0
- {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_storage.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: framework-py
|
|
3
|
-
Version: 0.1.0.
|
|
3
|
+
Version: 0.1.0.dev1
|
|
4
4
|
Summary: Structured data science projects: a data catalog, integrity tracking, caching, outputs, and AI guardrails
|
|
5
|
-
Project-URL: Homepage, https://framework.
|
|
5
|
+
Project-URL: Homepage, https://framework.pub
|
|
6
6
|
Project-URL: Source, https://github.com/frameworktools/framework-py
|
|
7
7
|
Project-URL: Issues, https://github.com/frameworktools/framework-py/issues
|
|
8
8
|
Author-email: Erik Westlund <erik@table1.org>
|
|
@@ -75,6 +75,13 @@ Optional extras add database drivers, S3 storage, and more file formats:
|
|
|
75
75
|
uv add "framework-py[postgres,s3]"
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
+
Releases are published from GitHub Actions with signed build provenance. To
|
|
79
|
+
check that a downloaded wheel or sdist was built from this repository:
|
|
80
|
+
|
|
81
|
+
```sh
|
|
82
|
+
gh attestation verify framework_py-<version>-py3-none-any.whl --repo frameworktools/framework-py
|
|
83
|
+
```
|
|
84
|
+
|
|
78
85
|
## Use
|
|
79
86
|
|
|
80
87
|
```python
|
|
@@ -28,6 +28,13 @@ Optional extras add database drivers, S3 storage, and more file formats:
|
|
|
28
28
|
uv add "framework-py[postgres,s3]"
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
Releases are published from GitHub Actions with signed build provenance. To
|
|
32
|
+
check that a downloaded wheel or sdist was built from this repository:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
gh attestation verify framework_py-<version>-py3-none-any.whl --repo frameworktools/framework-py
|
|
36
|
+
```
|
|
37
|
+
|
|
31
38
|
## Use
|
|
32
39
|
|
|
33
40
|
```python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "framework-py"
|
|
3
|
-
version = "0.1.0.
|
|
3
|
+
version = "0.1.0.dev1"
|
|
4
4
|
description = "Structured data science projects: a data catalog, integrity tracking, caching, outputs, and AI guardrails"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -41,7 +41,7 @@ spss = ["pyreadstat>=1.2"]
|
|
|
41
41
|
sas = ["pyreadstat>=1.2"]
|
|
42
42
|
|
|
43
43
|
[project.urls]
|
|
44
|
-
Homepage = "https://framework.
|
|
44
|
+
Homepage = "https://framework.pub"
|
|
45
45
|
Source = "https://github.com/frameworktools/framework-py"
|
|
46
46
|
Issues = "https://github.com/frameworktools/framework-py/issues"
|
|
47
47
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""Framework Cloud against the staging server. Opt-in and local only.
|
|
2
|
+
|
|
3
|
+
The staging server is reachable only from the house network and the tailnet,
|
|
4
|
+
and CI never reaches it. The tests run when all three variables are set and
|
|
5
|
+
skip otherwise, also in CI:
|
|
6
|
+
|
|
7
|
+
FW_CLOUD_STAGING_URL https://framework-cloud-staging.pequod.sh
|
|
8
|
+
FW_CLOUD_STAGING_TOKEN personal token of ci-primary
|
|
9
|
+
FW_CLOUD_STAGING_TOKEN_OTHER personal token of ci-other
|
|
10
|
+
|
|
11
|
+
The tokens are in the System vault (ansible/vault/apps/framework-cloud-staging.yml).
|
|
12
|
+
The server is reset every night at 04:30 New York time and may be shared with
|
|
13
|
+
other runs, so every project gets a unique name and no test depends on the
|
|
14
|
+
account being empty.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import hashlib
|
|
20
|
+
import os
|
|
21
|
+
import uuid
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
import pytest
|
|
26
|
+
|
|
27
|
+
import framework as fw
|
|
28
|
+
from framework import cloud
|
|
29
|
+
|
|
30
|
+
pytestmark = pytest.mark.integration
|
|
31
|
+
|
|
32
|
+
URL = os.environ.get("FW_CLOUD_STAGING_URL", "").rstrip("/")
|
|
33
|
+
TOKEN = os.environ.get("FW_CLOUD_STAGING_TOKEN", "")
|
|
34
|
+
TOKEN_OTHER = os.environ.get("FW_CLOUD_STAGING_TOKEN_OTHER", "")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.fixture
|
|
38
|
+
def staging(monkeypatch: pytest.MonkeyPatch) -> str:
|
|
39
|
+
"""The staging server as this test's default, with ci-primary logged in."""
|
|
40
|
+
if not (URL and TOKEN and TOKEN_OTHER):
|
|
41
|
+
pytest.skip("opt-in: set FW_CLOUD_STAGING_URL and both staging tokens")
|
|
42
|
+
monkeypatch.setattr(cloud, "_transport", None)
|
|
43
|
+
monkeypatch.setenv("FW_CLOUD_URL", URL)
|
|
44
|
+
monkeypatch.setenv("FW_CLOUD_TOKEN", TOKEN)
|
|
45
|
+
return URL
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@pytest.fixture
|
|
49
|
+
def registered(staging: str, project: Path) -> dict[str, Any]:
|
|
50
|
+
"""A new project on the server, with its key in the project's .env."""
|
|
51
|
+
name = f"ci-py-{uuid.uuid4().hex[:10]}"
|
|
52
|
+
result = cloud.register_project(project, name, "project")
|
|
53
|
+
assert result is not None, "registration failed (see the messages above)"
|
|
54
|
+
return dict(result)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_status_and_a_bad_token(staging: str, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
58
|
+
assert fw.cloud_status() is True
|
|
59
|
+
monkeypatch.setenv("FW_CLOUD_TOKEN", "fw_not_a_real_token_0000")
|
|
60
|
+
assert fw.cloud_status() is False
|
|
61
|
+
with pytest.raises(cloud.CloudError):
|
|
62
|
+
cloud.api("/api/v1/me", "fw_not_a_real_token_0000", staging)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_settings_document_is_readable(staging: str) -> None:
|
|
66
|
+
assert isinstance(fw.cloud_settings(), dict)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_registration_writes_the_key_to_env_only(registered: dict[str, Any], project: Path) -> None:
|
|
70
|
+
env = (project / ".env").read_text(encoding="utf-8")
|
|
71
|
+
assert f"FW_PROJECT_TOKEN={registered['pull_token']}" in env
|
|
72
|
+
assert f"FW_CLOUD_URL={URL}" in env
|
|
73
|
+
assert registered["pull_token"] not in (project / "settings.yml").read_text(encoding="utf-8")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_pull_returns_the_project_definition(registered: dict[str, Any]) -> None:
|
|
77
|
+
envelope, server = cloud.fetch_layers(registered["pull_token"], URL)
|
|
78
|
+
assert server == URL
|
|
79
|
+
assert isinstance(envelope, dict)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def test_ledger_round_trip(registered: dict[str, Any], monkeypatch: pytest.MonkeyPatch) -> None:
|
|
83
|
+
monkeypatch.setenv("FW_LEDGER", "live")
|
|
84
|
+
digest = hashlib.sha256(uuid.uuid4().bytes).hexdigest()
|
|
85
|
+
assert cloud.ledger_push_quietly("inputs.raw.ci", digest) is not None
|
|
86
|
+
ledger = fw.ledger_list("inputs.raw.ci")
|
|
87
|
+
assert ledger["hash"].iloc[0] == digest
|
|
88
|
+
assert set(ledger["name"]) == {"inputs.raw.ci"}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def test_publish_a_document(registered: dict[str, Any], project: Path) -> None:
|
|
92
|
+
page = project / "outputs/public/report.html"
|
|
93
|
+
page.parent.mkdir(parents=True)
|
|
94
|
+
page.write_text("<!DOCTYPE html><title>CI</title><p>staging</p>", encoding="utf-8")
|
|
95
|
+
url = cloud.cloud_publish(page, title="CI report")
|
|
96
|
+
assert url.startswith(URL)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def test_another_account_cannot_use_this_project(registered: dict[str, Any]) -> None:
|
|
100
|
+
"""ci-other's personal token is not this project's key and cannot read its ledger."""
|
|
101
|
+
with pytest.raises(cloud.CloudError):
|
|
102
|
+
cloud.api("/api/v1/ledger", TOKEN_OTHER, URL)
|
|
103
|
+
slug = registered["project"]["slug"]
|
|
104
|
+
try:
|
|
105
|
+
listing = cloud.api("/api/v1/projects", TOKEN_OTHER, URL)
|
|
106
|
+
except cloud.CloudError:
|
|
107
|
+
return
|
|
108
|
+
assert slug not in str(listing)
|
|
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
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/layer.v1.json
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/layers.v1.json
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/spec.v1.json
RENAMED
|
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
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/course
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/presentation
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/project
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/sensitive
RENAMED
|
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
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/script-default.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.framework/spec.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/docs/_quarto.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/fixture-study.Rproj
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/private/ids.csv
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/raw/survey.csv
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/raw/visits.tsv
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/notebooks/_quarto.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/ai.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/author.yml
RENAMED
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/data.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/git.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/packages.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/quarto.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/scaffold.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/.framework/spec.json
RENAMED
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/pyproject.toml
RENAMED
|
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
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/_quarto.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/modules/_quarto.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/pyproject.toml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/scaffold.py
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/settings.yml
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/slides/_quarto.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.env
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/AGENTS.md
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/CLAUDE.md
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/notes.md
RENAMED
|
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
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/layers.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.env
RENAMED
|
File without changes
|
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.gitignore
RENAMED
|
File without changes
|
{framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/AGENTS.md
RENAMED
|
File without changes
|