esd-services-api-client 2.0.0__py3-none-any.whl → 2.0.2__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.
Files changed (29) hide show
  1. esd_services_api_client/_version.py +1 -1
  2. esd_services_api_client/crystal/_connector.py +7 -7
  3. esd_services_api_client/nexus/README.md +280 -0
  4. esd_services_api_client/nexus/__init__.py +18 -0
  5. esd_services_api_client/nexus/abstractions/__init__.py +18 -0
  6. esd_services_api_client/nexus/abstractions/logger_factory.py +64 -0
  7. esd_services_api_client/nexus/abstractions/nexus_object.py +64 -0
  8. esd_services_api_client/nexus/abstractions/socket_provider.py +51 -0
  9. esd_services_api_client/nexus/algorithms/__init__.py +22 -0
  10. esd_services_api_client/nexus/algorithms/_baseline_algorithm.py +56 -0
  11. esd_services_api_client/nexus/algorithms/distributed.py +53 -0
  12. esd_services_api_client/nexus/algorithms/minimalistic.py +44 -0
  13. esd_services_api_client/nexus/algorithms/recursive.py +58 -0
  14. esd_services_api_client/nexus/core/__init__.py +18 -0
  15. esd_services_api_client/nexus/core/app_core.py +259 -0
  16. esd_services_api_client/nexus/core/app_dependencies.py +205 -0
  17. esd_services_api_client/nexus/exceptions/__init__.py +20 -0
  18. esd_services_api_client/nexus/exceptions/_nexus_error.py +30 -0
  19. esd_services_api_client/nexus/exceptions/input_reader_error.py +51 -0
  20. esd_services_api_client/nexus/exceptions/startup_error.py +48 -0
  21. esd_services_api_client/nexus/input/__init__.py +22 -0
  22. esd_services_api_client/nexus/input/input_processor.py +94 -0
  23. esd_services_api_client/nexus/input/input_reader.py +109 -0
  24. esd_services_api_client/nexus/input/payload_reader.py +83 -0
  25. {esd_services_api_client-2.0.0.dist-info → esd_services_api_client-2.0.2.dist-info}/METADATA +5 -2
  26. esd_services_api_client-2.0.2.dist-info/RECORD +43 -0
  27. esd_services_api_client-2.0.0.dist-info/RECORD +0 -21
  28. {esd_services_api_client-2.0.0.dist-info → esd_services_api_client-2.0.2.dist-info}/LICENSE +0 -0
  29. {esd_services_api_client-2.0.0.dist-info → esd_services_api_client-2.0.2.dist-info}/WHEEL +0 -0
