name: API Quality description: Run Python uv quality checks for API services (format, lint, typecheck, tests). inputs: python_version: description: Python version to use. required: false default: "3.13" uv_version: description: uv version to install. required: false default: "latest" working_directory: description: Working directory for commands. required: false default: "." cache_dependency_path: description: Path used for cache key hashing. required: false default: "uv.lock" env: description: > Multiline env vars, one per line: KEY=VALUE required: false default: "" uv_sync_args: description: Arguments for uv sync. required: false default: "--frozen --dev" format_command: description: Command for format checking. required: false default: "uv run ruff format --check ." lint_command: description: Command for linting. required: false default: "uv run ruff check ." typecheck_command: description: Command for type checking. required: false default: "uv run mypy ." test_command: description: Command for tests. required: false default: "uv run pytest" runs: using: composite steps: - name: Load env vars if: ${{ inputs.env != '' }} shell: bash run: | while IFS= read -r line; do [ -z "$line" ] && continue case "$line" in \#*) continue;; esac if [[ "$line" != *=* ]]; then echo "Invalid env line: $line" >&2 exit 1 fi echo "$line" >> "$GITHUB_ENV" done <<< "${{ inputs.env }}" - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ inputs.python_version }} - name: Install uv shell: bash env: UV_VERSION: ${{ inputs.uv_version }} run: | python -m pip install --upgrade pip if [ -z "$UV_VERSION" ] || [ "$UV_VERSION" = "latest" ]; then python -m pip install uv else python -m pip install "uv==$UV_VERSION" fi - name: Cache uv downloads uses: actions/cache@v4 with: path: ~/.cache/uv key: uv-${{ runner.os }}-${{ hashFiles(inputs.cache_dependency_path) }} restore-keys: | uv-${{ runner.os }}- - name: Sync dependencies shell: bash run: uv sync ${{ inputs.uv_sync_args }} working-directory: ${{ inputs.working_directory }} - name: Run format check if: ${{ inputs.format_command != '' }} shell: bash run: ${{ inputs.format_command }} working-directory: ${{ inputs.working_directory }} - name: Run lint if: ${{ inputs.lint_command != '' }} shell: bash run: ${{ inputs.lint_command }} working-directory: ${{ inputs.working_directory }} - name: Run typecheck if: ${{ inputs.typecheck_command != '' }} shell: bash run: ${{ inputs.typecheck_command }} working-directory: ${{ inputs.working_directory }} - name: Run tests if: ${{ inputs.test_command != '' }} shell: bash run: ${{ inputs.test_command }} working-directory: ${{ inputs.working_directory }}