esd-services-api-client 2.5.13a144.dev1__tar.gz → 2.5.14a148.dev5__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.
Files changed (58) hide show
  1. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/PKG-INFO +1 -1
  2. esd_services_api_client-2.5.14a148.dev5/esd_services_api_client/_version.py +1 -0
  3. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/README.md +1 -1
  4. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/core/app_core.py +36 -22
  5. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/core/app_dependencies.py +8 -12
  6. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/pyproject.toml +1 -1
  7. esd_services_api_client-2.5.13a144.dev1/esd_services_api_client/_version.py +0 -1
  8. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/LICENSE +0 -0
  9. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/README.md +0 -0
  10. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/__init__.py +0 -0
  11. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/beast/__init__.py +0 -0
  12. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/beast/v3/__init__.py +0 -0
  13. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/beast/v3/_connector.py +0 -0
  14. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/beast/v3/_models.py +0 -0
  15. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/boxer/README.md +0 -0
  16. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/boxer/__init__.py +0 -0
  17. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/boxer/_auth.py +0 -0
  18. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/boxer/_base.py +0 -0
  19. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/boxer/_connector.py +0 -0
  20. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/boxer/_models.py +0 -0
  21. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/common/__init__.py +0 -0
  22. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/crystal/__init__.py +0 -0
  23. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/crystal/_api_versions.py +0 -0
  24. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/crystal/_connector.py +0 -0
  25. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/crystal/_models.py +0 -0
  26. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/__init__.py +0 -0
  27. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/abstractions/__init__.py +0 -0
  28. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/abstractions/algrorithm_cache.py +0 -0
  29. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/abstractions/input_object.py +0 -0
  30. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/abstractions/logger_factory.py +0 -0
  31. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/abstractions/nexus_object.py +0 -0
  32. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/abstractions/socket_provider.py +0 -0
  33. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/algorithms/__init__.py +0 -0
  34. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/algorithms/_baseline_algorithm.py +0 -0
  35. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/algorithms/_remote_algorithm.py +0 -0
  36. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/algorithms/distributed.py +0 -0
  37. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/algorithms/forked_algorithm.py +0 -0
  38. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/algorithms/minimalistic.py +0 -0
  39. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/algorithms/recursive.py +0 -0
  40. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/configurations/__init__.py +0 -0
  41. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/configurations/algorithm_configuration.py +0 -0
  42. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/core/__init__.py +0 -0
  43. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/core/serializers.py +0 -0
  44. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/exceptions/__init__.py +0 -0
  45. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/exceptions/_nexus_error.py +0 -0
  46. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/exceptions/cache_errors.py +0 -0
  47. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/exceptions/input_reader_error.py +0 -0
  48. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/exceptions/startup_error.py +0 -0
  49. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/input/__init__.py +0 -0
  50. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/input/input_processor.py +0 -0
  51. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/input/input_reader.py +0 -0
  52. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/input/payload_reader.py +0 -0
  53. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/modules/__init__.py +0 -0
  54. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/modules/astra_client_module.py +0 -0
  55. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/modules/mlflow_module.py +0 -0
  56. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/telemetry/__init__.py +0 -0
  57. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/telemetry/recorder.py +0 -0
  58. {esd_services_api_client-2.5.13a144.dev1 → esd_services_api_client-2.5.14a148.dev5}/esd_services_api_client/nexus/telemetry/user_telemetry_recorder.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: esd-services-api-client
3
- Version: 2.5.13a144.dev1
3
+ Version: 2.5.14a148.dev5
4
4
  Summary: Python clients for ESD services
5
5
  License: Apache 2.0
6
6
  Author: ECCO Sneaks & Data
@@ -0,0 +1 @@
1
+ __version__ = 'v2.5.14a148.dev5'
@@ -297,7 +297,7 @@ async def main():
297
297
  server_thread.daemon = True
298
298
  server_thread.start()
