fix: add codeSepIndexSlots substitution to Ruby SDK #259
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: CI | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| env: | |
| FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true | |
| jobs: | |
| typescript: | |
| name: TypeScript (build + test) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| - uses: actions/setup-go@v5 | |
| with: | |
| go-version: '1.24' | |
| cache-dependency-path: compilers/go/go.sum | |
| - uses: dtolnay/rust-toolchain@stable | |
| - name: Build Rust compiler (for cross-compiler tests) | |
| run: cd compilers/rust && cargo build --release | |
| - run: pnpm install --frozen-lockfile | |
| - run: pnpm run build | |
| - run: pnpm run test | |
| - name: Example tests (TS + Sol + Move) | |
| run: npx vitest run examples/ts/ examples/sol/ examples/move/ | |
| - run: pnpm run typecheck | |
| go: | |
| name: Go Compiler | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-go@v5 | |
| with: | |
| go-version: '1.24' | |
| cache-dependency-path: compilers/go/go.sum | |
| - run: cd compilers/go && go build ./... | |
| - run: cd compilers/go && go build -o runar-go . | |
| - run: cd compilers/go && go test -race -v ./... | |
| - name: Go SDK tests | |
| run: cd packages/runar-go && go test ./... | |
| - name: Go example tests | |
| run: cd examples/go && go test ./... | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: runar-go | |
| path: compilers/go/runar-go | |
| rust: | |
| name: Rust Compiler | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: dtolnay/rust-toolchain@stable | |
| - run: cd compilers/rust && cargo build --release | |
| - run: cd compilers/rust && cargo test | |
| - name: Rust example tests | |
| run: cd examples/rust && cargo test | |
| - name: Rust SDK tests | |
| run: cd packages/runar-rs && cargo test | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: runar-rust | |
| path: compilers/rust/target/release/runar-compiler-rust | |
| python: | |
| name: Python Compiler | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - run: pip install pytest | |
| - run: cd compilers/python && python -m pytest tests/ -v | |
| - name: Python SDK tests | |
| run: cd packages/runar-py && python -m pytest | |
| - name: Python example tests | |
| run: cd examples/python && PYTHONPATH=../../packages/runar-py python -m pytest | |
| zig-compiler: | |
| name: Zig Compiler | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: mlugg/setup-zig@v2 | |
| with: | |
| version: 0.15.0 | |
| - run: cd compilers/zig && zig build test | |
| - name: Zig conformance tests | |
| run: cd compilers/zig && zig build conformance | |
| - name: Build release binary | |
| run: cd compilers/zig && zig build -Doptimize=ReleaseFast | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: runar-zig | |
| path: compilers/zig/zig-out/bin/runar-zig | |
| zig-sdk: | |
| name: Zig SDK | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: mlugg/setup-zig@v2 | |
| with: | |
| version: 0.15.0 | |
| - run: cd packages/runar-zig && zig build test | |
| - name: Zig example tests | |
| run: cd examples/zig && zig build test | |
| ruby: | |
| name: Ruby SDK | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: '3.3' | |
| bundler-cache: true | |
| working-directory: packages/runar-rb | |
| - run: cd packages/runar-rb && bundle exec rspec | |
| - name: Ruby example tests | |
| run: | | |
| cd examples/ruby | |
| bundle install | |
| bundle exec rspec **/*_spec.rb | |
| ruby-compiler: | |
| name: Ruby Compiler | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: '3.3' | |
| - name: Ruby compiler conformance (IR → hex) | |
| run: | | |
| fail=0 | |
| for test in conformance/tests/*/expected-ir.json; do | |
| dir=$(dirname "$test") | |
| name=$(basename "$dir") | |
| expected=$(tr -d '[:space:]' < "$dir/expected-script.hex" | tr '[:upper:]' '[:lower:]') | |
| actual=$(ruby compilers/ruby/bin/runar-compiler-ruby --ir "$test" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]') | |
| if [ "$expected" = "$actual" ]; then | |
| echo "PASS $name" | |
| else | |
| echo "FAIL $name" | |
| fail=1 | |
| fi | |
| done | |
| exit $fail | |
| - name: Ruby compiler source conformance (.runar.ts → hex) | |
| run: | | |
| fail=0 | |
| for dir in conformance/tests/*/; do | |
| name=$(basename "$dir") | |
| ts_file="$dir/$name.runar.ts" | |
| [ -f "$ts_file" ] || continue | |
| expected=$(tr -d '[:space:]' < "$dir/expected-script.hex" | tr '[:upper:]' '[:lower:]') | |
| actual=$(ruby compilers/ruby/bin/runar-compiler-ruby --source "$ts_file" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]') | |
| if [ "$expected" = "$actual" ]; then | |
| echo "PASS $name (.runar.ts)" | |
| else | |
| echo "FAIL $name (.runar.ts)" | |
| fail=1 | |
| fi | |
| done | |
| exit $fail | |
| - name: Ruby compiler source conformance (.runar.rb → hex) | |
| run: | | |
| fail=0 | |
| for dir in conformance/tests/*/; do | |
| name=$(basename "$dir") | |
| rb_file=$(find "$dir" -name "*.runar.rb" | head -1) | |
| [ -n "$rb_file" ] || continue | |
| expected=$(tr -d '[:space:]' < "$dir/expected-script.hex" | tr '[:upper:]' '[:lower:]') | |
| actual=$(ruby compilers/ruby/bin/runar-compiler-ruby --source "$rb_file" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]') | |
| if [ "$expected" = "$actual" ]; then | |
| echo "PASS $name (.runar.rb)" | |
| else | |
| echo "FAIL $name (.runar.rb)" | |
| fail=1 | |
| fi | |
| done | |
| exit $fail | |
| conformance: | |
| name: Conformance Tests | |
| needs: [typescript, go, rust, python, zig-compiler, ruby-compiler] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: runar-go | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: runar-rust | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| name: runar-zig | |
| - uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: '3.3' | |
| - run: chmod +x runar-go runar-compiler-rust runar-zig | |
| - name: Run conformance tests | |
| run: | | |
| fail=0 | |
| for test in conformance/tests/*/expected-ir.json; do | |
| dir=$(dirname "$test") | |
| name=$(basename "$dir") | |
| echo -n "=== $name === " | |
| go_hex=$(./runar-go --ir "$test" --hex) | |
| rust_hex=$(./runar-compiler-rust --ir "$test" --hex) | |
| zig_hex=$(./runar-zig compile-ir "$test" --hex 2>/dev/null | head -1) | |
| ruby_hex=$(ruby compilers/ruby/bin/runar-compiler-ruby --ir "$test" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]') | |
| if [ "$go_hex" != "$rust_hex" ]; then | |
| echo "MISMATCH Go vs Rust" | |
| fail=1 | |
| elif [ "$go_hex" != "$zig_hex" ]; then | |
| echo "MISMATCH Go vs Zig" | |
| fail=1 | |
| elif [ "$go_hex" != "$ruby_hex" ]; then | |
| echo "MISMATCH Go vs Ruby" | |
| fail=1 | |
| else | |
| echo "OK (${#go_hex} hex chars)" | |
| fi | |
| done | |
| exit $fail | |
| - name: Ruby format conformance (source → hex) | |
| run: | | |
| fail=0 | |
| for dir in conformance/tests/*/; do | |
| name=$(basename "$dir") | |
| rb_file="$dir/$name.runar.rb" | |
| [ -f "$rb_file" ] || continue | |
| expected_file="$dir/expected-script.hex" | |
| [ -f "$expected_file" ] || continue | |
| expected=$(tr -d '[:space:]' < "$expected_file" | tr '[:upper:]' '[:lower:]') | |
| go_hex=$(./runar-go --source "$rb_file" --hex --disable-constant-folding 2>/dev/null | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]') | |
| rust_hex=$(./runar-compiler-rust --source "$rb_file" --hex --disable-constant-folding 2>/dev/null | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]') | |
| if [ "$go_hex" != "$rust_hex" ]; then | |
| echo "MISMATCH $name: Go vs Rust differ" | |
| fail=1 | |
| elif [ "$go_hex" != "$expected" ]; then | |
| echo "MISMATCH $name: output differs from golden file" | |
| fail=1 | |
| else | |
| echo "OK $name (.runar.rb)" | |
| fi | |
| done | |
| exit $fail | |
| integration: | |
| name: Integration Tests | |
| needs: [typescript, go, rust, python, ruby, zig-compiler, zig-sdk] | |
| runs-on: ubuntu-latest | |
| env: | |
| RPC_URL: http://localhost:18332 | |
| RPC_USER: regtest | |
| RPC_PASS: regtest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| - uses: actions/setup-go@v5 | |
| with: | |
| go-version: '1.24' | |
| cache-dependency-path: compilers/go/go.sum | |
| - uses: dtolnay/rust-toolchain@stable | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - run: pip install pytest bsv-sdk | |
| - uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: '3.3' | |
| bundler-cache: true | |
| working-directory: integration/ruby | |
| - uses: mlugg/setup-zig@v2 | |
| with: | |
| version: 0.15.0 | |
| - run: pnpm install --frozen-lockfile | |
| - run: pnpm run build | |
| - name: Pre-create regtest node config with test credentials | |
| run: | | |
| mkdir -p integration/regtest-data/n1 | |
| printf '%s\n' \ | |
| 'port=18333' 'rpcbind=0.0.0.0' 'rpcport=18332' \ | |
| 'rpcuser=regtest' 'rpcpassword=regtest' 'rpcallowip=0.0.0.0/0' \ | |
| 'dnsseed=0' 'listenonion=0' 'listen=1' 'server=1' 'rest=1' 'regtest=1' \ | |
| 'usecashaddr=0' 'txindex=1' 'excessiveblocksize=1000000000' \ | |
| 'maxstackmemoryusageconsensus=100000000' 'maxscriptsizepolicy=0' \ | |
| 'maxscriptnumlengthpolicy=0' 'maxstackmemoryusagepolicy=100000000' \ | |
| 'maxtxsizepolicy=0' 'genesisactivationheight=1' 'minminingtxfee=0.00000001' \ | |
| > integration/regtest-data/n1/bitcoin.conf | |
| - name: Start BSV regtest node | |
| run: cd integration && ./regtest.sh start | |
| - name: Go integration tests | |
| run: cd integration/go && go test -tags integration -v -timeout 600s | |
| - name: TypeScript integration tests | |
| run: cd integration/ts && npx vitest run | |
| - name: Rust integration tests | |
| run: cd integration/rust && cargo test --release -- --ignored | |
| timeout-minutes: 10 | |
| - name: Python integration tests | |
| run: cd integration/python && PYTHONPATH=../../compilers/python:../../packages/runar-py pytest -v | |
| - name: Ruby integration tests | |
| run: cd integration/ruby && bundle exec rspec --format documentation | |
| - name: Zig integration tests | |
| run: cd integration/zig && zig build test | |
| timeout-minutes: 5 | |
| - name: Ruby end-to-end example tests | |
| run: | | |
| cd end2end-example/ruby | |
| bundle install | |
| bundle exec rspec price_bet_spec.rb --format documentation | |
| - name: Stop regtest node | |
| if: always() | |
| run: cd integration && ./regtest.sh stop |