UncountablePythonSDK 0.0.37__py3-none-any.whl → 0.0.38__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 UncountablePythonSDK might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.37
3
+ Version: 0.0.38
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -65,7 +65,7 @@ uncountable/__init__.py,sha256=8l8XWNCKsu7TG94c-xa2KHpDegvxDC2FyQISdWC763Y,89
65
65
  uncountable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  uncountable/core/__init__.py,sha256=RFv0kO6rKFf1PtBPu83hCGmxqkJamRtsgQ9_-ztw7tA,341
67
67
  uncountable/core/async_batch.py,sha256=Zo02TICZ7AK81Qa02NQ8fp8uaijQph1FEta28K3cKb0,749
68
- uncountable/core/client.py,sha256=6T8qecNK0MypHs5gD6VdW7KpiHjX7_jMNiqkmEn3CHM,9657
68
+ uncountable/core/client.py,sha256=lKg_58RSjKwGqDNOT2HYZXvJ4mGmxjVK4AtzlJAxIJ8,10159
69
69
  uncountable/core/file_upload.py,sha256=t4cutIFB5rNN2qVCx3H0HotSjCSJSxis2_QBarDuXyc,2833
70
70
  uncountable/core/types.py,sha256=s2CjqYJpsmbC7xMwxxT7kJ_V9bwokrjjWVVjpMcQpKI,333
71
71
  uncountable/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -185,7 +185,7 @@ uncountable/types/api/recipes/unarchive_recipes.py,sha256=WcwFYbBsX2SKXnoBQ8locn
185
185
  uncountable/types/api/recipes/unlock_recipes.py,sha256=m_CC9LZW7GRVrAu9uwDTTgEZr63-dOSduBAI5Ciud2I,1103
186
186
  uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
187
187
  uncountable/types/api/triggers/run_trigger.py,sha256=9m9M8-nlGB_sAU2Qm2lWugp4h4Osqj6QpjNfU8osd1U,901
188
- UncountablePythonSDK-0.0.37.dist-info/METADATA,sha256=3-tRSmnyCgOtzaRuyGhiBDX6GoHPqmEr4P7evG4BxcE,1577
189
- UncountablePythonSDK-0.0.37.dist-info/WHEEL,sha256=-oYQCr74JF3a37z2nRlQays_SX2MqOANoqVjBBAP2yE,91
190
- UncountablePythonSDK-0.0.37.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
191
- UncountablePythonSDK-0.0.37.dist-info/RECORD,,
188
+ UncountablePythonSDK-0.0.38.dist-info/METADATA,sha256=JNH2Bj5C8pcbAOM9uGBcWUEZ4DHrvvigkSkT9c4oSjo,1577
189
+ UncountablePythonSDK-0.0.38.dist-info/WHEEL,sha256=-oYQCr74JF3a37z2nRlQays_SX2MqOANoqVjBBAP2yE,91
190
+ UncountablePythonSDK-0.0.38.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
191
+ UncountablePythonSDK-0.0.38.dist-info/RECORD,,
@@ -60,6 +60,8 @@ HTTPRequest = HTTPPostRequest | HTTPGetRequest
60
60
  @dataclass(kw_only=True)
61
61
  class ClientConfig:
62
62
  allow_insecure_tls: bool = False
63
+ extra_headers: dict[str, str] | None = None
64
+ transform_request: typing.Callable[[requests.Request], requests.Request] | None = None
63
65
 
64
66
 
65
67
  OAUTH_REFRESH_WINDOW_SECONDS = 60 * 5
@@ -144,6 +146,7 @@ class Client(ClientMethods):
144
146
  _file_uploader: FileUploader
145
147
  _cfg: ClientConfig
146
148
  _oauth_bearer_token_cache: OAuthBearerTokenCache | None = None
149
+ _session: requests.Session
147
150
 
148
151
  def __init__(
149
152
  self,
@@ -156,6 +159,8 @@ class Client(ClientMethods):
156
159
  self._base_url = base_url
157
160
  self._file_uploader = FileUploader(self._base_url, self._auth_details)
158
161
  self._cfg = config or ClientConfig()
162
+ self._session = requests.Session()
163
+ self._session.verify = not self._cfg.allow_insecure_tls
159
164
 
160
165
  def _get_response_json(
161
166
  self, response: requests.Response, request_id: str
@@ -176,6 +181,15 @@ class Client(ClientMethods):
176
181
  except JSONDecodeError as e:
177
182
  raise SDKError("unable to process response", request_id=request_id) from e
178
183
 
184
+ def _send_request(self, request: requests.Request) -> requests.Response:
185
+ if self._cfg.extra_headers is not None:
186
+ request.headers = {**request.headers, **self._cfg.extra_headers}
187
+ if self._cfg.transform_request is not None:
188
+ request = self._cfg.transform_request(request)
189
+ prepared_request = request.prepare()
190
+ response = self._session.send(prepared_request)
191
+ return response
192
+
179
193
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
180
194
  request_id = str(uuid4())
181
195
  http_request = self._build_http_request(
@@ -183,21 +197,15 @@ class Client(ClientMethods):
183
197
  )
184
198
  match http_request:
185
199
  case HTTPGetRequest():
186
- response = requests.get(
187
- http_request.url,
188
- headers=http_request.headers,
189
- params=http_request.query_params,
190
- verify=not self._cfg.allow_insecure_tls,
191
- )
200
+ request = requests.Request("GET", http_request.url)
201
+ request.params = http_request.query_params
192
202
  case HTTPPostRequest():
193
- response = requests.post(
194
- http_request.url,
195
- headers=http_request.headers,
196
- data=http_request.body,
197
- verify=not self._cfg.allow_insecure_tls,
198
- )
203
+ request = requests.Request("POST", http_request.url)
204
+ request.data = http_request.body
199
205
  case _:
200
206
  typing.assert_never(http_request)
207
+ request.headers = http_request.headers
208
+ response = self._send_request(request)
201
209
  response_data = self._get_response_json(response, request_id=request_id)
202
210
  cached_parser = self._get_cached_parser(return_type)
203
211
  try:
@@ -220,15 +228,13 @@ class Client(ClientMethods):
220
228
  < OAUTH_REFRESH_WINDOW_SECONDS
221
229
  ):
222
230
  refresh_url = urljoin(self._base_url, "/token/get_bearer_token")
223
- response = requests.post(
224
- refresh_url,
225
- data={
226
- "client_secret": oauth_details.refresh_token,
227
- "scope": oauth_details.scope,
228
- "grant_type": "client_credentials",
229
- },
230
- verify=not self._cfg.allow_insecure_tls,
231
- )
231
+ request = requests.Request("POST", refresh_url)
232
+ request.data = {
233
+ "client_secret": oauth_details.refresh_token,
234
+ "scope": oauth_details.scope,
235
+ "grant_type": "client_credentials",
236
+ }
237
+ response = self._send_request(request)
232
238
  data = self._get_response_json(response, request_id=str(uuid4()))
233
239
  token_data = oauth_bearer_token_data_parser.parse_storage(data)
234
240
  self._oauth_bearer_token_cache = OAuthBearerTokenCache(