feat(subscriptions): add inline_body kwarg (cueapi #791 / Item 1 parity) #43
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Feature PR to Main | |
| on: | |
| pull_request: | |
| branches: [main] | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| services: | |
| postgres: | |
| image: postgres:15-alpine | |
| env: | |
| POSTGRES_DB: cueapi_test | |
| POSTGRES_USER: runner | |
| POSTGRES_PASSWORD: "" | |
| POSTGRES_HOST_AUTH_METHOD: trust | |
| ports: | |
| - 5432:5432 | |
| options: >- | |
| --health-cmd "pg_isready -U runner -d cueapi_test" | |
| --health-interval 2s | |
| --health-timeout 3s | |
| --health-retries 15 | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 2s | |
| --health-timeout 3s | |
| --health-retries 10 | |
| steps: | |
| - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.7 | |
| - name: Checkout cueapi-core | |
| uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.7 | |
| with: | |
| repository: cueapi/cueapi-core | |
| path: cueapi-core | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.3.0 | |
| with: | |
| python-version: '3.12' | |
| - name: Install dependencies | |
| run: | | |
| pip install -r cueapi-core/requirements.txt | |
| pip install -e . | |
| - name: Initialize test DB schema (model-driven, matches cueapi-core/tests/conftest.py) | |
| working-directory: cueapi-core | |
| env: | |
| DATABASE_URL: postgresql+asyncpg://runner@localhost:5432/cueapi_test | |
| REDIS_URL: redis://localhost:6379 | |
| SESSION_SECRET: test-session-secret-32-chars-minimum!! | |
| ENV: test | |
| RESEND_API_KEY: "" | |
| run: | | |
| python <<'PY' | |
| import asyncio | |
| from sqlalchemy.ext.asyncio import create_async_engine | |
| from app.config import settings | |
| from app.database import Base | |
| # Import all models so Base.metadata sees them (mirrors tests/conftest.py). | |
| from app.models import ( # noqa: F401 | |
| Alert, Cue, DispatchOutbox, Execution, UsageMonthly, User, Worker, DeviceCode, | |
| Agent, Message, UsageMessagesMonthly, | |
| ) | |
| async def _init(): | |
| engine = create_async_engine(settings.DATABASE_URL) | |
| async with engine.begin() as conn: | |
| await conn.run_sync(Base.metadata.create_all) | |
| await engine.dispose() | |
| asyncio.run(_init()) | |
| print("Schema initialized via Base.metadata.create_all") | |
| PY | |
| - name: Start cueapi-core API in background | |
| working-directory: cueapi-core | |
| env: | |
| DATABASE_URL: postgresql+asyncpg://runner@localhost:5432/cueapi_test | |
| REDIS_URL: redis://localhost:6379 | |
| SESSION_SECRET: test-session-secret-32-chars-minimum!! | |
| ENV: test | |
| RESEND_API_KEY: "" | |
| ALLOW_REGISTER: "true" | |
| BASE_URL: http://localhost:8000 | |
| run: | | |
| nohup python -m uvicorn app.main:app --host 127.0.0.1 --port 8000 \ | |
| > /tmp/uvicorn.log 2>&1 & | |
| echo $! > /tmp/uvicorn.pid | |
| - name: Wait for API health | |
| run: | | |
| for i in $(seq 1 30); do | |
| if curl -sf http://127.0.0.1:8000/health > /dev/null; then | |
| echo "API ready after ${i}s" | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "API failed to start within 30s" | |
| cat /tmp/uvicorn.log | |
| exit 1 | |
| - name: Register test user and capture API key | |
| id: register_user | |
| run: | | |
| EMAIL="ci-sdk-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}@example.com" | |
| RESP=$(curl -sf -X POST http://127.0.0.1:8000/v1/auth/register \ | |
| -H "Content-Type: application/json" \ | |
| -d "{\"email\":\"${EMAIL}\"}") | |
| KEY=$(printf '%s' "$RESP" | python -c 'import sys,json;print(json.load(sys.stdin)["api_key"])') | |
| if [ -z "$KEY" ]; then | |
| echo "Registration failed; response: $RESP" | |
| exit 1 | |
| fi | |
| echo "::add-mask::$KEY" | |
| echo "api_key=$KEY" >> "$GITHUB_OUTPUT" | |
| - name: Run tests | |
| env: | |
| CUEAPI_STAGING_URL: http://127.0.0.1:8000 | |
| CUEAPI_STAGING_API_KEY: ${{ steps.register_user.outputs.api_key }} | |
| run: pytest tests/ -v --tb=short | |
| - name: Dump uvicorn log on failure | |
| if: failure() | |
| run: cat /tmp/uvicorn.log || true | |
| auto-merge: | |
| needs: test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Auto-merge PR | |
| run: gh pr merge ${{ github.event.pull_request.number }} --squash --auto | |
| env: | |
| GH_TOKEN: ${{ secrets.GOVIND_GITHUB_TOKEN }} | |
| GH_REPO: ${{ github.repository }} | |
| notify-merge: | |
| needs: auto-merge | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Create merge confirmation cue | |
| run: | | |
| FIRE_AT=$(date -u -d '+2 minutes' '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || \ | |
| date -u -v+2M '+%Y-%m-%dT%H:%M:%SZ') | |
| curl -s -w "\n%{http_code}" -X POST https://api.cueapi.ai/v1/cues \ | |
| -H "Authorization: Bearer ${{ secrets.ARGUS_CUEAPI_KEY }}" \ | |
| -H "Content-Type: application/json" \ | |
| -d "{ | |
| \"name\": \"cueapi-python-merged-${{ github.event.pull_request.number }}\", | |
| \"schedule\": {\"type\": \"once\", \"at\": \"${FIRE_AT}\"}, | |
| \"transport\": \"worker\", | |
| \"payload\": { | |
| \"task\": \"test-sdk\", | |
| \"trigger\": \"post-merge\", | |
| \"repo\": \"cueapi/cueapi-python\", | |
| \"pr_number\": \"${{ github.event.pull_request.number }}\", | |
| \"commit_sha\": \"${{ github.event.pull_request.head.sha }}\" | |
| } | |
| }" |