compass_api_sdk 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of compass_api_sdk might be problematic. Click here for more details.

Files changed (137) hide show
  1. compass_api_sdk/__init__.py +17 -0
  2. compass_api_sdk/_hooks/__init__.py +5 -0
  3. compass_api_sdk/_hooks/registration.py +13 -0
  4. compass_api_sdk/_hooks/sdkhooks.py +76 -0
  5. compass_api_sdk/_hooks/types.py +106 -0
  6. compass_api_sdk/_version.py +15 -0
  7. compass_api_sdk/aave_v3.py +1903 -0
  8. compass_api_sdk/aerodrome_slipstream.py +1875 -0
  9. compass_api_sdk/basesdk.py +362 -0
  10. compass_api_sdk/errors/__init__.py +7 -0
  11. compass_api_sdk/errors/apierror.py +22 -0
  12. compass_api_sdk/errors/httpvalidationerror.py +21 -0
  13. compass_api_sdk/httpclient.py +136 -0
  14. compass_api_sdk/models/__init__.py +777 -0
  15. compass_api_sdk/models/aave_liquidity_changeop.py +108 -0
  16. compass_api_sdk/models/aave_token_priceop.py +98 -0
  17. compass_api_sdk/models/aave_user_position_per_tokenop.py +104 -0
  18. compass_api_sdk/models/aave_user_position_summaryop.py +35 -0
  19. compass_api_sdk/models/aaveborrowrequest.py +105 -0
  20. compass_api_sdk/models/aaveliquiditychangeresponse.py +26 -0
  21. compass_api_sdk/models/aaverepayrequest.py +105 -0
  22. compass_api_sdk/models/aavesupplyrequest.py +93 -0
  23. compass_api_sdk/models/aavetokenpriceresponse.py +15 -0
  24. compass_api_sdk/models/aaveuserpositionpertokenresponse.py +73 -0
  25. compass_api_sdk/models/aaveuserpositionsummaryresponse.py +50 -0
  26. compass_api_sdk/models/aavewithdrawrequest.py +58 -0
  27. compass_api_sdk/models/aerodrome_slipstream_liquidity_provision_positionsop.py +35 -0
  28. compass_api_sdk/models/aerodrome_slipstream_pool_priceop.py +173 -0
  29. compass_api_sdk/models/aerodromelppositionsresponse.py +21 -0
  30. compass_api_sdk/models/aerodromeposition.py +70 -0
  31. compass_api_sdk/models/aerodromeslipstreambuyexactlyrequest.py +92 -0
  32. compass_api_sdk/models/aerodromeslipstreamincreaseliquidityprovisionrequest.py +109 -0
  33. compass_api_sdk/models/aerodromeslipstreammintliquidityprovisionrequest.py +186 -0
  34. compass_api_sdk/models/aerodromeslipstreampoolpriceresponse.py +57 -0
  35. compass_api_sdk/models/aerodromeslipstreamsellexactlyrequest.py +96 -0
  36. compass_api_sdk/models/aerodromeslipstreamwithdrawliquidityprovisionrequest.py +50 -0
  37. compass_api_sdk/models/allowanceinforesponse.py +48 -0
  38. compass_api_sdk/models/balanceinforesponse.py +43 -0
  39. compass_api_sdk/models/chain.py +12 -0
  40. compass_api_sdk/models/chaininfo.py +53 -0
  41. compass_api_sdk/models/compass_api_backend_models_morpho_read_response_get_markets_asset.py +22 -0
  42. compass_api_sdk/models/compass_api_backend_models_morpho_read_response_get_vaults_asset.py +23 -0
  43. compass_api_sdk/models/ensnameinforesponse.py +24 -0
  44. compass_api_sdk/models/feeenum.py +16 -0
  45. compass_api_sdk/models/generic_allowanceop.py +121 -0
  46. compass_api_sdk/models/generic_balanceop.py +104 -0
  47. compass_api_sdk/models/generic_ensop.py +35 -0
  48. compass_api_sdk/models/generic_portfolioop.py +35 -0
  49. compass_api_sdk/models/generic_price_usdop.py +98 -0
  50. compass_api_sdk/models/generic_supported_tokensop.py +29 -0
  51. compass_api_sdk/models/generic_visualize_portfolioop.py +35 -0
  52. compass_api_sdk/models/image.py +15 -0
  53. compass_api_sdk/models/increaseallowancerequest.py +77 -0
  54. compass_api_sdk/models/interestratemode.py +14 -0
  55. compass_api_sdk/models/marketstate.py +35 -0
  56. compass_api_sdk/models/morpho_market_positionop.py +39 -0
  57. compass_api_sdk/models/morpho_marketsop.py +78 -0
  58. compass_api_sdk/models/morpho_vault_positionop.py +39 -0
  59. compass_api_sdk/models/morpho_vaultsop.py +72 -0
  60. compass_api_sdk/models/morphoborrowrequest.py +91 -0
  61. compass_api_sdk/models/morphocheckmarketpositionresponse.py +23 -0
  62. compass_api_sdk/models/morphocheckvaultpositionresponse.py +20 -0
  63. compass_api_sdk/models/morphodepositrequest.py +86 -0
  64. compass_api_sdk/models/morphogetmarketsresponse.py +17 -0
  65. compass_api_sdk/models/morphogetvaultsresponse.py +17 -0
  66. compass_api_sdk/models/morphomarket.py +80 -0
  67. compass_api_sdk/models/morphorepayrequest.py +79 -0
  68. compass_api_sdk/models/morphosetvaultallowancerequest.py +44 -0
  69. compass_api_sdk/models/morphosupplycollateralrequest.py +91 -0
  70. compass_api_sdk/models/morphovault.py +47 -0
  71. compass_api_sdk/models/morphowithdrawcollateralrequest.py +91 -0
  72. compass_api_sdk/models/morphowithdrawrequest.py +74 -0
  73. compass_api_sdk/models/portfolio.py +22 -0
  74. compass_api_sdk/models/priceresponse.py +15 -0
  75. compass_api_sdk/models/security.py +24 -0
  76. compass_api_sdk/models/token_addressop.py +98 -0
  77. compass_api_sdk/models/token_balanceop.py +49 -0
  78. compass_api_sdk/models/token_enum.py +57 -0
  79. compass_api_sdk/models/token_priceop.py +97 -0
  80. compass_api_sdk/models/tokenaddressresponse.py +15 -0
  81. compass_api_sdk/models/tokenbalance.py +49 -0
  82. compass_api_sdk/models/tokenbalanceresponse.py +44 -0
  83. compass_api_sdk/models/tokeninfo.py +17 -0
  84. compass_api_sdk/models/tokenpriceresponse.py +15 -0
  85. compass_api_sdk/models/tokentransferrequest.py +66 -0
  86. compass_api_sdk/models/transfererc20request.py +62 -0
  87. compass_api_sdk/models/transferethrequest.py +46 -0
  88. compass_api_sdk/models/uniswap_liquidity_provision_in_rangeop.py +34 -0
  89. compass_api_sdk/models/uniswap_liquidity_provision_positionsop.py +35 -0
  90. compass_api_sdk/models/uniswap_pool_priceop.py +193 -0
  91. compass_api_sdk/models/uniswap_quote_buy_exactlyop.py +209 -0
  92. compass_api_sdk/models/uniswap_quote_sell_exactlyop.py +209 -0
  93. compass_api_sdk/models/uniswapbuyexactlyrequest.py +104 -0
  94. compass_api_sdk/models/uniswapbuyquoteinforesponse.py +20 -0
  95. compass_api_sdk/models/uniswapcheckinrangeresponse.py +15 -0
  96. compass_api_sdk/models/uniswapincreaseliquidityprovisionrequest.py +99 -0
  97. compass_api_sdk/models/uniswaplppositionsinforesponse.py +24 -0
  98. compass_api_sdk/models/uniswapmintliquidityprovisionrequest.py +185 -0
  99. compass_api_sdk/models/uniswappoolpriceresponse.py +47 -0
  100. compass_api_sdk/models/uniswappositionssolidityresponse.py +46 -0
  101. compass_api_sdk/models/uniswapsellexactlyrequest.py +104 -0
  102. compass_api_sdk/models/uniswapsellquoteinforesponse.py +20 -0
  103. compass_api_sdk/models/uniswapwithdrawliquidityprovisionrequest.py +51 -0
  104. compass_api_sdk/models/unsignedtransaction.py +58 -0
  105. compass_api_sdk/models/unwrapwethrequest.py +41 -0
  106. compass_api_sdk/models/validationerror.py +26 -0
  107. compass_api_sdk/models/vaultstate.py +32 -0
  108. compass_api_sdk/models/weeklyapys.py +23 -0
  109. compass_api_sdk/models/wrapethrequest.py +41 -0
  110. compass_api_sdk/morpho.py +2577 -0
  111. compass_api_sdk/py.typed +1 -0
  112. compass_api_sdk/sdk.py +155 -0
  113. compass_api_sdk/sdkconfiguration.py +56 -0
  114. compass_api_sdk/token_sdk.py +861 -0
  115. compass_api_sdk/types/__init__.py +21 -0
  116. compass_api_sdk/types/basemodel.py +39 -0
  117. compass_api_sdk/uniswap_v3.py +2551 -0
  118. compass_api_sdk/universal.py +2625 -0
  119. compass_api_sdk/utils/__init__.py +100 -0
  120. compass_api_sdk/utils/annotations.py +55 -0
  121. compass_api_sdk/utils/datetimes.py +23 -0
  122. compass_api_sdk/utils/enums.py +74 -0
  123. compass_api_sdk/utils/eventstreaming.py +238 -0
  124. compass_api_sdk/utils/forms.py +202 -0
  125. compass_api_sdk/utils/headers.py +136 -0
  126. compass_api_sdk/utils/logger.py +22 -0
  127. compass_api_sdk/utils/metadata.py +118 -0
  128. compass_api_sdk/utils/queryparams.py +205 -0
  129. compass_api_sdk/utils/requestbodies.py +66 -0
  130. compass_api_sdk/utils/retries.py +217 -0
  131. compass_api_sdk/utils/security.py +174 -0
  132. compass_api_sdk/utils/serializers.py +248 -0
  133. compass_api_sdk/utils/url.py +155 -0
  134. compass_api_sdk/utils/values.py +137 -0
  135. compass_api_sdk-0.0.1.dist-info/METADATA +534 -0
  136. compass_api_sdk-0.0.1.dist-info/RECORD +137 -0
  137. compass_api_sdk-0.0.1.dist-info/WHEEL +4 -0
