learning-loop-node 0.10.1__tar.gz → 0.10.3__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 (85) hide show
  1. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/PKG-INFO +2 -1
  2. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/README.md +1 -0
  3. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/helpers/environment_reader.py +4 -0
  4. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/loop_communication.py +10 -1
  5. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/node.py +15 -2
  6. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/pyproject.toml +1 -1
  7. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/__init__.py +0 -0
  8. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/annotation/__init__.py +0 -0
  9. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/annotation/annotator_logic.py +0 -0
  10. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/annotation/annotator_node.py +0 -0
  11. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/annotation/tests/test_annotator_node.py +0 -0
  12. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/conftest.py +0 -0
  13. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/data_classes/__init__.py +0 -0
  14. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/data_classes/annotations.py +0 -0
  15. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/data_classes/detections.py +0 -0
  16. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/data_classes/general.py +0 -0
  17. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/data_classes/socket_response.py +0 -0
  18. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/data_classes/training.py +0 -0
  19. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/data_exchanger.py +0 -0
  20. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/__init__.py +0 -0
  21. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/detector_logic.py +0 -0
  22. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/detector_node.py +0 -0
  23. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/inbox_filter/__init__.py +0 -0
  24. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/inbox_filter/cam_observation_history.py +0 -0
  25. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/inbox_filter/relevance_filter.py +0 -0
  26. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/inbox_filter/tests/test_observation.py +0 -0
  27. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/inbox_filter/tests/test_relevance_group.py +0 -0
  28. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/inbox_filter/tests/test_unexpected_observations_count.py +0 -0
  29. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/outbox.py +0 -0
  30. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/rest/__init__.py +0 -0
  31. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/rest/about.py +0 -0
  32. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/rest/backdoor_controls.py +0 -0
  33. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/rest/detect.py +0 -0
  34. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/rest/operation_mode.py +0 -0
  35. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/rest/upload.py +0 -0
  36. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/tests/__init__.py +0 -0
  37. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/tests/conftest.py +0 -0
  38. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/tests/test.jpg +0 -0
  39. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/tests/test_client_communication.py +0 -0
  40. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/tests/test_outbox.py +0 -0
  41. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/tests/test_relevance_filter.py +0 -0
  42. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/detector/tests/testing_detector.py +0 -0
  43. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/examples/novelty_score_updater.py +0 -0
  44. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/globals.py +0 -0
  45. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/helpers/__init__.py +0 -0
  46. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/helpers/gdrive_downloader.py +0 -0
  47. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/helpers/log_conf.py +0 -0
  48. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/helpers/misc.py +0 -0
  49. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/py.typed +0 -0
  50. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/pytest.ini +0 -0
  51. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/__init__.py +0 -0
  52. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/conftest.py +0 -0
  53. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_data/file_1.txt +0 -0
  54. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_data/file_2.txt +0 -0
  55. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_data/model.json +0 -0
  56. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_data_classes.py +0 -0
  57. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_downloader.py +0 -0
  58. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_executor.py +0 -0
  59. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_helper.py +0 -0
  60. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/tests/test_learning_loop_node.py +0 -0
  61. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/__init__.py +0 -0
  62. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/downloader.py +0 -0
  63. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/executor.py +0 -0
  64. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/io_helpers.py +0 -0
  65. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/rest/__init__.py +0 -0
  66. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/rest/backdoor_controls.py +0 -0
  67. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/rest/controls.py +0 -0
  68. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/__init__.py +0 -0
  69. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/conftest.py +0 -0
  70. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/state_helper.py +0 -0
  71. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/__init__.py +0 -0
  72. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_cleanup.py +0 -0
  73. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_detecting.py +0 -0
  74. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_download_train_model.py +0 -0
  75. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_prepare.py +0 -0
  76. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_sync_confusion_matrix.py +0 -0
  77. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_train.py +0 -0
  78. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_upload_detections.py +0 -0
  79. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/states/test_state_upload_model.py +0 -0
  80. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/test_errors.py +0 -0
  81. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/test_trainer_states.py +0 -0
  82. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/tests/testing_trainer_logic.py +0 -0
  83. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/trainer_logic.py +0 -0
  84. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/learning_loop_node/trainer/trainer_logic_generic.py +0 -0
  85. {learning_loop_node-0.10.1 → learning_loop_node-0.10.3}/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.10.1
3
+ Version: 0.10.3
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
@@ -62,6 +62,7 @@ You can configure connection to our Learning Loop by specifying the following en
62
62
  | LOOP_HOST | HOST | Learning Loop address (e.g. learning-loop.ai) | all |
63
63
  | LOOP_USERNAME | USERNAME | Learning Loop user name | all besides Detector |
64
64
  | LOOP_PASSWORD | PASSWORD | Learning Loop password | all besides Detector |
65
+ | LOOP_SSL_CERT_PATH | - | Path to the SSL certificate | all (opt.) |
65
66
  | LOOP_ORGANIZATION | ORGANIZATION | Organization name | Detector |
