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