Commit 75dec68
feat: improve type ergonomics for library consumers (#103)
* feat: improve type ergonomics for library consumers
Add flexible input coercion for request types that reduces boilerplate
when constructing API requests. All changes are backward compatible.
Improvements:
- Enum fields accept string values (e.g., type="video")
- List[Enum] fields accept string lists (e.g., asset_types=["image", "video"])
- Context/Ext fields accept dicts (e.g., context={"key": "value"})
- FieldModel lists accept strings (e.g., fields=["creative_id", "name"])
- Sort fields accept string enums (e.g., field="name", direction="asc")
- Subclass lists accepted without cast() for all major list fields
Affected types:
- ListCreativeFormatsRequest (type, asset_types, context, ext)
- ListCreativesRequest (fields, context, ext, sort)
- GetProductsRequest (context, ext)
- PackageRequest (creatives, ext)
- CreateMediaBuyRequest (packages, context, ext)
- UpdateMediaBuyRequest.Packages (creatives, creative_assignments)
The list variance issue is now fully resolved - users can pass list[Subclass]
where list[BaseClass] is expected without needing cast().
Closes #102
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <[email protected]>
* feat: auto-generate type coercion module from model introspection
Replace manually-maintained _ergonomic.py with auto-generated version.
The new script introspects Pydantic models at runtime to detect fields
needing coercion, eliminating manual maintenance when schemas change.
Changes:
- Add scripts/generate_ergonomic_coercion.py for auto-generation
- Integrate into generate_types.py pipeline
- Add rationale comment explaining import-time patching choice
- Remove unnecessary hasattr check in _patch_field_annotation
- Discover additional coercion opportunities (pacing enum, packages list)
The generator detects:
- Enum fields -> string coercion
- list[Enum] fields -> string list coercion
- ContextObject/ExtensionObject -> dict coercion
- list[BaseModel] fields -> subclass list coercion
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <[email protected]>
* fix: use plain type: ignore for cross-version mypy compatibility
Different Python/mypy versions report different error codes for the
same type issues (return-value vs no-any-return). Using plain
`# type: ignore` comments avoids unused-ignore errors across versions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <[email protected]>
---------
Co-authored-by: Claude Opus 4.5 <[email protected]>1 parent ff82519 commit 75dec68
File tree
6 files changed
+1361
-1
lines changed- scripts
- src/adcp/types
- tests
6 files changed
+1361
-1
lines changed
0 commit comments