@@ -0,0 +1,136 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from typing import (
4
+ Any,
5
+ Dict,
6
+ List,
7
+ Optional,
8
+ )
9
+ from httpx import Headers
10
+ from pydantic import BaseModel
11
+ from pydantic.fields import FieldInfo
12
+
13
+ from .metadata import (
14
+ HeaderMetadata,
15
+ find_field_metadata,
16
+ )
17
+
18
+ from .values import _is_set, _populate_from_globals, _val_to_string
19
+
20
+
21
+ def get_headers(headers_params: Any, gbls: Optional[Any] = None) -> Dict[str, str]:
22
+ headers: Dict[str, str] = {}
23
+
24
+ globals_already_populated = []
25
+ if _is_set(headers_params):
26
+ globals_already_populated = _populate_headers(headers_params, gbls, headers, [])
27
+ if _is_set(gbls):
28
+ _populate_headers(gbls, None, headers, globals_already_populated)
29
+
30
+ return headers
31
+
32
+
33
+ def _populate_headers(
34
+ headers_params: Any,
35
+ gbls: Any,
36
+ header_values: Dict[str, str],
37
+ skip_fields: List[str],
38
+ ) -> List[str]:
39
+ globals_already_populated: List[str] = []
40
+
41
+ if not isinstance(headers_params, BaseModel):
42
+ return globals_already_populated
43
+
44
+ param_fields: Dict[str, FieldInfo] = headers_params.__class__.model_fields
45
+ for name in param_fields:
46
+ if name in skip_fields:
47
+ continue
48
+
49
+ field = param_fields[name]
50
+ f_name = field.alias if field.alias is not None else name
51
+
52
+ metadata = find_field_metadata(field, HeaderMetadata)
53
+ if metadata is None:
54
+ continue
55
+
56
+ value, global_found = _populate_from_globals(
57
+ name, getattr(headers_params, name), HeaderMetadata, gbls
58
+ )
59
+ if global_found:
60
+ globals_already_populated.append(name)
61
+ value = _serialize_header(metadata.explode, value)
62
+
63
+ if value != "":
64
+ header_values[f_name] = value
65
+
66
+ return globals_already_populated
67
+
68
+
69
+ def _serialize_header(explode: bool, obj: Any) -> str:
70
+ if not _is_set(obj):
71
+ return ""
72
+
73
+ if isinstance(obj, BaseModel):
74
+ items = []
75
+ obj_fields: Dict[str, FieldInfo] = obj.__class__.model_fields
76
+ for name in obj_fields:
77
+ obj_field = obj_fields[name]
78
+ obj_param_metadata = find_field_metadata(obj_field, HeaderMetadata)
79
+
80
+ if not obj_param_metadata:
81
+ continue
82
+
83
+ f_name = obj_field.alias if obj_field.alias is not None else name
84
+
85
+ val = getattr(obj, name)
86
+ if not _is_set(val):
87
+ continue
88
+
89
+ if explode:
90
+ items.append(f"{f_name}={_val_to_string(val)}")
91
+ else:
92
+ items.append(f_name)
93
+ items.append(_val_to_string(val))
94
+
95
+ if len(items) > 0:
96
+ return ",".join(items)
97
+ elif isinstance(obj, Dict):
98
+ items = []
99
+
100
+ for key, value in obj.items():
101
+ if not _is_set(value):
102
+ continue
103
+
104
+ if explode:
105
+ items.append(f"{key}={_val_to_string(value)}")
106
+ else:
107
+ items.append(key)
108
+ items.append(_val_to_string(value))
109
+
110
+ if len(items) > 0:
111
+ return ",".join([str(item) for item in items])
112
+ elif isinstance(obj, List):
113
+ items = []
114
+
115
+ for value in obj:
116
+ if not _is_set(value):
117
+ continue
118
+
119
+ items.append(_val_to_string(value))
120
+
121
+ if len(items) > 0:
122
+ return ",".join(items)
123
+ elif _is_set(obj):
124
+ return f"{_val_to_string(obj)}"
125
+
126
+ return ""
127
+
128
+
129
+ def get_response_headers(headers: Headers) -> Dict[str, List[str]]:
130
+ res: Dict[str, List[str]] = {}
131
+ for k, v in headers.items():
132
+ if not k in res:
133
+ res[k] = []
134
+
135
+ res[k].append(v)
136
+ return res
@@ -0,0 +1,22 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ import httpx
4
+ from typing import Any, Protocol
5
+
6
+
7
+ class Logger(Protocol):
8
+ def debug(self, msg: str, *args: Any, **kwargs: Any) -> None:
9
+ pass
10
+
11
+
12
+ class NoOpLogger:
13
+ def debug(self, msg: str, *args: Any, **kwargs: Any) -> None:
14
+ pass
15
+
16
+
17
+ def get_body_content(req: httpx.Request) -> str:
18
+ return "<streaming body>" if not hasattr(req, "_content") else str(req.content)
19
+
20
+
21
+ def get_default_logger() -> Logger:
22
+ return NoOpLogger()
@@ -0,0 +1,118 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from typing import Optional, Type, TypeVar, Union
4
+ from dataclasses import dataclass
5
+ from pydantic.fields import FieldInfo
6
+
7
+
8
+ T = TypeVar("T")
9
+
10
+
11
+ @dataclass
12
+ class SecurityMetadata:
13
+ option: bool = False
14
+ scheme: bool = False
15
+ scheme_type: Optional[str] = None
16
+ sub_type: Optional[str] = None
17
+ field_name: Optional[str] = None
18
+
19
+ def get_field_name(self, default: str) -> str:
20
+ return self.field_name or default
21
+
22
+
23
+ @dataclass
24
+ class ParamMetadata:
25
+ serialization: Optional[str] = None
26
+ style: str = "simple"
27
+ explode: bool = False
28
+
29
+
30
+ @dataclass
31
+ class PathParamMetadata(ParamMetadata):
32
+ pass
33
+
34
+
35
+ @dataclass
36
+ class QueryParamMetadata(ParamMetadata):
37
+ style: str = "form"
38
+ explode: bool = True
39
+
40
+
41
+ @dataclass
42
+ class HeaderMetadata(ParamMetadata):
43
+ pass
44
+
45
+
46
+ @dataclass
47
+ class RequestMetadata:
48
+ media_type: str = "application/octet-stream"
49
+
50
+
51
+ @dataclass
52
+ class MultipartFormMetadata:
53
+ file: bool = False
54
+ content: bool = False
55
+ json: bool = False
56
+
57
+
58
+ @dataclass
59
+ class FormMetadata:
60
+ json: bool = False
61
+ style: str = "form"
62
+ explode: bool = True
63
+
64
+
65
+ class FieldMetadata:
66
+ security: Optional[SecurityMetadata] = None
67
+ path: Optional[PathParamMetadata] = None
68
+ query: Optional[QueryParamMetadata] = None
69
+ header: Optional[HeaderMetadata] = None
70
+ request: Optional[RequestMetadata] = None
71
+ form: Optional[FormMetadata] = None
72
+ multipart: Optional[MultipartFormMetadata] = None
73
+
74
+ def __init__(
75
+ self,
76
+ security: Optional[SecurityMetadata] = None,
77
+ path: Optional[Union[PathParamMetadata, bool]] = None,
78
+ query: Optional[Union[QueryParamMetadata, bool]] = None,
79
+ header: Optional[Union[HeaderMetadata, bool]] = None,
80
+ request: Optional[Union[RequestMetadata, bool]] = None,
81
+ form: Optional[Union[FormMetadata, bool]] = None,
82
+ multipart: Optional[Union[MultipartFormMetadata, bool]] = None,
83
+ ):
84
+ self.security = security
85
+ self.path = PathParamMetadata() if isinstance(path, bool) else path
86
+ self.query = QueryParamMetadata() if isinstance(query, bool) else query
87
+ self.header = HeaderMetadata() if isinstance(header, bool) else header
88
+ self.request = RequestMetadata() if isinstance(request, bool) else request
89
+ self.form = FormMetadata() if isinstance(form, bool) else form
90
+ self.multipart = (
91
+ MultipartFormMetadata() if isinstance(multipart, bool) else multipart
92
+ )
93
+
94
+
95
+ def find_field_metadata(field_info: FieldInfo, metadata_type: Type[T]) -> Optional[T]:
96
+ metadata = find_metadata(field_info, FieldMetadata)
97
+ if not metadata:
98
+ return None
99
+
100
+ fields = metadata.__dict__
101
+
102
+ for field in fields:
103
+ if isinstance(fields[field], metadata_type):
104
+ return fields[field]
105
+
106
+ return None
107
+
108
+
109
+ def find_metadata(field_info: FieldInfo, metadata_type: Type[T]) -> Optional[T]:
110
+ metadata = field_info.metadata
111
+ if not metadata:
112
+ return None
113
+
114
+ for md in metadata:
115
+ if isinstance(md, metadata_type):
116
+ return md
117
+
118
+ return None
@@ -0,0 +1,205 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from typing import (
4
+ Any,
5
+ Dict,
6
+ get_type_hints,
7
+ List,
8
+ Optional,
9
+ )
10
+
11
+ from pydantic import BaseModel
12
+ from pydantic.fields import FieldInfo
13
+
14
+ from .metadata import (
15
+ QueryParamMetadata,
16
+ find_field_metadata,
17
+ )
18
+ from .values import (
19
+ _get_serialized_params,
20
+ _is_set,
21
+ _populate_from_globals,
22
+ _val_to_string,
23
+ )
24
+ from .forms import _populate_form
25
+
26
+
27
+ def get_query_params(
28
+ query_params: Any,
29
+ gbls: Optional[Any] = None,
30
+ ) -> Dict[str, List[str]]:
31
+ params: Dict[str, List[str]] = {}
32
+
33
+ globals_already_populated = _populate_query_params(query_params, gbls, params, [])
34
+ if _is_set(gbls):
35
+ _populate_query_params(gbls, None, params, globals_already_populated)
36
+
37
+ return params
38
+
39
+
40
+ def _populate_query_params(
41
+ query_params: Any,
42
+ gbls: Any,
43
+ query_param_values: Dict[str, List[str]],
44
+ skip_fields: List[str],
45
+ ) -> List[str]:
46
+ globals_already_populated: List[str] = []
47
+
48
+ if not isinstance(query_params, BaseModel):
49
+ return globals_already_populated
50
+
51
+ param_fields: Dict[str, FieldInfo] = query_params.__class__.model_fields
52
+ param_field_types = get_type_hints(query_params.__class__)
53
+ for name in param_fields:
54
+ if name in skip_fields:
55
+ continue
56
+
57
+ field = param_fields[name]
58
+
59
+ metadata = find_field_metadata(field, QueryParamMetadata)
60
+ if not metadata:
61
+ continue
62
+
63
+ value = getattr(query_params, name) if _is_set(query_params) else None
64
+
65
+ value, global_found = _populate_from_globals(
66
+ name, value, QueryParamMetadata, gbls
67
+ )
68
+ if global_found:
69
+ globals_already_populated.append(name)
70
+
71
+ f_name = field.alias if field.alias is not None else name
72
+ serialization = metadata.serialization
73
+ if serialization is not None:
74
+ serialized_parms = _get_serialized_params(
75
+ metadata, f_name, value, param_field_types[name]
76
+ )
77
+ for key, value in serialized_parms.items():
78
+ if key in query_param_values:
79
+ query_param_values[key].extend(value)
80
+ else:
81
+ query_param_values[key] = [value]
82
+ else:
83
+ style = metadata.style
84
+ if style == "deepObject":
85
+ _populate_deep_object_query_params(f_name, value, query_param_values)
86
+ elif style == "form":
87
+ _populate_delimited_query_params(
88
+ metadata, f_name, value, ",", query_param_values
89
+ )
90
+ elif style == "pipeDelimited":
91
+ _populate_delimited_query_params(
92
+ metadata, f_name, value, "|", query_param_values
93
+ )
94
+ else:
95
+ raise NotImplementedError(
96
+ f"query param style {style} not yet supported"
97
+ )
98
+
99
+ return globals_already_populated
100
+
101
+
102
+ def _populate_deep_object_query_params(
103
+ field_name: str,
104
+ obj: Any,
105
+ params: Dict[str, List[str]],
106
+ ):
107
+ if not _is_set(obj):
108
+ return
109
+
110
+ if isinstance(obj, BaseModel):
111
+ _populate_deep_object_query_params_basemodel(field_name, obj, params)
112
+ elif isinstance(obj, Dict):
113
+ _populate_deep_object_query_params_dict(field_name, obj, params)
114
+
115
+
116
+ def _populate_deep_object_query_params_basemodel(
117
+ prior_params_key: str,
118
+ obj: Any,
119
+ params: Dict[str, List[str]],
120
+ ):
121
+ if not _is_set(obj) or not isinstance(obj, BaseModel):
122
+ return
123
+
124
+ obj_fields: Dict[str, FieldInfo] = obj.__class__.model_fields
125
+ for name in obj_fields:
126
+ obj_field = obj_fields[name]
127
+
128
+ f_name = obj_field.alias if obj_field.alias is not None else name
129
+
130
+ params_key = f"{prior_params_key}[{f_name}]"
131
+
132
+ obj_param_metadata = find_field_metadata(obj_field, QueryParamMetadata)
133
+ if not _is_set(obj_param_metadata):
134
+ continue
135
+
136
+ obj_val = getattr(obj, name)
137
+ if not _is_set(obj_val):
138
+ continue
139
+
140
+ if isinstance(obj_val, BaseModel):
141
+ _populate_deep_object_query_params_basemodel(params_key, obj_val, params)
142
+ elif isinstance(obj_val, Dict):
143
+ _populate_deep_object_query_params_dict(params_key, obj_val, params)
144
+ elif isinstance(obj_val, List):
145
+ _populate_deep_object_query_params_list(params_key, obj_val, params)
146
+ else:
147
+ params[params_key] = [_val_to_string(obj_val)]
148
+
149
+
150
+ def _populate_deep_object_query_params_dict(
151
+ prior_params_key: str,
152
+ value: Dict,
153
+ params: Dict[str, List[str]],
154
+ ):
155
+ if not _is_set(value):
156
+ return
157
+
158
+ for key, val in value.items():
159
+ if not _is_set(val):
160
+ continue
161
+
162
+ params_key = f"{prior_params_key}[{key}]"
163
+
164
+ if isinstance(val, BaseModel):
165
+ _populate_deep_object_query_params_basemodel(params_key, val, params)
166
+ elif isinstance(val, Dict):
167
+ _populate_deep_object_query_params_dict(params_key, val, params)
168
+ elif isinstance(val, List):
169
+ _populate_deep_object_query_params_list(params_key, val, params)
170
+ else:
171
+ params[params_key] = [_val_to_string(val)]
172
+
173
+
174
+ def _populate_deep_object_query_params_list(
175
+ params_key: str,
176
+ value: List,
177
+ params: Dict[str, List[str]],
178
+ ):
179
+ if not _is_set(value):
180
+ return
181
+
182
+ for val in value:
183
+ if not _is_set(val):
184
+ continue
185
+
186
+ if params.get(params_key) is None:
187
+ params[params_key] = []
188
+
189
+ params[params_key].append(_val_to_string(val))
190
+
191
+
192
+ def _populate_delimited_query_params(
193
+ metadata: QueryParamMetadata,
194
+ field_name: str,
195
+ obj: Any,
196
+ delimiter: str,
197
+ query_param_values: Dict[str, List[str]],
198
+ ):
199
+ _populate_form(
200
+ field_name,
201
+ metadata.explode,
202
+ obj,
203
+ delimiter,
204
+ query_param_values,
205
+ )
@@ -0,0 +1,66 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ import io
4
+ from dataclasses import dataclass
5
+ import re
6
+ from typing import (
7
+ Any,
8
+ Optional,
9
+ )
10
+
11
+ from .forms import serialize_form_data, serialize_multipart_form
12
+
13
+ from .serializers import marshal_json
14
+
15
+ SERIALIZATION_METHOD_TO_CONTENT_TYPE = {
16
+ "json": "application/json",
17
+ "form": "application/x-www-form-urlencoded",
18
+ "multipart": "multipart/form-data",
19
+ "raw": "application/octet-stream",
20
+ "string": "text/plain",
21
+ }
22
+
23
+
24
+ @dataclass
25
+ class SerializedRequestBody:
26
+ media_type: Optional[str] = None
27
+ content: Optional[Any] = None
28
+ data: Optional[Any] = None
29
+ files: Optional[Any] = None
30
+
31
+
32
+ def serialize_request_body(
33
+ request_body: Any,
34
+ nullable: bool,
35
+ optional: bool,
36
+ serialization_method: str,
37
+ request_body_type,
38
+ ) -> Optional[SerializedRequestBody]:
39
+ if request_body is None:
40
+ if not nullable and optional:
41
+ return None
42
+
43
+ media_type = SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method]
44
+
45
+ serialized_request_body = SerializedRequestBody(media_type)
46
+
47
+ if re.match(r"(application|text)\/.*?\+*json.*", media_type) is not None:
48
+ serialized_request_body.content = marshal_json(request_body, request_body_type)
49
+ elif re.match(r"multipart\/.*", media_type) is not None:
50
+ (
51
+ serialized_request_body.media_type,
52
+ serialized_request_body.data,
53
+ serialized_request_body.files,
54
+ ) = serialize_multipart_form(media_type, request_body)
55
+ elif re.match(r"application\/x-www-form-urlencoded.*", media_type) is not None:
56
+ serialized_request_body.data = serialize_form_data(request_body)
57
+ elif isinstance(request_body, (bytes, bytearray, io.BytesIO, io.BufferedReader)):
58
+ serialized_request_body.content = request_body
59
+ elif isinstance(request_body, str):
60
+ serialized_request_body.content = request_body
61
+ else:
62
+ raise TypeError(
63
+ f"invalid request body type {type(request_body)} for mediaType {media_type}"
64
+ )
65
+
66
+ return serialized_request_body