Skip to content

fix: add codeSepIndexSlots substitution to Ruby SDK #259

fix: add codeSepIndexSlots substitution to Ruby SDK

fix: add codeSepIndexSlots substitution to Ruby SDK #259

Workflow file for this run

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