From 5984e94a33a10e8865ed9f343724366aa40f7a53 Mon Sep 17 00:00:00 2001 From: JuliaEdom Date: Thu, 9 Jul 2026 04:43:05 +0300 Subject: [PATCH] chore(ci): put sdk/ under the ruff lint+format gate The published PyPI package was gated weaker than src/: ci.yml ran ruff only over src/tests/scripts, so sdk/ accumulated format drift (async_client.py, cli.py, client.py). Add sdk/ to both ruff steps and apply the one-off `ruff format sdk/`. Makefile lint/format targets get scripts/ and sdk/ too, so `make lint` now matches CI exactly. Formatting-only for the SDK sources; no behaviour change. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 4 +-- Makefile | 8 +++--- sdk/agentflow/async_client.py | 50 +++++++---------------------------- sdk/agentflow/cli.py | 5 +--- sdk/agentflow/client.py | 50 +++++++---------------------------- 5 files changed, 27 insertions(+), 90 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5526e1b2..7450a01e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,9 +24,9 @@ jobs: - name: Install dependencies run: pip install -e ".[dev]" - name: Ruff check - run: ruff check src/ tests/ scripts/ + run: ruff check src/ tests/ scripts/ sdk/ - name: Ruff format check - run: ruff format --check src/ tests/ scripts/ + run: ruff format --check src/ tests/ scripts/ sdk/ - name: Type check run: mypy src/ --ignore-missing-imports diff --git a/Makefile b/Makefile index ad3ef28a..de19214d 100644 --- a/Makefile +++ b/Makefile @@ -105,13 +105,13 @@ perf-plot: # ── Code Quality ────────────────────────────────────────────────── lint: - ruff check src/ tests/ - ruff format --check src/ tests/ + ruff check src/ tests/ scripts/ sdk/ + ruff format --check src/ tests/ scripts/ sdk/ mypy src/ format: - ruff format src/ tests/ - ruff check --fix src/ tests/ + ruff format src/ tests/ scripts/ sdk/ + ruff check --fix src/ tests/ scripts/ sdk/ # ── Build & Deploy ──────────────────────────────────────────────── diff --git a/sdk/agentflow/async_client.py b/sdk/agentflow/async_client.py index ab6379ee..23327d6c 100644 --- a/sdk/agentflow/async_client.py +++ b/sdk/agentflow/async_client.py @@ -197,9 +197,7 @@ def _record_version_headers(self, headers: httpx.Headers) -> None: self._last_server_version = headers.get("X-AgentFlow-Version") self._last_latest_version = headers.get("X-AgentFlow-Latest-Version") self._last_deprecated = headers.get("X-AgentFlow-Deprecated") - self._last_deprecation_warning = headers.get( - "X-AgentFlow-Deprecation-Warning" - ) + self._last_deprecation_warning = headers.get("X-AgentFlow-Deprecation-Warning") async def _get_entity( self, @@ -219,9 +217,7 @@ def _parse_contract_versions( return {} entity, separator, version = contract_version.partition(":") if not separator or not entity or not version: - raise ValueError( - "contract_version must use ':' format." - ) + raise ValueError("contract_version must use ':' format.") return {entity: version[1:] if version.startswith("v") else version} async def _apply_contract_version( @@ -234,27 +230,14 @@ async def _apply_contract_version( return payload contract = await self._get_contract(entity_type, version) fields = contract.get("fields", []) - required_fields = [ - field["name"] - for field in fields - if field.get("required") - ] - missing_fields = [ - field_name - for field_name in required_fields - if field_name not in payload - ] + required_fields = [field["name"] for field in fields if field.get("required")] + missing_fields = [field_name for field_name in required_fields if field_name not in payload] if missing_fields: raise AgentFlowError( - "Contract validation failed. Missing required fields: " - + ", ".join(missing_fields) + "Contract validation failed. Missing required fields: " + ", ".join(missing_fields) ) allowed_fields = {field["name"] for field in fields} - return { - name: value - for name, value in payload.items() - if name in allowed_fields - } + return {name: value for name, value in payload.items() if name in allowed_fields} async def _get_contract(self, entity_type: str, version: str) -> dict[str, Any]: cache_key = (entity_type, version) @@ -355,11 +338,7 @@ async def _query_page( payload["limit"] = limit if cursor is not None: payload["cursor"] = cursor - headers = ( - {"Idempotency-Key": idempotency_key} - if idempotency_key is not None - else None - ) + headers = {"Idempotency-Key": idempotency_key} if idempotency_key is not None else None return await self._request("POST", "/v1/query", json=payload, headers=headers) async def query( @@ -404,8 +383,7 @@ async def search( async def list_contracts(self) -> list[ContractSummary]: payload = await self._request("GET", "/v1/contracts") return [ - ContractSummary.model_validate(contract) - for contract in payload.get("contracts", []) + ContractSummary.model_validate(contract) for contract in payload.get("contracts", []) ] async def get_contract( @@ -438,11 +416,7 @@ async def validate_contract( *, idempotency_key: str | None = None, ) -> ContractValidation: - headers = ( - {"Idempotency-Key": idempotency_key} - if idempotency_key is not None - else None - ) + headers = {"Idempotency-Key": idempotency_key} if idempotency_key is not None else None response = await self._request( "POST", f"/v1/contracts/{entity}/validate", @@ -500,11 +474,7 @@ async def batch( *, idempotency_key: str | None = None, ) -> dict[str, Any]: - headers = ( - {"Idempotency-Key": idempotency_key} - if idempotency_key is not None - else None - ) + headers = {"Idempotency-Key": idempotency_key} if idempotency_key is not None else None return await self._request( "POST", "/v1/batch", diff --git a/sdk/agentflow/cli.py b/sdk/agentflow/cli.py index 23f222dd..cf11a7d3 100644 --- a/sdk/agentflow/cli.py +++ b/sdk/agentflow/cli.py @@ -124,10 +124,7 @@ def _scaffold_project( continue relative_path = source_path.relative_to(template_dir) target_path = project_dir.joinpath( - *[ - part[:-5] if part.endswith(".tmpl") else part - for part in relative_path.parts - ] + *[part[:-5] if part.endswith(".tmpl") else part for part in relative_path.parts] ) target_path.parent.mkdir(parents=True, exist_ok=True) rendered = _render_template( diff --git a/sdk/agentflow/client.py b/sdk/agentflow/client.py index 845ed566..560383b2 100644 --- a/sdk/agentflow/client.py +++ b/sdk/agentflow/client.py @@ -197,9 +197,7 @@ def _record_version_headers(self, headers: httpx.Headers) -> None: self._last_server_version = headers.get("X-AgentFlow-Version") self._last_latest_version = headers.get("X-AgentFlow-Latest-Version") self._last_deprecated = headers.get("X-AgentFlow-Deprecated") - self._last_deprecation_warning = headers.get( - "X-AgentFlow-Deprecation-Warning" - ) + self._last_deprecation_warning = headers.get("X-AgentFlow-Deprecation-Warning") def _get_entity( self, @@ -222,9 +220,7 @@ def _parse_contract_versions( return {} entity, separator, version = contract_version.partition(":") if not separator or not entity or not version: - raise ValueError( - "contract_version must use ':' format." - ) + raise ValueError("contract_version must use ':' format.") return {entity: version[1:] if version.startswith("v") else version} def _apply_contract_version( @@ -237,27 +233,14 @@ def _apply_contract_version( return payload contract = self._get_contract(entity_type, version) fields = contract.get("fields", []) - required_fields = [ - field["name"] - for field in fields - if field.get("required") - ] - missing_fields = [ - field_name - for field_name in required_fields - if field_name not in payload - ] + required_fields = [field["name"] for field in fields if field.get("required")] + missing_fields = [field_name for field_name in required_fields if field_name not in payload] if missing_fields: raise AgentFlowError( - "Contract validation failed. Missing required fields: " - + ", ".join(missing_fields) + "Contract validation failed. Missing required fields: " + ", ".join(missing_fields) ) allowed_fields = {field["name"] for field in fields} - return { - name: value - for name, value in payload.items() - if name in allowed_fields - } + return {name: value for name, value in payload.items() if name in allowed_fields} def _get_contract(self, entity_type: str, version: str) -> dict[str, Any]: cache_key = (entity_type, version) @@ -359,11 +342,7 @@ def _query_page( payload["limit"] = limit if cursor is not None: payload["cursor"] = cursor - headers = ( - {"Idempotency-Key": idempotency_key} - if idempotency_key is not None - else None - ) + headers = {"Idempotency-Key": idempotency_key} if idempotency_key is not None else None return self._request("POST", "/v1/query", json=payload, headers=headers) def query( @@ -408,8 +387,7 @@ def search( def list_contracts(self) -> list[ContractSummary]: payload = self._request("GET", "/v1/contracts") return [ - ContractSummary.model_validate(contract) - for contract in payload.get("contracts", []) + ContractSummary.model_validate(contract) for contract in payload.get("contracts", []) ] def get_contract( @@ -442,11 +420,7 @@ def validate_contract( *, idempotency_key: str | None = None, ) -> ContractValidation: - headers = ( - {"Idempotency-Key": idempotency_key} - if idempotency_key is not None - else None - ) + headers = {"Idempotency-Key": idempotency_key} if idempotency_key is not None else None response = self._request( "POST", f"/v1/contracts/{entity}/validate", @@ -504,11 +478,7 @@ def batch( *, idempotency_key: str | None = None, ) -> dict[str, Any]: - headers = ( - {"Idempotency-Key": idempotency_key} - if idempotency_key is not None - else None - ) + headers = {"Idempotency-Key": idempotency_key} if idempotency_key is not None else None return self._request( "POST", "/v1/batch",