66
67
  | LOOP_PROJECT | PROJECT | Project name | Detector |
67
68
  | MIN_UNCERTAIN_THRESHOLD | PROJECT | smallest confidence (float) at which auto-upload will happen | Detector |
@@ -22,6 +22,7 @@ You can configure connection to our Learning Loop by specifying the following en
22
22
  | LOOP_HOST | HOST | Learning Loop address (e.g. learning-loop.ai) | all |
23
23
  | LOOP_USERNAME | USERNAME | Learning Loop user name | all besides Detector |
24
24
  | LOOP_PASSWORD | PASSWORD | Learning Loop password | all besides Detector |
25
+ | LOOP_SSL_CERT_PATH | - | Path to the SSL certificate | all (opt.) |
25
26
  | LOOP_ORGANIZATION | ORGANIZATION | Organization name | Detector |
26
27
  | LOOP_PROJECT | PROJECT | Project name | Detector |
27
28
  | MIN_UNCERTAIN_THRESHOLD | PROJECT | smallest confidence (float) at which auto-upload will happen | Detector |
@@ -43,3 +43,7 @@ def password(default: str = '') -> str:
43
43
 
44
44
  def host(default: str = '') -> str:
45
45
  return read_from_env(['LOOP_HOST', 'HOST']) or default
46
+
47
+
48
+ def ssl_certificate_path(default: str = '') -> str:
49
+ return read_from_env(['LOOP_SSL_CERT_PATH',]) or default
@@ -17,13 +17,22 @@ class LoopCommunicationException(Exception):
17
17
  class LoopCommunicator():
18
18
  def __init__(self) -> None:
19
19
  host: str = environment_reader.host(default='learning-loop.ai')
20
+ self.ssl_cert_path = environment_reader.ssl_certificate_path()
21
+ if self.ssl_cert_path:
22
+ logging.info('Using SSL certificate at %s', self.ssl_cert_path)
23
+ else:
24
+ logging.info('No SSL certificate path set')
20
25
  self.host: str = host
21
26
  self.username: str = environment_reader.username()
22
27
  self.password: str = environment_reader.password()
23
28
  self.organization: str = environment_reader.organization() # used by mock_detector
24
29
  self.project: str = environment_reader.project() # used by mock_detector
25
30
  self.base_url: str = f'http{"s" if "learning-loop.ai" in host else ""}://' + host
26
- self.async_client: httpx.AsyncClient = httpx.AsyncClient(base_url=self.base_url, timeout=Timeout(60.0))
31
+ if self.ssl_cert_path:
32
+ self.async_client = httpx.AsyncClient(
33
+ base_url=self.base_url, timeout=Timeout(60.0), verify=self.ssl_cert_path)
34
+ else:
35
+ self.async_client = httpx.AsyncClient(base_url=self.base_url, timeout=Timeout(60.0))
27
36
  self.async_client.cookies.clear()
28
37
 
29
38
  logging.info(f'Loop interface initialized with base_url: {self.base_url} / user: {self.username}')
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import logging
3
+ import ssl
3
4
  import sys
4
5
  from abc import abstractmethod
5
6
  from contextlib import asynccontextmanager
@@ -8,6 +9,7 @@ from typing import Any, Optional
8
9
 
9
10
  import aiohttp
10
11
  import socketio
12
+ from aiohttp import TCPConnector
11
13
  from fastapi import FastAPI
12
14
  from socketio import AsyncClient
13
15
 
@@ -122,8 +124,19 @@ class Node(FastAPI):
122
124
  """Create a socket.io client that communicates with the learning loop and register the events.
123
125
  Note: The method is called in startup and soft restart of detector, so the _sio_client should always be available."""
124
126
 
125
- self._sio_client = AsyncClient(request_timeout=20,
126
- http_session=aiohttp.ClientSession(cookies=self.loop_communicator.get_cookies()))
127
+ if self.loop_communicator.ssl_cert_path:
128
+ logging.info(f'SIO using SSL certificate path: {self.loop_communicator.ssl_cert_path}')
129
+ ssl_context = ssl.create_default_context(cafile=self.loop_communicator.ssl_cert_path)
130
+ ssl_context.check_hostname = False
131
+ ssl_context.verify_mode = ssl.CERT_REQUIRED
132
+ connector = TCPConnector(ssl=ssl_context)
133
+ self._sio_client = AsyncClient(request_timeout=20,
134
+ http_session=aiohttp.ClientSession(cookies=self.loop_communicator.get_cookies(),
135
+ connector=connector))
136
+
137
+ else:
138
+ self._sio_client = AsyncClient(request_timeout=20,
139
+ http_session=aiohttp.ClientSession(cookies=self.loop_communicator.get_cookies()))
127
140
 
128
141
  # pylint: disable=protected-access
129
142
  self.sio_client._trigger_event = ensure_socket_response(self.sio_client._trigger_event)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "learning_loop_node"
3
- version = "v0.10.1"
3
+ version = "v0.10.3"
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"