gpyui 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 (232) hide show
  1. gpyui-0.1.0/.github/workflows/checks.yml +27 -0
  2. gpyui-0.1.0/.github/workflows/docs.yml +79 -0
  3. gpyui-0.1.0/.github/workflows/release.yml +214 -0
  4. gpyui-0.1.0/.gitignore +20 -0
  5. gpyui-0.1.0/.python-version +1 -0
  6. gpyui-0.1.0/AGENTS.md +17 -0
  7. gpyui-0.1.0/Cargo.lock +9014 -0
  8. gpyui-0.1.0/Cargo.toml +26 -0
  9. gpyui-0.1.0/PKG-INFO +258 -0
  10. gpyui-0.1.0/README.md +249 -0
  11. gpyui-0.1.0/docs/architecture.md +204 -0
  12. gpyui-0.1.0/docs/component-coverage.md +100 -0
  13. gpyui-0.1.0/docs/components/accordion.md +47 -0
  14. gpyui-0.1.0/docs/components/alert.md +36 -0
  15. gpyui-0.1.0/docs/components/area-chart.md +36 -0
  16. gpyui-0.1.0/docs/components/attachment.md +39 -0
  17. gpyui-0.1.0/docs/components/avatar.md +38 -0
  18. gpyui-0.1.0/docs/components/badge.md +35 -0
  19. gpyui-0.1.0/docs/components/bar-chart.md +36 -0
  20. gpyui-0.1.0/docs/components/breadcrumb.md +40 -0
  21. gpyui-0.1.0/docs/components/bubble.md +36 -0
  22. gpyui-0.1.0/docs/components/button.md +42 -0
  23. gpyui-0.1.0/docs/components/calendar.md +42 -0
  24. gpyui-0.1.0/docs/components/candlestick-chart.md +40 -0
  25. gpyui-0.1.0/docs/components/carousel.md +44 -0
  26. gpyui-0.1.0/docs/components/charts/index.md +56 -0
  27. gpyui-0.1.0/docs/components/checkbox.md +40 -0
  28. gpyui-0.1.0/docs/components/clipboard.md +38 -0
  29. gpyui-0.1.0/docs/components/collapsible.md +45 -0
  30. gpyui-0.1.0/docs/components/color-picker.md +42 -0
  31. gpyui-0.1.0/docs/components/column.md +38 -0
  32. gpyui-0.1.0/docs/components/combobox.md +45 -0
  33. gpyui-0.1.0/docs/components/container.md +38 -0
  34. gpyui-0.1.0/docs/components/content/index.md +96 -0
  35. gpyui-0.1.0/docs/components/data/index.md +46 -0
  36. gpyui-0.1.0/docs/components/date-picker.md +42 -0
  37. gpyui-0.1.0/docs/components/date-time-and-color/index.md +46 -0
  38. gpyui-0.1.0/docs/components/description-list.md +38 -0
  39. gpyui-0.1.0/docs/components/dialog.md +50 -0
  40. gpyui-0.1.0/docs/components/disclosure/index.md +36 -0
  41. gpyui-0.1.0/docs/components/editor.md +44 -0
  42. gpyui-0.1.0/docs/components/empty.md +35 -0
  43. gpyui-0.1.0/docs/components/feedback/index.md +76 -0
  44. gpyui-0.1.0/docs/components/group-box.md +41 -0
  45. gpyui-0.1.0/docs/components/hover-card.md +42 -0
  46. gpyui-0.1.0/docs/components/html.md +38 -0
  47. gpyui-0.1.0/docs/components/icon.md +38 -0
  48. gpyui-0.1.0/docs/components/index.md +775 -0
  49. gpyui-0.1.0/docs/components/inputs/index.md +56 -0
  50. gpyui-0.1.0/docs/components/kbd.md +38 -0
  51. gpyui-0.1.0/docs/components/label.md +36 -0
  52. gpyui-0.1.0/docs/components/layout/index.md +86 -0
  53. gpyui-0.1.0/docs/components/line-chart.md +40 -0
  54. gpyui-0.1.0/docs/components/link.md +38 -0
  55. gpyui-0.1.0/docs/components/list.md +44 -0
  56. gpyui-0.1.0/docs/components/markdown.md +40 -0
  57. gpyui-0.1.0/docs/components/marker.md +35 -0
  58. gpyui-0.1.0/docs/components/message.md +35 -0
  59. gpyui-0.1.0/docs/components/navigation/index.md +56 -0
  60. gpyui-0.1.0/docs/components/number-input.md +44 -0
  61. gpyui-0.1.0/docs/components/otp-input.md +44 -0
  62. gpyui-0.1.0/docs/components/overlays/index.md +56 -0
  63. gpyui-0.1.0/docs/components/pagination.md +43 -0
  64. gpyui-0.1.0/docs/components/pie-chart.md +40 -0
  65. gpyui-0.1.0/docs/components/popover.md +42 -0
  66. gpyui-0.1.0/docs/components/progress-circle.md +35 -0
  67. gpyui-0.1.0/docs/components/progress.md +39 -0
  68. gpyui-0.1.0/docs/components/radio-group.md +44 -0
  69. gpyui-0.1.0/docs/components/radio.md +44 -0
  70. gpyui-0.1.0/docs/components/rating.md +43 -0
  71. gpyui-0.1.0/docs/components/resizable.md +44 -0
  72. gpyui-0.1.0/docs/components/row.md +38 -0
  73. gpyui-0.1.0/docs/components/scroll.md +40 -0
  74. gpyui-0.1.0/docs/components/select.md +45 -0
  75. gpyui-0.1.0/docs/components/selection/index.md +96 -0
  76. gpyui-0.1.0/docs/components/separator.md +35 -0
  77. gpyui-0.1.0/docs/components/sheet.md +55 -0
  78. gpyui-0.1.0/docs/components/shimmer.md +38 -0
  79. gpyui-0.1.0/docs/components/sidebar.md +40 -0
  80. gpyui-0.1.0/docs/components/skeleton.md +36 -0
  81. gpyui-0.1.0/docs/components/slider.md +47 -0
  82. gpyui-0.1.0/docs/components/spinner.md +36 -0
  83. gpyui-0.1.0/docs/components/status-bar.md +36 -0
  84. gpyui-0.1.0/docs/components/stepper.md +40 -0
  85. gpyui-0.1.0/docs/components/switch.md +40 -0
  86. gpyui-0.1.0/docs/components/table.md +49 -0
  87. gpyui-0.1.0/docs/components/tabs.md +44 -0
  88. gpyui-0.1.0/docs/components/tag.md +35 -0
  89. gpyui-0.1.0/docs/components/text-and-buttons/index.md +76 -0
  90. gpyui-0.1.0/docs/components/text-area.md +40 -0
  91. gpyui-0.1.0/docs/components/text-input.md +43 -0
  92. gpyui-0.1.0/docs/components/time-field.md +42 -0
  93. gpyui-0.1.0/docs/components/toggle.md +40 -0
  94. gpyui-0.1.0/docs/components/toolbar.md +42 -0
  95. gpyui-0.1.0/docs/components/tooltip.md +42 -0
  96. gpyui-0.1.0/docs/components/tree.md +49 -0
  97. gpyui-0.1.0/docs/contributing-docs.md +85 -0
  98. gpyui-0.1.0/docs/examples/gallery.md +29 -0
  99. gpyui-0.1.0/docs/examples/trading.md +47 -0
  100. gpyui-0.1.0/docs/guide/events.md +75 -0
  101. gpyui-0.1.0/docs/guide/install.md +68 -0
  102. gpyui-0.1.0/docs/guide/layout.md +68 -0
  103. gpyui-0.1.0/docs/guide/state.md +61 -0
  104. gpyui-0.1.0/docs/guide/styling.md +50 -0
  105. gpyui-0.1.0/docs/index.md +58 -0
  106. gpyui-0.1.0/docs/reference/application.md +67 -0
  107. gpyui-0.1.0/docs/reference/core.md +62 -0
  108. gpyui-0.1.0/docs/releases.md +115 -0
  109. gpyui-0.1.0/docs/screenshots/components/accordion.png +0 -0
  110. gpyui-0.1.0/docs/screenshots/components/alert.png +0 -0
  111. gpyui-0.1.0/docs/screenshots/components/area-chart.png +0 -0
  112. gpyui-0.1.0/docs/screenshots/components/attachment.png +0 -0
  113. gpyui-0.1.0/docs/screenshots/components/avatar.png +0 -0
  114. gpyui-0.1.0/docs/screenshots/components/badge.png +0 -0
  115. gpyui-0.1.0/docs/screenshots/components/bar-chart.png +0 -0
  116. gpyui-0.1.0/docs/screenshots/components/breadcrumb.png +0 -0
  117. gpyui-0.1.0/docs/screenshots/components/bubble.png +0 -0
  118. gpyui-0.1.0/docs/screenshots/components/button.png +0 -0
  119. gpyui-0.1.0/docs/screenshots/components/calendar.png +0 -0
  120. gpyui-0.1.0/docs/screenshots/components/candlestick-chart.png +0 -0
  121. gpyui-0.1.0/docs/screenshots/components/carousel.png +0 -0
  122. gpyui-0.1.0/docs/screenshots/components/checkbox.png +0 -0
  123. gpyui-0.1.0/docs/screenshots/components/clipboard.png +0 -0
  124. gpyui-0.1.0/docs/screenshots/components/collapsible.png +0 -0
  125. gpyui-0.1.0/docs/screenshots/components/color-picker.png +0 -0
  126. gpyui-0.1.0/docs/screenshots/components/column.png +0 -0
  127. gpyui-0.1.0/docs/screenshots/components/combobox.png +0 -0
  128. gpyui-0.1.0/docs/screenshots/components/container.png +0 -0
  129. gpyui-0.1.0/docs/screenshots/components/date-picker.png +0 -0
  130. gpyui-0.1.0/docs/screenshots/components/description-list.png +0 -0
  131. gpyui-0.1.0/docs/screenshots/components/dialog.png +0 -0
  132. gpyui-0.1.0/docs/screenshots/components/editor.png +0 -0
  133. gpyui-0.1.0/docs/screenshots/components/empty.png +0 -0
  134. gpyui-0.1.0/docs/screenshots/components/group-box.png +0 -0
  135. gpyui-0.1.0/docs/screenshots/components/hover-card.png +0 -0
  136. gpyui-0.1.0/docs/screenshots/components/html.png +0 -0
  137. gpyui-0.1.0/docs/screenshots/components/icon.png +0 -0
  138. gpyui-0.1.0/docs/screenshots/components/kbd.png +0 -0
  139. gpyui-0.1.0/docs/screenshots/components/label.png +0 -0
  140. gpyui-0.1.0/docs/screenshots/components/line-chart.png +0 -0
  141. gpyui-0.1.0/docs/screenshots/components/link.png +0 -0
  142. gpyui-0.1.0/docs/screenshots/components/list.png +0 -0
  143. gpyui-0.1.0/docs/screenshots/components/markdown.png +0 -0
  144. gpyui-0.1.0/docs/screenshots/components/marker.png +0 -0
  145. gpyui-0.1.0/docs/screenshots/components/message.png +0 -0
  146. gpyui-0.1.0/docs/screenshots/components/number-input.png +0 -0
  147. gpyui-0.1.0/docs/screenshots/components/otp-input.png +0 -0
  148. gpyui-0.1.0/docs/screenshots/components/pagination.png +0 -0
  149. gpyui-0.1.0/docs/screenshots/components/pie-chart.png +0 -0
  150. gpyui-0.1.0/docs/screenshots/components/popover.png +0 -0
  151. gpyui-0.1.0/docs/screenshots/components/progress-circle.png +0 -0
  152. gpyui-0.1.0/docs/screenshots/components/progress.png +0 -0
  153. gpyui-0.1.0/docs/screenshots/components/radio-group.png +0 -0
  154. gpyui-0.1.0/docs/screenshots/components/radio.png +0 -0
  155. gpyui-0.1.0/docs/screenshots/components/rating.png +0 -0
  156. gpyui-0.1.0/docs/screenshots/components/resizable.png +0 -0
  157. gpyui-0.1.0/docs/screenshots/components/row.png +0 -0
  158. gpyui-0.1.0/docs/screenshots/components/scroll.png +0 -0
  159. gpyui-0.1.0/docs/screenshots/components/select.png +0 -0
  160. gpyui-0.1.0/docs/screenshots/components/separator.png +0 -0
  161. gpyui-0.1.0/docs/screenshots/components/sheet.png +0 -0
  162. gpyui-0.1.0/docs/screenshots/components/shimmer.png +0 -0
  163. gpyui-0.1.0/docs/screenshots/components/sidebar.png +0 -0
  164. gpyui-0.1.0/docs/screenshots/components/skeleton.png +0 -0
  165. gpyui-0.1.0/docs/screenshots/components/slider.png +0 -0
  166. gpyui-0.1.0/docs/screenshots/components/spinner.png +0 -0
  167. gpyui-0.1.0/docs/screenshots/components/status-bar.png +0 -0
  168. gpyui-0.1.0/docs/screenshots/components/stepper.png +0 -0
  169. gpyui-0.1.0/docs/screenshots/components/switch.png +0 -0
  170. gpyui-0.1.0/docs/screenshots/components/table.png +0 -0
  171. gpyui-0.1.0/docs/screenshots/components/tabs.png +0 -0
  172. gpyui-0.1.0/docs/screenshots/components/tag.png +0 -0
  173. gpyui-0.1.0/docs/screenshots/components/text-area.png +0 -0
  174. gpyui-0.1.0/docs/screenshots/components/text-input.png +0 -0
  175. gpyui-0.1.0/docs/screenshots/components/time-field.png +0 -0
  176. gpyui-0.1.0/docs/screenshots/components/toggle.png +0 -0
  177. gpyui-0.1.0/docs/screenshots/components/toolbar.png +0 -0
  178. gpyui-0.1.0/docs/screenshots/components/tooltip.png +0 -0
  179. gpyui-0.1.0/docs/screenshots/components/tree.png +0 -0
  180. gpyui-0.1.0/docs/screenshots/gallery-light.png +0 -0
  181. gpyui-0.1.0/docs/screenshots/workspace-dark.png +0 -0
  182. gpyui-0.1.0/docs/screenshots/workspace-light.png +0 -0
  183. gpyui-0.1.0/docs/screenshots/workspace-stream.gif +0 -0
  184. gpyui-0.1.0/docs/stylesheets/catalog.css +39 -0
  185. gpyui-0.1.0/docs/upstream-lock.json +24 -0
  186. gpyui-0.1.0/docs/validation.md +214 -0
  187. gpyui-0.1.0/examples/async_binding.py +32 -0
  188. gpyui-0.1.0/examples/component_catalog.py +379 -0
  189. gpyui-0.1.0/examples/component_preview.py +70 -0
  190. gpyui-0.1.0/examples/gallery.py +162 -0
  191. gpyui-0.1.0/examples/hello.py +14 -0
  192. gpyui-0.1.0/examples/market.py +72 -0
  193. gpyui-0.1.0/examples/workspace.py +221 -0
  194. gpyui-0.1.0/justfile +68 -0
  195. gpyui-0.1.0/lefthook.yml +17 -0
  196. gpyui-0.1.0/overrides/404.html +7 -0
  197. gpyui-0.1.0/pyproject.toml +53 -0
  198. gpyui-0.1.0/rust-toolchain.toml +4 -0
  199. gpyui-0.1.0/scripts/capture-components.py +95 -0
  200. gpyui-0.1.0/scripts/check-docs-site.py +53 -0
  201. gpyui-0.1.0/scripts/generate-docs.py +273 -0
  202. gpyui-0.1.0/scripts/generate-wheel-notices.py +148 -0
  203. gpyui-0.1.0/scripts/native-display.sh +34 -0
  204. gpyui-0.1.0/scripts/record-workspace.py +216 -0
  205. gpyui-0.1.0/scripts/test-native.sh +39 -0
  206. gpyui-0.1.0/scripts/wheel-build-deps.sh +10 -0
  207. gpyui-0.1.0/scripts/wheel-ci.py +221 -0
  208. gpyui-0.1.0/scripts/workspace-env.sh +15 -0
  209. gpyui-0.1.0/src/bridge.rs +253 -0
  210. gpyui-0.1.0/src/gpyui/THIRD_PARTY_NOTICES.txt +29572 -0
  211. gpyui-0.1.0/src/gpyui/__init__.py +153 -0
  212. gpyui-0.1.0/src/gpyui/_core.pyi +12 -0
  213. gpyui-0.1.0/src/gpyui/application.py +313 -0
  214. gpyui-0.1.0/src/gpyui/controls.py +255 -0
  215. gpyui-0.1.0/src/gpyui/py.typed +0 -0
  216. gpyui-0.1.0/src/gpyui/state.py +33 -0
  217. gpyui-0.1.0/src/gpyui/widgets.py +737 -0
  218. gpyui-0.1.0/src/kit.rs +1210 -0
  219. gpyui-0.1.0/src/lib.rs +17 -0
  220. gpyui-0.1.0/src/protocol.rs +176 -0
  221. gpyui-0.1.0/src/view.rs +753 -0
  222. gpyui-0.1.0/tests/native_app.py +104 -0
  223. gpyui-0.1.0/tests/native_catalog.py +63 -0
  224. gpyui-0.1.0/tests/native_smoke.py +44 -0
  225. gpyui-0.1.0/tests/test_bridge.py +74 -0
  226. gpyui-0.1.0/tests/test_components_native.py +166 -0
  227. gpyui-0.1.0/tests/test_controls.py +149 -0
  228. gpyui-0.1.0/tests/test_market.py +37 -0
  229. gpyui-0.1.0/tests/test_native.py +150 -0
  230. gpyui-0.1.0/tests/test_widgets.py +161 -0
  231. gpyui-0.1.0/uv.lock +450 -0
  232. gpyui-0.1.0/zensical.toml +192 -0
