calliope-studio 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (623) hide show
  1. calliope_studio-0.1.0/.gitattributes +21 -0
  2. calliope_studio-0.1.0/.github/dependabot.yml +63 -0
  3. calliope_studio-0.1.0/.github/workflows/ci.yml +437 -0
  4. calliope_studio-0.1.0/.github/workflows/release.yml +246 -0
  5. calliope_studio-0.1.0/.github/workflows/screenshots.yml +164 -0
  6. calliope_studio-0.1.0/.gitignore +47 -0
  7. calliope_studio-0.1.0/CHANGELOG.md +5 -0
  8. calliope_studio-0.1.0/LICENSE +661 -0
  9. calliope_studio-0.1.0/MANIFEST.in +6 -0
  10. calliope_studio-0.1.0/PKG-INFO +122 -0
  11. calliope_studio-0.1.0/README.md +81 -0
  12. calliope_studio-0.1.0/codecov.yml +39 -0
  13. calliope_studio-0.1.0/pixi.lock +13992 -0
  14. calliope_studio-0.1.0/pyproject.toml +305 -0
  15. calliope_studio-0.1.0/scripts/check_dist.py +186 -0
  16. calliope_studio-0.1.0/scripts/make_examples.py +163 -0
  17. calliope_studio-0.1.0/setup.cfg +4 -0
  18. calliope_studio-0.1.0/src/calliope_studio/__init__.py +30 -0
  19. calliope_studio-0.1.0/src/calliope_studio/cli.py +209 -0
  20. calliope_studio-0.1.0/src/calliope_studio/modeldef/__init__.py +20 -0
  21. calliope_studio-0.1.0/src/calliope_studio/modeldef/csv_io.py +50 -0
  22. calliope_studio-0.1.0/src/calliope_studio/modeldef/data_tables.py +261 -0
  23. calliope_studio-0.1.0/src/calliope_studio/modeldef/entities.py +273 -0
  24. calliope_studio-0.1.0/src/calliope_studio/modeldef/filekinds.py +85 -0
  25. calliope_studio-0.1.0/src/calliope_studio/modeldef/geo.py +244 -0
  26. calliope_studio-0.1.0/src/calliope_studio/modeldef/imports.py +327 -0
  27. calliope_studio-0.1.0/src/calliope_studio/modeldef/mathdef.py +249 -0
  28. calliope_studio-0.1.0/src/calliope_studio/modeldef/overrides.py +188 -0
  29. calliope_studio-0.1.0/src/calliope_studio/modeldef/paths.py +185 -0
  30. calliope_studio-0.1.0/src/calliope_studio/modeldef/scaffold.py +85 -0
  31. calliope_studio-0.1.0/src/calliope_studio/modeldef/schema.py +136 -0
  32. calliope_studio-0.1.0/src/calliope_studio/modeldef/snapshot.py +262 -0
  33. calliope_studio-0.1.0/src/calliope_studio/modeldef/validate.py +31 -0
  34. calliope_studio-0.1.0/src/calliope_studio/modeldef/yaml_io.py +233 -0
  35. calliope_studio-0.1.0/src/calliope_studio/results/__init__.py +24 -0
  36. calliope_studio-0.1.0/src/calliope_studio/results/catalog.py +288 -0
  37. calliope_studio-0.1.0/src/calliope_studio/results/colors.py +44 -0
  38. calliope_studio-0.1.0/src/calliope_studio/results/frames.py +221 -0
  39. calliope_studio-0.1.0/src/calliope_studio/results/geo.py +194 -0
  40. calliope_studio-0.1.0/src/calliope_studio/results/links.py +163 -0
  41. calliope_studio-0.1.0/src/calliope_studio/results/query.py +120 -0
  42. calliope_studio-0.1.0/src/calliope_studio/results/store.py +531 -0
  43. calliope_studio-0.1.0/src/calliope_studio/results/summaries.py +82 -0
  44. calliope_studio-0.1.0/src/calliope_studio/runs/__init__.py +28 -0
  45. calliope_studio-0.1.0/src/calliope_studio/runs/manager.py +605 -0
  46. calliope_studio-0.1.0/src/calliope_studio/runs/mathcache.py +170 -0
  47. calliope_studio-0.1.0/src/calliope_studio/runs/mathdoc.py +413 -0
  48. calliope_studio-0.1.0/src/calliope_studio/runs/process.py +368 -0
  49. calliope_studio-0.1.0/src/calliope_studio/runs/protocol.py +332 -0
  50. calliope_studio-0.1.0/src/calliope_studio/runs/solvers.py +104 -0
  51. calliope_studio-0.1.0/src/calliope_studio/runs/stages.py +170 -0
  52. calliope_studio-0.1.0/src/calliope_studio/runs/validate.py +59 -0
  53. calliope_studio-0.1.0/src/calliope_studio/runs/worker.py +590 -0
  54. calliope_studio-0.1.0/src/calliope_studio/server/__init__.py +21 -0
  55. calliope_studio-0.1.0/src/calliope_studio/server/app.py +188 -0
  56. calliope_studio-0.1.0/src/calliope_studio/server/deps.py +121 -0
  57. calliope_studio-0.1.0/src/calliope_studio/server/mode.py +130 -0
  58. calliope_studio-0.1.0/src/calliope_studio/server/resolution.py +401 -0
  59. calliope_studio-0.1.0/src/calliope_studio/server/routes/__init__.py +43 -0
  60. calliope_studio-0.1.0/src/calliope_studio/server/routes/browse.py +95 -0
  61. calliope_studio-0.1.0/src/calliope_studio/server/routes/csv.py +37 -0
  62. calliope_studio-0.1.0/src/calliope_studio/server/routes/files.py +160 -0
  63. calliope_studio-0.1.0/src/calliope_studio/server/routes/math.py +296 -0
  64. calliope_studio-0.1.0/src/calliope_studio/server/routes/overrides.py +137 -0
  65. calliope_studio-0.1.0/src/calliope_studio/server/routes/projects.py +182 -0
  66. calliope_studio-0.1.0/src/calliope_studio/server/routes/results.py +239 -0
  67. calliope_studio-0.1.0/src/calliope_studio/server/routes/runs.py +421 -0
  68. calliope_studio-0.1.0/src/calliope_studio/server/routes/schema.py +44 -0
  69. calliope_studio-0.1.0/src/calliope_studio/server/routes/structure.py +77 -0
  70. calliope_studio-0.1.0/src/calliope_studio/server/routes/validate.py +158 -0
  71. calliope_studio-0.1.0/src/calliope_studio/server/routes/yaml_sections.py +78 -0
  72. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/AppShell-BdDJc6dW.css +1 -0
  73. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/AppShell-D2u8D6BC.js +1271 -0
  74. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/FilesSection-DbWKr_og.js +1 -0
  75. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  76. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  77. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  78. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  79. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  80. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  81. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  82. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  83. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  84. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  85. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  86. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  87. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  88. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  89. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  90. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  91. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  92. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  93. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  94. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  95. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  96. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  97. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  98. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  99. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  100. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  101. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  102. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  103. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  104. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  105. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  106. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  107. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  108. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  109. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  110. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  111. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  112. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  113. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  114. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  115. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  116. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  117. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  118. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  119. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  120. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  121. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  122. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  123. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  124. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  125. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  126. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  127. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  128. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  129. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  130. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  131. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  132. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  133. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  134. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/ModelSection-BUVZG55I.js +26 -0
  135. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/OpenProjectView-BdOz_BK3.js +1 -0
  136. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/OpenResultsView-B_oqTAB8.js +1 -0
  137. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/ProjectListView-CFPFGpbv.js +1 -0
  138. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/RunStatusPill.vue_vue_type_script_setup_true_lang-B_0xBWOk.js +2 -0
  139. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/RunsSection-BPj8i2gA.js +1 -0
  140. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/SelectValue.vue_vue_type_script_setup_true_lang-Bx9iGq77.js +1 -0
  141. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/StateMessage.vue_vue_type_script_setup_true_lang-BuqQEo1R.js +1 -0
  142. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/TooltipButton.vue_vue_type_script_setup_true_lang-ZT9lqzIQ.js +1 -0
  143. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/TreeSearch.vue_vue_type_script_setup_true_lang-41hTKiuj.js +1 -0
  144. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/abap-CRCWOmpq.js +1 -0
  145. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/apex-DnsZk_dE.js +1 -0
  146. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/azcli-1IWB1ccx.js +1 -0
  147. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/bat-DPkNLes8.js +1 -0
  148. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/bicep-Corcdgou.js +2 -0
  149. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/cameligo-CGrWLZr3.js +1 -0
  150. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/chevron-right-BRfJzHgy.js +1 -0
  151. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/clojure-D9WOWImG.js +1 -0
  152. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/codicon-DCmgc-ay.ttf +0 -0
  153. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/coffee-B7EJu28W.js +1 -0
  154. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/componentTree-C-wHDQDl.js +1 -0
  155. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/cpp-SEyurbux.js +1 -0
  156. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/csharp-BoL64M5l.js +1 -0
  157. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/csp-C46ZqvIl.js +1 -0
  158. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/css-DQU6DXDx.js +3 -0
  159. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/cssMode-BxllqVTV.js +4 -0
  160. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/cypher-D84EuPTj.js +1 -0
  161. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/dart-D8lhlL1r.js +1 -0
  162. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/dockerfile-DLk6rpji.js +1 -0
  163. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/ecl-BO6FnfXk.js +1 -0
  164. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/editor.worker-B4pQIWZD.js +12 -0
  165. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/elixir-BRjLKONM.js +1 -0
  166. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/flow9-Cac8vKd7.js +1 -0
  167. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/folder-plus-JJY8OCXw.js +1 -0
  168. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/format-B_d8noaY.js +1 -0
  169. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/freemarker2-uONZOifM.js +3 -0
  170. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/fsharp-fd1GTHhf.js +1 -0
  171. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/go-O9LJTZXk.js +1 -0
  172. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/graphql-LQdxqEYJ.js +1 -0
  173. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/handlebars-CR_9Uoy0.js +1 -0
  174. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/hcl-DxDQ3s82.js +1 -0
  175. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/html-CsO_tunk.js +1 -0
  176. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/htmlMode-DT80rgdc.js +4 -0
  177. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  178. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/index-B2TA6wAb.css +1 -0
  179. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/index-DXLTCQjx.js +740 -0
  180. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/ini-BvajGCUy.js +1 -0
  181. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  182. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/java-SYsfObOQ.js +1 -0
  183. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/javascript--eUKt1In.js +1 -0
  184. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/jsonMode-BFpS5S9D.js +10 -0
  185. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/julia-DQXNmw_w.js +1 -0
  186. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/kotlin-qQ0MG-9I.js +1 -0
  187. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/less-GGFNNJHn.js +2 -0
  188. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/lexon-Canl7DCW.js +1 -0
  189. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/liquid-BByO3Ohw.js +1 -0
  190. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/lua-D28Ae8-K.js +1 -0
  191. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/m3-DPitgjJI.js +1 -0
  192. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/maplibre-gl-worker-IbxDsVLX.js +2 -0
  193. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/markdown-B811l8j2.js +1 -0
  194. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/mdx-3pW_PSEc.js +1 -0
  195. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/mips-CdjsipkG.js +1 -0
  196. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/msdax-CYqgjx_P.js +1 -0
  197. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/mysql-BHd6q0vd.js +1 -0
  198. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/objective-c-B1aVtJYH.js +1 -0
  199. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/openIntent-D8R4JCyS.js +1 -0
  200. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/pascal-BhNW15KB.js +1 -0
  201. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/pascaligo-5jv8CcQD.js +1 -0
  202. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/perl-DlYyT36c.js +1 -0
  203. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/pgsql-Dy0bjov7.js +1 -0
  204. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/php-120yhfDK.js +1 -0
  205. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/pla-CjnFlu4u.js +1 -0
  206. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/postiats-CQpG440k.js +1 -0
  207. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/powerquery-DdJtto1Z.js +1 -0
  208. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/powershell-Bu_VLpJB.js +1 -0
  209. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/project-7deFrcrD.js +1 -0
  210. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/projects-COKZ9mG6.js +1 -0
  211. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/protobuf-IBS6jZEB.js +2 -0
  212. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/pug-kFxLfcjb.js +1 -0
  213. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/python-BlQxj-SX.js +1 -0
  214. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/qsharp-q7JyzKFN.js +1 -0
  215. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/r-BIFz-_sK.js +1 -0
  216. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/razor-DDzIazS6.js +1 -0
  217. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/redis-CHOsPHWR.js +1 -0
  218. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/redshift-CBifECDb.js +1 -0
  219. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/refresh-cw-DORD2fO7.js +1 -0
  220. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/restructuredtext-CghPJEOS.js +1 -0
  221. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/ruby-CYWGW-b1.js +1 -0
  222. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/runs-OyWlK5s7.js +1 -0
  223. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/rust-DMDD0SHb.js +1 -0
  224. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/sb-BYAiYHFx.js +1 -0
  225. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/scala-Bqvq8jcR.js +1 -0
  226. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/scheme-Dhb-2j9p.js +1 -0
  227. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/scss-CTwUZ5N7.js +3 -0
  228. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/shell-CsDZo4DB.js +1 -0
  229. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/solidity-CME5AdoB.js +1 -0
  230. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/sophia-RYC1BQQz.js +1 -0
  231. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/sparql-KEyrF7De.js +1 -0
  232. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/sql-BdTr02Mf.js +1 -0
  233. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/st-C7iG7M4S.js +1 -0
  234. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/swift-D7IUmUK8.js +1 -0
  235. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/system-DF3Lx2aO.js +1 -0
  236. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/systemverilog-DgMryOEJ.js +1 -0
  237. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/tcl-PloMZuKG.js +1 -0
  238. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/tsMode-DbBrsT3L.js +11 -0
  239. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/twig-BfRIq3la.js +1 -0
  240. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/typescript-l72YPfuF.js +1 -0
  241. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/typespec-CzxlYoT_.js +1 -0
  242. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/useTreeSearch-B0VKj4Uv.js +1 -0
  243. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/vb-BwAE3J76.js +1 -0
  244. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/version-DJ3dZTBB.js +1 -0
  245. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/wgsl-B_1kOXbF.js +298 -0
  246. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/xml-BjsDdNTa.js +1 -0
  247. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/yaml-Bkpi6Wxi.js +1 -0
  248. calliope_studio-0.1.0/src/calliope_studio/server/static/assets/yaml.worker-CY09xy5R.js +455 -0
  249. calliope_studio-0.1.0/src/calliope_studio/server/static/favicon.svg +52 -0
  250. calliope_studio-0.1.0/src/calliope_studio/server/static/index.html +43 -0
  251. calliope_studio-0.1.0/src/calliope_studio/server/storage.py +577 -0
  252. calliope_studio-0.1.0/src/calliope_studio.egg-info/PKG-INFO +122 -0
  253. calliope_studio-0.1.0/src/calliope_studio.egg-info/SOURCES.txt +621 -0
  254. calliope_studio-0.1.0/src/calliope_studio.egg-info/dependency_links.txt +1 -0
  255. calliope_studio-0.1.0/src/calliope_studio.egg-info/entry_points.txt +2 -0
  256. calliope_studio-0.1.0/src/calliope_studio.egg-info/requires.txt +12 -0
  257. calliope_studio-0.1.0/src/calliope_studio.egg-info/scm_file_list.json +439 -0
  258. calliope_studio-0.1.0/src/calliope_studio.egg-info/scm_version.json +8 -0
  259. calliope_studio-0.1.0/src/calliope_studio.egg-info/top_level.txt +1 -0
  260. calliope_studio-0.1.0/tests/conftest.py +96 -0
  261. calliope_studio-0.1.0/tests/layouts.py +151 -0
  262. calliope_studio-0.1.0/tests/oracle/README.md +48 -0
  263. calliope_studio-0.1.0/tests/oracle/__init__.py +9 -0
  264. calliope_studio-0.1.0/tests/oracle/colors.py +34 -0
  265. calliope_studio-0.1.0/tests/oracle/model.py +159 -0
  266. calliope_studio-0.1.0/tests/oracle/query.py +71 -0
  267. calliope_studio-0.1.0/tests/oracle/variables.py +95 -0
  268. calliope_studio-0.1.0/tests/test_api.py +571 -0
  269. calliope_studio-0.1.0/tests/test_app_startup.py +392 -0
  270. calliope_studio-0.1.0/tests/test_csv_io.py +64 -0
  271. calliope_studio-0.1.0/tests/test_entities.py +225 -0
  272. calliope_studio-0.1.0/tests/test_filekinds.py +74 -0
  273. calliope_studio-0.1.0/tests/test_layering.py +122 -0
  274. calliope_studio-0.1.0/tests/test_math_render.py +289 -0
  275. calliope_studio-0.1.0/tests/test_mathcache.py +347 -0
  276. calliope_studio-0.1.0/tests/test_mathdef.py +267 -0
  277. calliope_studio-0.1.0/tests/test_modeldef_geo.py +214 -0
  278. calliope_studio-0.1.0/tests/test_oracle.py +279 -0
  279. calliope_studio-0.1.0/tests/test_overrides.py +396 -0
  280. calliope_studio-0.1.0/tests/test_paths.py +73 -0
  281. calliope_studio-0.1.0/tests/test_process.py +243 -0
  282. calliope_studio-0.1.0/tests/test_resolution_parity.py +338 -0
  283. calliope_studio-0.1.0/tests/test_results.py +657 -0
  284. calliope_studio-0.1.0/tests/test_results_api.py +451 -0
  285. calliope_studio-0.1.0/tests/test_results_layouts.py +383 -0
  286. calliope_studio-0.1.0/tests/test_run_stages.py +189 -0
  287. calliope_studio-0.1.0/tests/test_runs.py +1148 -0
  288. calliope_studio-0.1.0/tests/test_snapshot.py +200 -0
  289. calliope_studio-0.1.0/tests/test_solvers.py +85 -0
  290. calliope_studio-0.1.0/tests/test_state_dir.py +103 -0
  291. calliope_studio-0.1.0/tests/test_storage.py +309 -0
  292. calliope_studio-0.1.0/tests/test_yaml_io.py +193 -0
  293. calliope_studio-0.1.0/web/.oxlintrc.json +15 -0
  294. calliope_studio-0.1.0/web/components.json +20 -0
  295. calliope_studio-0.1.0/web/index.html +42 -0
  296. calliope_studio-0.1.0/web/package.json +79 -0
  297. calliope_studio-0.1.0/web/pnpm-lock.yaml +3724 -0
  298. calliope_studio-0.1.0/web/pnpm-workspace.yaml +66 -0
  299. calliope_studio-0.1.0/web/public/favicon.svg +52 -0
  300. calliope_studio-0.1.0/web/scripts/confirm-check.mjs +118 -0
  301. calliope_studio-0.1.0/web/scripts/file-actions.mjs +283 -0
  302. calliope_studio-0.1.0/web/scripts/harness.mjs +300 -0
  303. calliope_studio-0.1.0/web/scripts/map-edit.mjs +395 -0
  304. calliope_studio-0.1.0/web/scripts/math-check.mjs +379 -0
  305. calliope_studio-0.1.0/web/scripts/menu-check.mjs +117 -0
  306. calliope_studio-0.1.0/web/scripts/model-picker.mjs +223 -0
  307. calliope_studio-0.1.0/web/scripts/monaco-check.mjs +175 -0
  308. calliope_studio-0.1.0/web/scripts/results-page.mjs +163 -0
  309. calliope_studio-0.1.0/web/scripts/run-lifecycle.mjs +260 -0
  310. calliope_studio-0.1.0/web/scripts/save-check.mjs +214 -0
  311. calliope_studio-0.1.0/web/scripts/screenshots.mjs +326 -0
  312. calliope_studio-0.1.0/web/scripts/smoke-charts.mjs +155 -0
  313. calliope_studio-0.1.0/web/scripts/smoke-layout.mjs +247 -0
  314. calliope_studio-0.1.0/web/scripts/smoke-map.mjs +167 -0
  315. calliope_studio-0.1.0/web/scripts/smoke-results.mjs +144 -0
  316. calliope_studio-0.1.0/web/scripts/smoke-table.mjs +386 -0
  317. calliope_studio-0.1.0/web/scripts/smoke.mjs +162 -0
  318. calliope_studio-0.1.0/web/scripts/source-link.mjs +178 -0
  319. calliope_studio-0.1.0/web/scripts/tab-drag.mjs +220 -0
  320. calliope_studio-0.1.0/web/scripts/token-check.mjs +398 -0
  321. calliope_studio-0.1.0/web/scripts/tree-search.mjs +135 -0
  322. calliope_studio-0.1.0/web/src/App.vue +37 -0
  323. calliope_studio-0.1.0/web/src/api/client.ts +8 -0
  324. calliope_studio-0.1.0/web/src/api/errors.ts +56 -0
  325. calliope_studio-0.1.0/web/src/api/paths.ts +26 -0
  326. calliope_studio-0.1.0/web/src/api/projects.ts +57 -0
  327. calliope_studio-0.1.0/web/src/api/results.ts +244 -0
  328. calliope_studio-0.1.0/web/src/api/runs.ts +119 -0
  329. calliope_studio-0.1.0/web/src/api/system.ts +82 -0
  330. calliope_studio-0.1.0/web/src/api/versions.ts +423 -0
  331. calliope_studio-0.1.0/web/src/assets/maplibre-overrides.css +251 -0
  332. calliope_studio-0.1.0/web/src/assets/markdown.css +173 -0
  333. calliope_studio-0.1.0/web/src/assets/math.css +81 -0
  334. calliope_studio-0.1.0/web/src/assets/tokens.css +297 -0
  335. calliope_studio-0.1.0/web/src/charts/layout.test.ts +40 -0
  336. calliope_studio-0.1.0/web/src/charts/layout.ts +60 -0
  337. calliope_studio-0.1.0/web/src/charts/theme.ts +137 -0
  338. calliope_studio-0.1.0/web/src/components/app/ConfirmDialog.vue +57 -0
  339. calliope_studio-0.1.0/web/src/components/app/Eyebrow.vue +19 -0
  340. calliope_studio-0.1.0/web/src/components/app/FieldRow.vue +169 -0
  341. calliope_studio-0.1.0/web/src/components/app/InfoTip.vue +50 -0
  342. calliope_studio-0.1.0/web/src/components/app/Metric.vue +100 -0
  343. calliope_studio-0.1.0/web/src/components/app/Panel.vue +35 -0
  344. calliope_studio-0.1.0/web/src/components/app/PanelDisclosure.vue +74 -0
  345. calliope_studio-0.1.0/web/src/components/app/PanelFooter.vue +26 -0
  346. calliope_studio-0.1.0/web/src/components/app/PanelHeader.vue +67 -0
  347. calliope_studio-0.1.0/web/src/components/app/PanelTitle.vue +20 -0
  348. calliope_studio-0.1.0/web/src/components/app/ProgressHairline.vue +29 -0
  349. calliope_studio-0.1.0/web/src/components/app/Segmented.vue +161 -0
  350. calliope_studio-0.1.0/web/src/components/app/SidebarSection.vue +29 -0
  351. calliope_studio-0.1.0/web/src/components/app/SourceLink.vue +69 -0
  352. calliope_studio-0.1.0/web/src/components/app/StateMessage.vue +70 -0
  353. calliope_studio-0.1.0/web/src/components/app/TooltipButton.vue +87 -0
  354. calliope_studio-0.1.0/web/src/components/app/TreeSearch.vue +62 -0
  355. calliope_studio-0.1.0/web/src/components/app/segmented.ts +186 -0
  356. calliope_studio-0.1.0/web/src/components/editor/ConfigEditor.vue +247 -0
  357. calliope_studio-0.1.0/web/src/components/editor/CsvGrid.vue +57 -0
  358. calliope_studio-0.1.0/web/src/components/editor/CsvGridEditor.vue +73 -0
  359. calliope_studio-0.1.0/web/src/components/editor/DataTableFields.vue +76 -0
  360. calliope_studio-0.1.0/web/src/components/editor/DataTablesEditor.vue +425 -0
  361. calliope_studio-0.1.0/web/src/components/editor/EditorMapPane.vue +138 -0
  362. calliope_studio-0.1.0/web/src/components/editor/EditorToolbar.vue +96 -0
  363. calliope_studio-0.1.0/web/src/components/editor/EntryAccordionRow.vue +57 -0
  364. calliope_studio-0.1.0/web/src/components/editor/FileViewer.vue +75 -0
  365. calliope_studio-0.1.0/web/src/components/editor/LinkFields.vue +159 -0
  366. calliope_studio-0.1.0/web/src/components/editor/LinksEditor.vue +497 -0
  367. calliope_studio-0.1.0/web/src/components/editor/MarkdownView.vue +75 -0
  368. calliope_studio-0.1.0/web/src/components/editor/MonacoYamlEditor.vue +309 -0
  369. calliope_studio-0.1.0/web/src/components/editor/NewFileDialog.vue +176 -0
  370. calliope_studio-0.1.0/web/src/components/editor/NodeFields.vue +219 -0
  371. calliope_studio-0.1.0/web/src/components/editor/NodesEditor.vue +347 -0
  372. calliope_studio-0.1.0/web/src/components/editor/OverridesEditor.vue +271 -0
  373. calliope_studio-0.1.0/web/src/components/editor/ParamRows.vue +144 -0
  374. calliope_studio-0.1.0/web/src/components/editor/ScalarOrDataVar.vue +159 -0
  375. calliope_studio-0.1.0/web/src/components/editor/ScenariosEditor.vue +240 -0
  376. calliope_studio-0.1.0/web/src/components/editor/SchemaKindPicker.vue +93 -0
  377. calliope_studio-0.1.0/web/src/components/editor/SchemaObjectEditor.vue +460 -0
  378. calliope_studio-0.1.0/web/src/components/editor/TechsEditor.vue +283 -0
  379. calliope_studio-0.1.0/web/src/components/layout/ImportGraphDialog.vue +241 -0
  380. calliope_studio-0.1.0/web/src/components/layout/LogoMark.vue +41 -0
  381. calliope_studio-0.1.0/web/src/components/layout/ThemeToggle.vue +43 -0
  382. calliope_studio-0.1.0/web/src/components/map/MapLegend.vue +135 -0
  383. calliope_studio-0.1.0/web/src/components/map/ModelMap.vue +902 -0
  384. calliope_studio-0.1.0/web/src/components/math/MathComponentRow.vue +71 -0
  385. calliope_studio-0.1.0/web/src/components/math/MathFilesPanel.vue +263 -0
  386. calliope_studio-0.1.0/web/src/components/math/MathTabView.vue +455 -0
  387. calliope_studio-0.1.0/web/src/components/results/FigurePanel.vue +109 -0
  388. calliope_studio-0.1.0/web/src/components/results/MapFigure.vue +248 -0
  389. calliope_studio-0.1.0/web/src/components/results/ResultChart.vue +397 -0
  390. calliope_studio-0.1.0/web/src/components/results/ResultsLayoutBar.vue +95 -0
  391. calliope_studio-0.1.0/web/src/components/results/TimeseriesFigure.vue +188 -0
  392. calliope_studio-0.1.0/web/src/components/results/TotalsFigure.vue +139 -0
  393. calliope_studio-0.1.0/web/src/components/runs/RunConfigPanel.vue +268 -0
  394. calliope_studio-0.1.0/web/src/components/runs/RunFilterPanel.vue +137 -0
  395. calliope_studio-0.1.0/web/src/components/runs/RunListItem.vue +234 -0
  396. calliope_studio-0.1.0/web/src/components/runs/RunLogPanel.vue +197 -0
  397. calliope_studio-0.1.0/web/src/components/runs/RunProgress.vue +91 -0
  398. calliope_studio-0.1.0/web/src/components/runs/RunResultsPanel.vue +232 -0
  399. calliope_studio-0.1.0/web/src/components/runs/RunRoundingPanel.vue +111 -0
  400. calliope_studio-0.1.0/web/src/components/runs/RunStatusPill.vue +69 -0
  401. calliope_studio-0.1.0/web/src/components/runs/RunTabView.vue +178 -0
  402. calliope_studio-0.1.0/web/src/components/runs/RunTablePanel.vue +264 -0
  403. calliope_studio-0.1.0/web/src/components/runs/RunUnitsPanel.vue +119 -0
  404. calliope_studio-0.1.0/web/src/components/sections/FilesSection.vue +189 -0
  405. calliope_studio-0.1.0/web/src/components/sections/ModelSection.vue +313 -0
  406. calliope_studio-0.1.0/web/src/components/sections/RunsSection.vue +336 -0
  407. calliope_studio-0.1.0/web/src/components/shell/AppShell.vue +125 -0
  408. calliope_studio-0.1.0/web/src/components/shell/AppSidebar.vue +53 -0
  409. calliope_studio-0.1.0/web/src/components/shell/ProjectSwitcher.vue +131 -0
  410. calliope_studio-0.1.0/web/src/components/shell/SidebarNav.vue +114 -0
  411. calliope_studio-0.1.0/web/src/components/shell/StructuredEditorHost.vue +91 -0
  412. calliope_studio-0.1.0/web/src/components/shell/TabBar.vue +313 -0
  413. calliope_studio-0.1.0/web/src/components/shell/TabBody.vue +179 -0
  414. calliope_studio-0.1.0/web/src/components/shell/TabHistory.vue +42 -0
  415. calliope_studio-0.1.0/web/src/components/ui/accordion/Accordion.vue +18 -0
  416. calliope_studio-0.1.0/web/src/components/ui/accordion/AccordionContent.vue +23 -0
  417. calliope_studio-0.1.0/web/src/components/ui/accordion/AccordionItem.vue +24 -0
  418. calliope_studio-0.1.0/web/src/components/ui/accordion/AccordionTrigger.vue +37 -0
  419. calliope_studio-0.1.0/web/src/components/ui/accordion/index.ts +4 -0
  420. calliope_studio-0.1.0/web/src/components/ui/badge/Badge.vue +26 -0
  421. calliope_studio-0.1.0/web/src/components/ui/badge/index.ts +27 -0
  422. calliope_studio-0.1.0/web/src/components/ui/button/Button.vue +31 -0
  423. calliope_studio-0.1.0/web/src/components/ui/button/index.ts +68 -0
  424. calliope_studio-0.1.0/web/src/components/ui/checkbox/Checkbox.vue +37 -0
  425. calliope_studio-0.1.0/web/src/components/ui/checkbox/index.ts +1 -0
  426. calliope_studio-0.1.0/web/src/components/ui/command/Command.vue +88 -0
  427. calliope_studio-0.1.0/web/src/components/ui/command/CommandDialog.vue +31 -0
  428. calliope_studio-0.1.0/web/src/components/ui/command/CommandEmpty.vue +27 -0
  429. calliope_studio-0.1.0/web/src/components/ui/command/CommandGroup.vue +45 -0
  430. calliope_studio-0.1.0/web/src/components/ui/command/CommandInput.vue +39 -0
  431. calliope_studio-0.1.0/web/src/components/ui/command/CommandItem.vue +76 -0
  432. calliope_studio-0.1.0/web/src/components/ui/command/CommandList.vue +25 -0
  433. calliope_studio-0.1.0/web/src/components/ui/command/CommandSeparator.vue +21 -0
  434. calliope_studio-0.1.0/web/src/components/ui/command/CommandShortcut.vue +17 -0
  435. calliope_studio-0.1.0/web/src/components/ui/command/index.ts +25 -0
  436. calliope_studio-0.1.0/web/src/components/ui/dialog/Dialog.vue +19 -0
  437. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogClose.vue +15 -0
  438. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogContent.vue +53 -0
  439. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogDescription.vue +23 -0
  440. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogFooter.vue +27 -0
  441. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogHeader.vue +17 -0
  442. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogOverlay.vue +21 -0
  443. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogScrollContent.vue +59 -0
  444. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogTitle.vue +23 -0
  445. calliope_studio-0.1.0/web/src/components/ui/dialog/DialogTrigger.vue +15 -0
  446. calliope_studio-0.1.0/web/src/components/ui/dialog/index.ts +10 -0
  447. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  448. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +39 -0
  449. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuContent.vue +39 -0
  450. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +15 -0
  451. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuItem.vue +31 -0
  452. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  453. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  454. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  455. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  456. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  457. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuSub.vue +18 -0
  458. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  459. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  460. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  461. calliope_studio-0.1.0/web/src/components/ui/dropdown-menu/index.ts +16 -0
  462. calliope_studio-0.1.0/web/src/components/ui/multi-select/MultiSelect.test.ts +122 -0
  463. calliope_studio-0.1.0/web/src/components/ui/multi-select/MultiSelect.vue +226 -0
  464. calliope_studio-0.1.0/web/src/components/ui/multi-select/index.ts +1 -0
  465. calliope_studio-0.1.0/web/src/components/ui/popover/Popover.vue +19 -0
  466. calliope_studio-0.1.0/web/src/components/ui/popover/PopoverAnchor.vue +15 -0
  467. calliope_studio-0.1.0/web/src/components/ui/popover/PopoverContent.vue +45 -0
  468. calliope_studio-0.1.0/web/src/components/ui/popover/PopoverTrigger.vue +15 -0
  469. calliope_studio-0.1.0/web/src/components/ui/popover/index.ts +4 -0
  470. calliope_studio-0.1.0/web/src/components/ui/resizable/ResizableHandle.vue +30 -0
  471. calliope_studio-0.1.0/web/src/components/ui/resizable/ResizablePanel.vue +21 -0
  472. calliope_studio-0.1.0/web/src/components/ui/resizable/ResizablePanelGroup.vue +25 -0
  473. calliope_studio-0.1.0/web/src/components/ui/resizable/index.ts +3 -0
  474. calliope_studio-0.1.0/web/src/components/ui/select/Select.vue +19 -0
  475. calliope_studio-0.1.0/web/src/components/ui/select/SelectContent.vue +51 -0
  476. calliope_studio-0.1.0/web/src/components/ui/select/SelectGroup.vue +15 -0
  477. calliope_studio-0.1.0/web/src/components/ui/select/SelectItem.vue +45 -0
  478. calliope_studio-0.1.0/web/src/components/ui/select/SelectItemText.vue +15 -0
  479. calliope_studio-0.1.0/web/src/components/ui/select/SelectLabel.vue +17 -0
  480. calliope_studio-0.1.0/web/src/components/ui/select/SelectScrollDownButton.vue +26 -0
  481. calliope_studio-0.1.0/web/src/components/ui/select/SelectScrollUpButton.vue +26 -0
  482. calliope_studio-0.1.0/web/src/components/ui/select/SelectSeparator.vue +19 -0
  483. calliope_studio-0.1.0/web/src/components/ui/select/SelectTrigger.vue +34 -0
  484. calliope_studio-0.1.0/web/src/components/ui/select/SelectValue.vue +15 -0
  485. calliope_studio-0.1.0/web/src/components/ui/select/index.ts +11 -0
  486. calliope_studio-0.1.0/web/src/components/ui/switch/Switch.vue +38 -0
  487. calliope_studio-0.1.0/web/src/components/ui/switch/index.ts +1 -0
  488. calliope_studio-0.1.0/web/src/components/ui/toggle/Toggle.vue +35 -0
  489. calliope_studio-0.1.0/web/src/components/ui/toggle/index.ts +35 -0
  490. calliope_studio-0.1.0/web/src/components/ui/toggle-group/ToggleGroup.vue +49 -0
  491. calliope_studio-0.1.0/web/src/components/ui/toggle-group/ToggleGroupItem.vue +46 -0
  492. calliope_studio-0.1.0/web/src/components/ui/toggle-group/index.ts +2 -0
  493. calliope_studio-0.1.0/web/src/components/ui/tooltip/Tooltip.vue +19 -0
  494. calliope_studio-0.1.0/web/src/components/ui/tooltip/TooltipContent.vue +45 -0
  495. calliope_studio-0.1.0/web/src/components/ui/tooltip/TooltipProvider.vue +14 -0
  496. calliope_studio-0.1.0/web/src/components/ui/tooltip/TooltipTrigger.vue +15 -0
  497. calliope_studio-0.1.0/web/src/components/ui/tooltip/index.ts +4 -0
  498. calliope_studio-0.1.0/web/src/components/ui/tree/Tree.test.ts +134 -0
  499. calliope_studio-0.1.0/web/src/components/ui/tree/Tree.vue +110 -0
  500. calliope_studio-0.1.0/web/src/components/ui/tree/index.ts +1 -0
  501. calliope_studio-0.1.0/web/src/components/validation/ValidationTabView.vue +168 -0
  502. calliope_studio-0.1.0/web/src/components/workspace/FolderBrowser.vue +118 -0
  503. calliope_studio-0.1.0/web/src/components/workspace/ModelDialogs.vue +61 -0
  504. calliope_studio-0.1.0/web/src/components/workspace/NewModelDialog.vue +183 -0
  505. calliope_studio-0.1.0/web/src/components/workspace/OpenModelDialog.vue +113 -0
  506. calliope_studio-0.1.0/web/src/components/workspace/browse.ts +24 -0
  507. calliope_studio-0.1.0/web/src/composables/useCsvGrid.test.ts +146 -0
  508. calliope_studio-0.1.0/web/src/composables/useCsvGrid.ts +145 -0
  509. calliope_studio-0.1.0/web/src/composables/useFigurePanels.ts +651 -0
  510. calliope_studio-0.1.0/web/src/composables/useModelGeo.ts +83 -0
  511. calliope_studio-0.1.0/web/src/composables/useResultFrame.ts +86 -0
  512. calliope_studio-0.1.0/web/src/composables/useSectionEditor.ts +194 -0
  513. calliope_studio-0.1.0/web/src/composables/useTreeSearch.ts +80 -0
  514. calliope_studio-0.1.0/web/src/editor/monacoTheme.ts +88 -0
  515. calliope_studio-0.1.0/web/src/lib/agTheme.ts +70 -0
  516. calliope_studio-0.1.0/web/src/lib/basemap.ts +332 -0
  517. calliope_studio-0.1.0/web/src/lib/calliopeSchema.test.ts +137 -0
  518. calliope_studio-0.1.0/web/src/lib/calliopeSchema.ts +149 -0
  519. calliope_studio-0.1.0/web/src/lib/chartControls.ts +57 -0
  520. calliope_studio-0.1.0/web/src/lib/cssColor.test.ts +89 -0
  521. calliope_studio-0.1.0/web/src/lib/cssColor.ts +182 -0
  522. calliope_studio-0.1.0/web/src/lib/dataTableParams.test.ts +102 -0
  523. calliope_studio-0.1.0/web/src/lib/dataTableParams.ts +56 -0
  524. calliope_studio-0.1.0/web/src/lib/design.test.ts +502 -0
  525. calliope_studio-0.1.0/web/src/lib/download.test.ts +112 -0
  526. calliope_studio-0.1.0/web/src/lib/download.ts +100 -0
  527. calliope_studio-0.1.0/web/src/lib/entries.test.ts +184 -0
  528. calliope_studio-0.1.0/web/src/lib/entries.ts +223 -0
  529. calliope_studio-0.1.0/web/src/lib/fileKind.test.ts +61 -0
  530. calliope_studio-0.1.0/web/src/lib/fileKind.ts +113 -0
  531. calliope_studio-0.1.0/web/src/lib/fileTree.test.ts +118 -0
  532. calliope_studio-0.1.0/web/src/lib/fileTree.ts +120 -0
  533. calliope_studio-0.1.0/web/src/lib/formClasses.ts +265 -0
  534. calliope_studio-0.1.0/web/src/lib/format.test.ts +138 -0
  535. calliope_studio-0.1.0/web/src/lib/format.ts +147 -0
  536. calliope_studio-0.1.0/web/src/lib/frameCsv.test.ts +273 -0
  537. calliope_studio-0.1.0/web/src/lib/frameCsv.ts +171 -0
  538. calliope_studio-0.1.0/web/src/lib/frameExport.ts +49 -0
  539. calliope_studio-0.1.0/web/src/lib/frameIndex.test.ts +103 -0
  540. calliope_studio-0.1.0/web/src/lib/frameIndex.ts +93 -0
  541. calliope_studio-0.1.0/web/src/lib/icons.ts +70 -0
  542. calliope_studio-0.1.0/web/src/lib/inherited.test.ts +171 -0
  543. calliope_studio-0.1.0/web/src/lib/inherited.ts +147 -0
  544. calliope_studio-0.1.0/web/src/lib/mapGeo.test.ts +189 -0
  545. calliope_studio-0.1.0/web/src/lib/mapGeo.ts +230 -0
  546. calliope_studio-0.1.0/web/src/lib/mapValues.test.ts +116 -0
  547. calliope_studio-0.1.0/web/src/lib/mapValues.ts +101 -0
  548. calliope_studio-0.1.0/web/src/lib/markdown.test.ts +98 -0
  549. calliope_studio-0.1.0/web/src/lib/markdown.ts +99 -0
  550. calliope_studio-0.1.0/web/src/lib/mathRender.test.ts +129 -0
  551. calliope_studio-0.1.0/web/src/lib/mathRender.ts +92 -0
  552. calliope_studio-0.1.0/web/src/lib/modelPaths.test.ts +73 -0
  553. calliope_studio-0.1.0/web/src/lib/modelPaths.ts +66 -0
  554. calliope_studio-0.1.0/web/src/lib/modelTree.test.ts +157 -0
  555. calliope_studio-0.1.0/web/src/lib/modelTree.ts +136 -0
  556. calliope_studio-0.1.0/web/src/lib/monacoBuffer.ts +41 -0
  557. calliope_studio-0.1.0/web/src/lib/navHistory.test.ts +144 -0
  558. calliope_studio-0.1.0/web/src/lib/navHistory.ts +127 -0
  559. calliope_studio-0.1.0/web/src/lib/openIntent.ts +23 -0
  560. calliope_studio-0.1.0/web/src/lib/pieMarker.test.ts +94 -0
  561. calliope_studio-0.1.0/web/src/lib/pieMarker.ts +163 -0
  562. calliope_studio-0.1.0/web/src/lib/precision.test.ts +117 -0
  563. calliope_studio-0.1.0/web/src/lib/precision.ts +99 -0
  564. calliope_studio-0.1.0/web/src/lib/resultsLayouts.test.ts +156 -0
  565. calliope_studio-0.1.0/web/src/lib/resultsLayouts.ts +229 -0
  566. calliope_studio-0.1.0/web/src/lib/seriesColors.ts +31 -0
  567. calliope_studio-0.1.0/web/src/lib/seriesLabel.test.ts +50 -0
  568. calliope_studio-0.1.0/web/src/lib/seriesLabel.ts +41 -0
  569. calliope_studio-0.1.0/web/src/lib/sourceTargets.test.ts +90 -0
  570. calliope_studio-0.1.0/web/src/lib/sourceTargets.ts +52 -0
  571. calliope_studio-0.1.0/web/src/lib/storageKeys.test.ts +75 -0
  572. calliope_studio-0.1.0/web/src/lib/storageKeys.ts +51 -0
  573. calliope_studio-0.1.0/web/src/lib/tabId.test.ts +120 -0
  574. calliope_studio-0.1.0/web/src/lib/tabId.ts +139 -0
  575. calliope_studio-0.1.0/web/src/lib/tableRows.test.ts +126 -0
  576. calliope_studio-0.1.0/web/src/lib/tableRows.ts +93 -0
  577. calliope_studio-0.1.0/web/src/lib/techs.test.ts +108 -0
  578. calliope_studio-0.1.0/web/src/lib/techs.ts +63 -0
  579. calliope_studio-0.1.0/web/src/lib/tokens.test.ts +155 -0
  580. calliope_studio-0.1.0/web/src/lib/treeFilter.test.ts +178 -0
  581. calliope_studio-0.1.0/web/src/lib/treeFilter.ts +109 -0
  582. calliope_studio-0.1.0/web/src/lib/units.test.ts +303 -0
  583. calliope_studio-0.1.0/web/src/lib/units.ts +327 -0
  584. calliope_studio-0.1.0/web/src/lib/utils.ts +13 -0
  585. calliope_studio-0.1.0/web/src/main.ts +19 -0
  586. calliope_studio-0.1.0/web/src/monacoSetup.test.ts +102 -0
  587. calliope_studio-0.1.0/web/src/monacoSetup.ts +184 -0
  588. calliope_studio-0.1.0/web/src/router/index.ts +127 -0
  589. calliope_studio-0.1.0/web/src/stores/componentTree.ts +38 -0
  590. calliope_studio-0.1.0/web/src/stores/confirm.ts +51 -0
  591. calliope_studio-0.1.0/web/src/stores/explorer.test.ts +59 -0
  592. calliope_studio-0.1.0/web/src/stores/explorer.ts +67 -0
  593. calliope_studio-0.1.0/web/src/stores/math.ts +351 -0
  594. calliope_studio-0.1.0/web/src/stores/project.ts +66 -0
  595. calliope_studio-0.1.0/web/src/stores/rounding.test.ts +137 -0
  596. calliope_studio-0.1.0/web/src/stores/rounding.ts +135 -0
  597. calliope_studio-0.1.0/web/src/stores/runSelection.test.ts +922 -0
  598. calliope_studio-0.1.0/web/src/stores/runSelection.ts +791 -0
  599. calliope_studio-0.1.0/web/src/stores/runs.test.ts +503 -0
  600. calliope_studio-0.1.0/web/src/stores/runs.ts +532 -0
  601. calliope_studio-0.1.0/web/src/stores/schema.test.ts +122 -0
  602. calliope_studio-0.1.0/web/src/stores/schema.ts +94 -0
  603. calliope_studio-0.1.0/web/src/stores/schemaKinds.ts +130 -0
  604. calliope_studio-0.1.0/web/src/stores/sectionData.ts +54 -0
  605. calliope_studio-0.1.0/web/src/stores/tabs.test.ts +721 -0
  606. calliope_studio-0.1.0/web/src/stores/tabs.ts +898 -0
  607. calliope_studio-0.1.0/web/src/stores/templates.ts +41 -0
  608. calliope_studio-0.1.0/web/src/stores/ui.test.ts +377 -0
  609. calliope_studio-0.1.0/web/src/stores/ui.ts +416 -0
  610. calliope_studio-0.1.0/web/src/stores/units.test.ts +110 -0
  611. calliope_studio-0.1.0/web/src/stores/units.ts +107 -0
  612. calliope_studio-0.1.0/web/src/stores/validation.ts +177 -0
  613. calliope_studio-0.1.0/web/src/stores/version.ts +65 -0
  614. calliope_studio-0.1.0/web/src/style.css +332 -0
  615. calliope_studio-0.1.0/web/src/test-setup.ts +55 -0
  616. calliope_studio-0.1.0/web/src/test-stubs/browserOnly.ts +16 -0
  617. calliope_studio-0.1.0/web/src/views/OpenProjectView.vue +48 -0
  618. calliope_studio-0.1.0/web/src/views/OpenResultsView.vue +95 -0
  619. calliope_studio-0.1.0/web/src/views/ProjectListView.vue +173 -0
  620. calliope_studio-0.1.0/web/src/vite-env.d.ts +7 -0
  621. calliope_studio-0.1.0/web/tsconfig.json +34 -0
  622. calliope_studio-0.1.0/web/tsconfig.node.json +13 -0
  623. calliope_studio-0.1.0/web/vite.config.ts +64 -0
