Skip to content

Commit

Permalink
pyo3 bindings
Browse files Browse the repository at this point in the history
Advantages
==========

- Can do the entire loading in one shot in pure rust from a python iterable.
- Work using rust semantics.
- Really just works.
- Only requires a pyi for type declarations (?).

Drawbacks
=========

- Likely slower than cffi for pypy, but unlikely to be slower than the
  slog of pure python.
- Graal don't work in tox.
  • Loading branch information
masklinn committed Oct 5, 2024
1 parent 40e44d1 commit 6664442
Show file tree
Hide file tree
Showing 14 changed files with 784 additions and 7 deletions.
41 changes: 41 additions & 0 deletions .github/workflows/pychecks.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: py checks

on:
pull_request:
push:
branches:
- main

permissions:
contents: read

jobs:
checks:
runs-on: ubuntu-latest
steps:
- name: Checkout working copy
uses: actions/checkout@v4
- name: ruff check
uses: chartboost/ruff-action@v1
with:
args: check
- name: ruff format
if: always()
uses: chartboost/ruff-action@v1
with:
args: format --diff
- name: Set up Python
id: setup_python
if: always()
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install mypy
id: install_mypy
if: ${{ always() && steps.setup_python.conclusion == 'success' }}
run: |
python -mpip install --upgrade pip
python -mpip install mypy pytest types-PyYaml
- name: mypy
if: ${{ always() && steps.install_mypy.conclusion == 'success' }}
run: mypy --strict .
185 changes: 185 additions & 0 deletions .github/workflows/pyo3-wheels.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# This file is autogenerated by maturin v1.7.4
# To update, run
#
# maturin generate-ci --zig github
#
name: build wheels

on:
push:
branches:
- main
- master
tags:
- '*'
pull_request:
workflow_dispatch:

permissions:
contents: read

env:
BASE: --out dist -m ua-parser-py/Cargo.toml
COMMON: --release --out dist -m ua-parser-py/Cargo.toml -i python

jobs:
linux:
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
- "3.x"
- "pypy-3.10"
- "graalpy-24"
platform:
- target: x86_64
#- target: x86
- target: aarch64
#- target: armv7
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: ${{ env.COMMON }} --zig
sccache: 'true'
manylinux: auto
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-linux-${{ matrix.platform.target }}-${{ matrix.python-version }}
path: dist/*

musllinux:
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
- "3.x"
- "pypy-3.10"
- "graalpy-24"
platform:
- target: x86_64
# - target: x86
- target: aarch64
#- target: armv7
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: ${{ env.BASE }} --release
sccache: 'true'
manylinux: musllinux_1_2
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-musllinux-${{ matrix.platform.target }}-${{ matrix.python-version }}
path: dist/*

windows:
runs-on: windows-latest
strategy:
matrix:
python-version:
- "3.x"
- "pypy-3.10"
# if enabled, fails with "GraalPy version 24 with arch x64
# not found" despite graal having windows artefacts
#- "graalpy-24"
platform:
- target: x64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: ${{ env.COMMON }}
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-windows-${{ matrix.platform.target }}-${{ matrix.python-version }}
path: dist

macos:
runs-on: macos-14
strategy:
matrix:
python-version:
- "3.x"
- "pypy-3.10"
- "graalpy-24"
platform:
- target: x86_64
- target: aarch64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: ${{ env.COMMON }}
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-macos-${{ matrix.platform.target }}-${{ matrix.python-version }}
path: dist

sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: ${{ env.BASE }}
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: wheels-sdist
path: dist

release:
name: Release
runs-on: ubuntu-latest
if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
needs: [linux, musllinux, windows, macos, sdist]
permissions:
# Use to sign the release artifacts
id-token: write
# Used to upload release artifacts
contents: write
# Used to generate artifact attestation
attestations: write
steps:
- uses: actions/download-artifact@v4
- name: Generate artifact attestation
uses: actions/attest-build-provenance@v1
with:
subject-path: 'wheels-*/*'
- name: Publish to PyPI
if: "startsWith(github.ref, 'refs/tags/')"
uses: PyO3/maturin-action@v1
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
with:
command: upload
args: --non-interactive --skip-existing wheels-*/*
52 changes: 52 additions & 0 deletions .github/workflows/pytests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: py tests

on:
pull_request:
push:
branches:
- main

permissions:
contents: read

jobs:
tests:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "pypy-3.10"
- "graalpy-24"
steps:
- name: Checkout working copy
uses: actions/checkout@v4
with:
submodules: true
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install test dependencies
run: |
python -mpip install --upgrade pip
# cyaml is outright broken on pypy
#if ! ${{ startsWith(matrix.python-version, 'pypy-') }}; then
# if binary wheels are not available for the current
# package install libyaml-dev so we can install pyyaml
# from source
if ! pip download --only-binary pyyaml > /dev/null 2>&1; then
sudo apt install libyaml-dev
fi
#fi
python -mpip install pytest pyyaml
- name: install package
run: pip install ./ua-parser-py
- name: run tests
run: pytest -v -Werror -ra .
11 changes: 5 additions & 6 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
name: Rust

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
push:
branches:
- main

env:
CARGO_TERM_COLOR: always

jobs:
checks:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Build
run: cargo build --verbose
- name: Check
run: cargo check
- name: Format
run: cargo fmt --check
- name: clippy
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ Cargo.lock
*.dSYM/
regex-filtered/re2/flake.lock
regex-filtered/re2/bench
.tox/
__pycache__
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = ["regex-filtered", "ua-parser"]
members = ["regex-filtered", "ua-parser", "ua-parser-py"]
resolver = "2"

[profile.release]
Expand Down
13 changes: 13 additions & 0 deletions ua-parser-py/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[package]
name = "ua_parser_rs"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
name = "ua_parser_rs"
crate-type = ["cdylib"]

[dependencies]
pyo3 = { version = "0.22", features = ["extension-module", "abi3", "abi3-py38"] }
ua-parser = { version = "0.2.0", path = "../ua-parser" }
15 changes: 15 additions & 0 deletions ua-parser-py/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[build-system]
requires = ["maturin>=1.5,<2.0"]
build-backend = "maturin"

[project]
name = "ua_parser_rs"
requires-python = ">=3.8"
classifiers = [
"Programming Language :: Rust",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
]
dynamic = ["version"]
[tool.maturin]
features = ["pyo3/extension-module"]
Loading

0 comments on commit 6664442

Please sign in to comment.