Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions .github/workflows/build-ruff-format.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `linux` job of
# https://github.com/reflex-dev/ruff-format/blob/v0.5.4/.github/workflows/CI.yml
name: Build ruff-format wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/ruff-format.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-ruff-format.yml'
- 'docs/packages/ruff-format.yaml'
push:
branches: [main]
paths:
- '.github/workflows/build-ruff-format.yml'
- 'docs/packages/ruff-format.yaml'

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

permissions:
contents: read # to fetch code (actions/checkout)

env:
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

jobs:
setup:
uses: $/.github/workflows/_setup.yml
with:
package: ruff-format
version: ${{ inputs.version }}

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build ruff-format ${{ matrix.version }} ${{ matrix.tag }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
# tag is a real matrix dimension (not just an include-only key) so
# the two legs below update their own combination instead of
# collapsing into one (gotcha 402).
tag: [cp38-abi3, cp314t]
include:
# pyo3's abi3-py38 feature is on unconditionally (Cargo.toml), so one
# abi3 wheel serves every GIL-ful interpreter; pyo3 disables abi3
# under Py_GIL_DISABLED, giving the free-threaded build its own
# wheel (matches the cp38-abi3 + cp314-cp314t split upstream
# publishes). cp38 isn't in the manylinux_2_39_riscv64 image (it
# ships cp39-cp315), so the abi3 wheel is built on cp39 instead.
- tag: cp38-abi3
build: >-
cp39-manylinux_riscv64 cp310-manylinux_riscv64
cp311-manylinux_riscv64 cp312-manylinux_riscv64
cp313-manylinux_riscv64 cp314-manylinux_riscv64
- tag: cp314t
build: cp314t-manylinux_riscv64

env:
RUFF_FORMAT_VERSION: ${{ matrix.version }}

steps:
- name: Checkout ruff-format v${{ env.RUFF_FORMAT_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: reflex-dev/ruff-format
ref: v${{ env.RUFF_FORMAT_VERSION }}
persist-credentials: false

- name: Build wheels
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
env:
# musllinux is dropped: rustup.rs ships no riscv64 musl toolchain.
CIBW_BUILD: ${{ matrix.build }}
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# ruff-format ships no [tool.cibuildwheel], so the Rust toolchain
# its maturin backend needs is installed in-container here.
CIBW_BEFORE_ALL_LINUX: >-
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
CIBW_ENVIRONMENT_LINUX: PATH="$PATH:$HOME/.cargo/bin"
# Upstream ships no test suite at all; exercise the three bound
# functions against known-good outputs (verified against the
# upstream ruff CLI) instead of an import-only smoke test.
# ruff-format is a pure-Rust maturin project (no python-source in
# pyproject.toml), so maturin wraps the extension in a generated
# ruff_format/__init__.py ("from .ruff_format import *") rather than
# shipping it as a flat top-level .so (gotcha 308) - probe the
# compiled submodule via sys.modules, not the package's own
# __file__, which is the shim.
CIBW_TEST_COMMAND: >-
python -c "import ruff_format as m, importlib.metadata as md, sys;
assert sys.modules['ruff_format.ruff_format'].__file__.endswith('.so'), sys.modules['ruff_format.ruff_format'].__file__;
assert any(str(p).endswith('licenses/LICENSE') for p in md.files('ruff-format'));
assert m.is_valid_syntax('x = 1');
assert not m.is_valid_syntax('def f(:');
m.parse_code('x = 1');
assert m.format_string('def hello( x,y, z ):\n print( x+y+z )\n') == 'def hello(x, y, z):\n print(x + y + z)\n';
assert m.format_string('result = some_function_name(argument_one, argument_two, argument_three, argument_four)\n') == 'result = some_function_name(\n argument_one, argument_two, argument_three, argument_four\n)\n';
assert m.format_string('result = some_function_name(argument_one, argument_two, argument_three, argument_four)\n', line_width=120) == 'result = some_function_name(argument_one, argument_two, argument_three, argument_four)\n'"

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: ruff-format-${{ env.RUFF_FORMAT_VERSION }}-${{ matrix.tag }}-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error

publish:
name: Publish ruff-format ${{ matrix.version }}
needs: [setup, build_wheels]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
secrets:
app-private-key: ${{ secrets.RISEPROJECT_APP_PRIVATE_KEY }}
with:
artifact-pattern: ruff-format-${{ matrix.version }}-*-manylinux_riscv64
5 changes: 5 additions & 0 deletions docs/packages/ruff-format.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package-name: ruff-format
source-code: https://github.com/reflex-dev/ruff-format
license: MIT
versions:
- version: 0.5.4
Loading