diff --git a/.github/badges/node.svg b/.github/badges/node.svg index bff5a5b..d968517 100644 --- a/.github/badges/node.svg +++ b/.github/badges/node.svg @@ -1,20 +1,20 @@ - - Node game coverage: 13% + + Node game coverage: 14.06% - + - - + + \ No newline at end of file diff --git a/.github/workflows/node-badge.yml b/.github/workflows/node-badge.yml index b0b33af..6d1b868 100644 --- a/.github/workflows/node-badge.yml +++ b/.github/workflows/node-badge.yml @@ -4,10 +4,11 @@ name: "Generate node comparison badge" on: push: paths: - - "src/games/definitions.rs" + - "crates/lib/src/games/definitions.rs" - ".github/workflows/node-badge.yml" + - ".github/workflows/scripts/node-badge.mjs" schedule: - - cron: '0 0 * * 1' # Update once a week in case node-gamedig has changed + - cron: '34 3 * * 2' # Update once a week in case node-gamedig has changed workflow_dispatch: jobs: @@ -26,30 +27,14 @@ jobs: - uses: actions/checkout@v4 with: repository: "gamedig/node-gamedig" - sparse-checkout: "games.txt" path: "node-gamedig" + sparse-checkout: | + lib/games.js + package.json - name: Calculate comparison id: comparison - run: | - # Find list of node games - node_games=$(awk -F "|" '/^[^#]/ {if(length($1) > 0) print $1 }' ./node-gamedig/games.txt) - node_games_count=$(printf "%s\n" "$node_games" | wc -l) - - # Calculate how many of those games we have definitions for - rust_games_count=0 - for game in $node_games; do - if grep "\"$game\" *=>" ./crates/lib/src/games/definitions.rs; then - rust_games_count=$(( rust_games_count + 1 )) - fi - done - - # Calculate percent - percent=$(( rust_games_count * 100 / node_games_count)) - - echo "$rust_games_count/$node_games_count $percent%" - # Output percentage - echo "percent=$percent" >> "${GITHUB_OUTPUT}" + run: node .github/workflows/scripts/node-badge.mjs - name: Generate the badge SVG image uses: emibcn/badge-action@v2.0.2 diff --git a/.github/workflows/scripts/node-badge.mjs b/.github/workflows/scripts/node-badge.mjs new file mode 100644 index 0000000..8114ae2 --- /dev/null +++ b/.github/workflows/scripts/node-badge.mjs @@ -0,0 +1,52 @@ +"use strict"; + +//! Calculate the percentage of games from node that we support +// Expects node-gamedig checkout out in git root /node-gamedig +// Expects the generic example to output a list of game IDs when no arguments are provided + +import process from "node:process"; +import { closeSync, openSync, writeSync } from "node:fs"; +import { spawnSync } from "node:child_process"; + +const setOutput = (key, value) => { + const file = openSync(process.env.GITHUB_OUTPUT, "a"); + writeSync(file, `${key}=${value}\n`); + closeSync(file); +} + +// Get node IDs +// NOTE: Here we directly import from games to avoid loading +// unecessary parts of the library that would require us +// to install dependencies. +import { games } from "../../../node-gamedig/lib/games.js"; + +const node_ids = new Set(Object.keys(games)); +const node_total = node_ids.size; + +// Get rust IDs + +const command = spawnSync("cargo", ["run", "-p", "gamedig", "--example", "generic"]); + +if (command.status !== 0) { + console.error(command.stderr.toString("utf8")); + process.exit(1); +} + +const rust_ids_pretty = command.stdout.toString("utf8"); +const rust_ids = new Set(rust_ids_pretty.split("\n").map(line => line.split("\t")[0]).filter(id => id.length > 0)); + +// Detect missing node IDs + +for (const id of rust_ids) { + if (node_ids.delete(id)) { + rust_ids.delete(id); + } +} + +console.log("Node remains", node_ids); +console.log("Rust remains", rust_ids); + +const percent = 1 - (node_ids.size / node_total); + +// Output percent to 2 decimal places +setOutput("percent", Math.round(percent*10000)/100);