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
2 changes: 1 addition & 1 deletion .github/instructions/python-bindings.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ name = "feedparser-rs"
version = "0.1.8"
description = "High-performance RSS/Atom feed parser (drop-in feedparser replacement)"
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
classifiers = [
"Programming Language :: Rust",
"Programming Language :: Python :: 3",
Expand Down
90 changes: 78 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,15 +133,54 @@ jobs:
- name: Check formatting
run: cargo +nightly fmt --all -- --check

# Python lint (ruff)
lint-python:
name: Lint Python (ruff)
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: read
steps:
- uses: actions/checkout@v6

- name: Run ruff lint
uses: astral-sh/ruff-action@v3
with:
src: crates/feedparser-rs-py

- name: Run ruff format
uses: astral-sh/ruff-action@v3
with:
src: crates/feedparser-rs-py
args: format --check

# Node.js lint (biome)
lint-node:
name: Lint Node.js (biome)
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: read
steps:
- uses: actions/checkout@v6

- name: Setup Biome
uses: biomejs/setup-biome@v2

- name: Run Biome
working-directory: crates/feedparser-rs-node
run: biome check .

# Security audit
security:
name: Security Audit
needs: [changes]
runs-on: ubuntu-latest
timeout-minutes: 10
# Run on: Rust core changes, CI config changes, or full CI mode
# Run on: Rust core changes, Node changes, CI config changes, or full CI mode
if: |
needs.changes.outputs.rust-core == 'true' ||
needs.changes.outputs.node == 'true' ||
needs.changes.outputs.ci == 'true' ||
needs.changes.outputs.full-ci == 'true'
permissions:
Expand All @@ -163,6 +202,15 @@ jobs:
- name: Run cargo-deny
run: cargo deny check

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '22'

- name: Run npm audit
working-directory: crates/feedparser-rs-node
run: npm audit --audit-level=high

# Cross-platform Rust tests
test-rust:
name: Test Rust (${{ matrix.os }})
Expand Down Expand Up @@ -211,7 +259,7 @@ jobs:
# Python bindings tests
test-python:
name: Test Python (${{ matrix.os }} - Py${{ matrix.python }})
needs: [changes, lint-stable, lint-nightly]
needs: [changes, lint-stable, lint-nightly, lint-python]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
# Run on: Python changes, CI config changes, or full CI mode
Expand All @@ -225,21 +273,25 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python: ['3.9', '3.10', '3.11', '3.12', '3.13']
python: ['3.10', '3.11', '3.12', '3.13', '3.14']
exclude:
# Reduce matrix size - test all versions on Linux only
- os: macos-latest
python: '3.9'
- os: macos-latest
python: '3.10'
- os: macos-latest
python: '3.11'
- os: windows-latest
python: '3.9'
- os: macos-latest
python: '3.12'
- os: macos-latest
python: '3.13'
- os: windows-latest
python: '3.10'
- os: windows-latest
python: '3.11'
- os: windows-latest
python: '3.12'
- os: windows-latest
python: '3.13'

steps:
- uses: actions/checkout@v6
Expand Down Expand Up @@ -278,7 +330,7 @@ jobs:
# Node.js bindings tests
test-node:
name: Test Node.js (${{ matrix.os }} - Node ${{ matrix.node }})
needs: [changes, lint-stable, lint-nightly]
needs: [changes, lint-stable, lint-nightly, lint-node]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
# Run on: Node changes, CI config changes, or full CI mode
Expand Down Expand Up @@ -383,7 +435,7 @@ jobs:
# Python code coverage
coverage-python:
name: Python Code Coverage
needs: [changes, lint-stable, lint-nightly]
needs: [changes, lint-stable, lint-nightly, lint-python]
runs-on: ubuntu-latest
timeout-minutes: 15
# Run on: Python changes, CI config changes, or full CI mode
Expand All @@ -408,7 +460,7 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
python-version: '3.14'

- name: Install uv
uses: astral-sh/setup-uv@v7
Expand All @@ -432,7 +484,7 @@ jobs:
# Node.js code coverage
coverage-node:
name: Node.js Code Coverage
needs: [changes, lint-stable, lint-nightly]
needs: [changes, lint-stable, lint-nightly, lint-node]
runs-on: ubuntu-latest
timeout-minutes: 15
# Run on: Node changes, CI config changes, or full CI mode
Expand Down Expand Up @@ -516,7 +568,7 @@ jobs:
# All checks passed gate
ci-success:
name: CI Success
needs: [changes, lint-stable, lint-nightly, security, test-rust, test-python, test-node, coverage-rust, coverage-python, coverage-node, msrv]
needs: [changes, lint-stable, lint-nightly, lint-python, lint-node, security, test-rust, test-python, test-node, coverage-rust, coverage-python, coverage-node, msrv]
runs-on: ubuntu-latest
if: always()
permissions:
Expand Down Expand Up @@ -556,6 +608,20 @@ jobs:
echo "lint-nightly: ${{ needs.lint-nightly.result }} ✓"
fi

if [[ "${{ needs.lint-python.result }}" != "success" ]]; then
echo "lint-python: ${{ needs.lint-python.result }} ✗ (must succeed)"
FAILED=1
else
echo "lint-python: ${{ needs.lint-python.result }} ✓"
fi

if [[ "${{ needs.lint-node.result }}" != "success" ]]; then
echo "lint-node: ${{ needs.lint-node.result }} ✗ (must succeed)"
FAILED=1
else
echo "lint-node: ${{ needs.lint-node.result }} ✓"
fi

# Check all other jobs (success or skipped is OK)
check_job "security" "${{ needs.security.result }}" || FAILED=1
check_job "test-rust" "${{ needs.test-rust.result }}" || FAILED=1
Expand Down
25 changes: 17 additions & 8 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,10 @@ jobs:
target: aarch64
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist
args: --release --out dist -i python3.10 -i python3.11 -i python3.12 -i python3.13 -i python3.14
manylinux: auto
working-directory: crates/feedparser-rs-py
- uses: actions/upload-artifact@v6
Expand All @@ -94,11 +91,17 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.12'
python-version: |
3.10
3.11
3.12
3.13
3.14
allow-prereleases: true
- uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist
args: --release --out dist --find-interpreter
working-directory: crates/feedparser-rs-py
- uses: actions/upload-artifact@v6
with:
Expand All @@ -114,11 +117,17 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.12'
python-version: |
3.10
3.11
3.12
3.13
3.14
allow-prereleases: true
- uses: PyO3/maturin-action@v1
with:
target: x64
args: --release --out dist
args: --release --out dist --find-interpreter
working-directory: crates/feedparser-rs-py
- uses: actions/upload-artifact@v6
with:
Expand Down
15 changes: 14 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.4.3] - 2026-01-15

