learning-loop-node 0.12.0__tar.gz → 0.12.1__tar.gz

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.

Files changed (96) hide show
  1. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/PKG-INFO +1 -1
  2. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_exchanger.py +0 -3
  3. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/loop_communication.py +21 -0
  4. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/pyproject.toml +1 -1
  5. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/README.md +0 -0
  6. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/__init__.py +0 -0
  7. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/annotation/__init__.py +0 -0
  8. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/annotation/annotator_logic.py +0 -0
  9. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/annotation/annotator_node.py +0 -0
  10. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_classes/__init__.py +0 -0
  11. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_classes/annotations.py +0 -0
  12. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_classes/detections.py +0 -0
  13. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_classes/general.py +0 -0
  14. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_classes/image_metadata.py +0 -0
  15. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_classes/socket_response.py +0 -0
  16. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/data_classes/training.py +0 -0
  17. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/__init__.py +0 -0
  18. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/detector_logic.py +0 -0
  19. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/detector_node.py +0 -0
  20. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/inbox_filter/__init__.py +0 -0
  21. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/inbox_filter/cam_observation_history.py +0 -0
  22. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/inbox_filter/relevance_filter.py +0 -0
  23. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/outbox.py +0 -0
  24. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/__init__.py +0 -0
  25. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/about.py +0 -0
  26. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/backdoor_controls.py +0 -0
  27. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/detect.py +0 -0
  28. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/model_version_control.py +0 -0
  29. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/operation_mode.py +0 -0
  30. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/outbox_mode.py +0 -0
  31. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/detector/rest/upload.py +0 -0
  32. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/examples/novelty_score_updater.py +0 -0
  33. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/globals.py +0 -0
  34. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/helpers/__init__.py +0 -0
  35. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/helpers/environment_reader.py +0 -0
  36. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/helpers/gdrive_downloader.py +0 -0
  37. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/helpers/log_conf.py +0 -0
  38. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/helpers/misc.py +0 -0
  39. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/node.py +0 -0
  40. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/py.typed +0 -0
  41. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/rest.py +0 -0
  42. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/__init__.py +0 -0
  43. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/annotator/__init__.py +0 -0
  44. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/annotator/conftest.py +0 -0
  45. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/annotator/pytest.ini +0 -0
  46. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/annotator/test_annotator_node.py +0 -0
  47. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/__init__.py +0 -0
  48. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/conftest.py +0 -0
  49. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/inbox_filter/__init__.py +0 -0
  50. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/inbox_filter/test_observation.py +0 -0
  51. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/inbox_filter/test_relevance_group.py +0 -0
  52. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/inbox_filter/test_unexpected_observations_count.py +0 -0
  53. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/pytest.ini +0 -0
  54. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/test.jpg +0 -0
  55. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/test_client_communication.py +0 -0
  56. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/test_detector_node.py +0 -0
  57. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/test_outbox.py +0 -0
  58. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/test_relevance_filter.py +0 -0
  59. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/detector/testing_detector.py +0 -0
  60. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/__init__.py +0 -0
  61. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/conftest.py +0 -0
  62. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/pytest.ini +0 -0
  63. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/test_data/file_1.txt +0 -0
  64. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/test_data/file_2.txt +0 -0
  65. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/test_data/model.json +0 -0
  66. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/test_data_classes.py +0 -0
  67. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/test_downloader.py +0 -0
  68. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/general/test_learning_loop_node.py +0 -0
  69. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/test_helper.py +0 -0
  70. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/__init__.py +0 -0
  71. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/conftest.py +0 -0
  72. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/pytest.ini +0 -0
  73. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/state_helper.py +0 -0
  74. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/__init__.py +0 -0
  75. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_cleanup.py +0 -0
  76. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_detecting.py +0 -0
  77. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_download_train_model.py +0 -0
  78. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_prepare.py +0 -0
  79. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_sync_confusion_matrix.py +0 -0
  80. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_train.py +0 -0
  81. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_upload_detections.py +0 -0
  82. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/states/test_state_upload_model.py +0 -0
  83. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/test_errors.py +0 -0
  84. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/test_trainer_states.py +0 -0
  85. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/tests/trainer/testing_trainer_logic.py +0 -0
  86. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/__init__.py +0 -0
  87. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/downloader.py +0 -0
  88. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/exceptions.py +0 -0
  89. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/executor.py +0 -0
  90. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/io_helpers.py +0 -0
  91. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/rest/__init__.py +0 -0
  92. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/rest/backdoor_controls.py +0 -0
  93. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/test_executor.py +0 -0
  94. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/trainer_logic.py +0 -0
  95. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/trainer_logic_generic.py +0 -0
  96. {learning_loop_node-0.12.0 → learning_loop_node-0.12.1}/learning_loop_node/trainer/trainer_node.py +0 -0
@@ -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
@@ -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
  [tool.poetry]
2
2
  name = "learning_loop_node"
3
- version = "v0.12.0"
3
+ version = "v0.12.1"
4
4
  description = "Python Library for Nodes which connect to the Zauberzeug Learning Loop"
5
5
  authors = ["Zauberzeug GmbH <info@zauberzeug.com>"]
6
6
  license = "MIT"