@@ -0,0 +1,21 @@
1
+ # Line endings are LF in the repository and LF in the working tree, on every
2
+ # platform. Without this, a Windows checkout with git's default `core.autocrlf`
3
+ # hands CRLF to the YAML and CSV fixtures — and the round-trip tests assert that
4
+ # a rewrite preserves comments and line count, while `save-check` asserts that a
5
+ # no-op save changes nothing at all. Both would be measuring git's translation
6
+ # rather than this project's, and the CSVs are read by pandas besides.
7
+ #
8
+ # `eol=lf` rather than bare `text=auto`, which normalises on commit but still
9
+ # lets the working tree be CRLF.
10
+ * text=auto eol=lf
11
+
12
+ # Binary, so git neither translates nor tries to merge them.
13
+ *.nc binary
14
+ *.ico binary
15
+ *.icns binary
16
+ *.png binary
17
+ *.woff binary
18
+ *.woff2 binary
19
+ *.ttf binary
20
+
21
+ pixi.lock linguist-generated=true merge=binary
@@ -0,0 +1,63 @@
1
+ version: 2
2
+
3
+ # Nothing surfaced dependency advisories before this: there was no audit step,
4
+ # no update automation, and nine open advisories in the frontend tree that the
5
+ # pnpm migration was the first thing to notice.
6
+ #
7
+ # Grouped, because ungrouped updates across three ecosystems open a PR per
8
+ # package and the review then never happens. Note that pixi.lock is *not*
9
+ # covered by any of this — conda dependencies stay a manual job.
10
+ updates:
11
+ # Dependabot reads pnpm-lock.yaml under the "npm" ecosystem.
12
+ - package-ecosystem: npm
13
+ directory: /web
14
+ schedule:
15
+ interval: weekly
16
+ open-pull-requests-limit: 5
17
+ groups:
18
+ minor-and-patch:
19
+ update-types: [minor, patch]
20
+ # Majors are grouped for the same reason the others are, learned the hard
21
+ # way: left ungrouped they arrive one PR per package, and five of them —
22
+ # typescript, maplibre-gl, echarts, apache-arrow, vitest — filled
23
+ # `open-pull-requests-limit` exactly, which then blocked the
24
+ # minor-and-patch PR from opening at all. The group carrying routine
25
+ # updates was starved by the group nobody merges in a hurry. (Security
26
+ # updates have their own separate limit and were never at risk.)
27
+ major:
28
+ update-types: [major]
29
+ ignore:
30
+ # Pinned deliberately: 0.53 changed how a worker hands its foreign module
31
+ # to the main thread, monaco-yaml still speaks the older protocol, and
32
+ # under 0.55 the YAML language worker answered nothing at all. Lifting
33
+ # the pin is a decision `pixi run -- pnpm --dir web run monaco-check`
34
+ # makes, not one a bot should.
35
+ - dependency-name: monaco-editor
36
+ update-types:
37
+ - "version-update:semver-minor"
38
+ - "version-update:semver-major"
39
+ # TypeScript 7 is the Go compiler, and vue-tsc cannot run on it: Volar
40
+ # embeds TypeScript's classic programmatic API, which 7.0 ships without a
41
+ # stable replacement for — that is 7.1's headline, expected around
42
+ # October 2026. `pixi run web-typecheck` *is* vue-tsc, so a bump here is
43
+ # not a config nit but a dead type check: it fails in vue-tsc's own
44
+ # entry point with ERR_PACKAGE_PATH_NOT_EXPORTED. Lift the pin when
45
+ # vue-tsc declares support, not when 7.x merely installs.
46
+ - dependency-name: typescript
47
+ update-types:
48
+ - "version-update:semver-major"
49
+
50
+ # This is what keeps the SHA-pinned actions in ci.yml current. Without it,
51
+ # pinning by SHA means pinning to whatever was true the day it was written.
52
+ - package-ecosystem: github-actions
53
+ directory: /
54
+ schedule:
55
+ interval: weekly
56
+ groups:
57
+ actions:
58
+ patterns: ["*"]
59
+
60
+ - package-ecosystem: pip
61
+ directory: /
62
+ schedule:
63
+ interval: monthly
@@ -0,0 +1,437 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ # Nothing in this workflow writes back to the repository, so the default
9
+ # token scope is more than any job needs. Dependabot keeps the SHA pins below
10
+ # current; pinning by tag would let a retagged action ship new code silently.
11
+ permissions:
12
+ contents: read
13
+
14
+ concurrency:
15
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
16
+ cancel-in-progress: true
17
+
18
+ jobs:
19
+ python:
20
+ name: Python
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
24
+ with:
25
+ # setuptools-scm derives the version from tags.
26
+ fetch-depth: 0
27
+ - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1
28
+ with:
29
+ cache: true
30
+ - name: Lint
31
+ run: pixi run lint
32
+ - name: Check formatting
33
+ run: pixi run format-check
34
+ # The sample .nc files are gitignored, and the numerical comparison
35
+ # against v0.2.0 skips without them — which meant the only evidence the
36
+ # results layer is correct never ran here. Solving Calliope's own two
37
+ # templates takes a minute and removes the skip.
38
+ - name: Solve the example models
39
+ run: pixi run solve-examples
40
+ - name: Test
41
+ run: pixi run test-cov
42
+
43
+ # `fail_ci_if_error` stays false, which is the action's own default and
44
+ # deliberate here: `secrets.CODECOV_TOKEN` is not readable by a
45
+ # Dependabot-triggered run unless the same value is also stored under the
46
+ # repository's *Dependabot* secrets, so a strict upload would turn every
47
+ # dependency PR red over something that is not a test failure. A Codecov
48
+ # outage should not gate a merge either.
49
+ - name: Upload coverage
50
+ uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
51
+ with:
52
+ files: coverage.xml
53
+ flags: python
54
+ # The report names exactly one file, so searching the tree for others
55
+ # can only find something unintended.
56
+ disable_search: true
57
+ token: ${{ secrets.CODECOV_TOKEN }}
58
+ fail_ci_if_error: false
59
+
60
+ web:
61
+ name: Frontend
62
+ runs-on: ubuntu-latest
63
+ steps:
64
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
65
+ # Node and pnpm both come from pixi, so their versions are pinned in
66
+ # pixi.lock alongside everything else rather than drifting against it.
67
+ # Every step below is a pixi task, which is why there is no
68
+ # `working-directory` here: the tasks carry their own `cwd = "web"`.
69
+ - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1
70
+ with:
71
+ cache: true
72
+ - name: Install
73
+ run: pixi run web-install
74
+ - name: Lint
75
+ run: pixi run web-lint
76
+ - name: Type check
77
+ run: pixi run web-typecheck
78
+ - name: Audit
79
+ run: pixi run web-audit
80
+ - name: Test
81
+ run: pixi run -- pnpm --dir web run test:coverage
82
+
83
+ # vitest writes lcov paths relative to `web/`, so the report says
84
+ # `src/App.vue` where the repository says `web/src/App.vue`. Codecov
85
+ # resolves that by matching the report path against its file network, and
86
+ # `network_filter` is what makes the match unambiguous: without it the
87
+ # network also holds the Python `src/`, and the two trees are one bad
88
+ # guess apart. See the `python` job above for `fail_ci_if_error`.
89
+ - name: Upload coverage
90
+ uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
91
+ with:
92
+ files: web/coverage/lcov.info
93
+ flags: web
94
+ network_filter: web/
95
+ disable_search: true
96
+ token: ${{ secrets.CODECOV_TOKEN }}
97
+ fail_ci_if_error: false
98
+
99
+ - name: Build
100
+ run: pixi run web-build
101
+
102
+ windows:
103
+ name: Windows
104
+ runs-on: windows-latest
105
+ steps:
106
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
107
+ with:
108
+ fetch-depth: 0
109
+ - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1
110
+ with:
111
+ cache: true
112
+
113
+ # Windows is where this project's platform-specific code lives, and until
114
+ # this job existed none of it had run: the job-object process group, the
115
+ # native stdio capture, the `os.replace` retry, and every relative path
116
+ # that reaches the API or `snapshot.json`. Real solves included — pixi
117
+ # brings coin-or-cbc here as it does everywhere else.
118
+ #
119
+ # The exclusions below are a *deny* list on purpose. A new test file runs
120
+ # here by default and has to be excluded deliberately, because a forgotten
121
+ # exclusion costs a little CPU while a forgotten inclusion costs coverage
122
+ # on the platform least likely to be tried by hand. Each name below has no
123
+ # platform surface at all — YAML and math semantics, source scanning, log
124
+ # parsing, and numerics against the frozen v0.2.0 implementation. They are
125
+ # fully covered by the Linux job.
126
+ #
127
+ # Skipping `test_oracle.py` is also what lets this job skip
128
+ # `solve-examples`: it is the only selection that needs the sample `.nc`
129
+ # files. Reading them is pure xarray, and `test_results.py` still solves a
130
+ # model here and reads the result back.
131
+ - name: Test
132
+ run: >
133
+ pixi run test
134
+ --ignore=tests/test_entities.py
135
+ --ignore=tests/test_layering.py
136
+ --ignore=tests/test_math_render.py
137
+ --ignore=tests/test_mathcache.py
138
+ --ignore=tests/test_mathdef.py
139
+ --ignore=tests/test_modeldef_geo.py
140
+ --ignore=tests/test_oracle.py
141
+ --ignore=tests/test_overrides.py
142
+ --ignore=tests/test_resolution_parity.py
143
+ --ignore=tests/test_results_api.py
144
+ --ignore=tests/test_run_stages.py
145
+
146
+ browser:
147
+ name: Browser
148
+ runs-on: ubuntu-latest
149
+ steps:
150
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
151
+ with:
152
+ fetch-depth: 0
153
+ - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1
154
+ with:
155
+ cache: true
156
+
157
+ - name: Install the frontend and build it into the package
158
+ run: pixi run web-build
159
+
160
+ - name: Install Chromium
161
+ # The scripts use playwright-core, which ships no browsers. Matching the
162
+ # installer's version to playwright-core's is what makes
163
+ # `chromium.executablePath()` resolve to the one it just downloaded.
164
+ run: |
165
+ version=$(pixi run -- pnpm --dir web exec node -p "require('playwright-core/package.json').version")
166
+ pixi run -- pnpm --dir web dlx playwright@$version install --with-deps chromium
167
+ echo "CHROMIUM=$(pixi run -- pnpm --dir web exec node -e "console.log(require('playwright-core').chromium.executablePath())")" >> "$GITHUB_ENV"
168
+
169
+ - name: Scaffold a model to drive
170
+ run: pixi run example
171
+
172
+ # `http-get://`, not `http://`. wait-on's `http://` scheme issues a
173
+ # **HEAD**, and `/api/health` answers GET only: Starlette's `Route` adds
174
+ # HEAD wherever GET is present, and FastAPI's `APIRoute` does not. So the
175
+ # endpoint returned 405 to every probe and wait-on burned its full 120s,
176
+ # which is why this step had never passed in any recorded run.
177
+ #
178
+ # The server was never at fault, which took capturing its output to
179
+ # establish — it had been discarded. That capture stays: a `wait-on`
180
+ # timeout with no other evidence is exactly what cost three runs.
181
+ - name: Start the server on it
182
+ run: |
183
+ pixi run calliope-studio --no-browser --port 8791 example-model \
184
+ > server.log 2>&1 &
185
+ echo $! > server.pid
186
+ if ! pixi run -- pnpm dlx wait-on -t 120000 http-get://127.0.0.1:8791/api/health
187
+ then
188
+ echo "::group::server.log"
189
+ cat server.log || echo "(no server.log)"
190
+ echo "::endgroup::"
191
+ echo "::group::is the process alive?"
192
+ ps -p "$(cat server.pid)" -o pid,stat,etime,cmd || echo "(gone)"
193
+ echo "::endgroup::"
194
+ echo "::group::is anything listening on 8791?"
195
+ ss -ltnp 2>/dev/null | grep 8791 || echo "(nothing listening)"
196
+ echo "::endgroup::"
197
+ echo "::group::what does the endpoint say?"
198
+ curl -sv -m 10 http://127.0.0.1:8791/api/health 2>&1 | tail -30 \
199
+ || echo "(curl failed)"
200
+ echo "::endgroup::"
201
+ exit 1
202
+ fi
203
+
204
+ # The design tokens, and every renderer that reads them outside the DOM.
205
+ # Every check below records a marker instead of aborting the job, and the
206
+ # gate at the end fails if any exist. These are the only coverage of a
207
+ # dozen behaviours that nothing else tests, and finding them one push at a
208
+ # time — three minutes each — is not a reasonable way to learn what is
209
+ # already broken.
210
+ #
211
+ # The step re-raises after recording, so it shows as failed rather than
212
+ # green; `continue-on-error` is what carries the job on to the remaining
213
+ # checks; and the marker is what the gate reads at the end. All three, and
214
+ # the first is easy to lose: a bare `cmd || touch marker` exits 0, so the
215
+ # step reports success and only the gate knows anything went wrong.
216
+ #
217
+ # They share one server and one model, and some mutate it: a check that
218
+ # dies before its own cleanup can make later ones fail for reasons of its
219
+ # making. Read the first failure as the real one.
220
+ - name: Collect check failures
221
+ run: mkdir -p .check-failed
222
+
223
+ - name: Token check
224
+ continue-on-error: true
225
+ run: pixi run -- pnpm --dir web run token-check http://127.0.0.1:8791 || { touch .check-failed/token-check; exit 1; }
226
+
227
+ # The YAML language worker, which answered nothing at all until the
228
+ # monaco-editor pin. This is what notices if the pin is lifted.
229
+ - name: Monaco check
230
+ continue-on-error: true
231
+ run: pixi run -- pnpm --dir web run monaco-check http://127.0.0.1:8791 || { touch .check-failed/monaco-check; exit 1; }
232
+
233
+ # A no-op save must not change the file, across every structured section.
234
+ - name: Faithful-save check
235
+ continue-on-error: true
236
+ run: pixi run -- pnpm --dir web run save-check http://127.0.0.1:8791 || { touch .check-failed/save-check; exit 1; }
237
+
238
+ # The guard between a user and their unsaved edits. A no-op guard fails
239
+ # silently — no error, no console output, just the edits gone — so the
240
+ # only way to know it still works is to dirty a tab and try to leave.
241
+ - name: Unsaved-changes guard
242
+ continue-on-error: true
243
+ run: pixi run -- pnpm --dir web run confirm-check http://127.0.0.1:8791 || { touch .check-failed/confirm-check; exit 1; }
244
+
245
+ # The explorer filters. A search borrows Reka's expansion model and has to
246
+ # give it back exactly as it was, which nothing but a rendered tree shows:
247
+ # with the two sets confused, collapsing a branch mid-search silently does
248
+ # nothing and clearing the field loses the expansion the user built.
249
+ - name: Tree search
250
+ continue-on-error: true
251
+ run: pixi run -- pnpm --dir web run tree-search http://127.0.0.1:8791 || { touch .check-failed/tree-search; exit 1; }
252
+
253
+ # Every popup lands where a person can see it. A popper with no anchor
254
+ # stays at Reka's off-screen default while the DOM looks entirely healthy,
255
+ # so presence is not the property — position is.
256
+ - name: Popup placement
257
+ continue-on-error: true
258
+ run: pixi run -- pnpm --dir web run menu-check http://127.0.0.1:8791 || { touch .check-failed/menu-check; exit 1; }
259
+
260
+ # The map as an input: it has a size at all, a node drags, a link draws.
261
+ - name: Map editing
262
+ continue-on-error: true
263
+ run: pixi run -- pnpm --dir web run map-edit http://127.0.0.1:8791 || { touch .check-failed/map-edit; exit 1; }
264
+
265
+ # Where an inherited value comes from, and that clicking it goes there. A
266
+ # source that fails to resolve renders as plain text, which is
267
+ # indistinguishable from a deliberate design, and a link to the wrong file
268
+ # opens a file and says nothing — neither is visible without a browser.
269
+ - name: Source links
270
+ continue-on-error: true
271
+ run: pixi run -- pnpm --dir web run source-link http://127.0.0.1:8791 || { touch .check-failed/source-link; exit 1; }
272
+
273
+ # The picker's entries are not clipped, and a model can be created.
274
+ - name: Model picker
275
+ continue-on-error: true
276
+ run: pixi run -- pnpm --dir web run model-picker http://127.0.0.1:8791 || { touch .check-failed/model-picker; exit 1; }
277
+
278
+ # Custom math, end to end: a file is declared, enabled, rendered and read.
279
+ # Both halves are invisible without a browser — KaTeX turns an equation it
280
+ # cannot parse into markup rather than an exception, so a formulation with
281
+ # one missing looks exactly like one without it; and a math file declared
282
+ # but never enabled is read by nobody with Calliope saying nothing at all.
283
+ - name: Custom math
284
+ continue-on-error: true
285
+ run: pixi run -- pnpm --dir web run math-check http://127.0.0.1:8791 || { touch .check-failed/math-check; exit 1; }
286
+
287
+ # Creating a file and a folder, and what a file that is not text shows.
288
+ # A binary used to open in Monaco as a screenful of replacement
289
+ # characters, which Ctrl/Cmd+S then wrote back over the original bytes —
290
+ # so the save keystroke is asserted here, not only the message.
291
+ - name: File actions and viewers
292
+ continue-on-error: true
293
+ run: pixi run -- pnpm --dir web run file-actions http://127.0.0.1:8791 || { touch .check-failed/file-actions; exit 1; }
294
+
295
+ # Reordering tabs by dragging them. The order is applied mid-drag, so the
296
+ # element under the pointer is re-parented while it is being held — which
297
+ # cancels the drag outright if Vue rebuilds the row rather than moving it.
298
+ # And the drag must offer a payload no one else takes: as `text/plain` a
299
+ # tab released over the editor pastes its own id into the user's file,
300
+ # which this check does end to end because it really happened.
301
+ - name: Tab reordering
302
+ continue-on-error: true
303
+ run: pixi run -- pnpm --dir web run tab-drag http://127.0.0.1:8791 || { touch .check-failed/tab-drag; exit 1; }
304
+
305
+ # Really solves, with CBC, and drives the run tab from log to charts.
306
+ - name: Run lifecycle
307
+ continue-on-error: true
308
+ run: pixi run -- pnpm --dir web run run-lifecycle http://127.0.0.1:8791 || { touch .check-failed/run-lifecycle; exit 1; }
309
+
310
+ # The README's pictures, taken but not published — publishing happens on a
311
+ # tag, in its own workflow, and a selector that has moved should be found
312
+ # here rather than in the middle of cutting a release. Nearly free: it
313
+ # reuses the run `run-lifecycle` has just left in the model, so it solves
314
+ # nothing.
315
+ - name: README screenshots
316
+ continue-on-error: true
317
+ run: |
318
+ pixi run -- pnpm --dir web run screenshots http://127.0.0.1:8791 results /tmp/shots \
319
+ && pixi run -- pnpm --dir web run screenshots http://127.0.0.1:8791 editor /tmp/shots \
320
+ || { touch .check-failed/screenshots; exit 1; }
321
+
322
+ # Not on what `run-lifecycle` just produced: smoke-charts asserts that
323
+ # with nothing summed *no* technology colour is painted, and whether that
324
+ # holds is a property of the model. `choose_index` puts techs on the index
325
+ # for urban_scale and nodes on it for national_scale, so that assertion
326
+ # legitimately fails against a national_scale run on working code.
327
+ - name: Results view, on the urban_scale example
328
+ continue-on-error: true
329
+ run: |
330
+ pixi run solve-examples urban_scale
331
+ pixi run calliope-studio --no-browser --port 8792 examples/nc_files/urban_scale.nc &
332
+ pixi run -- pnpm dlx wait-on -t 120000 http-get://127.0.0.1:8792/api/health
333
+ pixi run -- pnpm --dir web run smoke http://127.0.0.1:8792 || { touch .check-failed/smoke; exit 1; }
334
+
335
+ - name: Fail if any browser check failed
336
+ run: |
337
+ if [ -n "$(ls -A .check-failed 2>/dev/null)" ]; then
338
+ echo "::error::browser checks failed: $(ls .check-failed | tr '\n' ' ')"
339
+ exit 1
340
+ fi
341
+ echo "every browser check passed"
342
+
343
+ - name: Keep the screenshots when something fails
344
+ if: failure()
345
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
346
+ with:
347
+ name: browser-screenshots
348
+ path: /tmp/calliope-studio-*.png
349
+ if-no-files-found: ignore
350
+
351
+ # The README's, always — the only way to see what a change did to them
352
+ # without cutting a release to find out.
353
+ - name: Keep the README screenshots
354
+ if: always()
355
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
356
+ with:
357
+ name: readme-screenshots
358
+ path: /tmp/shots/*.png
359
+ if-no-files-found: ignore
360
+
361
+ package:
362
+ name: Package
363
+ runs-on: ubuntu-latest
364
+ steps:
365
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
366
+ with:
367
+ fetch-depth: 0
368
+ - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1
369
+ with:
370
+ cache: true
371
+ - name: Build wheel and check the interface is bundled
372
+ # `python -m build` alone succeeds without the frontend and produces a
373
+ # wheel with no interface, so the check is the point of this job.
374
+ run: pixi run -e build build
375
+
376
+ # Handed to `interpreters` below rather than rebuilt there: that job is
377
+ # about the *artefact* installing, and a wheel built per interpreter would
378
+ # not be the one we ship.
379
+ - name: Keep the artefacts
380
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
381
+ with:
382
+ name: dist
383
+ path: dist/
384
+ retention-days: 1
385
+
386
+ # `pixi run test` covers one interpreter — whichever `pixi.lock` pins — so
387
+ # nothing here used to exercise the rest of the declared `requires-python`
388
+ # range. This installs the built wheel from PyPI-resolved dependencies on each
389
+ # supported version, which is what a user actually does, and is the only place
390
+ # a version-specific resolution failure or C-extension mismatch would show up.
391
+ #
392
+ # Deliberately not pixi: conda-forge resolves a different dependency set, so a
393
+ # pixi environment per interpreter would test the one path this job is not
394
+ # about.
395
+ interpreters:
396
+ name: Python ${{ matrix.python-version }}
397
+ needs: package
398
+ runs-on: ubuntu-latest
399
+ strategy:
400
+ fail-fast: false
401
+ matrix:
402
+ # Must stay equal to `requires-python` in `pyproject.toml`. 3.14 is
403
+ # absent because pandas ships no cp314 wheel before 2.3.3 and Calliope
404
+ # 0.7.0.dev7 caps pandas below that; see the comment there.
405
+ python-version: ["3.12", "3.13"]
406
+ steps:
407
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
408
+ with:
409
+ name: dist
410
+ path: dist/
411
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
412
+ with:
413
+ python-version: ${{ matrix.python-version }}
414
+
415
+ - name: Install the wheel
416
+ # No `--pre`, on purpose: Calliope 0.7 is a pre-release, and this asserts
417
+ # that the `>=0.7.0.dev7` lower bound is enough to resolve it the way the
418
+ # README's install line promises.
419
+ run: pip install dist/*.whl
420
+
421
+ - name: Import the stack
422
+ # An import is what catches a version-specific break — a C extension
423
+ # built for the wrong ABI, or a dependency that resolved but cannot load.
424
+ # `server.app` is included because importing it builds the FastAPI app.
425
+ run: |
426
+ python - <<'EOF'
427
+ import calliope, calliope_studio, netCDF4, numpy, pandas, pyarrow, xarray
428
+ from calliope_studio.server.app import app
429
+ print("studio ", calliope_studio.__version__)
430
+ print("calliope", calliope.__version__)
431
+ print("pandas ", pandas.__version__)
432
+ print("xarray ", xarray.__version__)
433
+ print("routes ", len(app.routes))
434
+ EOF
435
+
436
+ - name: Run the console script
437
+ run: calliope-studio --help