learning-loop-node 0.12.0__py3-none-any.whl → 0.12.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 learning-loop-node might be problematic. Click here for more details.

@@ -124,9 +124,6 @@ class DataExchanger():
124
124
 
125
125
  async def _download_one_image(self, path: str, image_id: str, image_folder: str) -> None:
126
126
  response = await self.loop_communicator.get(path)
127
- if response.status_code == 429:
128
- await asyncio.sleep(1)
129
- response = await self.loop_communicator.get(path)
130
127
  if response.status_code != HTTPStatus.OK:
131
128
  logging.error('bad status code %s for %s. Details: %s', response.status_code, path, response.text)
132
129
  return
@@ -10,6 +10,23 @@ from .helpers import environment_reader
10
10
 
11
11
  logging.basicConfig(level=logging.INFO)
12
12
 
13
+ SLEEP_TIME_ON_429 = 5
14
+ MAX_RETRIES_ON_429 = 20
15
+
16
+
17
+ def retry_on_429(func: Callable[..., Awaitable]) -> Callable[..., Awaitable]:
18
+ """Decorator that retries requests that receive a 429 status code."""
19
+ async def wrapper(*args, **kwargs) -> httpx.Response:
20
+ for _ in range(MAX_RETRIES_ON_429):
21
+ response = await func(*args, **kwargs)
22
+ if response.status_code != 429:
23
+ return response
24
+
25
+ await asyncio.sleep(SLEEP_TIME_ON_429)
26
+
27
+ return response
28
+ return wrapper
29
+
13
30
 
14
31
  class LoopCommunicationException(Exception):
15
32
  """Raised when there's an unexpected answer from the learning loop."""
@@ -96,6 +113,7 @@ class LoopCommunicator():
96
113
  return await self.retry_on_401(self._get, path, api_prefix)
97
114
  return await self._get(path, api_prefix)
98
115
 
116
+ @retry_on_429
99
117
  async def _get(self, path: str, api_prefix: str) -> httpx.Response:
100
118
  return await self.async_client.get(api_prefix+path)
101
119
 
@@ -105,6 +123,7 @@ class LoopCommunicator():
105
123
  return await self.retry_on_401(self._put, path, files, api_prefix, **kwargs)
106
124
  return await self._put(path, files, api_prefix, **kwargs)
107
125
 
126
+ @retry_on_429
108
127
  async def _put(self, path: str, files: Optional[List[str]], api_prefix: str, **kwargs) -> httpx.Response:
109
128
  if files is None:
110
129
  return await self.async_client.put(api_prefix+path, **kwargs)
@@ -133,6 +152,7 @@ class LoopCommunicator():
133
152
  return await self.retry_on_401(self._post, path, api_prefix, **kwargs)
134
153
  return await self._post(path, api_prefix, **kwargs)
135
154
 
155
+ @retry_on_429
136
156
  async def _post(self, path, api_prefix='/api', **kwargs) -> httpx.Response:
137
157
  return await self.async_client.post(api_prefix+path, **kwargs)
138
158
 
@@ -142,5 +162,6 @@ class LoopCommunicator():
142
162
  return await self.retry_on_401(self._delete, path, api_prefix, **kwargs)
143
163
  return await self._delete(path, api_prefix, **kwargs)
144
164
 
165
+ @retry_on_429
145
166
  async def _delete(self, path, api_prefix, **kwargs) -> httpx.Response:
