Skip to content

Commit f4101ba

Browse files
committed
feat: Add Python bindings
1 parent c80cdf7 commit f4101ba

23 files changed

+2129
-36
lines changed

.github/workflows/bindings.yml renamed to .github/workflows/c-bindings.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ on:
22
release:
33
types:
44
- published
5-
name: Publish bindings
5+
name: Publish C bindings
66
jobs:
77
build-binaries:
88
if: startsWith(github.ref_name, 'accesskit_c-v')

.github/workflows/ci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ jobs:
2828
clang-format-version: 15
2929
check-path: bindings/c
3030

31+
- name: black --check
32+
uses: psf/black@stable
33+
3134
test:
3235
runs-on: ${{ matrix.os }}
3336
strategy:

.github/workflows/python-bindings.yml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
on:
2+
push:
3+
tags:
4+
- 'accesskit_python-v*'
5+
6+
name: Publish Python bindings
7+
8+
jobs:
9+
build-wheels:
10+
runs-on: ${{ matrix.os }}
11+
strategy:
12+
matrix:
13+
include:
14+
- os: macos-latest
15+
python-arch: x64
16+
rust-target: x86_64
17+
- os: macos-latest
18+
python-arch: x64
19+
rust-target: universal2-apple-darwin
20+
- os: ubuntu-latest
21+
python-arch: x64
22+
rust-target: x86_64
23+
- os: ubuntu-latest
24+
python-arch: x64
25+
rust-target: i686
26+
skip-wheel-installation: true
27+
- os: windows-latest
28+
python-arch: x64
29+
rust-target: x64
30+
- os: windows-latest
31+
python-arch: x86
32+
rust-target: x86
33+
34+
steps:
35+
- uses: actions/checkout@v3
36+
- uses: actions/setup-python@v4
37+
with:
38+
python-version: 3.7
39+
architecture: ${{ matrix.python-arch }}
40+
- uses: dtolnay/rust-toolchain@stable
41+
- name: Build wheel
42+
uses: PyO3/maturin-action@v1
43+
with:
44+
target: ${{ matrix.rust-target }}
45+
manylinux: auto
46+
args: --release --out dist --sdist
47+
- name: Test wheel installation
48+
if: matrix.skip-wheel-installation != true
49+
run: |
50+
pip install accesskit --no-index --find-links dist --force-reinstall
51+
python -c "import accesskit"
52+
- name: Upload wheel
53+
uses: actions/upload-artifact@v3
54+
with:
55+
name: wheels
56+
path: dist
57+
58+
release:
59+
name: Release
60+
runs-on: ubuntu-latest
61+
if: "startsWith(github.ref, 'refs/tags/')"
62+
needs: [build-wheels]
63+
steps:
64+
- uses: actions/download-artifact@v3
65+
with:
66+
name: wheels
67+
- uses: actions/setup-python@v4
68+
with:
69+
python-version: 3.9
70+
- name: Publish to PyPI
71+
env:
72+
TWINE_USERNAME: __token__
73+
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
74+
run: |
75+
pip install --upgrade twine
76+
twine upload --skip-existing *

Cargo.lock

Lines changed: 41 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ members = [
88
"platforms/windows",
99
"platforms/winit",
1010
"bindings/c",
11+
"bindings/python",
1112
]
1213
default-members = [
1314
"common",
1415
"consumer",
1516
"platforms/winit",
1617
"bindings/c",
18+
"bindings/python",
1719
]
1820

1921
[profile.release]

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ While we expect GUI toolkit developers to eventually integrate AccessKit into th
5656

5757
### Language bindings
5858

59-
UI toolkit developers who merely want to use AccessKit should not be required to use Rust directly. In addition to a direct Rust API, AccessKit provides a C API covering both the core data structures and all platform adapters. This C API can be used from a variety of languages. The Rust source for the C bindings is in [the `bindings/c directory`](https://github.com/AccessKit/accesskit/tree/main/bindings/c). The AccessKit project also provides a pre-built package, including a header file, both dynamic and static libraries, and sample code, for the C API, so toolkit developers won't need to deal with Rust at all. The latest pre-built package can be found in [AccessKit's GitHub releases](https://github.com/AccessKit/accesskit/releases); search for the name "accesskit_c".
59+
UI toolkit developers who merely want to use AccessKit should not be required to use Rust directly.
60+
61+
AccessKit provides a C API covering both the core data structures and all platform adapters. This C API can be used from a variety of languages. The Rust source for the C bindings is in [the `bindings/c directory`](https://github.com/AccessKit/accesskit/tree/main/bindings/c). The AccessKit project also provides a pre-built package, including a header file, both dynamic and static libraries, and sample code, for the C API, so toolkit developers won't need to deal with Rust at all. The latest pre-built package can be found in [AccessKit's GitHub releases](https://github.com/AccessKit/accesskit/releases); search for the name "accesskit_c".
62+
63+
Bindings for the Python programming language are also available. Rust source code is in [the `bindings/python directory`](https://github.com/AccessKit/accesskit/tree/main/bindings/python). Releases can be found on [PyPI](https://pypi.org/project/accesskit/) and can be included in your project using `pip`.
6064

6165
While many languages can use a C API, we also plan to provide libraries that make it easier to safely use AccessKit from languages other than Rust and C. In particular, we're planning to provide such a library for Java and other JVM-based languages.
6266

bindings/python/.cargo/config.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[target.aarch64-apple-darwin]
2+
rustflags = [
3+
"-C", "link-arg=-undefined",
4+
"-C", "link-arg=dynamic_lookup",
5+
]
6+
7+
[target.x86_64-apple-darwin]
8+
rustflags = [
9+
"-C", "link-arg=-undefined",
10+
"-C", "link-arg=dynamic_lookup",
11+
]

bindings/python/Cargo.toml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
[package]
2+
name = "accesskit_python"
3+
version = "0.1.0"
4+
authors = ["Arnold Loubriat <[email protected]>"]
5+
license = "MIT OR Apache-2.0"
6+
description = "Python bindings to the AccessKit library"
7+
readme = "README.md"
8+
publish = false
9+
edition = "2021"
10+
11+
[lib]
12+
name = "accesskit"
13+
crate-type = ["cdylib"]
14+
doc = false
15+
16+
[features]
17+
extension-module = ["pyo3/extension-module"]
18+
19+
[dependencies]
20+
accesskit = { version = "0.12.0", path = "../../common", features = ["pyo3"] }
21+
pyo3 = { version = "0.20", features = ["abi3-py37", "multiple-pymethods"] }
22+
23+
[target.'cfg(target_os = "windows")'.dependencies]
24+
accesskit_windows = { version = "0.15.0", path = "../../platforms/windows" }
25+
26+
[target.'cfg(target_os = "macos")'.dependencies]
27+
accesskit_macos = { version = "0.10.0", path = "../../platforms/macos" }
28+
29+
[target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))'.dependencies]
30+
accesskit_unix = { version = "0.6.0", path = "../../platforms/unix" }

bindings/python/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# AccessKit
2+
3+
These are the bindings to use AccessKit from Python.

0 commit comments

Comments
 (0)