name: CI on: push: branches: [main] pull_request: branches: [main] env: CARGO_TERM_COLOR: always RUSTFLAGS: "-D warnings" jobs: rust: name: Rust ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: components: rustfmt, clippy - name: Cache cargo uses: Swatinem/rust-cache@v2 - name: Format check run: cargo fmt --all -- --check - name: Clippy (workspace, all targets) run: cargo clippy -p wickra-core -p wickra -p wickra-data -p wickra-wasm --all-targets -- -D warnings - name: Build run: cargo build -p wickra-core -p wickra -p wickra-data --verbose - name: Tests (default features) run: cargo test -p wickra-core -p wickra -p wickra-data --verbose - name: Tests (live-binance feature) run: cargo test -p wickra-data --features live-binance --verbose - name: Compile benches (smoke) run: cargo build -p wickra --benches --verbose - name: Compile examples run: | cargo build -p wickra --example backtest cargo build -p wickra-data --example live_binance --features live-binance python: name: Python ${{ matrix.python-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] python-version: ["3.9", "3.11", "3.12"] steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Cache cargo uses: Swatinem/rust-cache@v2 - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install Python dev dependencies run: | python -m pip install --upgrade pip python -m pip install maturin pytest numpy hypothesis - name: Build wheel working-directory: bindings/python run: maturin build --release --out dist - name: Install wheel shell: bash working-directory: bindings/python run: python -m pip install --find-links dist --force-reinstall wickra - name: Run Python tests working-directory: bindings/python run: pytest -v wasm: name: WASM build runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust toolchain (with wasm target) uses: dtolnay/rust-toolchain@stable with: targets: wasm32-unknown-unknown - name: Cache cargo uses: Swatinem/rust-cache@v2 - name: Install wasm-pack uses: jetli/wasm-pack-action@v0.4.0 - name: Build WASM package run: wasm-pack build bindings/wasm --target web --release --features panic-hook - name: Verify generated artefacts run: | test -f bindings/wasm/pkg/wickra_wasm.js test -f bindings/wasm/pkg/wickra_wasm_bg.wasm test -f bindings/wasm/pkg/wickra_wasm.d.ts node: name: Node ${{ matrix.node-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] node-version: ["18", "20"] steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Cache cargo uses: Swatinem/rust-cache@v2 - name: Set up Node uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Install Node dependencies working-directory: bindings/node run: npm install - name: Build native module working-directory: bindings/node run: npx napi build --release - name: Run Node tests working-directory: bindings/node run: node --test __tests__/ cross-library-bench: name: Cross-library benchmark report runs-on: ubuntu-latest needs: [python] steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - name: Install Python deps + peer libs run: | python -m pip install --upgrade pip python -m pip install maturin numpy pandas talipp finta - name: Build Wickra wheel working-directory: bindings/python run: maturin build --release --out dist - name: Install Wickra wheel working-directory: bindings/python run: python -m pip install --find-links dist --force-reinstall wickra - name: Run cross-library benchmark working-directory: bindings/python run: | python -m benchmarks.compare_libraries --size 20000 --iterations 10 \ --streaming-window 5000 --streaming-iterations 2 \ | tee benchmark.txt - name: Upload report uses: actions/upload-artifact@v4 with: name: cross-library-bench path: bindings/python/benchmark.txt