146
167
  return await self.async_client.delete(api_prefix+path, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: learning-loop-node
3
- Version: 0.12.0
3
+ Version: 0.12.1
4
4
  Summary: Python Library for Nodes which connect to the Zauberzeug Learning Loop
5
5
  Home-page: https://github.com/zauberzeug/learning_loop_node
6
6
  License: MIT
@@ -9,7 +9,7 @@ learning_loop_node/data_classes/general.py,sha256=DIJnmLmbnVgg8Xzg6CKIeQpM7EQhiG
9
9
  learning_loop_node/data_classes/image_metadata.py,sha256=56nNSf_7aMlvKsJOG8vKCzJHcqKGHVRoULp85pJ2imA,1598
10
10
  learning_loop_node/data_classes/socket_response.py,sha256=tIdt-oYf6ULoJIDYQCecNM9OtWR6_wJ9tL0Ksu83Vko,655
11
11
  learning_loop_node/data_classes/training.py,sha256=Lr1dhRyYpv3ctD7ifFMwhqbS3Mx9yi0zVOxEi-V7uC8,6438
12
- learning_loop_node/data_exchanger.py,sha256=Ux-dHItR_oLBd2HGMNn1WbWBk_KVTOwJn0Wco03rkgo,9192
12
+ learning_loop_node/data_exchanger.py,sha256=IG5ki3f3IsVuXbyw6q_gUIakgv-GMT6e9nhOhzjKgW4,9055
13
13
  learning_loop_node/detector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  learning_loop_node/detector/detector_logic.py,sha256=fAaeLykvkuOeaQx-scuN1pkydK8cPdmNT75P8xqImY0,2130
15
15
  learning_loop_node/detector/detector_node.py,sha256=ryzPcv5wfNjA_Sk5YDcUkZoKEUGPT1s29rvFLGGPIZ8,19929
@@ -32,7 +32,7 @@ learning_loop_node/helpers/environment_reader.py,sha256=6DxDJecLHxiGczByhyVa_Jss
32
32
  learning_loop_node/helpers/gdrive_downloader.py,sha256=zeYJciTAJVRpu_eFjwgYLCpIa6hU1d71anqEBb564Rk,1145
33
33
  learning_loop_node/helpers/log_conf.py,sha256=hqVAa_9NnYEU6N0dcOKmph82p7MpgKqeF_eomTLYzWY,961
34
34
  learning_loop_node/helpers/misc.py,sha256=J29iBmsEUAraKKDN1m1NKiHQ3QrP5ub5HBU6cllSP2g,7384
35
- learning_loop_node/loop_communication.py,sha256=0Hm7cv3z_QqfnRa0oUH_S3uTTmfPFF7DXNGCd-lKAHk,6688
35
+ learning_loop_node/loop_communication.py,sha256=kc7GrkUS14Ka5OICaaOd_LZ61D-6O19GcyDEwckTxvM,7286
36
36
  learning_loop_node/node.py,sha256=z2CG4s_uvboY7pBQ8JlJr5s67Hf31ckfGjaRulsrqy0,10593
37
37
  learning_loop_node/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  learning_loop_node/rest.py,sha256=omwlRHLnyG-kgCBVnZDk5_SAPobL9g7slWeX21wsPGw,1551
@@ -91,6 +91,6 @@ learning_loop_node/trainer/test_executor.py,sha256=6BVGDN_6f5GEMMEvDLSG1yzMybSvg
91
91
  learning_loop_node/trainer/trainer_logic.py,sha256=SHzoCb_hwI3zC6VCW_7jWi45Ng3etEo6WepFntS3pnA,8773
92
92
  learning_loop_node/trainer/trainer_logic_generic.py,sha256=WM0gaTln0wjNKemNpxhCHRQCTEj_TVPgN1oMNXkacSU,26795
93
93
  learning_loop_node/trainer/trainer_node.py,sha256=9nk_LH4jmuUzZ5ApOGvut1RAcyULU7DtiIgtjKzIrpU,4494
94
- learning_loop_node-0.12.0.dist-info/METADATA,sha256=w9nc4bwIZkzvTLOM9SjLxxnGDldz1-hdrbw0pouBsMo,11906
95
- learning_loop_node-0.12.0.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
96
- learning_loop_node-0.12.0.dist-info/RECORD,,
94
+ learning_loop_node-0.12.1.dist-info/METADATA,sha256=jyoFDT7gR4Fao2T3wlvr5X9UYeeiD1Som8s4Qi73Q-k,11906
95
+ learning_loop_node-0.12.1.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
96
+ learning_loop_node-0.12.1.dist-info/RECORD,,