Skip to content
Merged
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
130 changes: 130 additions & 0 deletions .github/workflows/build-semantic-text-splitter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `linux` job of
# https://github.com/benbrandt/text-splitter/blob/v0.32.0/.github/workflows/python.yml
name: Build semantic-text-splitter wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'semantic-text-splitter version to build (git tag without leading v, e.g. 0.32.0)'
required: true
default: '0.32.0'
pull_request:
paths:
- '.github/workflows/build-semantic-text-splitter.yml'

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

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

env:
# `inputs.version` is empty on pull_request events; default to 0.32.0 there.
SEMANTIC_TEXT_SPLITTER_VERSION: ${{ inputs.version || '0.32.0' }}
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

jobs:
setup:
uses: $/.github/workflows/_setup.yml

build_wheels:
needs: [setup]
name: Build semantic-text-splitter ${{ inputs.version || '0.32.0' }} ${{ matrix.tag }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 120
strategy:
fail-fast: false
matrix:
include:
# bindings/python/Cargo.toml's `abi3` feature (pyo3/abi3-py310) is on
# by default, so one abi3 wheel serves every GIL-ful interpreter;
# pyo3 disables abi3 under Py_GIL_DISABLED, giving the free-threaded
# build its own wheel (upstream's own python.yml does the same, via
# a separate `-i python3.14t` maturin-action step). The `abi3t`
# feature (pyo3/abi3t-py315) targets an unreleased CPython and is
# out of scope for this repo's floor.
- tag: cp310-abi3
# Built on cp310 -- the oldest interpreter the abi3 tag claims --
# and re-tested on the newer ones via find_compatible_wheel.
build: >-
cp310-manylinux_riscv64 cp311-manylinux_riscv64
cp312-manylinux_riscv64 cp313-manylinux_riscv64
cp314-manylinux_riscv64
test-requires: pytest tokenizers tree-sitter-python
test-command: cd bindings/python && python -m pytest -v tests
- tag: cp314t
build: cp314t-manylinux_riscv64
test-requires: pytest tokenizers
# tree-sitter-python ships no cp314t wheel anywhere upstream (only
# cp310-abi3), and its sdist is missing src/scanner.c (present in
# its git tag, so this reproduces on any arch, not just riscv64) --
# building it here fails at import with "undefined symbol:
# tree_sitter_python_external_scanner_create". test_integration.py
# imports it at module scope, so the whole suite is uncollectable
# on this interpreter (gotcha 149's shape); the compiled-extension
# assertion below is the only check this leg gets.
test-command: 'true'

steps:
- name: Checkout text-splitter ${{ env.SEMANTIC_TEXT_SPLITTER_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: benbrandt/text-splitter
ref: v${{ env.SEMANTIC_TEXT_SPLITTER_VERSION }}
persist-credentials: false

- name: Stage the licence beside semantic-text-splitter's pyproject.toml
# maturin globs LICEN[CS]E* relative to the pyproject directory, which
# is bindings/python/ in this workspace -- the licence file lives at
# the repo root instead (primp/moyopy hit the same gap).
run: cp LICENSE.txt bindings/python/

- name: Build wheels
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
package-dir: bindings/python
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 }}
# semantic-text-splitter 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
# tree-sitter-python's own sdist (no riscv64 wheel on public PyPI)
# builds clean but is missing the external scanner's symbols; our
# registry already carries a correctly-built riscv64 wheel for it
# (cp310-abi3 leg only -- see matrix.test-requires for cp314t).
CIBW_ENVIRONMENT_LINUX: >-
PATH="$PATH:$HOME/.cargo/bin"
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
CIBW_TEST_REQUIRES: ${{ matrix.test-requires }}
CIBW_TEST_SOURCES: bindings/python/tests
CIBW_TEST_COMMAND: >-
python -c "import semantic_text_splitter, importlib.metadata as md;
files = md.files('semantic-text-splitter');
assert any(str(p).endswith('.so') for p in files), files;
assert any(str(p).endswith('licenses/LICENSE.txt') for p in files)" &&
${{ matrix.test-command }}

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

publish:
name: Publish semantic-text-splitter ${{ inputs.version || '0.32.0' }}
needs: [setup, build_wheels]
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
with:
artifact-pattern: semantic-text-splitter-${{ inputs.version || '0.32.0' }}-*-manylinux_riscv64