figgyplot 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. figgyplot-0.2.1/.gitattributes +5 -0
  2. figgyplot-0.2.1/.github/ISSUE_TEMPLATE/bug_report.yml +41 -0
  3. figgyplot-0.2.1/.github/ISSUE_TEMPLATE/config.yml +9 -0
  4. figgyplot-0.2.1/.github/ISSUE_TEMPLATE/feature_request.yml +24 -0
  5. figgyplot-0.2.1/.github/codeql-config.yml +5 -0
  6. figgyplot-0.2.1/.github/dependabot.yml +37 -0
  7. figgyplot-0.2.1/.github/pull_request_template.md +18 -0
  8. figgyplot-0.2.1/.github/workflows/codeql.yml +48 -0
  9. figgyplot-0.2.1/.github/workflows/pr-tests.yml +99 -0
  10. figgyplot-0.2.1/.github/workflows/publish.yml +238 -0
  11. figgyplot-0.2.1/.github/workflows/wheels.yml +177 -0
  12. figgyplot-0.2.1/.gitignore +30 -0
  13. figgyplot-0.2.1/CODE_OF_CONDUCT.md +22 -0
  14. figgyplot-0.2.1/CONTRIBUTING.md +65 -0
  15. figgyplot-0.2.1/Cargo.lock +3844 -0
  16. figgyplot-0.2.1/Cargo.toml +30 -0
  17. figgyplot-0.2.1/LICENSE-APACHE +176 -0
  18. figgyplot-0.2.1/LICENSE-MIT +21 -0
  19. figgyplot-0.2.1/PKG-INFO +176 -0
  20. figgyplot-0.2.1/PYPI_README.md +127 -0
  21. figgyplot-0.2.1/README.md +385 -0
  22. figgyplot-0.2.1/SECURITY.md +35 -0
  23. figgyplot-0.2.1/THIRD_PARTY_NOTICES.md +29 -0
  24. figgyplot-0.2.1/benchmarks/FIRST_FRAME_REUSE_RESULTS.md +101 -0
  25. figgyplot-0.2.1/benchmarks/LINUX_GPU_RESULTS.md +172 -0
  26. figgyplot-0.2.1/benchmarks/RESULTS.md +154 -0
  27. figgyplot-0.2.1/benchmarks/WINDOWS_GPU_RESULTS.md +144 -0
  28. figgyplot-0.2.1/benchmarks/WINDOWS_RESULTS.md +140 -0
  29. figgyplot-0.2.1/benchmarks/compare.py +326 -0
  30. figgyplot-0.2.1/benchmarks/first_frame_reuse.py +175 -0
  31. figgyplot-0.2.1/benchmarks/gpu_backends.py +212 -0
  32. figgyplot-0.2.1/benchmarks/plot_results.py +146 -0
  33. figgyplot-0.2.1/benchmarks/results/comparison.rendering.json +77 -0
  34. figgyplot-0.2.1/benchmarks/results/comparison.svg +5 -0
  35. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-environment.json +217 -0
  36. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-first-frame-reuse.json +4655 -0
  37. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-first-frame-reuse.txt +314 -0
  38. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-gpu-comparison.rendering.json +82 -0
  39. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-gpu-comparison.svg +5 -0
  40. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-gpu-line.csv +37 -0
  41. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-gpu-line.json +2318 -0
  42. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-gpu-scatter.csv +13 -0
  43. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-gpu-scatter.json +863 -0
  44. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-heatmap.csv +7 -0
  45. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-heatmap.json +380 -0
  46. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-heatmap.txt +6 -0
  47. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-line.txt +37 -0
  48. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-plot.txt +1 -0
  49. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-scatter.txt +13 -0
  50. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-surface.json +142 -0
  51. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-surface.txt +142 -0
  52. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-tests.txt +8 -0
  53. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-vispy-line.csv +7 -0
  54. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-vispy-line.json +501 -0
  55. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-vispy-scatter.csv +4 -0
  56. figgyplot-0.2.1/benchmarks/results/linux-radeon8060s-vispy-scatter.json +288 -0
  57. figgyplot-0.2.1/benchmarks/results/linux-software-first-frame-reuse.json +2340 -0
  58. figgyplot-0.2.1/benchmarks/results/linux-software-shared-context.json +39 -0
  59. figgyplot-0.2.1/benchmarks/results/linux-software-surface.json +42 -0
  60. figgyplot-0.2.1/benchmarks/results/llvmpipe-heatmap.csv +7 -0
  61. figgyplot-0.2.1/benchmarks/results/llvmpipe-heatmap.json +319 -0
  62. figgyplot-0.2.1/benchmarks/results/llvmpipe-line.csv +25 -0
  63. figgyplot-0.2.1/benchmarks/results/llvmpipe-line.json +1178 -0
  64. figgyplot-0.2.1/benchmarks/results/llvmpipe-scatter.csv +7 -0
  65. figgyplot-0.2.1/benchmarks/results/llvmpipe-scatter.json +345 -0
  66. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-comparison.rendering.json +77 -0
  67. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-comparison.svg +5 -0
  68. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-desktop.json +16 -0
  69. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-gpu-comparison.rendering.json +82 -0
  70. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-gpu-comparison.svg +5 -0
  71. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-gpu-line.csv +37 -0
  72. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-gpu-line.json +2234 -0
  73. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-gpu-scatter.csv +13 -0
  74. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-gpu-scatter.json +815 -0
  75. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-heatmap.csv +7 -0
  76. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-heatmap.json +353 -0
  77. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-line.csv +25 -0
  78. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-line.json +1326 -0
  79. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-scatter.csv +7 -0
  80. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-scatter.json +394 -0
  81. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-tests.txt +9 -0
  82. figgyplot-0.2.1/benchmarks/results/windows-rtx4070ti-vispy-aa-line.json +398 -0
  83. figgyplot-0.2.1/benchmarks/shared_context.py +60 -0
  84. figgyplot-0.2.1/benchmarks/ui_surface.py +26 -0
  85. figgyplot-0.2.1/docs/CHART_TYPES.md +161 -0
  86. figgyplot-0.2.1/docs/DESKTOP_EDITOR.md +205 -0
  87. figgyplot-0.2.1/docs/DISTRIBUTION.md +221 -0
  88. figgyplot-0.2.1/docs/HOSTS.md +191 -0
  89. figgyplot-0.2.1/docs/HOST_VALIDATION.md +382 -0
  90. figgyplot-0.2.1/docs/NATIVE_SHARING.md +88 -0
  91. figgyplot-0.2.1/docs/PREPARATION.md +86 -0
  92. figgyplot-0.2.1/docs/PUBLISHING.md +142 -0
  93. figgyplot-0.2.1/docs/RANDOMIZED_VALIDATION.md +145 -0
  94. figgyplot-0.2.1/docs/README.md +40 -0
  95. figgyplot-0.2.1/docs/README_DEMO.md +83 -0
  96. figgyplot-0.2.1/docs/REPOSITORY_SETUP.md +121 -0
  97. figgyplot-0.2.1/docs/examples/chart_style.py +38 -0
  98. figgyplot-0.2.1/docs/images/desktop-editor-overview.png +0 -0
  99. figgyplot-0.2.1/docs/images/desktop-editor-series.png +0 -0
  100. figgyplot-0.2.1/docs/images/desktop-editor-title.png +0 -0
  101. figgyplot-0.2.1/docs/images/edit-and-reuse.gif +0 -0
  102. figgyplot-0.2.1/docs/images/edit-and-reuse.json +31 -0
  103. figgyplot-0.2.1/docs/images/edit-and-reuse.png +0 -0
  104. figgyplot-0.2.1/docs/images/first-frame-reuse.png +0 -0
  105. figgyplot-0.2.1/docs/images/gallery/constellation-style.png +0 -0
  106. figgyplot-0.2.1/docs/images/gallery/correlation-matrix.png +0 -0
  107. figgyplot-0.2.1/docs/images/gallery/donut-chart.png +0 -0
  108. figgyplot-0.2.1/docs/images/gallery/heatmap-field.png +0 -0
  109. figgyplot-0.2.1/docs/images/gallery/line-markers.png +0 -0
  110. figgyplot-0.2.1/docs/images/gallery/line-signals.png +0 -0
  111. figgyplot-0.2.1/docs/images/gallery/log-scales.png +0 -0
  112. figgyplot-0.2.1/docs/images/gallery/manifest.json +320 -0
  113. figgyplot-0.2.1/docs/images/gallery/material-hatch.png +0 -0
  114. figgyplot-0.2.1/docs/images/gallery/material-paper.png +0 -0
  115. figgyplot-0.2.1/docs/images/gallery/material-pearl.png +0 -0
  116. figgyplot-0.2.1/docs/images/gallery/material-wood.png +0 -0
  117. figgyplot-0.2.1/docs/images/gallery/milkyway-style.png +0 -0
  118. figgyplot-0.2.1/docs/images/gallery/parametric-curves.png +0 -0
  119. figgyplot-0.2.1/docs/images/gallery/pie-chart.png +0 -0
  120. figgyplot-0.2.1/docs/images/gallery/scatter-clusters.png +0 -0
  121. figgyplot-0.2.1/docs/images/gallery/sketch-style.png +0 -0
  122. figgyplot-0.2.1/docs/images/gallery/spectrogram.png +0 -0
  123. figgyplot-0.2.1/docs/images/notebook-webgpu.png +0 -0
  124. figgyplot-0.2.1/examples/README.md +94 -0
  125. figgyplot-0.2.1/examples/_gallery.py +41 -0
  126. figgyplot-0.2.1/examples/constellation_style.py +25 -0
  127. figgyplot-0.2.1/examples/correlation_matrix.py +21 -0
  128. figgyplot-0.2.1/examples/desktop_editor.py +43 -0
  129. figgyplot-0.2.1/examples/donut_chart.py +19 -0
  130. figgyplot-0.2.1/examples/edit_and_reuse.py +80 -0
  131. figgyplot-0.2.1/examples/heatmap_field.py +18 -0
  132. figgyplot-0.2.1/examples/interactive.ipynb +56 -0
  133. figgyplot-0.2.1/examples/line_markers.py +24 -0
  134. figgyplot-0.2.1/examples/line_signals.py +22 -0
  135. figgyplot-0.2.1/examples/log_scales.py +25 -0
  136. figgyplot-0.2.1/examples/material_textures.py +35 -0
  137. figgyplot-0.2.1/examples/milkyway_style.py +25 -0
  138. figgyplot-0.2.1/examples/multiple_windows.py +25 -0
  139. figgyplot-0.2.1/examples/notebook.py +16 -0
  140. figgyplot-0.2.1/examples/parametric_curves.py +23 -0
  141. figgyplot-0.2.1/examples/pie_chart.py +17 -0
  142. figgyplot-0.2.1/examples/quickstart.py +12 -0
  143. figgyplot-0.2.1/examples/scatter_clusters.py +26 -0
  144. figgyplot-0.2.1/examples/sketch_style.py +29 -0
  145. figgyplot-0.2.1/examples/spectrogram.py +25 -0
  146. figgyplot-0.2.1/pyproject.toml +50 -0
  147. figgyplot-0.2.1/python/figgyplot/__init__.py +6 -0
  148. figgyplot-0.2.1/python/figgyplot/_codegen.py +156 -0
  149. figgyplot-0.2.1/python/figgyplot/assets/figgy.d.ts +803 -0
  150. figgyplot-0.2.1/python/figgyplot/assets/figgy.js +3710 -0
  151. figgyplot-0.2.1/python/figgyplot/assets/figgy_bg.wasm +0 -0
  152. figgyplot-0.2.1/python/figgyplot/assets/figgy_bg.wasm.d.ts +149 -0
  153. figgyplot-0.2.1/python/figgyplot/assets/provenance.json +17 -0
  154. figgyplot-0.2.1/python/figgyplot/desktop.py +30 -0
  155. figgyplot-0.2.1/python/figgyplot/editor.css +15 -0
  156. figgyplot-0.2.1/python/figgyplot/editor.js +170 -0
  157. figgyplot-0.2.1/python/figgyplot/editor.py +68 -0
  158. figgyplot-0.2.1/python/figgyplot/figure.py +963 -0
  159. figgyplot-0.2.1/python/figgyplot/licenses/LICENSE-ComicNeue.txt +93 -0
  160. figgyplot-0.2.1/python/figgyplot/licenses/LICENSE-Egui-Hack-Regular.txt +31 -0
  161. figgyplot-0.2.1/python/figgyplot/licenses/LICENSE-Egui-OFL.txt +92 -0
  162. figgyplot-0.2.1/python/figgyplot/licenses/LICENSE-Egui-UFL.txt +96 -0
  163. figgyplot-0.2.1/python/figgyplot/licenses/LICENSE-Egui-emoji-icon-font-mit-license.txt +9 -0
  164. figgyplot-0.2.1/python/figgyplot/licenses/LICENSE-LiberationSans.txt +94 -0
  165. figgyplot-0.2.1/python/figgyplot/notebook.py +39 -0
  166. figgyplot-0.2.1/python/figgyplot/prepare.py +23 -0
  167. figgyplot-0.2.1/python/figgyplot/pyplot.py +51 -0
  168. figgyplot-0.2.1/python/figgyplot/webgpu.js +204 -0
  169. figgyplot-0.2.1/python/figgyplot/widget.py +206 -0
  170. figgyplot-0.2.1/reports/figgyplot-packaging.json +117 -0
  171. figgyplot-0.2.1/reports/randomized-hosts.json +82 -0
  172. figgyplot-0.2.1/reports/randomized-model.json +28 -0
  173. figgyplot-0.2.1/scripts/build-wasm.sh +28 -0
  174. figgyplot-0.2.1/scripts/check_assets.py +27 -0
  175. figgyplot-0.2.1/scripts/check_installed.py +34 -0
  176. figgyplot-0.2.1/scripts/check_promotion.py +85 -0
  177. figgyplot-0.2.1/scripts/check_randomized.py +640 -0
  178. figgyplot-0.2.1/scripts/check_testpypi.py +86 -0
  179. figgyplot-0.2.1/scripts/check_wheel_workflow.py +61 -0
  180. figgyplot-0.2.1/scripts/check_x11_runtime.py +26 -0
  181. figgyplot-0.2.1/scripts/ci-before-linux.sh +42 -0
  182. figgyplot-0.2.1/scripts/ci-check-linux.sh +13 -0
  183. figgyplot-0.2.1/scripts/ci-preflight.sh +8 -0
  184. figgyplot-0.2.1/scripts/ci_gpu_env.py +52 -0
  185. figgyplot-0.2.1/scripts/configure-github-security.sh +28 -0
  186. figgyplot-0.2.1/scripts/prepare_release.py +175 -0
  187. figgyplot-0.2.1/scripts/randomized_desktop.py +177 -0
  188. figgyplot-0.2.1/scripts/record_readme_demo.py +365 -0
  189. figgyplot-0.2.1/scripts/render_gallery.py +45 -0
  190. figgyplot-0.2.1/scripts/repro_upstream_colorbar/Cargo.toml +8 -0
  191. figgyplot-0.2.1/scripts/repro_upstream_colorbar/README.md +17 -0
  192. figgyplot-0.2.1/scripts/repro_upstream_colorbar/src/main.rs +21 -0
  193. figgyplot-0.2.1/scripts/setup-cloud.sh +72 -0
  194. figgyplot-0.2.1/src/desktop.rs +1162 -0
  195. figgyplot-0.2.1/src/editor.rs +1043 -0
  196. figgyplot-0.2.1/src/gpu.rs +282 -0
  197. figgyplot-0.2.1/src/lib.rs +1446 -0
  198. figgyplot-0.2.1/src/notebook.rs +236 -0
  199. figgyplot-0.2.1/src/radial.rs +114 -0
  200. figgyplot-0.2.1/src/radial_editor.rs +303 -0
  201. figgyplot-0.2.1/src/radial_host.rs +250 -0
  202. figgyplot-0.2.1/src/selection.rs +216 -0
  203. figgyplot-0.2.1/tests/test_browser.py +112 -0
  204. figgyplot-0.2.1/tests/test_chart_styles.py +98 -0
  205. figgyplot-0.2.1/tests/test_codegen.py +54 -0
  206. figgyplot-0.2.1/tests/test_desktop_editor.py +169 -0
  207. figgyplot-0.2.1/tests/test_desktop_host.py +267 -0
  208. figgyplot-0.2.1/tests/test_desktop_navigation.py +121 -0
  209. figgyplot-0.2.1/tests/test_figure.py +196 -0
  210. figgyplot-0.2.1/tests/test_invalid_state.py +192 -0
  211. figgyplot-0.2.1/tests/test_jupyter_webgpu.py +176 -0
  212. figgyplot-0.2.1/tests/test_layout_defaults.py +27 -0
  213. figgyplot-0.2.1/tests/test_native_threading.py +27 -0
  214. figgyplot-0.2.1/tests/test_notebook_model.py +92 -0
  215. figgyplot-0.2.1/tests/test_packaged_assets.py +55 -0
  216. figgyplot-0.2.1/tests/test_radial.py +126 -0
  217. figgyplot-0.2.1/tests/test_radial_desktop.py +131 -0
  218. figgyplot-0.2.1/tests/test_release.py +266 -0
  219. figgyplot-0.2.1/tests/test_selection_values.py +54 -0
  220. figgyplot-0.2.1/tests/test_shared_gpu.py +148 -0
  221. figgyplot-0.2.1/tests/test_wheel_workflow.py +60 -0
