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.
Files changed (336) hide show
  1. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/PKG-INFO +9 -2
  2. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/README.md +7 -0
  3. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/parity.toml +1 -1
  4. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/pyproject.toml +2 -2
  5. framework_py-0.1.0.dev1/tests/integration/test_cloud_staging.py +108 -0
  6. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/.gitignore +0 -0
  7. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/LICENSE +0 -0
  8. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/__init__.py +0 -0
  9. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/check_parity.py +0 -0
  10. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/make_golden_trees.py +0 -0
  11. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/make_r_fixtures.R +0 -0
  12. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/scripts/sync_assets.py +0 -0
  13. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/__init__.py +0 -0
  14. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/__main__.py +0 -0
  15. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/hooks/pre-commit +0 -0
  16. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/init.sql +0 -0
  17. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/layer.v1.json +0 -0
  18. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/layers.v1.json +0 -0
  19. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_assets/schema/spec.v1.json +0 -0
  20. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_log.py +0 -0
  21. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_paths.py +0 -0
  22. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_secretservice.py +0 -0
  23. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_time.py +0 -0
  24. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_wincred.py +0 -0
  25. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/_yaml.py +0 -0
  26. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/ai.py +0 -0
  27. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/bootstrap.py +0 -0
  28. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/cache.py +0 -0
  29. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/catalog.py +0 -0
  30. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/cloud.py +0 -0
  31. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/config_home.py +0 -0
  32. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/connections.py +0 -0
  33. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/console.py +0 -0
  34. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/create.py +0 -0
  35. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/data.py +0 -0
  36. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/db.py +0 -0
  37. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/dotenv.py +0 -0
  38. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/errors.py +0 -0
  39. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/global_config.py +0 -0
  40. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/hooks.py +0 -0
  41. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/integrity.py +0 -0
  42. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/notebooks.py +0 -0
  43. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/outputs.py +0 -0
  44. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/packages.py +0 -0
  45. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/project.py +0 -0
  46. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/py.typed +0 -0
  47. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/quarto.py +0 -0
  48. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/scaffold.py +0 -0
  49. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/scratch.py +0 -0
  50. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/security.py +0 -0
  51. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/settings.py +0 -0
  52. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/__init__.py +0 -0
  53. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/check.py +0 -0
  54. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/merge.py +0 -0
  55. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/spec/resolve.py +0 -0
  56. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/storage.py +0 -0
  57. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/defaults.yml +0 -0
  58. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/course +0 -0
  59. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/presentation +0 -0
  60. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/project +0 -0
  61. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/gitignore/sensitive +0 -0
  62. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-data/SKILL.md +0 -0
  63. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-outputs/SKILL.md +0 -0
  64. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-packages/SKILL.md +0 -0
  65. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-sensitive-data/SKILL.md +0 -0
  66. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/skills/framework-workflow/SKILL.md +0 -0
  67. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-default.ipynb +0 -0
  68. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-default.qmd +0 -0
  69. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-minimal.qmd +0 -0
  70. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/notebook-revealjs.qmd +0 -0
  71. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/src/framework/templates/stubs/script-default.py +0 -0
  72. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/__init__.py +0 -0
  73. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/conftest.py +0 -0
  74. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-data/SKILL.md +0 -0
  75. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-outputs/SKILL.md +0 -0
  76. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-packages/SKILL.md +0 -0
  77. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.claude/skills/framework-workflow/SKILL.md +0 -0
  78. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.env +0 -0
  79. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.framework/spec.json +0 -0
  80. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/.gitignore +0 -0
  81. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/AGENTS.md +0 -0
  82. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/CLAUDE.md +0 -0
  83. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/_quarto.yml +0 -0
  84. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/docs/_quarto.yml +0 -0
  85. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/fixture-study.Rproj +0 -0
  86. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/fixture-study.code-workspace +0 -0
  87. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/framework.db +0 -0
  88. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/intermediate/r_clean.csv +0 -0
  89. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/private/ids.csv +0 -0
  90. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/raw/survey.csv +0 -0
  91. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/raw/visits.tsv +0 -0
  92. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/reference/test.dta +0 -0
  93. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/reference/test.sav +0 -0
  94. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/inputs/reference/test.xpt +0 -0
  95. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/notebooks/_quarto.yml +0 -0
  96. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/outputs/cache/r_value.rds +0 -0
  97. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/outputs/tables/r_summary.csv +0 -0
  98. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/scaffold.R +0 -0
  99. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/ai.yml +0 -0
  100. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/author.yml +0 -0
  101. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/connections.yml +0 -0
  102. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/data.yml +0 -0
  103. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/git.yml +0 -0
  104. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/packages.yml +0 -0
  105. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/quarto.yml +0 -0
  106. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings/scaffold.yml +0 -0
  107. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project/settings.yml +0 -0
  108. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/fixtures/r_project.expected.json +0 -0
  109. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/.framework/spec.json +0 -0
  110. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/.gitignore +0 -0
  111. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/pyproject.toml +0 -0
  112. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/expected/settings.yml +0 -0
  113. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/bare/layers.json +0 -0
  114. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-data/SKILL.md +0 -0
  115. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
  116. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-packages/SKILL.md +0 -0
  117. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
  118. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.env +0 -0
  119. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.framework/spec.json +0 -0
  120. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/.gitignore +0 -0
  121. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/AGENTS.md +0 -0
  122. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/CLAUDE.md +0 -0
  123. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/_quarto.yml +0 -0
  124. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/assignments/_quarto.yml +0 -0
  125. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/course_docs/_quarto.yml +0 -0
  126. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/golden-course.code-workspace +0 -0
  127. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/modules/_quarto.yml +0 -0
  128. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/pyproject.toml +0 -0
  129. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/scaffold.py +0 -0
  130. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/settings.yml +0 -0
  131. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/expected/slides/_quarto.yml +0 -0
  132. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/course/layers.json +0 -0
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.env +0 -0
  140. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.framework/spec.json +0 -0
  141. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/.gitignore +0 -0
  142. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/AGENTS.md +0 -0
  143. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/CLAUDE.md +0 -0
  144. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/README.md +0 -0
  145. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/_quarto.yml +0 -0
  146. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/docs/_quarto.yml +0 -0
  147. {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
  148. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/notebooks/_quarto.yml +0 -0
  149. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/notes.md +0 -0
  150. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/pyproject.toml +0 -0
  151. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/scaffold.py +0 -0
  152. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/ai.yml +0 -0
  153. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/author.yml +0 -0
  154. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/connections.yml +0 -0
  155. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/data.yml +0 -0
  156. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/git.yml +0 -0
  157. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/quarto.yml +0 -0
  158. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings/scaffold.yml +0 -0
  159. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/expected/settings.yml +0 -0
  160. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/files-and-skills/layers.json +0 -0
  161. {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
  162. {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
  163. {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
  164. {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
  165. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.env +0 -0
  166. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.framework/spec.json +0 -0
  167. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/.gitignore +0 -0
  168. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/AGENTS.md +0 -0
  169. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/_quarto.yml +0 -0
  170. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/docs/_quarto.yml +0 -0
  171. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/golden-no-assistants.code-workspace +0 -0
  172. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/notebooks/_quarto.yml +0 -0
  173. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/pyproject.toml +0 -0
  174. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/scaffold.py +0 -0
  175. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/ai.yml +0 -0
  176. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/author.yml +0 -0
  177. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/connections.yml +0 -0
  178. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/data.yml +0 -0
  179. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/git.yml +0 -0
  180. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/quarto.yml +0 -0
  181. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings/scaffold.yml +0 -0
  182. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/expected/settings.yml +0 -0
  183. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/no-assistants/layers.json +0 -0
  184. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-data/SKILL.md +0 -0
  185. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
  186. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-packages/SKILL.md +0 -0
  187. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
  188. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.env +0 -0
  189. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.framework/spec.json +0 -0
  190. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/.gitignore +0 -0
  191. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/AGENTS.md +0 -0
  192. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/CLAUDE.md +0 -0
  193. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/_quarto.yml +0 -0
  194. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/golden-presentation.code-workspace +0 -0
  195. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/presentation.qmd +0 -0
  196. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/pyproject.toml +0 -0
  197. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/scaffold.py +0 -0
  198. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/expected/settings.yml +0 -0
  199. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/presentation/layers.json +0 -0
  200. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-data/SKILL.md +0 -0
  201. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-outputs/SKILL.md +0 -0
  202. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-packages/SKILL.md +0 -0
  203. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.claude/skills/framework-workflow/SKILL.md +0 -0
  204. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.env +0 -0
  205. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.framework/spec.json +0 -0
  206. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/.gitignore +0 -0
  207. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/AGENTS.md +0 -0
  208. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/CLAUDE.md +0 -0
  209. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/_quarto.yml +0 -0
  210. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/docs/_quarto.yml +0 -0
  211. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/golden-project.code-workspace +0 -0
  212. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/notebooks/_quarto.yml +0 -0
  213. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/pyproject.toml +0 -0
  214. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/scaffold.py +0 -0
  215. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/ai.yml +0 -0
  216. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/author.yml +0 -0
  217. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/connections.yml +0 -0
  218. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/data.yml +0 -0
  219. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/git.yml +0 -0
  220. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/quarto.yml +0 -0
  221. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings/scaffold.yml +0 -0
  222. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/expected/settings.yml +0 -0
  223. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project/layers.json +0 -0
  224. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.claude/settings.json +0 -0
  225. {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
  226. {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
  227. {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
  228. {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
  229. {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
  230. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.env +0 -0
  231. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.framework/spec.json +0 -0
  232. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/.gitignore +0 -0
  233. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/AGENTS.md +0 -0
  234. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/CLAUDE.md +0 -0
  235. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/_quarto.yml +0 -0
  236. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/docs/_quarto.yml +0 -0
  237. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/golden-project-sensitive.code-workspace +0 -0
  238. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/notebooks/_quarto.yml +0 -0
  239. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/pyproject.toml +0 -0
  240. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/scaffold.py +0 -0
  241. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/ai.yml +0 -0
  242. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/author.yml +0 -0
  243. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/connections.yml +0 -0
  244. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/data.yml +0 -0
  245. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/git.yml +0 -0
  246. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/quarto.yml +0 -0
  247. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings/scaffold.yml +0 -0
  248. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/expected/settings.yml +0 -0
  249. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/project-sensitive/layers.json +0 -0
  250. {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
  251. {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
  252. {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
  253. {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
  254. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.env +0 -0
  255. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.framework/spec.json +0 -0
  256. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.github/copilot-instructions.md +0 -0
  257. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/.gitignore +0 -0
  258. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/AGENTS.md +0 -0
  259. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/_quarto.yml +0 -0
  260. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/docs/_quarto.yml +0 -0
  261. {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
  262. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/notebooks/_quarto.yml +0 -0
  263. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/pyproject.toml +0 -0
  264. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/scaffold.py +0 -0
  265. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/ai.yml +0 -0
  266. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/author.yml +0 -0
  267. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/connections.yml +0 -0
  268. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/data.yml +0 -0
  269. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/git.yml +0 -0
  270. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/quarto.yml +0 -0
  271. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings/scaffold.yml +0 -0
  272. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/expected/settings.yml +0 -0
  273. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/removals-and-assistants/layers.json +0 -0
  274. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.claude/settings.json +0 -0
  275. {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
  276. {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
  277. {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
  278. {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
  279. {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
  280. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.env +0 -0
  281. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.framework/spec.json +0 -0
  282. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/.gitignore +0 -0
  283. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/AGENTS.md +0 -0
  284. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/CLAUDE.md +0 -0
  285. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/_quarto.yml +0 -0
  286. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/docs/_quarto.yml +0 -0
  287. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/golden-sensitive-facet.code-workspace +0 -0
  288. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/notebooks/_quarto.yml +0 -0
  289. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/pyproject.toml +0 -0
  290. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/scaffold.py +0 -0
  291. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/ai.yml +0 -0
  292. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/author.yml +0 -0
  293. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/connections.yml +0 -0
  294. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/data.yml +0 -0
  295. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/git.yml +0 -0
  296. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/quarto.yml +0 -0
  297. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings/scaffold.yml +0 -0
  298. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/expected/settings.yml +0 -0
  299. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/golden/sensitive-facet/layers.json +0 -0
  300. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/compose.yml +0 -0
  301. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/mariadb/init.sql +0 -0
  302. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/mysql/init.sql +0 -0
  303. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/postgres/init.sql +0 -0
  304. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/sqlserver/init.sql +0 -0
  305. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/integration/test_servers.py +0 -0
  306. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/NAMESPACE +0 -0
  307. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/README.md +0 -0
  308. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/atomic-entries.json +0 -0
  309. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/conflicts-and-labels.json +0 -0
  310. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/empty-sections.json +0 -0
  311. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/gitignore-and-assistants.json +0 -0
  312. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/shared/conformance/merge/maps-and-null-removal.json +0 -0
  313. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_bootstrap.py +0 -0
  314. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_cache.py +0 -0
  315. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_catalog.py +0 -0
  316. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_cloud.py +0 -0
  317. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_config_home.py +0 -0
  318. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_conformance.py +0 -0
  319. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_connections.py +0 -0
  320. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_create.py +0 -0
  321. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_data.py +0 -0
  322. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_db.py +0 -0
  323. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_dotenv.py +0 -0
  324. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_global_config.py +0 -0
  325. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_hooks.py +0 -0
  326. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_notebooks.py +0 -0
  327. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_outputs.py +0 -0
  328. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_package.py +0 -0
  329. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_packages.py +0 -0
  330. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_r_compat.py +0 -0
  331. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_r_live.py +0 -0
  332. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_scaffold.py +0 -0
  333. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_secretservice.py +0 -0
  334. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_security.py +0 -0
  335. {framework_py-0.1.0.dev0 → framework_py-0.1.0.dev1}/tests/test_settings.py +0 -0
  336. {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.dev0
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.table1.org
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
@@ -549,4 +549,4 @@ status = "folded"
549
549
 
550
550
  # Python functions with no R counterpart.
551
551
  [python_only]
552
- names = ["framework_template_path", "project_add_python"]
552
+ names = ["framework_template_path"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "framework-py"
3
- version = "0.1.0.dev0"
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.table1.org"
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)