@@ -0,0 +1,27 @@
1
+ name: Python checks
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: checks-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ check:
17
+ runs-on: ubuntu-latest
18
+ env:
19
+ UV_PROJECT_ENVIRONMENT: .venv-tools
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: '3.12'
25
+ - uses: astral-sh/setup-uv@v6
26
+ - run: uv sync --locked --only-group dev
27
+ - run: uv run --locked --only-group dev just check
@@ -0,0 +1,79 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: docs-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ build:
18
+ runs-on: ubuntu-latest
19
+ permissions:
20
+ contents: read
21
+ pages: read
22
+ outputs:
23
+ pages_enabled: ${{ steps.pages.outputs.enabled }}
24
+ env:
25
+ UV_PROJECT_ENVIRONMENT: .venv-docs
26
+ steps:
27
+ - name: Check GitHub Pages configuration
28
+ id: pages
29
+ if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
30
+ env:
31
+ GH_TOKEN: ${{ github.token }}
32
+ GH_REPO: ${{ github.repository }}
33
+ run: |
34
+ if gh api "repos/$GH_REPO/pages" --jq .build_type > "$RUNNER_TEMP/pages-type" 2> "$RUNNER_TEMP/pages-error"; then
35
+ if [ "$(cat "$RUNNER_TEMP/pages-type")" = workflow ]; then
36
+ echo 'enabled=true' >> "$GITHUB_OUTPUT"
37
+ else
38
+ echo '::warning::Select GitHub Actions in Settings > Pages to publish the documentation.'
39
+ echo 'enabled=false' >> "$GITHUB_OUTPUT"
40
+ fi
41
+ elif grep -q 'HTTP 404' "$RUNNER_TEMP/pages-error"; then
42
+ echo '::warning::Enable GitHub Pages with the GitHub Actions source, then run this workflow again.'
43
+ echo 'enabled=false' >> "$GITHUB_OUTPUT"
44
+ else
45
+ cat "$RUNNER_TEMP/pages-error" >&2
46
+ exit 1
47
+ fi
48
+ - uses: actions/checkout@v4
49
+ - uses: actions/setup-python@v5
50
+ with:
51
+ python-version: '3.12'
52
+ - uses: astral-sh/setup-uv@v6
53
+ - run: uv sync --locked --only-group docs
54
+ - run: uv run --locked --only-group docs python scripts/generate-docs.py --check
55
+ - run: uv run --locked --only-group docs zensical build --strict --clean
56
+ - run: uv run --locked --only-group docs python scripts/check-docs-site.py
57
+ - uses: actions/upload-artifact@v4
58
+ with:
59
+ name: gpyui-docs
60
+ path: site/
61
+ retention-days: 7
62
+ - uses: actions/upload-pages-artifact@v3
63
+ if: steps.pages.outputs.enabled == 'true'
64
+ with:
65
+ path: site/
66
+
67
+ deploy:
68
+ if: needs.build.outputs.pages_enabled == 'true' && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
69
+ needs: build
70
+ runs-on: ubuntu-latest
71
+ permissions:
72
+ pages: write
73
+ id-token: write
74
+ environment:
75
+ name: github-pages
76
+ url: ${{ steps.deployment.outputs.page_url }}
77
+ steps:
78
+ - uses: actions/deploy-pages@v4
79
+ id: deployment
@@ -0,0 +1,214 @@
1
+ name: Build wheels
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - .github/workflows/release.yml
7
+ - Cargo.toml
8
+ - Cargo.lock
9
+ - rust-toolchain.toml
10
+ - pyproject.toml
11
+ - src/**
12
+ - tests/**
13
+ - examples/**
14
+ - scripts/wheel*.py
15
+ - scripts/wheel-build-deps.sh
16
+ - scripts/test-native.sh
17
+ push:
18
+ tags: ["v*"]
19
+ workflow_dispatch:
20
+ inputs:
21
+ github_release:
22
+ description: Create a GitHub prerelease after all wheel tests pass (select a version tag)
23
+ type: boolean
24
+ default: false
25
+ publish:
26
+ description: Publish to PyPI after all wheel tests pass (select a version tag)
27
+ type: boolean
28
+ default: false
29
+
30
+ permissions:
31
+ contents: read
32
+
33
+ concurrency:
34
+ group: wheels-${{ github.ref }}
35
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
36
+
37
+ jobs:
38
+ prepare:
39
+ runs-on: ubuntu-24.04
40
+ outputs:
41
+ rust: ${{ steps.config.outputs.rust }}
42
+ maturin: ${{ steps.config.outputs.maturin }}
43
+ version: ${{ steps.config.outputs.version }}
44
+ builds: ${{ steps.config.outputs.builds }}
45
+ tests: ${{ steps.config.outputs.tests }}
46
+ steps:
47
+ - uses: actions/checkout@v4
48
+ - uses: actions/setup-python@v5
49
+ with:
50
+ python-version: "3.12"
51
+ - id: config
52
+ env:
53
+ PUBLISH: ${{ inputs.publish || false }}
54
+ RELEASE: ${{ inputs.github_release || false }}
55
+ run: python scripts/wheel-ci.py prepare
56
+
57
+ build:
58
+ name: Wheel / ${{ matrix.name }}
59
+ needs: prepare
60
+ runs-on: ${{ matrix.runner }}
61
+ timeout-minutes: 90
62
+ strategy:
63
+ fail-fast: false
64
+ matrix: ${{ fromJSON(needs.prepare.outputs.builds) }}
65
+ defaults:
66
+ run:
67
+ shell: bash
68
+ env:
69
+ CARGO_BUILD_JOBS: "2"
70
+ MACOSX_DEPLOYMENT_TARGET: "12.0"
71
+ steps:
72
+ - uses: actions/checkout@v4
73
+ - uses: actions/setup-python@v5
74
+ with:
75
+ python-version: ${{ matrix.python }}
76
+ - uses: Swatinem/rust-cache@v2
77
+ with:
78
+ shared-key: wheel-${{ matrix.name }}
79
+ cache-on-failure: true
80
+ - name: Build Linux wheel against system desktop libraries
81
+ if: runner.os == 'Linux'
82
+ uses: PyO3/maturin-action@v1
83
+ with:
84
+ target: ${{ matrix.target }}
85
+ # Mesa uses GPUI's XCB connection. Bundling another libxcb crashes.
86
+ manylinux: "off"
87
+ container: quay.io/pypa/manylinux_2_28_${{ matrix.arch }}:latest
88
+ rust-toolchain: ${{ needs.prepare.outputs.rust }}
89
+ maturin-version: ${{ needs.prepare.outputs.maturin }}
90
+ args: --release --locked --strip ${{ matrix.sdist }} --auditwheel skip --out dist --interpreter /opt/python/cp312-cp312/bin/python
91
+ before-script-linux: bash scripts/wheel-build-deps.sh
92
+ - name: Build macOS or Windows wheel
93
+ if: runner.os != 'Linux'
94
+ uses: PyO3/maturin-action@v1
95
+ with:
96
+ target: ${{ matrix.target }}
97
+ rust-toolchain: ${{ needs.prepare.outputs.rust }}
98
+ maturin-version: ${{ needs.prepare.outputs.maturin }}
99
+ args: --release --locked --strip --out dist --interpreter python
100
+ - uses: astral-sh/setup-uv@v6
101
+ - name: Validate wheel contents and metadata
102
+ env:
103
+ WHEEL_PLATFORM: ${{ matrix.platform }}
104
+ run: |
105
+ python scripts/wheel-ci.py check
106
+ uvx --from twine==7.0.0 twine check --strict dist/*
107
+ - name: Audit Linux dependencies
108
+ if: runner.os == 'Linux'
109
+ run: uvx --from auditwheel==6.8.2 auditwheel show dist/*.whl
110
+ - uses: actions/upload-artifact@v4
111
+ with:
112
+ name: gpyui-dist-${{ matrix.name }}
113
+ path: dist/*
114
+ if-no-files-found: error
115
+ retention-days: 14
116
+
117
+ test:
118
+ name: Installed wheel / ${{ matrix.name }} / Python ${{ matrix.python }}
119
+ needs: [prepare, build]
120
+ runs-on: ${{ matrix.runner }}
121
+ timeout-minutes: 20
122
+ strategy:
123
+ fail-fast: false
124
+ matrix: ${{ fromJSON(needs.prepare.outputs.tests) }}
125
+ defaults:
126
+ run:
127
+ shell: bash
128
+ steps:
129
+ - uses: actions/checkout@v4
130
+ - uses: actions/setup-python@v5
131
+ with:
132
+ python-version: ${{ matrix.python }}
133
+ - uses: astral-sh/setup-uv@v6
134
+ - uses: actions/download-artifact@v4
135
+ with:
136
+ name: gpyui-dist-${{ matrix.name }}
137
+ path: dist
138
+ - name: Install Linux native runtime and test tools
139
+ if: runner.os == 'Linux'
140
+ run: |
141
+ sudo apt-get update
142
+ sudo apt-get install -y xvfb xdotool imagemagick mesa-vulkan-drivers \
143
+ libvulkan1 libfontconfig1 libfreetype6 libxcb1 libxkbcommon0 \
144
+ libxkbcommon-x11-0 fonts-dejavu-core
145
+ - name: Install and verify the wheel without rebuilding
146
+ run: python scripts/wheel-ci.py install
147
+ - name: Run Python and bridge tests
148
+ run: python scripts/wheel-ci.py test
149
+ - name: Select software Vulkan driver
150
+ if: runner.os == 'Linux'
151
+ run: |
152
+ python - <<'PYTHON'
153
+ import os
154
+ from pathlib import Path
155
+ drivers = list(Path('/usr/share/vulkan/icd.d').glob('lvp*.json'))
156
+ assert len(drivers) == 1, drivers
157
+ with open(os.environ['GITHUB_ENV'], 'a') as output:
158
+ print(f'VK_DRIVER_FILES={drivers[0]}', file=output)
159
+ PYTHON
160
+ - name: Run Linux window interaction tests
161
+ if: runner.os == 'Linux'
162
+ run: scripts/test-native.sh
163
+ - name: Run native window, state and lifecycle smoke test
164
+ if: runner.os != 'Linux'
165
+ run: python scripts/wheel-ci.py native
166
+ - uses: actions/upload-artifact@v4
167
+ if: failure()
168
+ with:
169
+ name: native-test-failure-${{ matrix.name }}-${{ matrix.python }}
170
+ path: artifacts/
171
+ retention-days: 7
172
+
173
+ release:
174
+ name: GitHub release with verified wheels
175
+ if: (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) || (github.event_name == 'workflow_dispatch' && inputs.github_release)
176
+ needs: [prepare, build, test]
177
+ runs-on: ubuntu-24.04
178
+ permissions:
179
+ contents: write
180
+ steps:
181
+ - uses: actions/checkout@v4
182
+ - uses: actions/download-artifact@v4
183
+ with:
184
+ pattern: gpyui-dist-*
185
+ merge-multiple: true
186
+ path: dist
187
+ - name: Create checksums and release notes
188
+ run: python scripts/wheel-ci.py release
189
+ - name: Publish GitHub prerelease
190
+ env:
191
+ GH_TOKEN: ${{ github.token }}
192
+ TAG: v${{ needs.prepare.outputs.version }}
193
+ run: |
194
+ gh release create "$TAG" --verify-tag --draft --prerelease \
195
+ --title "gpyui $TAG" --notes-file artifacts/release-notes.md
196
+ gh release upload "$TAG" dist/*
197
+ gh release edit "$TAG" --draft=false
198
+
199
+ publish:
200
+ name: Publish tested distributions to PyPI
201
+ if: github.event_name == 'workflow_dispatch' && inputs.publish
202
+ needs: [prepare, build, test]
203
+ runs-on: ubuntu-24.04
204
+ environment: pypi
205
+ permissions:
206
+ id-token: write
207
+ steps:
208
+ - uses: actions/download-artifact@v4
209
+ with:
210
+ pattern: gpyui-dist-*
211
+ merge-multiple: true
212
+ path: dist
213
+ - uses: astral-sh/setup-uv@v6
214
+ - run: uv publish --trusted-publishing always
gpyui-0.1.0/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+ target/
12
+ *.so
13
+ *.pyd
14
+ .pytest_cache/
15
+ .ruff_cache/
16
+ artifacts/
17
+ .venv-docs/
18
+ .venv-tools/
19
+ site/
20
+ .cache/
@@ -0,0 +1 @@
1
+ 3.12
gpyui-0.1.0/AGENTS.md ADDED
@@ -0,0 +1,17 @@
1
+ # Project intent
2
+
3
+ The user's goal is a reusable Python UI toolkit exposing Longbridge's GPUI Kit
4
+ components, enabling complete native desktop apps written entirely in Python,
5
+ comparable in use to Tkinter and other Python UI libraries. The working name is
6
+ gpyui; package-name availability has not been checked.
7
+
8
+ Keep Rust behind the Python API. Rust owns native windows, rendering, component
9
+ state and text editing; Python authors own composition and application behavior.
10
+ Use actual GPUI Kit components and verify wrappers against the pinned upstream
11
+ sources. The column, label, text input and button are the first milestone, not
12
+ the final scope or a demo-specific backend.
13
+
14
+ Extend component coverage and Python access to layout, styling, events, state and
15
+ application lifecycle as the toolkit develops. Distinguish implemented support
16
+ from planned capabilities. See README.md and docs/architecture.md for the current
17
+ API, source evidence and constraints.