name: Code Quality on: push: branches: [main] pull_request: branches: [main] jobs: python-lint: name: Python Lint runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install ruff run: pip install ruff - name: Run ruff linter run: ruff check scripts/ continue-on-error: true - name: Run ruff formatter check run: ruff format --check scripts/ continue-on-error: true json-validation: name: JSON Validation runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: submodules: true - name: Validate JSON files run: | ERRORS=0 echo "Validating chain config JSON files..." for f in chains/v22/android/chains.json chains/v22/chains.json chains/v22/chains_dev.json pezkuwi-overlay/chains/pezkuwi-chains.json; do if [ -f "$f" ]; then if python3 -m json.tool "$f" > /dev/null 2>&1; then echo " $f: valid" else echo "::error file=$f::Invalid JSON: $f" ERRORS=$((ERRORS + 1)) fi fi done exit $ERRORS chain-integrity: name: Chain Config Integrity runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: submodules: true - name: Verify Pezkuwi chains are present run: | CHAINS_FILE="chains/v22/android/chains.json" if [ ! -f "$CHAINS_FILE" ]; then echo "::error::$CHAINS_FILE not found" exit 1 fi ERRORS=0 # Pezkuwi Relay if ! python3 -c "import json; chains=json.load(open('$CHAINS_FILE')); assert any(c['chainId'].startswith('1aa94987') for c in chains), 'Missing Pezkuwi Relay'"; then echo "::error::Pezkuwi Relay chain missing from $CHAINS_FILE" ERRORS=$((ERRORS + 1)) else echo "Pezkuwi Relay: present" fi # Pezkuwi Asset Hub if ! python3 -c "import json; chains=json.load(open('$CHAINS_FILE')); assert any(c['chainId'].startswith('e7c15092') for c in chains), 'Missing Asset Hub'"; then echo "::error::Pezkuwi Asset Hub missing from $CHAINS_FILE" ERRORS=$((ERRORS + 1)) else echo "Pezkuwi Asset Hub: present" fi # Pezkuwi People if ! python3 -c "import json; chains=json.load(open('$CHAINS_FILE')); assert any(c['chainId'].startswith('69a8d025') for c in chains), 'Missing People Chain'"; then echo "::error::Pezkuwi People chain missing from $CHAINS_FILE" ERRORS=$((ERRORS + 1)) else echo "Pezkuwi People: present" fi # Verify Pezkuwi chains are first in array FIRST_CHAIN=$(python3 -c "import json; print(json.load(open('$CHAINS_FILE'))[0]['chainId'][:8])") if [ "$FIRST_CHAIN" != "1aa94987" ]; then echo "::warning::Pezkuwi Relay is not the first chain (found: $FIRST_CHAIN)" else echo "Pezkuwi Relay is first chain: OK" fi exit $ERRORS sync-script-test: name: Sync Script Dry Run runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: submodules: true - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.12' - name: Run sync script run: python3 scripts/sync_from_nova.py - name: Verify output was generated run: | if [ ! -f "chains/v22/android/chains.json" ]; then echo "::error::Sync script failed to generate chains/v22/android/chains.json" exit 1 fi COUNT=$(python3 -c "import json; print(len(json.load(open('chains/v22/android/chains.json'))))") echo "Generated $COUNT chains" if [ "$COUNT" -lt 4 ]; then echo "::error::Expected at least 4 chains, got $COUNT" exit 1 fi