
api-endpoint
Add new API endpoints to the OpenGov SDK from an OpenAPI specification. Use when:(1) Adding a new re
提供方 dsayling|开源
OpenGov API Endpoint Generator
Generate SDK endpoints from OpenAPI specifications following project conventions.
Workflow
- Read the OpenAPI spec at the provided file path
- Extract attribute schemas - Use the schema extraction guide in references/schema-extraction.md to:
- Locate the schema in the OpenAPI spec for each resource
- Extract using jq command or Python script
- Document all fields in a mapping table
- Verify field types, required/optional status, and nullable flags
- Verify field mappings before generating code
- Identify endpoints to implement from the spec
- Check existing code to understand current patterns and avoid duplicates
- Generate code following patterns in references/patterns.md
- Run tests and type checks to verify
Quick Reference
Files to Create/Modify
| Component | Location | When |
|---|---|---|
| Endpoint module | src/opengov_api/{resource}.py | Always |
| Response models | src/opengov_api/models/{resource}.py | If typed responses needed |
| Params model | src/opengov_api/models/params.py | If list endpoint has filters |
| Enums | src/opengov_api/models/enums.py | If status/type enums needed |
| Model exports | src/opengov_api/models/__init__.py | When adding models |
| SDK exports | src/opengov_api/__init__.py | Always |
| Tests | tests/test_{resource}.py | Always |
| Common tests | tests/test_common_endpoints.py | Add to parametrized lists |
OpenAPI to SDK Mapping
| OpenAPI | SDK |
|---|---|
GET /{resource} | list_{resource}() returning JSONAPIResponse[{Resource}Resource] |
GET /{resource}/{id} | get_{resource}(id) returning dict[str, Any] |
POST /{resource} | create_{resource}(data) returning dict[str, Any] |
PATCH /{resource}/{id} | update_{resource}(id, data) returning dict[str, Any] |
DELETE /{resource}/{id} | delete_{resource}(id) or archive_{resource}(id) |
Nested GET /{parent}/{id}/{child} | list_{parent}_{child}(parent_id) |
Nested POST /{parent}/{id}/{child} | add_{parent}_{child}(parent_id, data) |
Filter Parameter Translation
| OpenAPI Parameter | SDK Param Name | Model Field |
|---|---|---|
filter[status] | status | filter_status |
filter[createdAt] | created_at | filter_created_at |
filter[isEnabled] | is_enabled | filter_is_enabled |
page[number] | page_number | page_number |
page[size] | page_size | page_size |
Detailed Patterns
See references/patterns.md for complete code examples including:
- Full list endpoint with typed params/response
- Iterator function pattern
- Simple CRUD endpoints
- Nested resource endpoints
- Model definitions
- Test patterns
Checklist
Before completing, verify:
Schema Extraction & Validation:
- Schema extracted using jq/Python from OpenAPI spec (not inferred from memory)
- All OpenAPI fields documented in mapping table
- Field types match OpenAPI spec exactly (string/integer/number/boolean/array/object)
- Required vs optional status matches spec (check
requiredarray) - Nullable fields handled correctly (
nullable: true→| None) - All camelCase fields have proper
Field(alias=...)with exact casing - Field validators added only when needed (empty string → None, type coercion)
- No extra fields beyond spec (unless intentionally added for SDK convenience)
Code Generation:
- All endpoint functions have
@handle_request_errorsdecorator - All functions use
with _get_client() as client:pattern - List endpoints return
JSONAPIResponse[{Resource}Resource] - Response models use
Field(alias="camelCase")for JSON field mapping - Params model has
to_query_params()method -
model_config = {"populate_by_name": True}present in all attribute models
Integration:
- Functions exported in
__init__.py - Models exported in
models/__init__.py - Tests created in
tests/test_{resource}.py - List/Get endpoints added to
test_common_endpoints.pyparametrized lists
Verification:
-
uv run pytestpasses -
uv run pyrightpasses