@@ -0,0 +1,5 @@
1
+ # Keep first-party package sources identical in every platform wheel.
2
+ /python/figgyplot/** text eol=lf
3
+ # Upstream JS/WASM assets are content-addressed in provenance.json. Preserve
4
+ # their exact bytes on every platform, including Windows core.autocrlf=true.
5
+ /python/figgyplot/assets/* -text
@@ -0,0 +1,41 @@
1
+ name: Bug report
2
+ description: Report a reproducible figgyplot failure.
3
+ title: "[Bug]: "
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: "For security reports, use SECURITY.md and the private reporting channel."
8
+ - type: textarea
9
+ id: behavior
10
+ attributes:
11
+ label: Expected and actual behavior
12
+ description: Describe the failure and what should happen.
13
+ validations:
14
+ required: true
15
+ - type: textarea
16
+ id: reproduction
17
+ attributes:
18
+ label: Minimal reproduction
19
+ description: Paste runnable Python code with synthetic data. Remove secrets and private datasets.
20
+ render: python
21
+ validations:
22
+ required: true
23
+ - type: textarea
24
+ id: environment
25
+ attributes:
26
+ label: Environment
27
+ description: Include commit/version, OS/architecture, Python and NumPy, backend, GPU/driver, and browser/Jupyter versions when applicable.
28
+ validations:
29
+ required: true
30
+ - type: textarea
31
+ id: logs
32
+ attributes:
33
+ label: Error message and logs
34
+ description: Include the full exception and relevant logs, with credentials removed.
35
+ render: text
36
+ - type: textarea
37
+ id: verification
38
+ attributes:
39
+ label: Reproduction details
40
+ description: Mention repeated runs, input size, resize/DPI, or close/reopen behavior when relevant.
41
+
@@ -0,0 +1,9 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Private security report
4
+ url: mailto:ssy9610@gmail.com
5
+ about: Send vulnerabilities privately; do not post credentials or exploit details in public issues.
6
+ - name: Usage and installation documentation
7
+ url: https://github.com/shim9610/figgy-python/blob/main/README.md
8
+ about: Read installation, interactive editing and notebook instructions.
9
+
@@ -0,0 +1,24 @@
1
+ name: Feature request
2
+ description: Suggest a plotting, editing or integration improvement.
3
+ title: "[Feature]: "
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: Problem or use case
9
+ description: Explain what you are trying to do and the current limitation.
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: behavior
14
+ attributes:
15
+ label: Proposed behavior
16
+ description: Give an API or interaction example, including the target backend.
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: constraints
21
+ attributes:
22
+ label: Data size and compatibility needs
23
+ description: Mention OS, Python/browser versions, data sizes and performance needs.
24
+
@@ -0,0 +1,5 @@
1
+ name: figgyplot source
2
+ paths-ignore:
3
+ # Generated, pinned upstream artifacts are verified by provenance hashes.
4
+ - python/figgyplot/assets/**
5
+
@@ -0,0 +1,37 @@
1
+ version: 2
2
+ # Regular update PRs stay paused during stabilization. Setting the limit to 3
3
+ # after PR CI is enabled activates them. Security alerts/updates are independent
4
+ # repository settings; this file does not enable those switches.
5
+ updates:
6
+ - package-ecosystem: github-actions
7
+ directory: /
8
+ schedule:
9
+ interval: weekly
10
+ open-pull-requests-limit: 0
11
+ groups:
12
+ actions:
13
+ patterns: ["*"]
14
+ - package-ecosystem: pip
15
+ directory: /
16
+ schedule:
17
+ interval: weekly
18
+ open-pull-requests-limit: 0
19
+ groups:
20
+ python-dependencies:
21
+ patterns: ["*"]
22
+ - package-ecosystem: cargo
23
+ directory: /
24
+ schedule:
25
+ interval: weekly
26
+ open-pull-requests-limit: 0
27
+ groups:
28
+ rust-dependencies:
29
+ patterns: ["*"]
30
+ # Renderer/host versions must move together in a reviewed compatibility PR.
31
+ ignore:
32
+ - dependency-name: figgy-renderer
33
+ - dependency-name: figgy-model
34
+ - dependency-name: wgpu
35
+ - dependency-name: egui*
36
+ - dependency-name: winit
37
+
@@ -0,0 +1,18 @@
1
+ Describe the problem and resulting behavior, including a concrete before/after
2
+ example when useful.
3
+
4
+ ## Validation
5
+
6
+ List checks you actually ran, including the tested OS, Python, backend and GPU.
7
+ Distinguish software-GPU tests from hardware tests and explain skipped checks.
8
+
9
+ ## Compatibility and remaining limits
10
+
11
+ Mention API/settings changes, data-transfer/resource lifetimes, packaging or
12
+ platform limitations relevant to review. Note any renderer change and why its
13
+ public API is sufficient.
14
+
15
+ - [ ] Relevant checks pass and formatting is clean.
16
+ - [ ] Upstream JS/WASM hashes remain valid, or an intentional rebuild is documented.
17
+ - [ ] No secrets or private datasets are included.
18
+
@@ -0,0 +1,48 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ # Enable alongside PR CI after its first successful manual scan.
6
+ # pull_request:
7
+ # branches: [main]
8
+ # push:
9
+ # branches: [main]
10
+ # schedule:
11
+ # - cron: '23 3 * * 1'
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ concurrency:
17
+ group: codeql-${{ github.event.pull_request.number || github.ref }}
18
+ cancel-in-progress: true
19
+
20
+ jobs:
21
+ analyze:
22
+ name: CodeQL / ${{ matrix.language }}
23
+ runs-on: ubuntu-24.04
24
+ timeout-minutes: 30
25
+ permissions:
26
+ contents: read
27
+ security-events: write
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ language: [python, javascript-typescript, rust]
32
+ steps:
33
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
34
+ with:
35
+ persist-credentials: false
36
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
37
+ with:
38
+ python-version: '3.12'
39
+ - uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
40
+ with:
41
+ languages: ${{ matrix.language }}
42
+ build-mode: none
43
+ queries: security-extended
44
+ config-file: ./.github/codeql-config.yml
45
+ - uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
46
+ with:
47
+ category: /language:${{ matrix.language }}
48
+
@@ -0,0 +1,99 @@
1
+ name: PR tests
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ # The manual run passed; required PR checks have no path filters.
6
+ pull_request:
7
+ branches: [main]
8
+ # merge_group:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ concurrency:
14
+ group: pr-tests-${{ github.event.pull_request.number || github.ref }}
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ preflight:
19
+ name: PR / Workflow and assets
20
+ runs-on: ubuntu-24.04
21
+ timeout-minutes: 10
22
+ steps:
23
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
24
+ with:
25
+ persist-credentials: false
26
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
27
+ with:
28
+ repository: PyO3/maturin-action
29
+ ref: e83996d129638aa358a18fbd1dfb82f0b0fb5d3b
30
+ path: .ci/maturin-action
31
+ persist-credentials: false
32
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
33
+ - run: bash scripts/ci-preflight.sh
34
+
35
+ integration:
36
+ name: PR / Linux integration
37
+ needs: preflight
38
+ runs-on: ubuntu-24.04
39
+ timeout-minutes: 30
40
+ env:
41
+ CARGO_BUILD_JOBS: '4'
42
+ WGPU_BACKEND: vulkan
43
+ FIGGY_TEST_JUPYTER: '1'
44
+ FIGGY_TEST_HEADFUL: '1'
45
+ FIGGYPLOT_MATURIN_ACTION: .ci/maturin-action/action.yml
46
+ steps:
47
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
48
+ with:
49
+ persist-credentials: false
50
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
51
+ with:
52
+ repository: PyO3/maturin-action
53
+ ref: e83996d129638aa358a18fbd1dfb82f0b0fb5d3b
54
+ path: .ci/maturin-action
55
+ persist-credentials: false
56
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
57
+ - uses: dtolnay/rust-toolchain@e2a55d2ffb04f378e9626c28d38b36d230d1e12f # master
58
+ with:
59
+ toolchain: '1.99.0'
60
+ components: rustfmt
61
+ - name: Install native software-GPU and X11 runtime
62
+ run: |
63
+ sudo apt-get update
64
+ sudo apt-get install -y git mesa-vulkan-drivers libvulkan1 libxkbcommon0 libxkbcommon-x11-0 xvfb xdotool xclip openbox wmctrl
65
+ - name: Build and install the exact PR wheel
66
+ run: |
67
+ uv python install 3.12
68
+ uv venv .venv --python 3.12
69
+ uv pip install --python .venv/bin/python 'maturin>=1.15,<2'
70
+ .venv/bin/python -m maturin build --release --locked --compatibility linux --out dist -i .venv/bin/python
71
+ for wheel in dist/*.whl; do
72
+ uv pip install --python .venv/bin/python --only-binary=:all: "${wheel}[test]"
73
+ done
74
+ uv pip install --python .venv/bin/python --only-binary=:all: 'PyYAML>=6,<7' 'playwright>=1.50,<2' 'jupyterlab>=4,<5' 'nbformat>=5,<6' 'ipykernel>=6'
75
+ .venv/bin/python scripts/check_installed.py
76
+ .venv/bin/python scripts/check_x11_runtime.py
77
+ - name: Install Chromium and select software GPU drivers
78
+ run: |
79
+ .venv/bin/python -m playwright install --with-deps chromium
80
+ .venv/bin/python scripts/ci_gpu_env.py
81
+ - name: Test native surface, editing and real JupyterLab WebGPU
82
+ run: |
83
+ cargo fmt --check
84
+ xvfb-run -a -s '-screen 0 1600x1000x24' bash <<'SCRIPT'
85
+ set -euo pipefail
86
+ openbox > /tmp/figgyplot-openbox.log 2>&1 &
87
+ wm_pid=$!
88
+ trap 'kill "$wm_pid" 2>/dev/null || true' EXIT
89
+ .venv/bin/python -m pytest -q --basetemp=ci-results --junitxml=ci-results/junit.xml
90
+ SCRIPT
91
+ - name: Save integration results
92
+ if: always()
93
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
94
+ with:
95
+ name: pr-linux-integration-results
96
+ path: ci-results
97
+ retention-days: 5
98
+ if-no-files-found: ignore
99
+
@@ -0,0 +1,238 @@
1
+ name: Publish figgyplot (manual only)
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ target:
7
+ description: 'TestPyPI build/upload, or promote a successful TestPyPI run to PyPI'
8
+ type: choice
9
+ options: [testpypi, pypi]
10
+ default: testpypi
11
+ required: true
12
+ version:
13
+ description: 'Exact source version (public upload to the selected index)'
14
+ required: true
15
+ type: string
16
+ default: '0.2.1'
17
+ testpypi-run-id:
18
+ description: 'Required for PyPI: successful TestPyPI run at this exact main commit'
19
+ type: string
20
+ default: ''
21
+
22
+ permissions:
23
+ contents: read
24
+
25
+ concurrency:
26
+ group: publish-figgyplot
27
+ cancel-in-progress: false
28
+
29
+ jobs:
30
+ gate:
31
+ runs-on: ubuntu-24.04
32
+ outputs:
33
+ version: ${{ steps.version.outputs.version }}
34
+ steps:
35
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
36
+ with:
37
+ persist-credentials: false
38
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
39
+ with:
40
+ python-version: '3.12'
41
+ - name: Require main and the exact source version
42
+ id: version
43
+ env:
44
+ REQUESTED_VERSION: ${{ inputs.version }}
45
+ RELEASE_TARGET: ${{ inputs.target }}
46
+ TEST_RUN_ID: ${{ inputs.testpypi-run-id }}
47
+ run: |
48
+ python - <<'PY'
49
+ import ast, os, tomllib
50
+ from pathlib import Path
51
+ if os.environ['GITHUB_REF'] != 'refs/heads/main':
52
+ raise SystemExit('Publication is allowed only from main; select main in Run workflow.')
53
+ if os.environ['RELEASE_TARGET'] not in ('testpypi', 'pypi'):
54
+ raise SystemExit('Target must be testpypi or pypi.')
55
+ if os.environ['RELEASE_TARGET'] == 'pypi' and not (os.environ['TEST_RUN_ID'].isdecimal() and int(os.environ['TEST_RUN_ID']) > 0):
56
+ raise SystemExit('PyPI promotion requires the successful TestPyPI run ID.')
57
+ project = tomllib.loads(Path('pyproject.toml').read_text())['project']
58
+ cargo = tomllib.loads(Path('Cargo.toml').read_text())['package']
59
+ version = project['version']
60
+ module = ast.parse(Path('python/figgyplot/__init__.py').read_text())
61
+ python_version = next(ast.literal_eval(node.value) for node in module.body if isinstance(node, ast.Assign) and any(isinstance(t, ast.Name) and t.id == '__version__' for t in node.targets))
62
+ if project['name'] != 'figgyplot' or cargo['version'] != version or python_version != version or os.environ['REQUESTED_VERSION'] != version:
63
+ raise SystemExit('Input, pyproject.toml, Cargo.toml and Python package versions must match exactly.')
64
+ with open(os.environ['GITHUB_OUTPUT'], 'a') as output:
65
+ output.write(f'version={version}\n')
66
+ PY
67
+
68
+ build:
69
+ needs: gate
70
+ if: inputs.target == 'testpypi'
71
+ uses: ./.github/workflows/wheels.yml
72
+ permissions:
73
+ contents: read
74
+
75
+ validate:
76
+ needs: [gate, build]
77
+ if: inputs.target == 'testpypi'
78
+ runs-on: ubuntu-24.04
79
+ steps:
80
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
81
+ with:
82
+ persist-credentials: false
83
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
84
+ with:
85
+ python-version: '3.12'
86
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
87
+ with:
88
+ pattern: wheels-*
89
+ path: artifacts
90
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
91
+ with:
92
+ name: figgyplot-sdist
93
+ path: artifacts/figgyplot-sdist
94
+ - run: python -m pip install 'packaging>=24' 'PyYAML>=6,<7' twine
95
+ - name: Validate every wheel, sdist, version and packaged asset
96
+ run: |
97
+ python scripts/prepare_release.py artifacts dist release-manifest/manifest.json
98
+ python -m twine check --strict dist/*
99
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
100
+ with:
101
+ name: figgyplot-release-files
102
+ path: dist/*
103
+ if-no-files-found: error
104
+ retention-days: 30
105
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
106
+ with:
107
+ name: figgyplot-release-manifest
108
+ path: release-manifest/manifest.json
109
+ if-no-files-found: error
110
+ retention-days: 30
111
+
112
+ promote:
113
+ name: Verify tested distributions for PyPI
114
+ needs: gate
115
+ if: inputs.target == 'pypi'
116
+ runs-on: ubuntu-24.04
117
+ permissions:
118
+ contents: read
119
+ actions: read
120
+ steps:
121
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
122
+ with:
123
+ persist-credentials: false
124
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
125
+ with:
126
+ python-version: '3.12'
127
+ - name: Read the successful TestPyPI run and all installation jobs
128
+ env:
129
+ GH_TOKEN: ${{ github.token }}
130
+ TEST_RUN_ID: ${{ inputs.testpypi-run-id }}
131
+ run: |
132
+ gh api "repos/$GITHUB_REPOSITORY/actions/runs/$TEST_RUN_ID" > tested-run.json
133
+ gh api --paginate --slurp "repos/$GITHUB_REPOSITORY/actions/runs/$TEST_RUN_ID/jobs?per_page=100" > tested-jobs.json
134
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
135
+ with:
136
+ name: figgyplot-release-files
137
+ path: dist
138
+ run-id: ${{ inputs.testpypi-run-id }}
139
+ github-token: ${{ github.token }}
140
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
141
+ with:
142
+ name: figgyplot-release-manifest
143
+ path: release-manifest
144
+ run-id: ${{ inputs.testpypi-run-id }}
145
+ github-token: ${{ github.token }}
146
+ - run: python -m pip install 'packaging>=24' 'PyYAML>=6,<7' twine
147
+ - name: Verify provenance, complete coverage and every byte before promotion
148
+ env:
149
+ TEST_RUN_ID: ${{ inputs.testpypi-run-id }}
150
+ run: |
151
+ python scripts/check_promotion.py tested-run.json tested-jobs.json dist release-manifest/manifest.json "$TEST_RUN_ID"
152
+ python -m twine check --strict dist/*
153
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
154
+ with:
155
+ name: figgyplot-release-files
156
+ path: dist/*
157
+ if-no-files-found: error
158
+ retention-days: 30
159
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
160
+ with:
161
+ name: figgyplot-release-manifest
162
+ path: release-manifest/manifest.json
163
+ if-no-files-found: error
164
+ retention-days: 30
165
+
166
+ publish:
167
+ name: Upload to ${{ inputs.target == 'pypi' && 'PyPI' || 'TestPyPI' }}
168
+ needs: [gate, validate, promote]
169
+ # One preparation branch is intentionally skipped; the selected one must pass.
170
+ if: >-
171
+ always() && !cancelled() && needs.gate.result == 'success' &&
172
+ ((inputs.target == 'testpypi' && needs.validate.result == 'success') ||
173
+ (inputs.target == 'pypi' && needs.promote.result == 'success'))
174
+ runs-on: ubuntu-24.04
175
+ environment:
176
+ name: ${{ inputs.target }}
177
+ url: https://${{ inputs.target == 'pypi' && 'pypi.org' || 'test.pypi.org' }}/project/figgyplot/
178
+ # OIDC exists only here; build/test jobs receive no publishing permission.
179
+ permissions:
180
+ contents: read
181
+ id-token: write
182
+ steps:
183
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
184
+ with:
185
+ name: figgyplot-release-files
186
+ path: dist
187
+ - name: Publish with Trusted Publishing and attestations
188
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
189
+ with:
190
+ repository-url: https://${{ inputs.target == 'pypi' && 'upload.pypi.org' || 'test.pypi.org' }}/legacy/
191
+ packages-dir: dist/
192
+ attestations: true
193
+ skip-existing: false
194
+
195
+ install:
196
+ name: ${{ inputs.target == 'pypi' && 'PyPI' || 'TestPyPI' }} install / ${{ matrix.runner }} / Python ${{ matrix.python }}
197
+ needs: [gate, publish]
198
+ strategy:
199
+ fail-fast: false
200
+ matrix:
201
+ include:
202
+ - {runner: ubuntu-24.04, python: '3.12'}
203
+ - {runner: ubuntu-24.04-arm, python: '3.12'}
204
+ - {runner: windows-latest, python: '3.12'}
205
+ - {runner: windows-11-arm, python: '3.12'}
206
+ - {runner: macos-15-intel, python: '3.12'}
207
+ - {runner: macos-15, python: '3.12'}
208
+ - {runner: ubuntu-24.04, python: '3.8'}
209
+ - {runner: ubuntu-24.04, python: '3.15t'}
210
+ - {runner: windows-11-arm, python: '3.15t'}
211
+ runs-on: ${{ matrix.runner }}
212
+ steps:
213
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
214
+ with:
215
+ persist-credentials: false
216
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
217
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
218
+ with:
219
+ name: figgyplot-release-manifest
220
+ path: release-manifest
221
+ - name: Download from TestPyPI, compare published bytes and install
222
+ shell: bash
223
+ env:
224
+ TEST_PYTHON: ${{ matrix.python }}
225
+ RELEASE_VERSION: ${{ needs.gate.outputs.version }}
226
+ RELEASE_TARGET: ${{ inputs.target }}
227
+ run: |
228
+ uv python install "$TEST_PYTHON"
229
+ uv venv .testpypi --python "$TEST_PYTHON"
230
+ if [ -f .testpypi/Scripts/python.exe ]; then
231
+ test_python=.testpypi/Scripts/python.exe
232
+ else
233
+ test_python=.testpypi/bin/python
234
+ fi
235
+ # Resolve dependencies from PyPI; figgyplot is downloaded ONLY from TestPyPI.
236
+ uv pip install --python "$test_python" pip 'packaging>=24' 'numpy>=1.24' 'anywidget>=0.9,<1'
237
+ "$test_python" scripts/check_testpypi.py release-manifest/manifest.json "$RELEASE_VERSION" "$RELEASE_TARGET"
238
+ "$test_python" scripts/check_installed.py