zillow-rapidapi-client 0.1.3__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. zillow_rapidapi_client/__init__.py +18 -0
  2. zillow_rapidapi_client/_hooks/__init__.py +5 -0
  3. zillow_rapidapi_client/_hooks/registration.py +13 -0
  4. zillow_rapidapi_client/_hooks/sdkhooks.py +76 -0
  5. zillow_rapidapi_client/_hooks/types.py +106 -0
  6. zillow_rapidapi_client/_version.py +15 -0
  7. zillow_rapidapi_client/basesdk.py +358 -0
  8. zillow_rapidapi_client/httpclient.py +134 -0
  9. zillow_rapidapi_client/models/__init__.py +40 -0
  10. zillow_rapidapi_client/models/apierror.py +22 -0
  11. zillow_rapidapi_client/models/property.py +163 -0
  12. zillow_rapidapi_client/models/propertyextendedsearchop.py +106 -0
  13. zillow_rapidapi_client/models/propertysearchresponse.py +32 -0
  14. zillow_rapidapi_client/properties.py +221 -0
  15. zillow_rapidapi_client/py.typed +1 -0
  16. zillow_rapidapi_client/sdk.py +114 -0
  17. zillow_rapidapi_client/sdkconfiguration.py +52 -0
  18. zillow_rapidapi_client/types/__init__.py +21 -0
  19. zillow_rapidapi_client/types/basemodel.py +39 -0
  20. zillow_rapidapi_client/utils/__init__.py +99 -0
  21. zillow_rapidapi_client/utils/annotations.py +55 -0
  22. zillow_rapidapi_client/utils/enums.py +34 -0
  23. zillow_rapidapi_client/utils/eventstreaming.py +238 -0
  24. zillow_rapidapi_client/utils/forms.py +202 -0
  25. zillow_rapidapi_client/utils/headers.py +136 -0
  26. zillow_rapidapi_client/utils/logger.py +27 -0
  27. zillow_rapidapi_client/utils/metadata.py +118 -0
  28. zillow_rapidapi_client/utils/queryparams.py +205 -0
  29. zillow_rapidapi_client/utils/requestbodies.py +66 -0
  30. zillow_rapidapi_client/utils/retries.py +217 -0
  31. zillow_rapidapi_client/utils/security.py +174 -0
  32. zillow_rapidapi_client/utils/serializers.py +215 -0
  33. zillow_rapidapi_client/utils/url.py +155 -0
  34. zillow_rapidapi_client/utils/values.py +137 -0
  35. zillow_rapidapi_client-0.1.3.dist-info/METADATA +419 -0
  36. zillow_rapidapi_client-0.1.3.dist-info/RECORD +37 -0
  37. zillow_rapidapi_client-0.1.3.dist-info/WHEEL +4 -0