@@ -0,0 +1,48 @@
1
+ """
2
+ Custom exceptions.
3
+ """
4
+
5
+ # Copyright (c) 2023. ECCO Sneaks & Data
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+
21
+ from esd_services_api_client.nexus.exceptions import FatalNexusError
22
+
23
+
24
+ class FatalServiceStartupError(FatalNexusError):
25
+ """
26
+ Service startup error that shuts down the Nexus.
27
+ """
28
+
29
+ def __init__(self, service: str, underlying: BaseException):
30
+ super().__init__()
31
+ self.with_traceback(underlying.__traceback__)
32
+ self._service = service
33
+
34
+ def __str__(self) -> str:
35
+ return f"Algorithm initialization failed on service {self._service} startup. Review the traceback for more information"
36
+
37
+
38
+ class FatalStartupConfigurationError(FatalNexusError):
39
+ """
40
+ Service configuration error that shuts down the Nexus.
41
+ """
42
+
43
+ def __init__(self, missing_entry: str):
44
+ super().__init__()
45
+ self._missing_entry = missing_entry
46
+
47
+ def __str__(self) -> str:
48
+ return f"Algorithm initialization failed due to a missing configuration entry: {self._missing_entry}."
@@ -0,0 +1,22 @@
1
+ """
2
+ Import index.
3
+ """
4
+
5
+ # Copyright (c) 2023. ECCO Sneaks & Data
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+
21
+ from esd_services_api_client.nexus.input.input_processor import *
22
+ from esd_services_api_client.nexus.input.input_reader import *
@@ -0,0 +1,94 @@
1
+ """
2
+ Input processing.
3
+ """
4
+
5
+ # Copyright (c) 2023. ECCO Sneaks & Data
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ import asyncio
21
+ from abc import abstractmethod
22
+ from typing import Dict, Union, Type
23
+
24
+ import deltalake
25
+ from adapta.metrics import MetricsProvider
26
+
27
+ import azure.core.exceptions
28
+
29
+ from pandas import DataFrame as PandasDataFrame
30
+
31
+ from esd_services_api_client.nexus.abstractions.nexus_object import (
32
+ NexusObject,
33
+ TPayload,
34
+ )
35
+ from esd_services_api_client.nexus.abstractions.logger_factory import LoggerFactory
36
+ from esd_services_api_client.nexus.exceptions.input_reader_error import (
37
+ FatalInputReaderError,
38
+ TransientInputReaderError,
39
+ )
40
+ from esd_services_api_client.nexus.input.input_reader import InputReader
41
+
42
+
43
+ class InputProcessor(NexusObject[TPayload]):
44
+ """
45
+ Base class for raw data processing into algorithm input.
46
+ """
47
+
48
+ def __init__(
49
+ self,
50
+ *readers: InputReader,
51
+ payload: TPayload,
52
+ metrics_provider: MetricsProvider,
53
+ logger_factory: LoggerFactory,
54
+ ):
55
+ super().__init__(metrics_provider, logger_factory)
56
+ self._readers = readers
57
+ self._payload = payload
58
+
59
+ def _get_exc_type(
60
+ self, ex: BaseException
61
+ ) -> Union[Type[FatalInputReaderError], Type[TransientInputReaderError]]:
62
+ match type(ex):
63
+ case azure.core.exceptions.HttpResponseError, deltalake.PyDeltaTableError:
64
+ return TransientInputReaderError
65
+ case azure.core.exceptions.AzureError, azure.core.exceptions.ClientAuthenticationError:
66
+ return FatalInputReaderError
67
+ case _:
68
+ return FatalInputReaderError
69
+
70
+ async def _read_input(self) -> Dict[str, PandasDataFrame]:
71
+ def get_result(alias: str, completed_task: asyncio.Task) -> PandasDataFrame:
72
+ reader_exc = completed_task.exception()
73
+ if reader_exc:
74
+ raise self._get_exc_type(reader_exc)(alias, reader_exc)
75
+
76
+ return completed_task.result()
77
+
78
+ async def _read(input_reader: InputReader):
79
+ async with input_reader as instance:
80
+ return await instance.read()
81
+
82
+ read_tasks: dict[str, asyncio.Task] = {
83
+ reader.socket.alias: asyncio.create_task(_read(reader))
84
+ for reader in self._readers
85
+ }
86
+ await asyncio.wait(fs=read_tasks.values())
87
+
88
+ return {alias: get_result(alias, task) for alias, task in read_tasks.items()}
89
+
90
+ @abstractmethod
91
+ async def process_input(self, **kwargs) -> Dict[str, PandasDataFrame]:
92
+ """
93
+ Input processing logic. Implement this method to prepare data for your algorithm code.
94
+ """
@@ -0,0 +1,109 @@
1
+ """
2
+ Input reader.
3
+ """
4
+
5
+ # Copyright (c) 2023. ECCO Sneaks & Data
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ import re
21
+ from abc import abstractmethod
22
+ from functools import partial
23
+ from typing import Optional
24
+
25
+ from adapta.metrics import MetricsProvider
26
+ from adapta.process_communication import DataSocket
27
+ from adapta.storage.query_enabled_store import QueryEnabledStore
28
+ from adapta.utils.decorators._logging import run_time_metrics_async
29
+
30
+ from pandas import DataFrame as PandasDataFrame
31
+
32
+ from esd_services_api_client.nexus.abstractions.nexus_object import (
33
+ NexusObject,
34
+ TPayload,
35
+ )
36
+ from esd_services_api_client.nexus.abstractions.logger_factory import LoggerFactory
37
+
38
+
39
+ class InputReader(NexusObject[TPayload]):
40
+ """
41
+ Base class for a raw data reader.
42
+ """
43
+
44
+ def __init__(
45
+ self,
46
+ socket: DataSocket,
47
+ store: QueryEnabledStore,
48
+ metrics_provider: MetricsProvider,
49
+ logger_factory: LoggerFactory,
50
+ payload: TPayload,
51
+ *readers: "InputReader"
52
+ ):
53
+ super().__init__(metrics_provider, logger_factory)
54
+ self.socket = socket
55
+ self._store = store
56
+ self._data: Optional[PandasDataFrame] = None
57
+ self._readers = readers
58
+ self._payload = payload
59
+
60
+ @property
61
+ def data(self) -> Optional[PandasDataFrame]:
62
+ """
63
+ Data read by this reader.
64
+ """
65
+ return self._data
66
+
67
+ @abstractmethod
68
+ async def _read_input(self) -> PandasDataFrame:
69
+ """
70
+ Actual data reader logic. Implementing this method is mandatory for the reader to work
71
+ """
72
+
73
+ @property
74
+ def _metric_name(self) -> str:
75
+ return re.sub(
76
+ r"(?<!^)(?=[A-Z])",
77
+ "_",
78
+ self.__class__.__name__.lower().replace("reader", ""),
79
+ )
80
+
81
+ @property
82
+ def _metric_tags(self) -> dict[str, str]:
83
+ return {"entity": self._metric_name}
84
+
85
+ async def read(self) -> PandasDataFrame:
86
+ """
87
+ Coroutine that reads the data from external store and converts it to a dataframe.
88
+ """
89
+
90
+ @run_time_metrics_async(
91
+ metric_name="read_input",
92
+ on_finish_message_template="Finished reading {entity} from path {data_path} in {elapsed:.2f}s seconds",
93
+ template_args={
94
+ "entity": self._metric_name.upper(),
95
+ "data_path": self.socket.data_path,
96
+ },
97
+ )
98
+ async def _read(**_) -> PandasDataFrame:
99
+ if not self._data:
100
+ self._data = await self._read_input()
101
+
102
+ return self._data
103
+
104
+ return await partial(
105
+ _read,
106
+ metric_tags=self._metric_tags,
107
+ metrics_provider=self._metrics_provider,
108
+ logger=self._logger,
109
+ )()
@@ -0,0 +1,83 @@
1
+ """
2
+ Code infrastructure for manipulating payload received from Crystal SAS URI
3
+ """
4
+
5
+ # Copyright (c) 2023. ECCO Sneaks & Data
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ from dataclasses import dataclass
21
+
22
+ from typing import final, Optional, Type
23
+
24
+ from adapta.storage.models.format import DictJsonSerializationFormat
25
+ from adapta.utils import session_with_retries
26
+
27
+ from dataclasses_json import DataClassJsonMixin
28
+
29
+
30
+ @dataclass
31
+ class AlgorithmPayload(DataClassJsonMixin):
32
+ """
33
+ Base class for algorithm payload
34
+ """
35
+
36
+ def validate(self):
37
+ """
38
+ Optional post-validation of the data. Define this method to analyze class contents after payload has been read and deserialized.
39
+ """
40
+
41
+ def __post_init__(self):
42
+ self.validate()
43
+
44
+
45
+ @final
46
+ class AlgorithmPayloadReader:
47
+ """
48
+ Crystal Payload Reader - receives the payload from the URI and deserializes it into the specified type
49
+ """
50
+
51
+ async def __aenter__(self):
52
+ if not self._http:
53
+ self._http = session_with_retries()
54
+ http_response = self._http.get(url=self._payload_uri)
55
+ http_response.raise_for_status()
56
+ self._payload = self._payload_type.from_dict(
57
+ DictJsonSerializationFormat().deserialize(http_response.content)
58
+ )
59
+ return self
60
+
61
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
62
+ self._http.close()
63
+ self._http = None
64
+
65
+ def __init__(self, payload_uri: str, payload_type: Type[AlgorithmPayload]):
66
+ self._http = session_with_retries()
67
+ self._payload: Optional[AlgorithmPayload] = None
68
+ self._payload_uri = payload_uri
69
+ self._payload_type = payload_type
70
+
71
+ @property
72
+ def payload_uri(self) -> str:
73
+ """
74
+ Uri of the paylod for the algorithm
75
+ """
76
+ return self._payload_uri
77
+
78
+ @property
79
+ def payload(self) -> Optional[AlgorithmPayload]:
80
+ """
81
+ Payload data deserialized into the user class.
82
+ """
83
+ return self._payload
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esd-services-api-client
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Python clients for ESD services
5
5
  Home-page: https://github.com/SneaksAndData/esd-services-api-client