299
299
  nexus = (
300
- await Nexus.create()
300
+ Nexus.create()
301
301
  .add_reader(XReader)
302
302
  .add_reader(YReader)
303
303
  .use_processor(XProcessor)
@@ -27,12 +27,11 @@ from typing import final, Type, Optional
27
27
 
28
28
  import backoff
29
29
  import urllib3.exceptions
30
- import azure.core.exceptions
31
30
  from adapta.logs import LoggerInterface
32
31
  from adapta.process_communication import DataSocket
33
32
  from adapta.storage.blob.base import StorageClient
34
33
  from adapta.storage.query_enabled_store import QueryEnabledStore
35
- from injector import Injector, Module
34
+ from injector import Injector, Module, singleton
36
35
 
37
36
  import esd_services_api_client.nexus.exceptions
38
37
  from esd_services_api_client.crystal import (
@@ -119,6 +118,7 @@ class Nexus:
119
118
  self._run_args = args
120
119
  self._algorithm_run_task: Optional[asyncio.Task] = None
121
120
  self._on_complete_tasks: list[type[UserTelemetryRecorder]] = []
121
+ self._payload_types: list[type[AlgorithmPayload]] = []
122
122
 
123
123
  attach_signal_handlers()
124
124
 
@@ -157,22 +157,11 @@ class Nexus:
157
157
  self._algorithm_class = algorithm
158
158
  return self
159
159
 
160
- async def inject_payload(self, *payload_types: Type[AlgorithmPayload]) -> "Nexus":
160
+ def inject_payload(self, *payload_types: Type[AlgorithmPayload]) -> "Nexus":
161
161
  """
162
- Adds payloads processed into the specified types to the DI container
162
+ Adds payload types to inject to the DI container. Payloads will be deserialized at runtime.
163
163
  """
164
- for payload_type in payload_types:
165
-
166
- async def get_payload() -> payload_type: # pylint: disable=W0640
167
- async with AlgorithmPayloadReader(
168
- payload_uri=self._run_args.sas_uri,
169
- payload_type=payload_type, # pylint: disable=W0640
170
- ) as reader:
171
- return reader.payload
172
-
173
- # pylint warnings are silenced here because closure is called inside the same loop it is defined, thus each value of a loop variable is used
174
-
175
- self._configurator = self._configurator.with_payload((await get_payload()))
164
+ self._payload_types = payload_types
176
165
  return self
177
166
 
178
167
  def inject_configuration(
@@ -202,10 +191,7 @@ class Nexus:
202
191
  ) -> None:
203
192
  @backoff.on_exception(
204
193
  wait_gen=backoff.expo,
205
- exception=(
206
- azure.core.exceptions.HttpResponseError,
207
- urllib3.exceptions.HTTPError,
208
- ),
194
+ exception=(urllib3.exceptions.HTTPError,),
209
195
  max_time=10,
210
196
  raise_on_giveup=True,
211
197
  )
@@ -258,6 +244,15 @@ class Nexus:
258
244
  case _:
259
245
  sys.exit(1)
260
246
 
247
+ async def _get_payload(
248
+ self, payload_type: type[AlgorithmPayload]
249
+ ) -> AlgorithmPayload:
250
+ async with AlgorithmPayloadReader(
251
+ payload_uri=self._run_args.sas_uri,
252
+ payload_type=payload_type,
253
+ ) as reader:
254
+ return reader.payload
255
+
261
256
  async def activate(self):
262
257
  """
263
258
  Activates the run sequence.
@@ -265,14 +260,25 @@ class Nexus:
265
260
 
266
261
  self._injector = Injector(self._configurator.injection_binds)
267
262
 
268
- algorithm: BaselineAlgorithm = self._injector.get(self._algorithm_class)
269
- telemetry_recorder: TelemetryRecorder = self._injector.get(TelemetryRecorder)
270
263
  root_logger: LoggerInterface = self._injector.get(LoggerFactory).create_logger(
271
264
  logger_type=self.__class__,
272
265
  )
273
266
 
274
267
  root_logger.start()
275
268
 
269
+ for payload_type in self._payload_types:
270
+ try:
271
+ payload = await self._get_payload(payload_type=payload_type)
272
+ self._injector.binder.bind(
273
+ payload.__class__, to=payload, scope=singleton
274
+ )
275
+ except BaseException as ex: # pylint: disable=broad-except
276
+ root_logger.error("Error reading algorithm payload", ex)
277
+ sys.exit(1)
278
+
279
+ algorithm: BaselineAlgorithm = self._injector.get(self._algorithm_class)
280
+ telemetry_recorder: TelemetryRecorder = self._injector.get(TelemetryRecorder)
281
+
276
282
  root_logger.info(
277
283
  "Running algorithm {algorithm} on Nexus version {version}",
278
284
  algorithm=algorithm.__class__.__name__,
@@ -286,6 +292,14 @@ class Nexus:
286
292
  await self._algorithm_run_task
287
293
  ex = self._algorithm_run_task.exception()
288
294
 
295
+ if ex is not None:
296
+ root_logger.error(
297
+ "Algorithm {algorithm} run failed on Nexus version {version}",
298
+ ex,
299
+ algorithm=self._algorithm_class,
300
+ version=__version__,
301
+ )
302
+
289
303
  await self._submit_result(
290
304
  self._algorithm_run_task.result() if not ex else None,
291
305
  self._algorithm_run_task.exception(),
@@ -42,9 +42,6 @@ from esd_services_api_client.nexus.exceptions.startup_error import (
42
42
  )
43
43
  from esd_services_api_client.nexus.input.input_processor import InputProcessor
44
44
  from esd_services_api_client.nexus.input.input_reader import InputReader
45
- from esd_services_api_client.nexus.input.payload_reader import (
46
- AlgorithmPayload,
47
- )
48
45
  from esd_services_api_client.nexus.telemetry.recorder import TelemetryRecorder
49
46
  from esd_services_api_client.nexus.core.serializers import (
50
47
  TelemetrySerializer,
@@ -247,6 +244,7 @@ class ServiceConfigurator:
247
244
  CacheModule(),
248
245
  type(f"{TelemetryRecorder.__name__}Module", (Module,), {})(),
249
246
  ]
247
+ self._runtime_injection_binds = []
250
248
 
251
249
  @property
252
250
  def injection_binds(self) -> list:
@@ -255,6 +253,13 @@ class ServiceConfigurator:
255
253
  """
256
254
  return self._injection_binds
257
255
 
256
+ @property
257
+ def runtime_injection_binds(self) -> list:
258
+ """
259
+ Currently configured injection bindings that are added at runtime
260
+ """
261
+ return self._runtime_injection_binds
262
+
258
263
  def with_module(self, module: Type[Module]) -> "ServiceConfigurator":
259
264
  """
260
265
  Adds a (custom) module into the DI container.
@@ -280,15 +285,6 @@ class ServiceConfigurator:
280
285
  )
281
286
  return self
282
287
 
283
- def with_payload(self, payload: AlgorithmPayload) -> "ServiceConfigurator":
284
- """
285
- Adds the specified payload instance to the DI container.
286
- """
287
- self._injection_binds.append(
288
- lambda binder: binder.bind(payload.__class__, to=payload, scope=singleton)
289
- )
290
- return self
291
-
292
288
  def with_configuration(self, config: NexusConfiguration) -> "ServiceConfigurator":
293
289
  """
294
290
  Adds the specified payload instance to the DI container.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "esd-services-api-client"
3
- version = "v2.5.13a144.dev1"
3
+ version = "v2.5.14a148.dev5"
4
4
  description = "Python clients for ESD services"
5
5
  authors = ["ECCO Sneaks & Data <esdsupport@ecco.com>"]
6
6
  maintainers = ['GZU <gzu@ecco.com>', 'JRB <ext-jrb@ecco.com>', 'VISA <visa@ecco.com>']
@@ -1 +0,0 @@
1
- __version__ = 'v2.5.13a144.dev1'