@@ -0,0 +1,221 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from .basesdk import BaseSDK
4
+ from typing import Mapping, Optional
5
+ from zillow_rapidapi_client import models, utils
6
+ from zillow_rapidapi_client._hooks import HookContext
7
+ from zillow_rapidapi_client.types import OptionalNullable, UNSET
8
+
9
+
10
+ class Properties(BaseSDK):
11
+ def extended_search(
12
+ self,
13
+ *,
14
+ location: Optional[str] = None,
15
+ page: Optional[int] = None,
16
+ status_type: Optional[models.StatusType] = None,
17
+ home_type: Optional[models.HomeType] = None,
18
+ sort: Optional[models.Sort] = None,
19
+ min_price: Optional[float] = None,
20
+ max_price: Optional[float] = None,
21
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
22
+ server_url: Optional[str] = None,
23
+ timeout_ms: Optional[int] = None,
24
+ http_headers: Optional[Mapping[str, str]] = None,
25
+ ) -> models.PropertySearchResponse:
26
+ r"""Search for properties
27
+
28
+ :param location: Location details (address, county, neighborhood, or Zip code). Required if polygon or coordinates are empty.
29
+ :param page: Page number for paginated results. Max value is 20.
30
+ :param status_type: Property status type.
31
+ :param home_type: Property type. Comma-separated list.
32
+ :param sort: Sorting order.
33
+ :param min_price: Minimum price filter.
34
+ :param max_price: Maximum price filter.
35
+ :param retries: Override the default retry configuration for this method
36
+ :param server_url: Override the default server URL for this method
37
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
38
+ :param http_headers: Additional headers to set or replace on requests.
39
+ """
40
+ base_url = None
41
+ url_variables = None
42
+ if timeout_ms is None:
43
+ timeout_ms = self.sdk_configuration.timeout_ms
44
+
45
+ if server_url is not None:
46
+ base_url = server_url
47
+ else:
48
+ base_url = self._get_url(base_url, url_variables)
49
+
50
+ request = models.PropertyExtendedSearchRequest(
51
+ location=location,
52
+ page=page,
53
+ status_type=status_type,
54
+ home_type=home_type,
55
+ sort=sort,
56
+ min_price=min_price,
57
+ max_price=max_price,
58
+ )
59
+
60
+ req = self._build_request(
61
+ method="GET",
62
+ path="/propertyExtendedSearch",
63
+ base_url=base_url,
64
+ url_variables=url_variables,
65
+ request=request,
66
+ request_body_required=False,
67
+ request_has_path_params=False,
68
+ request_has_query_params=True,
69
+ user_agent_header="user-agent",
70
+ accept_header_value="application/json",
71
+ http_headers=http_headers,
72
+ timeout_ms=timeout_ms,
73
+ )
74
+
75
+ if retries == UNSET:
76
+ if self.sdk_configuration.retry_config is not UNSET:
77
+ retries = self.sdk_configuration.retry_config
78
+
79
+ retry_config = None
80
+ if isinstance(retries, utils.RetryConfig):
81
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
82
+
83
+ http_res = self.do_request(
84
+ hook_ctx=HookContext(
85
+ base_url=base_url or "",
86
+ operation_id="propertyExtendedSearch",
87
+ oauth2_scopes=[],
88
+ security_source=None,
89
+ ),
90
+ request=req,
91
+ error_status_codes=["400", "4XX", "500", "5XX"],
92
+ retry_config=retry_config,
93
+ )
94
+
95
+ if utils.match_response(http_res, "200", "application/json"):
96
+ return utils.unmarshal_json(http_res.text, models.PropertySearchResponse)
97
+ if utils.match_response(http_res, ["400", "4XX"], "*"):
98
+ http_res_text = utils.stream_to_text(http_res)
99
+ raise models.APIError(
100
+ "API error occurred", http_res.status_code, http_res_text, http_res
101
+ )
102
+ if utils.match_response(http_res, ["500", "5XX"], "*"):
103
+ http_res_text = utils.stream_to_text(http_res)
104
+ raise models.APIError(
105
+ "API error occurred", http_res.status_code, http_res_text, http_res
106
+ )
107
+
108
+ content_type = http_res.headers.get("Content-Type")
109
+ http_res_text = utils.stream_to_text(http_res)
110
+ raise models.APIError(
111
+ f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
112
+ http_res.status_code,
113
+ http_res_text,
114
+ http_res,
115
+ )
116
+
117
+ async def extended_search_async(
118
+ self,
119
+ *,
120
+ location: Optional[str] = None,
121
+ page: Optional[int] = None,
122
+ status_type: Optional[models.StatusType] = None,
123
+ home_type: Optional[models.HomeType] = None,
124
+ sort: Optional[models.Sort] = None,
125
+ min_price: Optional[float] = None,
126
+ max_price: Optional[float] = None,
127
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
128
+ server_url: Optional[str] = None,
129
+ timeout_ms: Optional[int] = None,
130
+ http_headers: Optional[Mapping[str, str]] = None,
131
+ ) -> models.PropertySearchResponse:
132
+ r"""Search for properties
133
+
134
+ :param location: Location details (address, county, neighborhood, or Zip code). Required if polygon or coordinates are empty.
135
+ :param page: Page number for paginated results. Max value is 20.
136
+ :param status_type: Property status type.
137
+ :param home_type: Property type. Comma-separated list.
138
+ :param sort: Sorting order.
139
+ :param min_price: Minimum price filter.
140
+ :param max_price: Maximum price filter.
141
+ :param retries: Override the default retry configuration for this method
142
+ :param server_url: Override the default server URL for this method
143
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
144
+ :param http_headers: Additional headers to set or replace on requests.
145
+ """
146
+ base_url = None
147
+ url_variables = None
148
+ if timeout_ms is None:
149
+ timeout_ms = self.sdk_configuration.timeout_ms
150
+
151
+ if server_url is not None:
152
+ base_url = server_url
153
+ else:
154
+ base_url = self._get_url(base_url, url_variables)
155
+
156
+ request = models.PropertyExtendedSearchRequest(
157
+ location=location,
158
+ page=page,
159
+ status_type=status_type,
160
+ home_type=home_type,
161
+ sort=sort,
162
+ min_price=min_price,
163
+ max_price=max_price,
164
+ )
165
+
166
+ req = self._build_request_async(
167
+ method="GET",
168
+ path="/propertyExtendedSearch",
169
+ base_url=base_url,
170
+ url_variables=url_variables,
171
+ request=request,
172
+ request_body_required=False,
173
+ request_has_path_params=False,
174
+ request_has_query_params=True,
175
+ user_agent_header="user-agent",
176
+ accept_header_value="application/json",
177
+ http_headers=http_headers,
178
+ timeout_ms=timeout_ms,
179
+ )
180
+
181
+ if retries == UNSET:
182
+ if self.sdk_configuration.retry_config is not UNSET:
183
+ retries = self.sdk_configuration.retry_config
184
+
185
+ retry_config = None
186
+ if isinstance(retries, utils.RetryConfig):
187
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
188
+
189
+ http_res = await self.do_request_async(
190
+ hook_ctx=HookContext(
191
+ base_url=base_url or "",
192
+ operation_id="propertyExtendedSearch",
193
+ oauth2_scopes=[],
194
+ security_source=None,
195
+ ),
196
+ request=req,
197
+ error_status_codes=["400", "4XX", "500", "5XX"],
198
+ retry_config=retry_config,
199
+ )
200
+
201
+ if utils.match_response(http_res, "200", "application/json"):
202
+ return utils.unmarshal_json(http_res.text, models.PropertySearchResponse)
203
+ if utils.match_response(http_res, ["400", "4XX"], "*"):
204
+ http_res_text = await utils.stream_to_text_async(http_res)
205
+ raise models.APIError(
206
+ "API error occurred", http_res.status_code, http_res_text, http_res
207
+ )
208
+ if utils.match_response(http_res, ["500", "5XX"], "*"):
209
+ http_res_text = await utils.stream_to_text_async(http_res)
210
+ raise models.APIError(
211
+ "API error occurred", http_res.status_code, http_res_text, http_res
212
+ )
213
+
214
+ content_type = http_res.headers.get("Content-Type")
215
+ http_res_text = await utils.stream_to_text_async(http_res)
216
+ raise models.APIError(
217
+ f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
218
+ http_res.status_code,
219
+ http_res_text,
220
+ http_res,
221
+ )
@@ -0,0 +1 @@
1
+ # Marker file for PEP 561. The package enables type hints.
@@ -0,0 +1,114 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from .basesdk import BaseSDK
4
+ from .httpclient import AsyncHttpClient, ClientOwner, HttpClient, close_clients
5
+ from .sdkconfiguration import SDKConfiguration
6
+ from .utils.logger import Logger, get_default_logger
7
+ from .utils.retries import RetryConfig
8
+ import httpx
9
+ from typing import Dict, Optional, cast
10
+ import weakref
11
+ from zillow_rapidapi_client import utils
12
+ from zillow_rapidapi_client._hooks import SDKHooks
13
+ from zillow_rapidapi_client.properties import Properties
14
+ from zillow_rapidapi_client.types import OptionalNullable, UNSET
15
+
16
+
17
+ class ZillowRapidapiClient(BaseSDK):
18
+ r"""Zillow Property Extended Search API: API for searching properties using various filters."""
19
+
20
+ properties: Properties
21
+
22
+ def __init__(
23
+ self,
24
+ server_idx: Optional[int] = None,
25
+ server_url: Optional[str] = None,
26
+ url_params: Optional[Dict[str, str]] = None,
27
+ client: Optional[HttpClient] = None,
28
+ async_client: Optional[AsyncHttpClient] = None,
29
+ retry_config: OptionalNullable[RetryConfig] = UNSET,
30
+ timeout_ms: Optional[int] = None,
31
+ debug_logger: Optional[Logger] = None,
32
+ ) -> None:
33
+ r"""Instantiates the SDK configuring it with the provided parameters.
34
+
35
+ :param server_idx: The index of the server to use for all methods
36
+ :param server_url: The server URL to use for all methods
37
+ :param url_params: Parameters to optionally template the server URL with
38
+ :param client: The HTTP client to use for all synchronous methods
39
+ :param async_client: The Async HTTP client to use for all asynchronous methods
40
+ :param retry_config: The retry configuration to use for all supported methods
41
+ :param timeout_ms: Optional request timeout applied to each operation in milliseconds
42
+ """
43
+ if client is None:
44
+ client = httpx.Client()
45
+
46
+ assert issubclass(
47
+ type(client), HttpClient
48
+ ), "The provided client must implement the HttpClient protocol."
49
+
50
+ if async_client is None:
51
+ async_client = httpx.AsyncClient()
52
+
53
+ if debug_logger is None:
54
+ debug_logger = get_default_logger()
55
+
56
+ assert issubclass(
57
+ type(async_client), AsyncHttpClient
58
+ ), "The provided async_client must implement the AsyncHttpClient protocol."
59
+
60
+ if server_url is not None:
61
+ if url_params is not None:
62
+ server_url = utils.template_url(server_url, url_params)
63
+
64
+ BaseSDK.__init__(
65
+ self,
66
+ SDKConfiguration(
67
+ client=client,
68
+ async_client=async_client,
69
+ server_url=server_url,
70
+ server_idx=server_idx,
71
+ retry_config=retry_config,
72
+ timeout_ms=timeout_ms,
73
+ debug_logger=debug_logger,
74
+ ),
75
+ )
76
+
77
+ hooks = SDKHooks()
78
+
79
+ current_server_url, *_ = self.sdk_configuration.get_server_details()
80
+ server_url, self.sdk_configuration.client = hooks.sdk_init(
81
+ current_server_url, self.sdk_configuration.client
82
+ )
83
+ if current_server_url != server_url:
84
+ self.sdk_configuration.server_url = server_url
85
+
86
+ # pylint: disable=protected-access
87
+ self.sdk_configuration.__dict__["_hooks"] = hooks
88
+
89
+ weakref.finalize(
90
+ self,
91
+ close_clients,
92
+ cast(ClientOwner, self.sdk_configuration),
93
+ self.sdk_configuration.client,
94
+ self.sdk_configuration.async_client,
95
+ )
96
+
97
+ self._init_sdks()
98
+
99
+ def _init_sdks(self):
100
+ self.properties = Properties(self.sdk_configuration)
101
+
102
+ def __enter__(self):
103
+ return self
104
+
105
+ async def __aenter__(self):
106
+ return self
107
+
108
+ def __exit__(self, exc_type, exc_val, exc_tb):
109
+ if self.sdk_configuration.client is not None:
110
+ self.sdk_configuration.client.close()
111
+
112
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
113
+ if self.sdk_configuration.async_client is not None:
114
+ await self.sdk_configuration.async_client.aclose()
@@ -0,0 +1,52 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from ._hooks import SDKHooks
4
+ from ._version import (
5
+ __gen_version__,
6
+ __openapi_doc_version__,
7
+ __user_agent__,
8
+ __version__,
9
+ )
10
+ from .httpclient import AsyncHttpClient, HttpClient
11
+ from .utils import Logger, RetryConfig, remove_suffix
12
+ from dataclasses import dataclass
13
+ from pydantic import Field
14
+ from typing import Dict, Optional, Tuple
15
+ from zillow_rapidapi_client.types import OptionalNullable, UNSET
16
+
17
+
18
+ SERVERS = [
19
+ "https://zillow-com1.p.rapidapi.com",
20
+ # RapidAPI Zillow Proxy
21
+ ]
22
+ """Contains the list of servers available to the SDK"""
23
+
24
+
25
+ @dataclass
26
+ class SDKConfiguration:
27
+ client: HttpClient
28
+ async_client: AsyncHttpClient
29
+ debug_logger: Logger
30
+ server_url: Optional[str] = ""
31
+ server_idx: Optional[int] = 0
32
+ language: str = "python"
33
+ openapi_doc_version: str = __openapi_doc_version__
34
+ sdk_version: str = __version__
35
+ gen_version: str = __gen_version__
36
+ user_agent: str = __user_agent__
37
+ retry_config: OptionalNullable[RetryConfig] = Field(default_factory=lambda: UNSET)
38
+ timeout_ms: Optional[int] = None
39
+
40
+ def __post_init__(self):
41
+ self._hooks = SDKHooks()
42
+
43
+ def get_server_details(self) -> Tuple[str, Dict[str, str]]:
44
+ if self.server_url is not None and self.server_url:
45
+ return remove_suffix(self.server_url, "/"), {}
46
+ if self.server_idx is None:
47
+ self.server_idx = 0
48
+
49
+ return SERVERS[self.server_idx], {}
50
+
51
+ def get_hooks(self) -> SDKHooks:
52
+ return self._hooks
@@ -0,0 +1,21 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from .basemodel import (
4
+ BaseModel,
5
+ Nullable,
6
+ OptionalNullable,
7
+ UnrecognizedInt,
8
+ UnrecognizedStr,
9
+ UNSET,
10
+ UNSET_SENTINEL,
11
+ )
12
+
13
+ __all__ = [
14
+ "BaseModel",
15
+ "Nullable",
16
+ "OptionalNullable",
17
+ "UnrecognizedInt",
18
+ "UnrecognizedStr",
19
+ "UNSET",
20
+ "UNSET_SENTINEL",
21
+ ]
@@ -0,0 +1,39 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from pydantic import ConfigDict, model_serializer
4
+ from pydantic import BaseModel as PydanticBaseModel
5
+ from typing import TYPE_CHECKING, Literal, Optional, TypeVar, Union, NewType
6
+ from typing_extensions import TypeAliasType, TypeAlias
7
+
8
+
9
+ class BaseModel(PydanticBaseModel):
10
+ model_config = ConfigDict(
11
+ populate_by_name=True, arbitrary_types_allowed=True, protected_namespaces=()
12
+ )
13
+
14
+
15
+ class Unset(BaseModel):
16
+ @model_serializer(mode="plain")
17
+ def serialize_model(self):
18
+ return UNSET_SENTINEL
19
+
20
+ def __bool__(self) -> Literal[False]:
21
+ return False
22
+
23
+
24
+ UNSET = Unset()
25
+ UNSET_SENTINEL = "~?~unset~?~sentinel~?~"
26
+
27
+
28
+ T = TypeVar("T")
29
+ if TYPE_CHECKING:
30
+ Nullable: TypeAlias = Union[T, None]
31
+ OptionalNullable: TypeAlias = Union[Optional[Nullable[T]], Unset]
32
+ else:
33
+ Nullable = TypeAliasType("Nullable", Union[T, None], type_params=(T,))
34
+ OptionalNullable = TypeAliasType(
35
+ "OptionalNullable", Union[Optional[Nullable[T]], Unset], type_params=(T,)
36
+ )
37
+
38
+ UnrecognizedInt = NewType("UnrecognizedInt", int)
39
+ UnrecognizedStr = NewType("UnrecognizedStr", str)
@@ -0,0 +1,99 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from .annotations import get_discriminator
4
+ from .enums import OpenEnumMeta
5
+ from .headers import get_headers, get_response_headers
6
+ from .metadata import (
7
+ FieldMetadata,
8
+ find_metadata,
9
+ FormMetadata,
10
+ HeaderMetadata,
11
+ MultipartFormMetadata,
12
+ PathParamMetadata,
13
+ QueryParamMetadata,
14
+ RequestMetadata,
15
+ SecurityMetadata,
16
+ )
17
+ from .queryparams import get_query_params
18
+ from .retries import BackoffStrategy, Retries, retry, retry_async, RetryConfig
19
+ from .requestbodies import serialize_request_body, SerializedRequestBody
20
+ from .security import get_security
21
+ from .serializers import (
22
+ get_pydantic_model,
23
+ marshal_json,
24
+ unmarshal,
25
+ unmarshal_json,
26
+ serialize_decimal,
27
+ serialize_float,
28
+ serialize_int,
29
+ stream_to_text,
30
+ stream_to_text_async,
31
+ stream_to_bytes,
32
+ stream_to_bytes_async,
33
+ validate_const,
34
+ validate_decimal,
35
+ validate_float,
36
+ validate_int,
37
+ validate_open_enum,
38
+ )
39
+ from .url import generate_url, template_url, remove_suffix
40
+ from .values import (
41
+ get_global_from_env,
42
+ match_content_type,
43
+ match_status_codes,
44
+ match_response,
45
+ cast_partial,
46
+ )
47
+ from .logger import Logger, get_body_content, get_default_logger
48
+
49
+ __all__ = [
50
+ "BackoffStrategy",
51
+ "FieldMetadata",
52
+ "find_metadata",
53
+ "FormMetadata",
54
+ "generate_url",
55
+ "get_body_content",
56
+ "get_default_logger",
57
+ "get_discriminator",
58
+ "get_global_from_env",
59
+ "get_headers",
60
+ "get_pydantic_model",
61
+ "get_query_params",
62
+ "get_response_headers",
63
+ "get_security",
64
+ "HeaderMetadata",
65
+ "Logger",
66
+ "marshal_json",
67
+ "match_content_type",
68
+ "match_status_codes",
69
+ "match_response",
70
+ "MultipartFormMetadata",
71
+ "OpenEnumMeta",
72
+ "PathParamMetadata",
73
+ "QueryParamMetadata",
74
+ "remove_suffix",
75
+ "Retries",
76
+ "retry",
77
+ "retry_async",
78
+ "RetryConfig",
79
+ "RequestMetadata",
80
+ "SecurityMetadata",
81
+ "serialize_decimal",
82
+ "serialize_float",
83
+ "serialize_int",
84
+ "serialize_request_body",
85
+ "SerializedRequestBody",
86
+ "stream_to_text",
87
+ "stream_to_text_async",
88
+ "stream_to_bytes",
89
+ "stream_to_bytes_async",
90
+ "template_url",
91
+ "unmarshal",
92
+ "unmarshal_json",
93
+ "validate_decimal",
94
+ "validate_const",
95
+ "validate_float",
96
+ "validate_int",
97
+ "validate_open_enum",
98
+ "cast_partial",
99
+ ]
@@ -0,0 +1,55 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from enum import Enum
4
+ from typing import Any, Optional
5
+
6
+ def get_discriminator(model: Any, fieldname: str, key: str) -> str:
7
+ """
8
+ Recursively search for the discriminator attribute in a model.
9
+
10
+ Args:
11
+ model (Any): The model to search within.
12
+ fieldname (str): The name of the field to search for.
13
+ key (str): The key to search for in dictionaries.
14
+
15
+ Returns:
16
+ str: The name of the discriminator attribute.
17
+
18
+ Raises:
19
+ ValueError: If the discriminator attribute is not found.
20
+ """
21
+ upper_fieldname = fieldname.upper()
22
+
23
+ def get_field_discriminator(field: Any) -> Optional[str]:
24
+ """Search for the discriminator attribute in a given field."""
25
+
26
+ if isinstance(field, dict):
27
+ if key in field:
28
+ return f'{field[key]}'
29
+
30
+ if hasattr(field, fieldname):
31
+ attr = getattr(field, fieldname)
32
+ if isinstance(attr, Enum):
33
+ return f'{attr.value}'
34
+ return f'{attr}'
35
+
36
+ if hasattr(field, upper_fieldname):
37
+ attr = getattr(field, upper_fieldname)
38
+ if isinstance(attr, Enum):
39
+ return f'{attr.value}'
40
+ return f'{attr}'
41
+
42
+ return None
43
+
44
+
45
+ if isinstance(model, list):
46
+ for field in model:
47
+ discriminator = get_field_discriminator(field)
48
+ if discriminator is not None:
49
+ return discriminator
50
+
51
+ discriminator = get_field_discriminator(model)
52
+ if discriminator is not None:
53
+ return discriminator
54
+
55
+ raise ValueError(f'Could not find discriminator field {fieldname} in {model}')
@@ -0,0 +1,34 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ import enum
4
+
5
+
6
+ class OpenEnumMeta(enum.EnumMeta):
7
+ def __call__(
8
+ cls, value, names=None, *, module=None, qualname=None, type=None, start=1
9
+ ):
10
+ # The `type` kwarg also happens to be a built-in that pylint flags as
11
+ # redeclared. Safe to ignore this lint rule with this scope.
12
+ # pylint: disable=redefined-builtin
13
+
14
+ if names is not None:
15
+ return super().__call__(
16
+ value,
17
+ names=names,
18
+ module=module,
19
+ qualname=qualname,
20
+ type=type,
21
+ start=start,
22
+ )
23
+
24
+ try:
25
+ return super().__call__(
26
+ value,
27
+ names=names, # pyright: ignore[reportArgumentType]
28
+ module=module,
29
+ qualname=qualname,
30
+ type=type,
31
+ start=start,
32
+ )
33
+ except ValueError:
34
+ return value