diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 4af2d12..180a6fe 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,25 +1,25 @@ lockVersion: 2.0.0 id: 5ca2c9b7-aea6-4a23-a631-998fcc6c18a8 management: - docChecksum: ade290ce8a2cfaa82b58311fa0c6666c - docVersion: 1.0.106 - speakeasyVersion: 1.773.1 - generationVersion: 2.897.1 - releaseVersion: 0.14.2 - configChecksum: 34177271be9aefafa3f0435ef563fffb + docChecksum: d6a5aa81dd7b887528be46ee0bf93613 + docVersion: 1.0.107 + speakeasyVersion: 1.777.1 + generationVersion: 2.903.2 + releaseVersion: 0.14.3 + configChecksum: bf06c9495b3e1f32fcb236cddf5c7299 repoURL: https://github.com/censys/censys-sdk-python.git installationURL: https://github.com/censys/censys-sdk-python.git published: true persistentEdits: - generation_id: 39f91088-4aae-47ba-a46b-df6129509eab - pristine_commit_hash: 8eae61ad2d57450ae36e3cf8ef33a088dd513fe3 - pristine_tree_hash: 9798613e7dd5c4f3a9ad57c93b29c347b03e573f + generation_id: 866c6ce2-4512-48e2-be62-1bb5b18a03ae + pristine_commit_hash: 9e9e866a225e6ac195951da5a402f2aa0dc82193 + pristine_tree_hash: c45fa29ac8f854325d7a3ef20388b4c5114ad5cd features: python: acceptHeaders: 3.0.0 additionalDependencies: 1.1.0 constsAndDefaults: 1.0.7 - core: 6.0.27 + core: 6.0.29 defaultEnabledRetries: 0.2.0 downloadStreams: 1.0.1 enumUnions: 0.1.1 @@ -32,13 +32,13 @@ features: globalServerURLs: 3.2.1 globals: 3.0.0 ignores: 3.0.1 - methodArguments: 1.1.0 + methodArguments: 1.1.1 nameOverrides: 3.0.3 nullables: 1.0.2 responseFormat: 1.1.0 retries: 3.0.5 sdkHooks: 1.2.1 - unions: 3.1.5 + unions: 3.1.6 trackedFiles: .gitattributes: id: 24139dae6567 @@ -1832,6 +1832,10 @@ trackedFiles: id: 2775cc440d00 last_write_checksum: sha1:d6e40bd3344012c8102ec7466172fda613ee9df5 pristine_git_object: d3e1ed7ab3bc3075bb355e272cf9dcf2818a0742 + docs/models/queryparamassettype.md: + id: 8b9fdb6255fc + last_write_checksum: sha1:4df9e8e96bd9c40915a079ff8a436f8618215f8f + pristine_git_object: 27ba8f0a7a148cd01be2b9dd6958f034eb2ae834 docs/models/queryparamgranularity.md: id: 772b62ac31ab last_write_checksum: sha1:5507cb541b15cdc20e111a2e3af93616e1bce474 @@ -3370,8 +3374,8 @@ trackedFiles: pristine_git_object: d408d7c2a2101c6897f6828217dcfe5376972c34 docs/models/v3tagslistassignmentsrequest.md: id: c0cd7584d55d - last_write_checksum: sha1:510c4a946ae60257d87372b41c60a1ebdaada738 - pristine_git_object: 13c9928cb03586d188f0a7c20e827e0d3b2e82ec + last_write_checksum: sha1:9c55e409963993a4fbcdb8a7a4172d49feb03207 + pristine_git_object: 1f231e367eab024e1da9b87a2326130a7d0f8302 docs/models/v3tagslistassignmentsresponse.md: id: 6417f922f7cf last_write_checksum: sha1:6fab3208776c5674fcb5501898fa93f867f4312a @@ -3674,8 +3678,8 @@ trackedFiles: pristine_git_object: bfd8691be4b4b5ee9f2c4baf849970d807ade207 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:80ebcb2be64b9e205a9e20e586d4003784fe9788 - pristine_git_object: bd0ed8f6a7ce105ef1a3d78663792b883e98732b + last_write_checksum: sha1:4e03642cdc2b00b7537d46ccafc0dcc6dcb6ad2c + pristine_git_object: a928e4354af32d65249d49226295b1beb199374e scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:10d6ae008b24c68e99d7e8ba9c2e747070685ead @@ -3686,8 +3690,8 @@ trackedFiles: pristine_git_object: 2a3ead70ccc6228cbae1c5c8a319b1399f3804ea src/censys_platform/__init__.py: id: 878ba9c20da1 - last_write_checksum: sha1:36306d1d404b6aeb912d27f1d9c52f098ff7bf9b - pristine_git_object: dd02e42e4cc509dc90e6ae70493054021faa5f9c + last_write_checksum: sha1:eec86b555287a1f966479167defba81fe37be83f + pristine_git_object: d028dd22db25a8dfa0f8c44641ceed256e9d9e46 src/censys_platform/_hooks/__init__.py: id: 571a90265aa1 last_write_checksum: sha1:45a380490e968d8d95994dd97554ac60eeb6ae60 @@ -3702,8 +3706,8 @@ trackedFiles: pristine_git_object: 352d3691d91c2d0ba0f05b48b56d4df5ce520098 src/censys_platform/_version.py: id: d2dc39704c23 - last_write_checksum: sha1:be2be80e216f5040c0b5d9b7b0a9ad115e83ea0f - pristine_git_object: 41c8d17b03eb01ac5df7f050637ad439279bfbc5 + last_write_checksum: sha1:0ff3fa3cccc9afe833a990881c701e5f7bf3d47e + pristine_git_object: 22057bc0aea611a0710c991f4a28647c0891e16e src/censys_platform/account_management.py: id: 09993862b047 last_write_checksum: sha1:09f4a14d8ae7684622d2d8633656f043c3ae9bef @@ -3718,8 +3722,8 @@ trackedFiles: pristine_git_object: 04d02d991fd90eb1c43e317e343d26fb395d2241 src/censys_platform/collections.py: id: e6d640c28668 - last_write_checksum: sha1:41a16f9156941a8485aebb388fe222adc17c5273 - pristine_git_object: 176a0551bfb62efd9847529aeade4043b7b923df + last_write_checksum: sha1:75cbb8b2a3af148d9e62235fa2d06ffad9eb0d74 + pristine_git_object: b4c0522c33e5d68f3335930c11d21ec93fbf2c56 src/censys_platform/global_data.py: id: 0eedbf9a2038 last_write_checksum: sha1:9041016f3cafc9826264accf81dc9c84b808ebef @@ -3730,8 +3734,8 @@ trackedFiles: pristine_git_object: 89560b566073785535643e694c112bedbd3db13d src/censys_platform/models/__init__.py: id: 4c65ae1e4fed - last_write_checksum: sha1:031176bc5c13c876a5f6fc5e8e8fa618efa796d5 - pristine_git_object: fe5ff84e3fc3e69ad34fe83c1d90b9e0b17af64a + last_write_checksum: sha1:3fdb7fc4ee23012df8a8a8c547af98fda6c99e32 + pristine_git_object: 7815035bf29a8f8b2d509b712cdb54ed527682a1 src/censys_platform/models/activemq.py: id: c852b87bc559 last_write_checksum: sha1:a754dc1ce0647be6304994e4c598c533e0db974e @@ -6362,8 +6366,8 @@ trackedFiles: pristine_git_object: e9b29751e021ffdf749dd1fbcd5c32d5f7e5ac33 src/censys_platform/models/v3_tags_list_assignmentsop.py: id: 9091a5881c41 - last_write_checksum: sha1:60023b0f42be2d284ee89f0afc950a9dc7a6240a - pristine_git_object: 919d723306997dfcde0bc8218cf6879fc4406f05 + last_write_checksum: sha1:8b17d3dbaa07a4b7a078b60fb44085387f06b965 + pristine_git_object: e711947faee0a7403d5353ca6f8040aace4c78a2 src/censys_platform/models/v3_tags_list_tagsop.py: id: 0120b0bc7188 last_write_checksum: sha1:dd5d1d63c6b0a8580071915f6b14d670dd40d46e @@ -6590,8 +6594,8 @@ trackedFiles: pristine_git_object: 42d8d78e9981eed7507670014d99588e27ab325a src/censys_platform/utils/serializers.py: id: a3afe58d4a90 - last_write_checksum: sha1:61009f2e4ef6613a1a5af813fe020373dae5a492 - pristine_git_object: d2149f8b909cb96628db140ac3cddb1b1e981367 + last_write_checksum: sha1:7485f1425b0661fd84836186570df90207eec6af + pristine_git_object: 1031ed930bad5ece220cf7416a56c29f40f0588b src/censys_platform/utils/unmarshal_json_response.py: id: d2dd833c6fb4 last_write_checksum: sha1:431aefbf77535ecb82fd774c5429eda8380aca91 diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index a86c535..d088ba4 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false python: - version: 0.14.2 + version: 0.14.3 additionalDependencies: dev: {} main: {} @@ -69,6 +69,7 @@ python: webhooks: "" inferUnionDiscriminators: true inputModelSuffix: input + inputTypedDictSuffix: TypedDict legacyPyright: true license: "" maxMethodParams: 5 diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 7d40d0f..2f4e053 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,20 +1,20 @@ -speakeasyVersion: 1.773.1 +speakeasyVersion: 1.777.1 sources: converge-source: sourceNamespace: converge-source - sourceRevisionDigest: sha256:a5c090fab3cd374240c23f17037eb69dbcab2a031dc389a7c702ba78f530f9aa - sourceBlobDigest: sha256:dade7d1e04d9a7fdc8c621f35b22b7dc1de5280147324d47822c841a62cc42fd + sourceRevisionDigest: sha256:5db2b1f0584d9707b7d1e63346dfa16dc264cbd6c19da9d610538e10b5817ba1 + sourceBlobDigest: sha256:e17252e4a3992c9b8d88e29dd91e829d55d25dfe01cb509155adcb81b2c32ce5 tags: - latest - - 1.0.106 + - 1.0.107 targets: censys-sdk-python: source: converge-source sourceNamespace: converge-source - sourceRevisionDigest: sha256:a5c090fab3cd374240c23f17037eb69dbcab2a031dc389a7c702ba78f530f9aa - sourceBlobDigest: sha256:dade7d1e04d9a7fdc8c621f35b22b7dc1de5280147324d47822c841a62cc42fd + sourceRevisionDigest: sha256:5db2b1f0584d9707b7d1e63346dfa16dc264cbd6c19da9d610538e10b5817ba1 + sourceBlobDigest: sha256:e17252e4a3992c9b8d88e29dd91e829d55d25dfe01cb509155adcb81b2c32ce5 codeSamplesNamespace: converge-source-python-code-samples - codeSamplesRevisionDigest: sha256:ea7c9c9df9fb6ea2c9e4278c007629180e8cf279469d3023fa92f32d81d2d925 + codeSamplesRevisionDigest: sha256:33499d9fb0def70474649974ed631c43cc7a6d82954bf243aa4fb99b5e9e8914 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/RELEASES.md b/RELEASES.md index cd9a860..2a19e0e 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -306,4 +306,14 @@ Based on: ### Generated - [python v0.14.2] . ### Releases -- [PyPI v0.14.2] https://pypi.org/project/censys-platform/0.14.2 - . \ No newline at end of file +- [PyPI v0.14.2] https://pypi.org/project/censys-platform/0.14.2 - . + +## 2026-06-12 01:07:37 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.777.1 (2.903.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.14.3] . +### Releases +- [PyPI v0.14.3] https://pypi.org/project/censys-platform/0.14.3 - . \ No newline at end of file diff --git a/docs/models/queryparamassettype.md b/docs/models/queryparamassettype.md new file mode 100644 index 0000000..27ba8f0 --- /dev/null +++ b/docs/models/queryparamassettype.md @@ -0,0 +1,20 @@ +# QueryParamAssetType + +Filter assignments by asset type. + +## Example Usage + +```python +from censys_platform.models import QueryParamAssetType + +value = QueryParamAssetType.HOST +``` + + +## Values + +| Name | Value | +| -------------- | -------------- | +| `HOST` | host | +| `WEB_PROPERTY` | web_property | +| `CERTIFICATE` | certificate | \ No newline at end of file diff --git a/docs/models/v3tagslistassignmentsrequest.md b/docs/models/v3tagslistassignmentsrequest.md index 13c9928..1f231e3 100644 --- a/docs/models/v3tagslistassignmentsrequest.md +++ b/docs/models/v3tagslistassignmentsrequest.md @@ -11,6 +11,7 @@ | `page_token` | *Optional[str]* | :heavy_minus_sign: | Pagination token from a previous response to retrieve the next page of results. | | | `order_by` | [Optional[models.V3TagsListAssignmentsQueryParamOrderBy]](../models/v3tagslistassignmentsqueryparamorderby.md) | :heavy_minus_sign: | Sort order. Supported values: create_time_asc, create_time_desc. | | | `asset_id` | *Optional[str]* | :heavy_minus_sign: | The identifier of the asset (host IP, certificate SHA-256 fingerprint, or web property hostname:port). | **Example 1:** 8.8.8.8
**Example 2:** 3daf2843a77b6f4e6af43cd9b6f6746053b8c928e056e8a724808db8905a94cf
**Example 3:** platform.censys.io:443 | +| `asset_type` | [Optional[models.QueryParamAssetType]](../models/queryparamassettype.md) | :heavy_minus_sign: | Filter assignments by asset type. | | | `created_before` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | RFC3339 timestamp. Only return assignments created before this time. | | | `created_after` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | RFC3339 timestamp. Only return assignments created after this time. | | | `created_by` | *Optional[str]* | :heavy_minus_sign: | Filter by the user ID of the user who created the assignment. | | \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index bd0ed8f..a928e43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "censys-platform" -version = "0.14.2" +version = "0.14.3" description = "Python Client SDK Generated by Speakeasy." authors = [{ name = "Speakeasy" },] readme = "README-PYPI.md" diff --git a/src/censys_platform/__init__.py b/src/censys_platform/__init__.py index dd02e42..d028dd2 100644 --- a/src/censys_platform/__init__.py +++ b/src/censys_platform/__init__.py @@ -9,7 +9,23 @@ ) from .sdk import * from .sdkconfiguration import * -from .models import * +from typing import TYPE_CHECKING +from . import models as _models + +if TYPE_CHECKING: + from .models import * +else: + + def __getattr__(name: str): + try: + return getattr(_models, name) + except AttributeError: + raise AttributeError( + f"module {__name__!r} has no attribute {name!r}" + ) from None + + def __dir__(): + return dir(_models) + list(globals().keys()) VERSION: str = __version__ diff --git a/src/censys_platform/_version.py b/src/censys_platform/_version.py index 41c8d17..22057bc 100644 --- a/src/censys_platform/_version.py +++ b/src/censys_platform/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "censys-platform" -__version__: str = "0.14.2" -__openapi_doc_version__: str = "1.0.106" -__gen_version__: str = "2.897.1" -__user_agent__: str = "speakeasy-sdk/python 0.14.2 2.897.1 1.0.106 censys-platform" +__version__: str = "0.14.3" +__openapi_doc_version__: str = "1.0.107" +__gen_version__: str = "2.903.2" +__user_agent__: str = "speakeasy-sdk/python 0.14.3 2.903.2 1.0.107 censys-platform" try: if __package__ is not None: diff --git a/src/censys_platform/collections.py b/src/censys_platform/collections.py index 176a055..b4c0522 100644 --- a/src/censys_platform/collections.py +++ b/src/censys_platform/collections.py @@ -6,7 +6,7 @@ from censys_platform.types import BaseModel, OptionalNullable, UNSET from censys_platform.utils.unmarshal_json_response import unmarshal_json_response from enum import Enum -from typing import Any, List, Mapping, Optional, Union, cast +from typing import Any, Iterable, List, Mapping, Optional, Union, cast class DeleteAcceptEnum(str, Enum): @@ -23,7 +23,9 @@ def list( organization_id: Optional[str] = None, page_token: Optional[str] = None, page_size: Optional[int] = None, - collection_statuses: OptionalNullable[List[models.CollectionStatuses]] = UNSET, + collection_statuses: OptionalNullable[ + Iterable[models.CollectionStatuses] + ] = UNSET, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -56,7 +58,9 @@ def list( organization_id=organization_id, page_token=page_token, page_size=page_size, - collection_statuses=collection_statuses, + collection_statuses=utils.unmarshal( + collection_statuses, OptionalNullable[List[models.CollectionStatuses]] + ), ) req = self._build_request( @@ -134,7 +138,9 @@ async def list_async( organization_id: Optional[str] = None, page_token: Optional[str] = None, page_size: Optional[int] = None, - collection_statuses: OptionalNullable[List[models.CollectionStatuses]] = UNSET, + collection_statuses: OptionalNullable[ + Iterable[models.CollectionStatuses] + ] = UNSET, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -167,7 +173,9 @@ async def list_async( organization_id=organization_id, page_token=page_token, page_size=page_size, - collection_statuses=collection_statuses, + collection_statuses=utils.unmarshal( + collection_statuses, OptionalNullable[List[models.CollectionStatuses]] + ), ) req = self._build_request_async( diff --git a/src/censys_platform/models/__init__.py b/src/censys_platform/models/__init__.py index fe5ff84..7815035 100644 --- a/src/censys_platform/models/__init__.py +++ b/src/censys_platform/models/__init__.py @@ -1672,6 +1672,7 @@ V3TagsGetTagResponseTypedDict, ) from .v3_tags_list_assignmentsop import ( + QueryParamAssetType, V3TagsListAssignmentsGlobals, V3TagsListAssignmentsGlobalsTypedDict, V3TagsListAssignmentsQueryParamOrderBy, @@ -2646,6 +2647,7 @@ "QcStatementsQcType", "QcStatementsQcTypeTypedDict", "QcStatementsTypedDict", + "QueryParamAssetType", "QueryParamGranularity", "QueryParamOrderBy", "QueryParamPrivacy", @@ -5074,6 +5076,7 @@ "V3TagsGetTagRequestTypedDict": ".v3_tags_get_tagop", "V3TagsGetTagResponse": ".v3_tags_get_tagop", "V3TagsGetTagResponseTypedDict": ".v3_tags_get_tagop", + "QueryParamAssetType": ".v3_tags_list_assignmentsop", "V3TagsListAssignmentsGlobals": ".v3_tags_list_assignmentsop", "V3TagsListAssignmentsGlobalsTypedDict": ".v3_tags_list_assignmentsop", "V3TagsListAssignmentsQueryParamOrderBy": ".v3_tags_list_assignmentsop", diff --git a/src/censys_platform/models/v3_tags_list_assignmentsop.py b/src/censys_platform/models/v3_tags_list_assignmentsop.py index 919d723..e711947 100644 --- a/src/censys_platform/models/v3_tags_list_assignmentsop.py +++ b/src/censys_platform/models/v3_tags_list_assignmentsop.py @@ -48,6 +48,14 @@ class V3TagsListAssignmentsQueryParamOrderBy(str, Enum): CREATE_TIME_DESC = "create_time_desc" +class QueryParamAssetType(str, Enum): + r"""Filter assignments by asset type.""" + + HOST = "host" + WEB_PROPERTY = "web_property" + CERTIFICATE = "certificate" + + class V3TagsListAssignmentsRequestTypedDict(TypedDict): tag_id: str r"""The ID of the tag whose assignments to list.""" @@ -61,6 +69,8 @@ class V3TagsListAssignmentsRequestTypedDict(TypedDict): r"""Sort order. Supported values: create_time_asc, create_time_desc.""" asset_id: NotRequired[str] r"""The identifier of the asset (host IP, certificate SHA-256 fingerprint, or web property hostname:port).""" + asset_type: NotRequired[QueryParamAssetType] + r"""Filter assignments by asset type.""" created_before: NotRequired[datetime] r"""RFC3339 timestamp. Only return assignments created before this time.""" created_after: NotRequired[datetime] @@ -105,6 +115,12 @@ class V3TagsListAssignmentsRequest(BaseModel): ] = None r"""The identifier of the asset (host IP, certificate SHA-256 fingerprint, or web property hostname:port).""" + asset_type: Annotated[ + Optional[QueryParamAssetType], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter assignments by asset type.""" + created_before: Annotated[ Optional[datetime], FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), @@ -132,6 +148,7 @@ def serialize_model(self, handler): "page_token", "order_by", "asset_id", + "asset_type", "created_before", "created_after", "created_by", diff --git a/src/censys_platform/utils/serializers.py b/src/censys_platform/utils/serializers.py index d2149f8..1031ed9 100644 --- a/src/censys_platform/utils/serializers.py +++ b/src/censys_platform/utils/serializers.py @@ -4,7 +4,7 @@ import functools import json import typing -from typing import Any, Dict, List, Tuple, Union, get_args +from typing import Any, Dict, Iterable, List, Mapping, Tuple, Union, get_args import typing_extensions from typing_extensions import get_origin @@ -113,10 +113,12 @@ def validate(c): def unmarshal_json(raw, typ: Any) -> Any: - return unmarshal(from_json(raw), typ) + return unmarshal(from_json(raw), typ, coerce_iterables=False) -def unmarshal(val, typ: Any) -> Any: +def unmarshal(val, typ: Any, coerce_iterables: bool = True) -> Any: + if coerce_iterables: + val = _coerce_iterables_for_type(val, typ) unmarshaller = create_model( "Unmarshaller", body=(typ, ...), @@ -193,9 +195,88 @@ def get_pydantic_model(data: Any, typ: Any) -> Any: if not _contains_pydantic_model(data): return unmarshal(data, typ) + return _coerce_iterables_for_type(data, typ) + + +def _coerce_iterables_for_type(data: Any, typ: Any) -> Any: + if data is None or isinstance(data, (BaseModel, Unset)): + return data + + typ = _resolve_type_alias(typ) + origin = get_origin(typ) + + if _is_annotated_type(origin): + args = get_args(typ) + return _coerce_iterables_for_type(data, args[0]) if args else data + + if is_union(origin): + for arg in (arg for arg in get_args(typ) if arg is not type(None)): + coerced = _coerce_iterables_for_type(data, arg) + if coerced is not data: + return coerced + return data + + if _is_list_type(typ): + item_type = get_args(typ)[0] if get_args(typ) else Any + if isinstance(data, (str, bytes, bytearray, Mapping)): + return data + if isinstance(data, Iterable): + return [_coerce_iterables_for_type(item, item_type) for item in data] + return data + + if _is_mapping_type(typ): + value_type = get_args(typ)[1] if len(get_args(typ)) > 1 else Any + if isinstance(data, Mapping): + return { + key: _coerce_iterables_for_type(value, value_type) + for key, value in data.items() + } + return data + + if _is_pydantic_model_type(typ) and isinstance(data, Mapping): + coerced = None + for field_name, field in typ.model_fields.items(): + field_type = field.annotation + for key in (field_name, field.alias): + if key is not None and key in data: + value = data[key] if coerced is None else coerced[key] + coerced_value = _coerce_iterables_for_type(value, field_type) + if coerced_value is not value: + if coerced is None: + coerced = dict(data) + coerced[key] = coerced_value + return coerced if coerced is not None else data + return data +def _resolve_type_alias(typ: Any) -> Any: + return getattr(typ, "__value__", typ) + + +def _is_annotated_type(origin: Any) -> bool: + return any( + origin is typing_obj + for typing_obj in _get_typing_objects_by_name_of("Annotated") + ) + + +def _is_list_type(typ: Any) -> bool: + typ = _resolve_type_alias(typ) + return typ is list or get_origin(typ) is list + + +def _is_mapping_type(typ: Any) -> bool: + typ = _resolve_type_alias(typ) + origin = get_origin(typ) + mapping_origin = get_origin(Mapping[Any, Any]) + return typ in (dict, Dict, Mapping) or origin in (dict, Mapping, mapping_origin) + + +def _is_pydantic_model_type(typ: Any) -> bool: + return isinstance(typ, type) and issubclass(typ, BaseModel) + + def _contains_pydantic_model(data: Any) -> bool: if isinstance(data, BaseModel): return True