{"owner":"brokermr810","repo":"QuantDinger","hasSpec":true,"specFile":".github/workflows/openapi-ci.yml","branch":"HEAD","format":"yaml","version":"3.x (YAML)","title":"QuantDinger","description":"","endpoints":[],"spec":"name: OpenAPI CI\n\non:\n  push:\n    branches: [main, master]\n    paths:\n      - 'backend_api_python/app/openapi/**'\n      - 'backend_api_python/scripts/export_openapi.py'\n      - 'docs/api/**'\n      - 'docs/agent/agent-openapi.json'\n      - '.spectral.yaml'\n      - '.github/workflows/openapi-ci.yml'\n  pull_request:\n    branches: [main, master]\n    paths:\n      - 'backend_api_python/app/openapi/**'\n      - 'backend_api_python/scripts/export_openapi.py'\n      - 'docs/api/**'\n      - 'docs/agent/agent-openapi.json'\n      - '.spectral.yaml'\n      - '.github/workflows/openapi-ci.yml'\n\nconcurrency:\n  group: openapi-ci-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  openapi:\n    name: OpenAPI export, lint & diff\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v7\n\n      - name: Set up Python 3.12\n        uses: actions/setup-python@v7\n        with:\n          python-version: '3.12'\n          cache: pip\n          cache-dependency-path: backend_api_python/requirements.txt\n\n      - name: Install Python dependencies\n        working-directory: ./backend_api_python\n        run: |\n          python -m pip install --disable-pip-version-check -r requirements.txt\n          python -m pip install --disable-pip-version-check pytest\n\n      - name: Export OpenAPI spec\n        working-directory: ./backend_api_python\n        env:\n          SKIP_STARTUP_HOOKS: '1'\n          OPENAPI_ENABLED: 'false'\n        run: |\n          python scripts/export_openapi.py --output ../docs/api/openapi.generated.yaml\n\n      - name: Verify committed spec matches export\n        run: |\n          if ! diff -u docs/api/openapi.yaml docs/api/openapi.generated.yaml; then\n            echo \"::error::docs/api/openapi.yaml is out of date. Run: cd backend_api_python && python scripts/export_openapi.py\"\n            exit 1\n          fi\n          echo \"Committed openapi.yaml matches flask-smorest export.\"\n\n      - name: Set up Node.js (Spectral + oasdiff)\n        uses: actions/setup-node@v7\n        with:\n          node-version: '20'\n\n      - name: Install Spectral CLI\n        run: npm install -g @stoplight/spectral-cli@6.16.1\n\n      - name: Lint human Web API spec\n        run: spectral lint docs/api/openapi.yaml --ruleset .spectral.yaml\n\n      - name: Lint Agent Gateway spec\n        run: spectral lint docs/agent/agent-openapi.json --ruleset .spectral.agent.yaml\n\n      - name: Install oasdiff\n        run: |\n          OASDIFF_VERSION=1.10.21\n          curl -fsSL \"https://github.com/Tufin/oasdiff/releases/download/v${OASDIFF_VERSION}/oasdiff_${OASDIFF_VERSION}_linux_amd64.tar.gz\" \\\n            | tar -xz -C /tmp\n          sudo mv /tmp/oasdiff /usr/local/bin/oasdiff\n          oasdiff --version\n\n      - name: Breaking-change check (human API)\n        run: |\n          oasdiff breaking docs/api/openapi.yaml docs/api/openapi.generated.yaml \\\n            --fail-on ERR || {\n            echo \"::error::Breaking OpenAPI change detected. Document in PR and bump API version if intentional.\"\n            exit 1\n          }\n\n      - name: OpenAPI smoke tests\n        working-directory: ./backend_api_python\n        env:\n          SKIP_STARTUP_HOOKS: '1'\n        run: python -m pytest tests/test_openapi.py -q\n"}