[python] add typeddict models-mode for Python HTTP client emitter#10439
[python] add typeddict models-mode for Python HTTP client emitter#10439iscai-msft wants to merge 72 commits into
models-mode for Python HTTP client emitter#10439Conversation
Add a new 'typeddict' value for the models-mode option that generates Python TypedDict classes instead of DPG model classes. Key features: - TypedDict classes with Required[T]/NotRequired[T] annotations - TypedDict inheritance for non-discriminated models - Discriminated models: Union of leaf TypedDicts, no abstract base class - Input-only: operations accept TypedDict input, return dict output - Wire names used as TypedDict keys - _model_base.py still generated for serialization utilities Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
commit: |
|
All changed packages have been documented.
Show changes
|
|
You can try these changes here
|
…ypespec into python/addTypedDict
…hon/addTypedDict
- TypedDictModelType returns 'JSON' for response type annotations - Response.type_annotation/docstring passes is_response=True - Typeddict deserialization uses response.json() directly - Removed NotRequired from TypedDictModelSerializer (total=False handles it) - Updated mock API tests to verify JSON dict responses Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add client/naming typeddict variant to regenerate-common.ts - Create test_client_naming_typeddict.py with 11 tests verifying TypedDict uses wire names (defaultName, wireName) not client names - Tests cover: ClientNameModel, LanguageClientNameModel, ClientNameAndJsonEncodedNameModel, ClientModel, PythonModel Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
TypedDict is already JSON, so the MutableMapping[str, Any] overload is unnecessary. Only keep TypedDict model + IO[bytes] overloads. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Typeddict mode uses response.json() directly, so _deserialize is never called. Skip importing it to avoid W0611 unused-import lint warning. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove unused MutableMapping/Any imports from TypedDictModelType.imports() - Skip _deserialize import in paging_operation.py for typeddict mode Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ypespec into python/addTypedDict
TypedDictModelType returns 'JSON' for response type annotations but never defined the JSON = MutableMapping[str, Any] type alias, causing NameError at runtime. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
34e0cda to
95db199
Compare
|
I invoked workflow to generate code diff for this PR: Azure/azure-sdk-for-python#47346 for better review. |
When multiple namespaces import 'types', the second import shadows the
first causing mypy errors ('Name types already defined') and runtime
failures ('Name types.X is not defined').
Add get_unique_types_alias() (mirrors get_unique_models_alias) to
generate unique aliases like _types, _types_models1, _types_models2.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ypespec into python/addTypedDict
d6eb5ab to
4c0a3ac
Compare
In types.py (TypedDict definitions), use the JSON wire type instead of rich Python types for properties: - datetime.datetime → str - datetime.date → str - datetime.time → str - datetime.timedelta → str - datetime.datetime (unix) → int - decimal.Decimal → float - bytes → str This follows the principle that TypedDicts represent the wire/JSON shape of the data. Rich types like datetime are still used in model classes and operation signatures. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
can people take a look at the regeneration, it automatically updates in the pr that @msyyc linked, linking here again for ease of access. You can pay specific attention to tests with date times etc, I now make sure the TD include the serialized value instead of the client value. would be great to get this PR in, at least as a first step, and to keep improving if / when we run into issues, cc @kashifkhan |
|
There is new file named |
# Conflicts: # packages/http-client-python/generator/pygen/preprocess/__init__.py
- Add crossLanguageDefinitionId-based dedup to dpg model TypedDict creation (prevents duplicate TypedDict classes when multiple operations share the same body model) - Dedup typeddict_models in TypesSerializer: prefer dpg model over typeddict copy when both exist with the same crossLanguageDefinitionId Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
this is defined as a named union, that's why we generate it as one |
…ct copies from _models.py - Only add 'from . import types' to sync __init__.py, not aio (types.py is generated at the sync level, aio doesn't have one) - Filter out base='typeddict' models from _models.py class list (typeddict copies should only appear in types.py, not as model classes) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add 'List' import to ListType.imports() when property/operation named 'list' exists (fixes NameError in special-words types.py) - Use has_non_json_models() for has_models in ModelInitSerializer to avoid generating 'from . import _models' when _models.py doesn't exist - Remove 'from . import types' from __init__.py — each TypedDict type's imports() already handles adding the types import where needed (operations) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
f77576c to
14b7d6c
Compare
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace is_operation_file with serialize_namespace_type to correctly determine when to add the typing.List import. Operation/client files only need it when has_operation_named_list is True, while model/types files need it when has_property_named_list is True. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>


fixes #8800
Add a new 'typeddict' value for the
models-modeoption that generates PythonTypedDictclasses instead of DPG model classes. Key features:_model_base.pystill generated for serialization utilities