6
6
  License: Apache 2.0
@@ -15,9 +15,12 @@ Classifier: Programming Language :: Python :: 3.9
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Provides-Extra: azure
18
- Requires-Dist: adapta[azure] (>=2.2.0,<3.0.0)
18
+ Provides-Extra: nexus
19
+ Requires-Dist: adapta[azure,datadog,storage] (>=2.6.6,<3.0.0)
19
20
  Requires-Dist: azure-identity (>=1.7,<1.8) ; extra == "azure"
20
21
  Requires-Dist: dataclasses-json (>=0.6.0,<0.7.0)
22
+ Requires-Dist: httpx (>=0.26.0,<0.27.0) ; extra == "nexus"
23
+ Requires-Dist: injector (>=0.21.0,<0.22.0) ; extra == "nexus"
21
24
  Requires-Dist: pycryptodome (>=3.15,<3.16)
22
25
  Requires-Dist: pyjwt (>=2.4.0,<2.5.0)
23
26
  Project-URL: Repository, https://github.com/SneaksAndData/esd-services-api-client
@@ -0,0 +1,43 @@
1
+ esd_services_api_client/__init__.py,sha256=rP0njtEgVSMm-sOVayVfcRUrrubl4lme7HI2zS678Lo,598
2
+ esd_services_api_client/_version.py,sha256=kumiGImhzOTlTrRM-6jDo2mNnVHGO_2vxtrhB0nzAiw,22
3
+ esd_services_api_client/beast/__init__.py,sha256=NTaz_7YoLPK8MCLwbwqH7rW1zDWLxXu2T7fGmMmRxyg,718
4
+ esd_services_api_client/beast/v3/__init__.py,sha256=TRjB4-T6eIORpMvdylb32_GinrIpYNFmAdshSC1HqHg,749
5
+ esd_services_api_client/beast/v3/_connector.py,sha256=oPizDQ1KOKOfiyh-jAofKodlpRzrRiELv-rmP_o_oio,11473
6
+ esd_services_api_client/beast/v3/_models.py,sha256=hvh8QlwYLCfdBJxUKPutOq0xFn9rUU1q6UgHEpoZaFM,6761
7
+ esd_services_api_client/boxer/README.md,sha256=-MAhYUPvmEMcgx_lo_2PlH_gZI1lndGv8fnDQYIpurU,3618
8
+ esd_services_api_client/boxer/__init__.py,sha256=OYsWvdnLan0kmjUcH4I2-m1rbPeARKp5iqhp8uyudPk,780
9
+ esd_services_api_client/boxer/_auth.py,sha256=vA7T9y0oZV2f17UWQ2or9CK8vAsNnHB10G5HNQe1l1I,7440
10
+ esd_services_api_client/boxer/_base.py,sha256=PSU08QzTKFkXfzx7fF5FIHBOZXshxNEd1J_qKGo0Rd0,976
11
+ esd_services_api_client/boxer/_connector.py,sha256=kATr7IyQKtvsGlvgVInO_DsGGC4yCC1aW3RxoXt-QIM,8672
12
+ esd_services_api_client/boxer/_models.py,sha256=q_xRHOXlRroKrDrNUxQJUFGSotxYvUbRY1rYmx8UfJg,1697
13
+ esd_services_api_client/common/__init__.py,sha256=rP0njtEgVSMm-sOVayVfcRUrrubl4lme7HI2zS678Lo,598
14
+ esd_services_api_client/crystal/__init__.py,sha256=afSGQRkDic0ECsJfgu3b291kX8CyU57sjreqxj5cx-s,787
15
+ esd_services_api_client/crystal/_api_versions.py,sha256=2BMiQRS0D8IEpWCCys3dge5alVBRCZrOuCR1QAn8UIM,832
16
+ esd_services_api_client/crystal/_connector.py,sha256=WjfMezWXia41Z8aiNupaT577fk9Sx6uy6V23O6y9hfI,12870
17
+ esd_services_api_client/crystal/_models.py,sha256=eRhGAl8LjglCyIFwf1bcFBhjbpSuRYucuF2LO388L2E,4025
18
+ esd_services_api_client/nexus/README.md,sha256=6fGBYTvzkmZH9Yk9VcPqWCtqU_D2zleG1rv1U3GA3IM,7721
19
+ esd_services_api_client/nexus/__init__.py,sha256=e7RPs-qJNQqDHj121TeYx-_YadZSOIyJuAPyhSSXRsE,622
20
+ esd_services_api_client/nexus/abstractions/__init__.py,sha256=e7RPs-qJNQqDHj121TeYx-_YadZSOIyJuAPyhSSXRsE,622
21
+ esd_services_api_client/nexus/abstractions/logger_factory.py,sha256=JHl_t0d0ra_k-EixZlkw-s746wHUdBhSU6preqoARtk,2031
22
+ esd_services_api_client/nexus/abstractions/nexus_object.py,sha256=E9iYmjYjkmS0Uv-VS1ixRhi3zdtQfcSNx4gxad5_aZ0,1780
23
+ esd_services_api_client/nexus/abstractions/socket_provider.py,sha256=Mv9BWdxw8VY4Gi4EOrdxWK1zsR3-fqIbpyF1xHWchbE,1495
24
+ esd_services_api_client/nexus/algorithms/__init__.py,sha256=uWX24NHUnUcnOJN2IIp1kaaozCC0rOmB36WxHBCapCY,823
25
+ esd_services_api_client/nexus/algorithms/_baseline_algorithm.py,sha256=4Gqp8qV5nunZ_DwZyHAu0vLuF1rls8nnq2zoHy2orME,1825
26
+ esd_services_api_client/nexus/algorithms/distributed.py,sha256=iWjx9D6g-ASwTWPkQ9GmInTLymVlxl7UkfEBcEfnkmc,1628
27
+ esd_services_api_client/nexus/algorithms/minimalistic.py,sha256=9KvIXXsiOZ9wAOvrIZuOlNYcJLB-SjlQoNpICJu-qeQ,1366
28
+ esd_services_api_client/nexus/algorithms/recursive.py,sha256=2YuAeYZ6-K5hcY8NEAAJVyGhtVVQMTZ7wjkWPPo8qeE,1829
29
+ esd_services_api_client/nexus/core/__init__.py,sha256=e7RPs-qJNQqDHj121TeYx-_YadZSOIyJuAPyhSSXRsE,622
30
+ esd_services_api_client/nexus/core/app_core.py,sha256=bwbFzbjx8PwZWHfHsEYDCGAjJuTzmVKuunSeMU54tHs,8877
31
+ esd_services_api_client/nexus/core/app_dependencies.py,sha256=afX7QrUEuaLnFssaCTohXBt7QCeGJ0MuovF62CZTZ34,5672
32
+ esd_services_api_client/nexus/exceptions/__init__.py,sha256=JgPXhrvBIi0U1QOF90TYHS8jv_SBQEoRLsEg6rrtRoc,691
33
+ esd_services_api_client/nexus/exceptions/_nexus_error.py,sha256=b3L8JnNvV2jdxNfuFWh9-j4kVb_VX7gNH5WHKcC-R78,890
34
+ esd_services_api_client/nexus/exceptions/input_reader_error.py,sha256=D-xYTKRNREQ2-NGhc88GHOmXCvLNsIVQsH8wf0LLC_0,1760
35
+ esd_services_api_client/nexus/exceptions/startup_error.py,sha256=f2PIOSdLgT-42eKD6ec8p7nROADshMawCsDGDUbxO_w,1546
36
+ esd_services_api_client/nexus/input/__init__.py,sha256=0k_HMIP4NPC5O2ixKJPgKsLzYeHS14DhibF_MUtez1c,753
37
+ esd_services_api_client/nexus/input/input_processor.py,sha256=MiXXd_APrG85Pi-Ke68_UHNEV7T_QHN1hU1WAPWoTsw,3187
38
+ esd_services_api_client/nexus/input/input_reader.py,sha256=uxTAGX5xNhjTFpEsVQnr8BkVgpIH_U_om54hh3pvJ3s,3269
39
+ esd_services_api_client/nexus/input/payload_reader.py,sha256=__r_QjIFRAWwx56X5WUK1qensJUae0vZEb422dzOgSY,2511
40
+ esd_services_api_client-2.0.2.dist-info/LICENSE,sha256=0gS6zXsPp8qZhzi1xaGCIYPzb_0e8on7HCeFJe8fOpw,10693
41
+ esd_services_api_client-2.0.2.dist-info/METADATA,sha256=rNOu2tUM-mWp4kQbt13EpUweANcI808ZNCFmMdcqQRM,1236
42
+ esd_services_api_client-2.0.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
43
+ esd_services_api_client-2.0.2.dist-info/RECORD,,
@@ -1,21 +0,0 @@
1
- esd_services_api_client/__init__.py,sha256=rP0njtEgVSMm-sOVayVfcRUrrubl4lme7HI2zS678Lo,598
2
- esd_services_api_client/_version.py,sha256=hwOJuFUEKtsgiOt4l6op9s-hviovM6TK1uCdtRNWY4E,22
3
- esd_services_api_client/beast/__init__.py,sha256=NTaz_7YoLPK8MCLwbwqH7rW1zDWLxXu2T7fGmMmRxyg,718
4
- esd_services_api_client/beast/v3/__init__.py,sha256=TRjB4-T6eIORpMvdylb32_GinrIpYNFmAdshSC1HqHg,749
5
- esd_services_api_client/beast/v3/_connector.py,sha256=oPizDQ1KOKOfiyh-jAofKodlpRzrRiELv-rmP_o_oio,11473
6
- esd_services_api_client/beast/v3/_models.py,sha256=hvh8QlwYLCfdBJxUKPutOq0xFn9rUU1q6UgHEpoZaFM,6761
7
- esd_services_api_client/boxer/README.md,sha256=-MAhYUPvmEMcgx_lo_2PlH_gZI1lndGv8fnDQYIpurU,3618
8
- esd_services_api_client/boxer/__init__.py,sha256=OYsWvdnLan0kmjUcH4I2-m1rbPeARKp5iqhp8uyudPk,780
9
- esd_services_api_client/boxer/_auth.py,sha256=vA7T9y0oZV2f17UWQ2or9CK8vAsNnHB10G5HNQe1l1I,7440
10
- esd_services_api_client/boxer/_base.py,sha256=PSU08QzTKFkXfzx7fF5FIHBOZXshxNEd1J_qKGo0Rd0,976
11
- esd_services_api_client/boxer/_connector.py,sha256=kATr7IyQKtvsGlvgVInO_DsGGC4yCC1aW3RxoXt-QIM,8672
12
- esd_services_api_client/boxer/_models.py,sha256=q_xRHOXlRroKrDrNUxQJUFGSotxYvUbRY1rYmx8UfJg,1697
13
- esd_services_api_client/common/__init__.py,sha256=rP0njtEgVSMm-sOVayVfcRUrrubl4lme7HI2zS678Lo,598
14
- esd_services_api_client/crystal/__init__.py,sha256=afSGQRkDic0ECsJfgu3b291kX8CyU57sjreqxj5cx-s,787
15
- esd_services_api_client/crystal/_api_versions.py,sha256=2BMiQRS0D8IEpWCCys3dge5alVBRCZrOuCR1QAn8UIM,832
16
- esd_services_api_client/crystal/_connector.py,sha256=yJObx9kHtaUmjry_B7EaJqbxn6t9aR0ypgrCGsCO5pI,12854
17
- esd_services_api_client/crystal/_models.py,sha256=eRhGAl8LjglCyIFwf1bcFBhjbpSuRYucuF2LO388L2E,4025
18
- esd_services_api_client-2.0.0.dist-info/LICENSE,sha256=0gS6zXsPp8qZhzi1xaGCIYPzb_0e8on7HCeFJe8fOpw,10693
19
- esd_services_api_client-2.0.0.dist-info/METADATA,sha256=p6kY-uup2AS5oQ66wcPuMpfWPxogN0FbzKcfEA4XPX4,1077
20
- esd_services_api_client-2.0.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
21
- esd_services_api_client-2.0.0.dist-info/RECORD,,