diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..5544b788 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,62 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + validate-specs: + name: Validate Specs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Validate all specs against Swagger Validator + run: | + set -e + FAILED=0 + PASSED=0 + VALIDATOR_URL="https://validator.swagger.io/validator/debug" + + SPECS=$(find specs -name "*.json" | sort) + + if [ -z "$SPECS" ]; then + echo "Error: no spec files found under specs/" + exit 1 + fi + + while IFS= read -r spec_file; do + echo "Validating: $spec_file" + + response=$(curl -s --fail-with-body --max-time 30 -X POST \ + -H "Content-Type: application/json" \ + --data @"$spec_file" \ + "$VALIDATOR_URL") || { + echo " FAILED (HTTP/network error)" + FAILED=$((FAILED + 1)) + continue + } + + errors=$(echo "$response" | jq '[.schemaValidationMessages[] | select(.level == "error")] | length' 2>/dev/null || echo "0") + + if [ "$errors" -gt "0" ]; then + echo " FAILED ($errors error(s)):" + echo "$response" | jq -r '.schemaValidationMessages[] | select(.level == "error") | " - \(.message)"' + FAILED=$((FAILED + 1)) + else + echo " PASSED" + PASSED=$((PASSED + 1)) + fi + done <<< "$SPECS" + + echo "" + echo "Results: $PASSED passed, $FAILED failed" + + if [ "$FAILED" -ne "0" ]; then + echo "One or more specs failed validation." + exit 1 + fi + + echo "All specs passed validation." diff --git a/README.md b/README.md index eb3de17b..d7086695 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Appwrite Specs [![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord) -[![Twitter Account](https://img.shields.io/twitter/follow/appwrite?color=00acee&label=twitter&style=flat-square)](https://twitter.com/appwrite) +[![X (formerly Twitter)](https://img.shields.io/badge/follow-%40appwrite-00acee?logo=x&style=flat-square)](https://x.com/appwrite) This repository contains the official [Appwrite](https://appwrite.io) API specifications and SDK code examples for all supported versions.