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.
- gpyui-0.1.0/.github/workflows/checks.yml +27 -0
- gpyui-0.1.0/.github/workflows/docs.yml +79 -0
- gpyui-0.1.0/.github/workflows/release.yml +214 -0
- gpyui-0.1.0/.gitignore +20 -0
- gpyui-0.1.0/.python-version +1 -0
- gpyui-0.1.0/AGENTS.md +17 -0
- gpyui-0.1.0/Cargo.lock +9014 -0
- gpyui-0.1.0/Cargo.toml +26 -0
- gpyui-0.1.0/PKG-INFO +258 -0
- gpyui-0.1.0/README.md +249 -0
- gpyui-0.1.0/docs/architecture.md +204 -0
- gpyui-0.1.0/docs/component-coverage.md +100 -0
- gpyui-0.1.0/docs/components/accordion.md +47 -0
- gpyui-0.1.0/docs/components/alert.md +36 -0
- gpyui-0.1.0/docs/components/area-chart.md +36 -0
- gpyui-0.1.0/docs/components/attachment.md +39 -0
- gpyui-0.1.0/docs/components/avatar.md +38 -0
- gpyui-0.1.0/docs/components/badge.md +35 -0
- gpyui-0.1.0/docs/components/bar-chart.md +36 -0
- gpyui-0.1.0/docs/components/breadcrumb.md +40 -0
- gpyui-0.1.0/docs/components/bubble.md +36 -0
- gpyui-0.1.0/docs/components/button.md +42 -0
- gpyui-0.1.0/docs/components/calendar.md +42 -0
- gpyui-0.1.0/docs/components/candlestick-chart.md +40 -0
- gpyui-0.1.0/docs/components/carousel.md +44 -0
- gpyui-0.1.0/docs/components/charts/index.md +56 -0
- gpyui-0.1.0/docs/components/checkbox.md +40 -0
- gpyui-0.1.0/docs/components/clipboard.md +38 -0
- gpyui-0.1.0/docs/components/collapsible.md +45 -0
- gpyui-0.1.0/docs/components/color-picker.md +42 -0
- gpyui-0.1.0/docs/components/column.md +38 -0
- gpyui-0.1.0/docs/components/combobox.md +45 -0
- gpyui-0.1.0/docs/components/container.md +38 -0
- gpyui-0.1.0/docs/components/content/index.md +96 -0
- gpyui-0.1.0/docs/components/data/index.md +46 -0
- gpyui-0.1.0/docs/components/date-picker.md +42 -0
- gpyui-0.1.0/docs/components/date-time-and-color/index.md +46 -0
- gpyui-0.1.0/docs/components/description-list.md +38 -0
- gpyui-0.1.0/docs/components/dialog.md +50 -0
- gpyui-0.1.0/docs/components/disclosure/index.md +36 -0
- gpyui-0.1.0/docs/components/editor.md +44 -0
- gpyui-0.1.0/docs/components/empty.md +35 -0
- gpyui-0.1.0/docs/components/feedback/index.md +76 -0
- gpyui-0.1.0/docs/components/group-box.md +41 -0
- gpyui-0.1.0/docs/components/hover-card.md +42 -0
- gpyui-0.1.0/docs/components/html.md +38 -0
- gpyui-0.1.0/docs/components/icon.md +38 -0
- gpyui-0.1.0/docs/components/index.md +775 -0
- gpyui-0.1.0/docs/components/inputs/index.md +56 -0
- gpyui-0.1.0/docs/components/kbd.md +38 -0
- gpyui-0.1.0/docs/components/label.md +36 -0
- gpyui-0.1.0/docs/components/layout/index.md +86 -0
- gpyui-0.1.0/docs/components/line-chart.md +40 -0
- gpyui-0.1.0/docs/components/link.md +38 -0
- gpyui-0.1.0/docs/components/list.md +44 -0
- gpyui-0.1.0/docs/components/markdown.md +40 -0
- gpyui-0.1.0/docs/components/marker.md +35 -0
- gpyui-0.1.0/docs/components/message.md +35 -0
- gpyui-0.1.0/docs/components/navigation/index.md +56 -0
- gpyui-0.1.0/docs/components/number-input.md +44 -0
- gpyui-0.1.0/docs/components/otp-input.md +44 -0
- gpyui-0.1.0/docs/components/overlays/index.md +56 -0
- gpyui-0.1.0/docs/components/pagination.md +43 -0
- gpyui-0.1.0/docs/components/pie-chart.md +40 -0
- gpyui-0.1.0/docs/components/popover.md +42 -0
- gpyui-0.1.0/docs/components/progress-circle.md +35 -0
- gpyui-0.1.0/docs/components/progress.md +39 -0
- gpyui-0.1.0/docs/components/radio-group.md +44 -0
- gpyui-0.1.0/docs/components/radio.md +44 -0
- gpyui-0.1.0/docs/components/rating.md +43 -0
- gpyui-0.1.0/docs/components/resizable.md +44 -0
- gpyui-0.1.0/docs/components/row.md +38 -0
- gpyui-0.1.0/docs/components/scroll.md +40 -0
- gpyui-0.1.0/docs/components/select.md +45 -0
- gpyui-0.1.0/docs/components/selection/index.md +96 -0
- gpyui-0.1.0/docs/components/separator.md +35 -0
- gpyui-0.1.0/docs/components/sheet.md +55 -0
- gpyui-0.1.0/docs/components/shimmer.md +38 -0
- gpyui-0.1.0/docs/components/sidebar.md +40 -0
- gpyui-0.1.0/docs/components/skeleton.md +36 -0
- gpyui-0.1.0/docs/components/slider.md +47 -0
- gpyui-0.1.0/docs/components/spinner.md +36 -0
- gpyui-0.1.0/docs/components/status-bar.md +36 -0
- gpyui-0.1.0/docs/components/stepper.md +40 -0
- gpyui-0.1.0/docs/components/switch.md +40 -0
- gpyui-0.1.0/docs/components/table.md +49 -0
- gpyui-0.1.0/docs/components/tabs.md +44 -0
- gpyui-0.1.0/docs/components/tag.md +35 -0
- gpyui-0.1.0/docs/components/text-and-buttons/index.md +76 -0
- gpyui-0.1.0/docs/components/text-area.md +40 -0
- gpyui-0.1.0/docs/components/text-input.md +43 -0
- gpyui-0.1.0/docs/components/time-field.md +42 -0
- gpyui-0.1.0/docs/components/toggle.md +40 -0
- gpyui-0.1.0/docs/components/toolbar.md +42 -0
- gpyui-0.1.0/docs/components/tooltip.md +42 -0
- gpyui-0.1.0/docs/components/tree.md +49 -0
- gpyui-0.1.0/docs/contributing-docs.md +85 -0
- gpyui-0.1.0/docs/examples/gallery.md +29 -0
- gpyui-0.1.0/docs/examples/trading.md +47 -0
- gpyui-0.1.0/docs/guide/events.md +75 -0
- gpyui-0.1.0/docs/guide/install.md +68 -0
- gpyui-0.1.0/docs/guide/layout.md +68 -0
- gpyui-0.1.0/docs/guide/state.md +61 -0
- gpyui-0.1.0/docs/guide/styling.md +50 -0
- gpyui-0.1.0/docs/index.md +58 -0
- gpyui-0.1.0/docs/reference/application.md +67 -0
- gpyui-0.1.0/docs/reference/core.md +62 -0
- gpyui-0.1.0/docs/releases.md +115 -0
- gpyui-0.1.0/docs/screenshots/components/accordion.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/alert.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/area-chart.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/attachment.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/avatar.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/badge.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/bar-chart.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/breadcrumb.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/bubble.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/button.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/calendar.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/candlestick-chart.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/carousel.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/checkbox.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/clipboard.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/collapsible.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/color-picker.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/column.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/combobox.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/container.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/date-picker.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/description-list.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/dialog.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/editor.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/empty.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/group-box.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/hover-card.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/html.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/icon.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/kbd.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/label.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/line-chart.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/link.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/list.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/markdown.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/marker.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/message.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/number-input.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/otp-input.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/pagination.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/pie-chart.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/popover.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/progress-circle.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/progress.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/radio-group.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/radio.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/rating.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/resizable.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/row.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/scroll.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/select.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/separator.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/sheet.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/shimmer.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/sidebar.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/skeleton.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/slider.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/spinner.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/status-bar.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/stepper.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/switch.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/table.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/tabs.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/tag.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/text-area.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/text-input.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/time-field.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/toggle.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/toolbar.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/tooltip.png +0 -0
- gpyui-0.1.0/docs/screenshots/components/tree.png +0 -0
- gpyui-0.1.0/docs/screenshots/gallery-light.png +0 -0
- gpyui-0.1.0/docs/screenshots/workspace-dark.png +0 -0
- gpyui-0.1.0/docs/screenshots/workspace-light.png +0 -0
- gpyui-0.1.0/docs/screenshots/workspace-stream.gif +0 -0
- gpyui-0.1.0/docs/stylesheets/catalog.css +39 -0
- gpyui-0.1.0/docs/upstream-lock.json +24 -0
- gpyui-0.1.0/docs/validation.md +214 -0
- gpyui-0.1.0/examples/async_binding.py +32 -0
- gpyui-0.1.0/examples/component_catalog.py +379 -0
- gpyui-0.1.0/examples/component_preview.py +70 -0
- gpyui-0.1.0/examples/gallery.py +162 -0
- gpyui-0.1.0/examples/hello.py +14 -0
- gpyui-0.1.0/examples/market.py +72 -0
- gpyui-0.1.0/examples/workspace.py +221 -0
- gpyui-0.1.0/justfile +68 -0
- gpyui-0.1.0/lefthook.yml +17 -0
- gpyui-0.1.0/overrides/404.html +7 -0
- gpyui-0.1.0/pyproject.toml +53 -0
- gpyui-0.1.0/rust-toolchain.toml +4 -0
- gpyui-0.1.0/scripts/capture-components.py +95 -0
- gpyui-0.1.0/scripts/check-docs-site.py +53 -0
- gpyui-0.1.0/scripts/generate-docs.py +273 -0
- gpyui-0.1.0/scripts/generate-wheel-notices.py +148 -0
- gpyui-0.1.0/scripts/native-display.sh +34 -0
- gpyui-0.1.0/scripts/record-workspace.py +216 -0
- gpyui-0.1.0/scripts/test-native.sh +39 -0
- gpyui-0.1.0/scripts/wheel-build-deps.sh +10 -0
- gpyui-0.1.0/scripts/wheel-ci.py +221 -0
- gpyui-0.1.0/scripts/workspace-env.sh +15 -0
- gpyui-0.1.0/src/bridge.rs +253 -0
- gpyui-0.1.0/src/gpyui/THIRD_PARTY_NOTICES.txt +29572 -0
- gpyui-0.1.0/src/gpyui/__init__.py +153 -0
- gpyui-0.1.0/src/gpyui/_core.pyi +12 -0
- gpyui-0.1.0/src/gpyui/application.py +313 -0
- gpyui-0.1.0/src/gpyui/controls.py +255 -0
- gpyui-0.1.0/src/gpyui/py.typed +0 -0
- gpyui-0.1.0/src/gpyui/state.py +33 -0
- gpyui-0.1.0/src/gpyui/widgets.py +737 -0
- gpyui-0.1.0/src/kit.rs +1210 -0
- gpyui-0.1.0/src/lib.rs +17 -0
- gpyui-0.1.0/src/protocol.rs +176 -0
- gpyui-0.1.0/src/view.rs +753 -0
- gpyui-0.1.0/tests/native_app.py +104 -0
- gpyui-0.1.0/tests/native_catalog.py +63 -0
- gpyui-0.1.0/tests/native_smoke.py +44 -0
- gpyui-0.1.0/tests/test_bridge.py +74 -0
- gpyui-0.1.0/tests/test_components_native.py +166 -0
- gpyui-0.1.0/tests/test_controls.py +149 -0
- gpyui-0.1.0/tests/test_market.py +37 -0
- gpyui-0.1.0/tests/test_native.py +150 -0
- gpyui-0.1.0/tests/test_widgets.py +161 -0
- gpyui-0.1.0/uv.lock +450 -0
- 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.
|