From 3de0703b9aec61a32c8c6d93de24a5d8efbf46f2 Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Fri, 7 Nov 2025 20:15:26 +0500 Subject: [PATCH 1/5] feat: bump PyO3 to 0.27.1 for Python 3.14 support --- Cargo.lock | 128 +++++++++++++++++++++++++++++------------------------ Cargo.toml | 2 +- src/lib.rs | 2 +- 3 files changed, 72 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc148c3..7d84932 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 4 [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "basic-toml" @@ -26,12 +26,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - [[package]] name = "heck" version = "0.5.0" @@ -49,9 +43,12 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] [[package]] name = "itoa" @@ -61,21 +58,21 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "libc" -version = "0.2.170" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" @@ -120,38 +117,37 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" -version = "0.22.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884" +checksum = "37a6df7eab65fc7bee654a421404947e10a0f7085b6951bf2ea395f4659fb0cf" dependencies = [ - "cfg-if", "indoc", "libc", "memoffset", @@ -165,19 +161,18 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.22.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" +checksum = "f77d387774f6f6eec64a004eac0ed525aab7fa1966d94b42f743797b3e395afb" dependencies = [ - "once_cell", "target-lexicon", ] [[package]] name = "pyo3-ffi" -version = "0.22.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636" +checksum = "2dd13844a4242793e02df3e2ec093f540d948299a6a77ea9ce7afd8623f542be" dependencies = [ "libc", "pyo3-build-config", @@ -185,9 +180,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.22.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453" +checksum = "eaf8f9f1108270b90d3676b8679586385430e5c0bb78bb5f043f95499c821a71" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -197,9 +192,9 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.22.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe" +checksum = "70a3b2274450ba5288bc9b8c1b69ff569d1d61189d4bff38f8d22e03d17f932b" dependencies = [ "heck", "proc-macro2", @@ -219,18 +214,18 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.39" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -240,9 +235,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -251,9 +246,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rinja" @@ -302,6 +297,12 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.20" @@ -310,18 +311,28 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -330,21 +341,22 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "syn" -version = "2.0.99" +version = "2.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" dependencies = [ "proc-macro2", "quote", @@ -353,9 +365,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "test_results_parser" @@ -377,9 +389,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unindent" diff --git a/Cargo.toml b/Cargo.toml index a12ac11..4d74af2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ name = "test_results_parser" crate-type = ["cdylib"] [dependencies] -pyo3 = "0.22.2" +pyo3 = "0.27.1" quick-xml = "0.36.0" regex = "1.10.4" serde = { version = "1.0", features = ["derive"] } diff --git a/src/lib.rs b/src/lib.rs index 0d6d365..4868019 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,7 +10,7 @@ pyo3::create_exception!(test_results_parser, ParserError, PyException); /// A Python module implemented in Rust. #[pymodule] fn test_results_parser(py: Python, m: &Bound) -> PyResult<()> { - m.add("ParserError", py.get_type_bound::())?; + m.add("ParserError", py.get_type::())?; m.add_class::()?; m.add_class::()?; m.add_class::()?; From 56e01606ffaef2366bd851acb83d341e81575024 Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Fri, 7 Nov 2025 20:20:19 +0500 Subject: [PATCH 2/5] feat: add matrix testing for multiple OS and Python versions - Add support for macOS, Ubuntu, and Windows - Test Python versions 3.10, 3.11, 3.12, 3.13, and 3.14 - Add separate steps for Windows shell syntax --- .github/workflows/test.yml | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 788814d..e24359f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,30 +19,56 @@ jobs: run: make lint run_tests: - runs-on: ubuntu-latest + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] + runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/setup-python@v4 id: setup-python with: - python-version: "3.11" + python-version: ${{ matrix.python-version }} - name: Install Rust Toolchain run: rustup toolchain install stable --profile minimal --no-self-update - - name: Install requirements + - name: Install requirements (Unix) + if: runner.os != 'Windows' run: | python -m venv venv . venv/bin/activate pip install maturin pip install -r tests/requirements.txt maturin develop - - name: Install codecov cli + - name: Install requirements (Windows) + if: runner.os == 'Windows' + run: | + python -m venv venv + venv\Scripts\activate + pip install maturin + pip install -r tests/requirements.txt + maturin develop + - name: Install codecov cli (Unix) + if: runner.os != 'Windows' run: | + . venv/bin/activate + pip install --no-cache-dir git+https://github.com/codecov/codecov-cli.git@joseph/test-results-staging + - name: Install codecov cli (Windows) + if: runner.os == 'Windows' + run: | + venv\Scripts\activate pip install --no-cache-dir git+https://github.com/codecov/codecov-cli.git@joseph/test-results-staging - - name: Run tests + - name: Run tests (Unix) + if: runner.os != 'Windows' run: | . venv/bin/activate python -m pytest --cov-report=xml:coverage.xml --cov=. --junitxml=unit.junit.xml + - name: Run tests (Windows) + if: runner.os == 'Windows' + run: | + venv\Scripts\activate + python -m pytest --cov-report=xml:coverage.xml --cov=. --junitxml=unit.junit.xml - name: Upload results to codecov if: ${{ !cancelled() }} From 1a7f2c9670c04f8ba8dc28fcc50dee2f380734b9 Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Fri, 7 Nov 2025 20:21:51 +0500 Subject: [PATCH 3/5] refactor: simplify workflow and update to codecov-action - Remove separate codecov CLI installation steps - Switch from test-results-action to codecov-action@v5 - Add report_type: test-results parameter --- .github/workflows/test.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e24359f..31b2e7e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,16 +49,6 @@ jobs: pip install maturin pip install -r tests/requirements.txt maturin develop - - name: Install codecov cli (Unix) - if: runner.os != 'Windows' - run: | - . venv/bin/activate - pip install --no-cache-dir git+https://github.com/codecov/codecov-cli.git@joseph/test-results-staging - - name: Install codecov cli (Windows) - if: runner.os == 'Windows' - run: | - venv\Scripts\activate - pip install --no-cache-dir git+https://github.com/codecov/codecov-cli.git@joseph/test-results-staging - name: Run tests (Unix) if: runner.os != 'Windows' run: | @@ -72,18 +62,20 @@ jobs: - name: Upload results to codecov if: ${{ !cancelled() }} - uses: codecov/test-results-action@v1 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_ORG_TOKEN }} url: ${{ secrets.CODECOV_URL }} file: unit.junit.xml disable_search: true + report_type: test-results - - name: Upload results to codecov + - name: Upload results to codecov (Staging) if: ${{ !cancelled() }} - uses: codecov/test-results-action@v1 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_ORG_TOKEN_STAGING }} url: ${{ secrets.CODECOV_STAGING_API_URL }} file: unit.junit.xml disable_search: true + report_type: test-results From 611502bf3f613d3f6de2dc794e9310f4ee8cc46d Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Fri, 7 Nov 2025 20:23:04 +0500 Subject: [PATCH 4/5] refactor: consolidate OS-specific steps into unified steps - Use shell: bash for cross-platform compatibility - Single 'Install requirements' step works on all OS - Single 'Run tests' step works on all OS - Bash is available on Windows runners and handles paths correctly --- .github/workflows/test.yml | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 31b2e7e..0e4de29 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,31 +33,18 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install Rust Toolchain run: rustup toolchain install stable --profile minimal --no-self-update - - name: Install requirements (Unix) - if: runner.os != 'Windows' + - name: Install requirements + shell: bash run: | python -m venv venv - . venv/bin/activate + source venv/bin/activate pip install maturin pip install -r tests/requirements.txt maturin develop - - name: Install requirements (Windows) - if: runner.os == 'Windows' + - name: Run tests + shell: bash run: | - python -m venv venv - venv\Scripts\activate - pip install maturin - pip install -r tests/requirements.txt - maturin develop - - name: Run tests (Unix) - if: runner.os != 'Windows' - run: | - . venv/bin/activate - python -m pytest --cov-report=xml:coverage.xml --cov=. --junitxml=unit.junit.xml - - name: Run tests (Windows) - if: runner.os == 'Windows' - run: | - venv\Scripts\activate + source venv/bin/activate python -m pytest --cov-report=xml:coverage.xml --cov=. --junitxml=unit.junit.xml - name: Upload results to codecov From 92589f175208a874ac63981f55dec7968cb5f79c Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Fri, 7 Nov 2025 20:30:51 +0500 Subject: [PATCH 5/5] fix: correct codecov-action parameter and simplify for Unix only - Change 'file' to 'files' parameter for codecov-action@v5 - Remove Windows from test matrix (macOS and Ubuntu only) - Use simple venv activation without Windows detection - Use maturin develop as in release branch --- .github/workflows/test.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0e4de29..38325b1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ jobs: run_tests: strategy: matrix: - os: [macos-latest, ubuntu-latest, windows-latest] + os: [macos-latest, ubuntu-latest] python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] runs-on: ${{ matrix.os }} steps: @@ -34,7 +34,6 @@ jobs: - name: Install Rust Toolchain run: rustup toolchain install stable --profile minimal --no-self-update - name: Install requirements - shell: bash run: | python -m venv venv source venv/bin/activate @@ -42,7 +41,6 @@ jobs: pip install -r tests/requirements.txt maturin develop - name: Run tests - shell: bash run: | source venv/bin/activate python -m pytest --cov-report=xml:coverage.xml --cov=. --junitxml=unit.junit.xml @@ -53,7 +51,7 @@ jobs: with: token: ${{ secrets.CODECOV_ORG_TOKEN }} url: ${{ secrets.CODECOV_URL }} - file: unit.junit.xml + files: unit.junit.xml disable_search: true report_type: test-results @@ -63,6 +61,6 @@ jobs: with: token: ${{ secrets.CODECOV_ORG_TOKEN_STAGING }} url: ${{ secrets.CODECOV_STAGING_API_URL }} - file: unit.junit.xml + files: unit.junit.xml disable_search: true report_type: test-results