### Added
- Add `ruff` linter and formatter for Python bindings
- Add `biome` linter and formatter for Node.js bindings
- Add `npm audit` to CI security checks (alongside `cargo deny`)

### Changed
- Drop Python 3.9 support (dependencies require 3.10+)
- Add Python 3.14 support
- Build wheels for all supported Python versions (3.10-3.14)

## [0.4.2] - 2026-01-14

### Fixed
Expand Down Expand Up @@ -175,7 +187,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Comprehensive test coverage
- Documentation with examples

[Unreleased]: https://github.com/bug-ops/feedparser-rs/compare/v0.4.2...HEAD
[Unreleased]: https://github.com/bug-ops/feedparser-rs/compare/v0.4.3...HEAD
[0.4.3]: https://github.com/bug-ops/feedparser-rs/compare/v0.4.2...v0.4.3
[0.4.2]: https://github.com/bug-ops/feedparser-rs/compare/v0.4.1...v0.4.2
[0.4.1]: https://github.com/bug-ops/feedparser-rs/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/bug-ops/feedparser-rs/compare/v0.3.0...v0.4.0
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ This project follows the [Rust Code of Conduct](https://www.rust-lang.org/polici
- Rust 1.88.0 or later (edition 2024)
- [cargo-make](https://github.com/sagiegurari/cargo-make) for task automation
- Node.js 18+ (for Node.js bindings development)
- Python 3.9+ (for Python bindings development)
- Python 3.10+ (for Python bindings development)

### Setup

Expand Down
18 changes: 9 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ members = [
resolver = "2"

[workspace.package]
version = "0.4.2"
version = "0.4.3"
edition = "2024"
rust-version = "1.88.0"
authors = ["bug-ops"]
Expand All @@ -26,13 +26,13 @@ encoding_rs = "0.8"
flate2 = "1.1"
html-escape = "0.2"
memchr = "2.7"
mockito = "1.6"
mockito = "1.7"
napi = "3.8"
napi-derive = "3.5"
once_cell = "1.20"
once_cell = "1.21"
pyo3 = "0.27"
quick-xml = "0.39"
regex = "1.11"
regex = "1.12"
reqwest = { version = "0.13", default-features = false }
serde = "1.0"
serde_json = "1.0"
Expand Down
Loading
Loading