Skip to content
Open
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
115 changes: 115 additions & 0 deletions .github/workflows/build-common-expression-language.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# Based on upstream's own CI (the `test` and `linux` jobs):
# https://github.com/hardbyte/python-common-expression-language/blob/v0.8.0/.github/workflows/ci.yml
name: Build common-expression-language wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/common-expression-language.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-common-expression-language.yml'
- 'docs/packages/common-expression-language.yaml'
push:
branches: [main]
paths:
- '.github/workflows/build-common-expression-language.yml'
- 'docs/packages/common-expression-language.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: common-expression-language
version: ${{ inputs.version }}

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build common-expression-language ${{ matrix.version }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
python: ["cp312", "cp313", "cp314", "cp314t", "cp315", "cp315t"]

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

steps:
- name: Checkout common-expression-language v${{ env.CEL_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: hardbyte/python-common-expression-language
ref: v${{ env.CEL_VERSION }}
persist-credentials: false

- name: Checkout python-wheels
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
path: python-wheels
persist-credentials: false

- name: Patch common-expression-language source
run: git apply python-wheels/patches/common-expression-language/${{ env.CEL_VERSION }}/*.patch

- name: Build and test wheel
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
only: ${{ matrix.python }}-manylinux_riscv64
env:
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
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"
CIBW_TEST_REQUIRES: pytest mktestdocs
CIBW_TEST_SOURCES: tests docs pyproject.toml
# The two deselected tests assert fixed wall-clock budgets the riscv64 runner misses by ~2x.
CIBW_TEST_COMMAND: >-
python -c "import cel.cel as ext; assert ext.__file__.endswith('.so'), ext.__file__" &&
python -m pytest --verbose --tb=short
--deselect tests/test_functions.py::TestFunctionPerformance::test_complex_function_call_performance
--deselect tests/test_functions.py::TestFunctionPerformance::test_function_call_with_large_data

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: common-expression-language-${{ env.CEL_VERSION }}-${{ matrix.python }}-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error

publish:
name: Publish common-expression-language ${{ 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: common-expression-language-${{ matrix.version }}-*-manylinux_riscv64
6 changes: 6 additions & 0 deletions docs/packages/common-expression-language.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package-name: common-expression-language
source-code: https://github.com/hardbyte/python-common-expression-language
license: Apache-2.0
versions:
- version: 0.8.0
patched: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ludovic Henry <git@ludovic.dev>
Date: Sun, 4 Oct 2026 11:30:00 +0000
Subject: [PATCH] cli: import Annotated from typing, not typing_extensions

Upstream-Status: Backport [https://github.com/hardbyte/python-common-expression-language/commit/212cf00c48b6dd1a7fe35ae092eee414b1825f01]

cel/__init__.py imports cel.cli, which imports Annotated from
typing_extensions. typing_extensions is not a declared dependency; it
used to arrive transitively through typer, but typer 0.21.2 dropped it,
so `import cel` fails with "No module named 'typing_extensions'" in any
clean environment. This reproduces on every architecture, not just
riscv64.

Upstream fixed it in 212cf00 ("Fix `import cel` failing in a clean
install", #44, released in 0.10.0) by importing Annotated from the
standard library's typing module (Python >= 3.9; the package requires
>= 3.11). This backports the python/cel/cli.py hunk of that commit.

Signed-off-by: Ludovic Henry <git@ludovic.dev>
---
python/cel/cli.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/python/cel/cli.py b/python/cel/cli.py
index 22ea1e1..216cc38 100644
--- a/python/cel/cli.py
+++ b/python/cel/cli.py
@@ -16,7 +16,7 @@ import sys
import time
from importlib.metadata import PackageNotFoundError, version
from pathlib import Path
-from typing import Any, Dict, Optional, Tuple
+from typing import Annotated, Any, Dict, Optional, Tuple

import typer

@@ -35,7 +35,6 @@ from rich.console import Console
from rich.panel import Panel
from rich.syntax import Syntax
from rich.table import Table
-from typing_extensions import Annotated

# Import directly from relative modules to avoid circular imports
from .cel import Context, evaluate
--
2.43.0
Loading