refactor(walk): make the boundary-crossing forms the traversal primitives #631
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Complete Test Suite | |
| on: | |
| push: | |
| branches: [ main ] | |
| pull_request: | |
| branches: [ main ] | |
| env: | |
| CARGO_TERM_COLOR: always | |
| jobs: | |
| # Rust tests on multiple platforms | |
| rust-tests: | |
| name: Rust Tests (${{ matrix.os }}) | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, windows-latest, macos-latest] | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Rust | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| toolchain: stable | |
| override: true | |
| components: rustfmt, clippy | |
| - name: Cache cargo registry | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-cargo- | |
| - name: Cache cargo build | |
| uses: actions/cache@v4 | |
| with: | |
| path: target | |
| key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-cargo-build- | |
| - name: Build | |
| run: cargo build --release --verbose | |
| - name: Run Rust tests | |
| run: cargo test --verbose | |
| - name: Run clippy | |
| run: cargo clippy -- -W warnings | |
| - name: Check formatting | |
| run: cargo fmt -- --check | |
| # Python tests only on Linux (where uv is readily available) | |
| python-tests: | |
| name: Python Tests (Linux) | |
| runs-on: ubuntu-latest | |
| needs: rust-tests # Run after Rust tests to ensure binary builds | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Install uv | |
| run: | | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
| - name: Set up Rust (for building sql-cli) | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| toolchain: stable | |
| override: true | |
| - name: Cache cargo build | |
| uses: actions/cache@v4 | |
| with: | |
| path: target | |
| key: ${{ runner.os }}-cargo-build-python-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-cargo-build-python- | |
| ${{ runner.os }}-cargo-build- | |
| - name: Build SQL CLI | |
| run: cargo build --release | |
| - name: Cache Python dependencies | |
| uses: actions/cache@v4 | |
| with: | |
| path: .venv | |
| key: ${{ runner.os }}-python-${{ hashFiles('pyproject.toml', 'uv.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-python- | |
| - name: Install Python dependencies | |
| run: | | |
| # Only create .venv if the cache step didn't restore one. | |
| # Newer uv versions refuse to overwrite an existing venv without --clear. | |
| [ -d .venv ] || uv venv | |
| uv pip install -e . | |
| uv pip install pytest pytest-cov pandas numpy | |
| - name: Generate test data | |
| run: | | |
| if [ ! -f "data/test_simple_math.csv" ] || [ ! -f "data/test_simple_strings.csv" ]; then | |
| uv run python scripts/generate_simple_test.py | |
| fi | |
| - name: Run Python tests | |
| run: | | |
| uv run pytest tests/python_tests/ -v --tb=short | |
| - name: Upload test results | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: python-test-results | |
| path: | | |
| .pytest_cache/ | |
| **/*.log | |
| # Examples test suite (formal and smoke tests) | |
| examples-tests: | |
| name: Examples Test Suite (Linux) | |
| runs-on: ubuntu-latest | |
| needs: rust-tests # Run after Rust tests to ensure binary builds | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Install uv | |
| run: | | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
| - name: Set up Rust (for building sql-cli) | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| toolchain: stable | |
| override: true | |
| - name: Cache cargo build | |
| uses: actions/cache@v4 | |
| with: | |
| path: target | |
| key: ${{ runner.os }}-cargo-build-examples-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-cargo-build-examples- | |
| ${{ runner.os }}-cargo-build- | |
| - name: Build SQL CLI | |
| run: cargo build --release | |
| - name: Run examples test suite | |
| run: | | |
| uv run python tests/integration/test_examples.py | |
| - name: Upload test results | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: examples-test-results | |
| path: | | |
| examples/expectations/*.json | |
| **/*.log | |
| # SQL parity regression gate (differential test vs DuckDB) | |
| parity-tests: | |
| name: SQL Parity (vs DuckDB) | |
| runs-on: ubuntu-latest | |
| needs: rust-tests # Run after Rust tests to ensure binary builds | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' # harness uses stdlib tomllib (3.11+) | |
| - name: Install uv | |
| run: | | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
| - name: Set up Rust (for building sql-cli) | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| toolchain: stable | |
| override: true | |
| - name: Cache cargo build | |
| uses: actions/cache@v4 | |
| with: | |
| path: target | |
| key: ${{ runner.os }}-cargo-build-parity-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-cargo-build-parity- | |
| ${{ runner.os }}-cargo-build- | |
| - name: Build SQL CLI | |
| run: cargo build --release | |
| - name: Install Python dependencies | |
| run: | | |
| # Only create .venv if the cache step didn't restore one. | |
| [ -d .venv ] || uv venv | |
| uv pip install duckdb | |
| - name: Run parity check (sql-cli vs DuckDB) | |
| # Fails if any case drifts from its expected bucket: a regressed AGREE, a | |
| # silently-closed gap, or a new un-annotated non-AGREE case. See | |
| # docs/SQL_PARITY.md for the contract. | |
| run: uv run python tests/comparison/runner.py --check | |
| - name: Upload parity report | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: parity-report | |
| path: tests/comparison/reports/ | |
| # Integration test combining both | |
| integration-test: | |
| name: Integration Test (Linux) | |
| runs-on: ubuntu-latest | |
| needs: [rust-tests, python-tests, examples-tests] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Rust | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| toolchain: stable | |
| override: true | |
| - name: Build SQL CLI | |
| run: cargo build --release | |
| - name: Test CLI directly | |
| run: | | |
| # Generate test data | |
| echo "id,value" > test.csv | |
| echo "1,10" >> test.csv | |
| echo "2,20" >> test.csv | |
| echo "3,30" >> test.csv | |
| # Test basic query | |
| ./target/release/sql-cli test.csv -q "SELECT * FROM test WHERE value > 15" -o csv | |
| # Test with string methods | |
| echo "id,name" > names.csv | |
| echo "1, Alice " >> names.csv | |
| echo "2,Bob" >> names.csv | |
| ./target/release/sql-cli names.csv -q "SELECT id, name.Trim() as trimmed FROM names" -o csv | |
| - name: Verify --query-plan works | |
| run: | | |
| ./target/release/sql-cli test.csv -q "SELECT id FROM test WHERE value > 15" --query-plan | |
| # Performance benchmarking (Linux only, non-blocking) | |
| performance-benchmark: | |
| name: Performance Benchmarks (Linux) | |
| runs-on: ubuntu-latest | |
| needs: rust-tests # Run after rust tests to get the binary | |
| continue-on-error: true # Don't fail the build if benchmarks have issues | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Install uv | |
| run: | | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
| - name: Set up Rust (for building sql-cli) | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| toolchain: stable | |
| override: true | |
| - name: Cache cargo build | |
| uses: actions/cache@v4 | |
| with: | |
| path: target | |
| key: ${{ runner.os }}-cargo-build-benchmark-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-cargo-build-benchmark- | |
| ${{ runner.os }}-cargo-build- | |
| - name: Build SQL CLI (Release with optimizations) | |
| run: cargo build --release | |
| - name: Install Python dependencies | |
| run: | | |
| # Only create .venv if one doesn't already exist. | |
| # Newer uv versions refuse to overwrite an existing venv without --clear. | |
| [ -d .venv ] || uv venv | |
| uv pip install pandas numpy | |
| - name: Run performance benchmarks | |
| run: | | |
| echo "=========================================" | |
| echo "Performance Benchmark Results" | |
| echo "=========================================" | |
| uv run python scripts/benchmark_all.py || echo "Benchmark completed with warnings" | |
| - name: Upload benchmark results | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: benchmark-results | |
| path: | | |
| benchmarks/*.txt | |
| benchmarks/*.csv | |
| retention-days: 30 |