elastly 0.1.0__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 (49) hide show
  1. elastly/__init__.py +117 -0
  2. elastly/api/__init__.py +7 -0
  3. elastly/api/ingest_api.py +1167 -0
  4. elastly/api/prices_api.py +349 -0
  5. elastly/api/writebacks_api.py +618 -0
  6. elastly/api_client.py +805 -0
  7. elastly/api_response.py +21 -0
  8. elastly/configuration.py +606 -0
  9. elastly/exceptions.py +219 -0
  10. elastly/models/__init__.py +49 -0
  11. elastly/models/ack_writebacks_response.py +94 -0
  12. elastly/models/api_error.py +93 -0
  13. elastly/models/api_error_error.py +102 -0
  14. elastly/models/batch_created_response.py +91 -0
  15. elastly/models/batch_status_response.py +110 -0
  16. elastly/models/claim_writebacks_request.py +90 -0
  17. elastly/models/claim_writebacks_response.py +97 -0
  18. elastly/models/claim_writebacks_response_tasks_inner.py +122 -0
  19. elastly/models/commit_batch_response.py +89 -0
  20. elastly/models/prices_request.py +98 -0
  21. elastly/models/prices_request_lines_inner.py +114 -0
  22. elastly/models/prices_response.py +97 -0
  23. elastly/models/prices_response_lines_inner.py +138 -0
  24. elastly/models/prices_response_lines_inner_one_of.py +131 -0
  25. elastly/models/prices_response_lines_inner_one_of1.py +105 -0
  26. elastly/models/prices_response_lines_inner_one_of_explanation.py +121 -0
  27. elastly/models/prices_response_lines_inner_one_of_explanation_drivers_inner.py +102 -0
  28. elastly/models/prices_response_lines_inner_one_of_reason_inner.py +95 -0
  29. elastly/models/stage_records_request.py +166 -0
  30. elastly/models/stage_records_request_one_of.py +107 -0
  31. elastly/models/stage_records_request_one_of1.py +107 -0
  32. elastly/models/stage_records_request_one_of1_records_inner.py +126 -0
  33. elastly/models/stage_records_request_one_of2.py +107 -0
  34. elastly/models/stage_records_request_one_of2_records_inner.py +160 -0
  35. elastly/models/stage_records_request_one_of2_records_inner_lines_inner.py +119 -0
  36. elastly/models/stage_records_request_one_of3.py +107 -0
  37. elastly/models/stage_records_request_one_of3_records_inner.py +131 -0
  38. elastly/models/stage_records_request_one_of3_records_inner_lines_inner.py +98 -0
  39. elastly/models/stage_records_request_one_of_records_inner.py +118 -0
  40. elastly/models/stage_records_response.py +90 -0
  41. elastly/models/writeback_ack_request.py +98 -0
  42. elastly/models/writeback_ack_request_results_inner.py +93 -0
  43. elastly/py.typed +0 -0
  44. elastly/rest.py +264 -0
  45. elastly-0.1.0.dist-info/METADATA +100 -0
  46. elastly-0.1.0.dist-info/RECORD +49 -0
  47. elastly-0.1.0.dist-info/WHEEL +5 -0
  48. elastly-0.1.0.dist-info/licenses/LICENSE +21 -0
  49. elastly-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,93 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Elastly API
5
+
6
+ Elastly public API v1: price serving, canonical ingest, write-back claims and webhooks. Authenticate every request with an API key: Authorization: Bearer elastly_live_...
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Contact: support@elastly.io
10
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
11
+
12
+ Do not edit the class manually.
13
+ """ # noqa: E501
14
+
15
+
16
+ from __future__ import annotations
17
+ import pprint
18
+ import re # noqa: F401
19
+ import json
20
+
21
+ from pydantic import BaseModel, ConfigDict, StrictBool, StrictStr
22
+ from typing import Any, ClassVar, Dict, List, Optional
23
+ from typing import Optional, Set
24
+ from typing_extensions import Self
25
+ from pydantic_core import to_jsonable_python
26
+
27
+ class WritebackAckRequestResultsInner(BaseModel):
28
+ """
29
+ WritebackAckRequestResultsInner
30
+ """ # noqa: E501
31
+ id: StrictStr
32
+ ok: StrictBool
33
+ error: Optional[StrictStr] = None
34
+ __properties: ClassVar[List[str]] = ["id", "ok", "error"]
35
+
36
+ model_config = ConfigDict(
37
+ validate_by_name=True,
38
+ validate_by_alias=True,
39
+ validate_assignment=True,
40
+ protected_namespaces=(),
41
+ )
42
+
43
+
44
+ def to_str(self) -> str:
45
+ """Returns the string representation of the model using alias"""
46
+ return pprint.pformat(self.model_dump(by_alias=True))
47
+
48
+ def to_json(self) -> str:
49
+ """Returns the JSON representation of the model using alias"""
50
+ return json.dumps(to_jsonable_python(self.to_dict()))
51
+
52
+ @classmethod
53
+ def from_json(cls, json_str: str) -> Optional[Self]:
54
+ """Create an instance of WritebackAckRequestResultsInner from a JSON string"""
55
+ return cls.from_dict(json.loads(json_str))
56
+
57
+ def to_dict(self) -> Dict[str, Any]:
58
+ """Return the dictionary representation of the model using alias.
59
+
60
+ This has the following differences from calling pydantic's
61
+ `self.model_dump(by_alias=True)`:
62
+
63
+ * `None` is only added to the output dict for nullable fields that
64
+ were set at model initialization. Other fields with value `None`
65
+ are ignored.
66
+ """
67
+ excluded_fields: Set[str] = set([
68
+ ])
69
+
70
+ _dict = self.model_dump(
71
+ by_alias=True,
72
+ exclude=excluded_fields,
73
+ exclude_none=True,
74
+ )
75
+ return _dict
76
+
77
+ @classmethod
78
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
79
+ """Create an instance of WritebackAckRequestResultsInner from a dict"""
80
+ if obj is None:
81
+ return None
82
+
83
+ if not isinstance(obj, dict):
84
+ return cls.model_validate(obj)
85
+
86
+ _obj = cls.model_validate({
87
+ "id": obj.get("id"),
88
+ "ok": obj.get("ok"),
89
+ "error": obj.get("error")
90
+ })
91
+ return _obj
92
+
93
+
elastly/py.typed ADDED
File without changes
elastly/rest.py ADDED
@@ -0,0 +1,264 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Elastly API
5
+
6
+ Elastly public API v1: price serving, canonical ingest, write-back claims and webhooks. Authenticate every request with an API key: Authorization: Bearer elastly_live_...
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Contact: support@elastly.io
10
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
11
+
12
+ Do not edit the class manually.
13
+ """ # noqa: E501
14
+
15
+
16
+ import io
17
+ import json
18
+ import re
19
+ import ssl
20
+
21
+ import urllib3
22
+
23
+ from elastly.exceptions import ApiException, ApiValueError
24
+
25
+ SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
26
+ RESTResponseType = urllib3.HTTPResponse
27
+
28
+
29
+ def is_socks_proxy_url(url):
30
+ if url is None:
31
+ return False
32
+ split_section = url.split("://")
33
+ if len(split_section) < 2:
34
+ return False
35
+ else:
36
+ return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
37
+
38
+
39
+ class RESTResponse(io.IOBase):
40
+
41
+ def __init__(self, resp) -> None:
42
+ self.response = resp
43
+ self.status = resp.status
44
+ self.reason = resp.reason
45
+ self.data = None
46
+
47
+ def read(self):
48
+ if self.data is None:
49
+ self.data = self.response.data
50
+ return self.data
51
+
52
+ @property
53
+ def headers(self):
54
+ """Returns a dictionary of response headers."""
55
+ return self.response.headers
56
+
57
+ def getheaders(self):
58
+ """Returns a dictionary of the response headers; use ``headers`` instead."""
59
+ return self.response.headers
60
+
61
+ def getheader(self, name, default=None):
62
+ """Returns a given response header; use ``headers.get()`` instead."""
63
+ return self.response.headers.get(name, default)
64
+
65
+
66
+ class RESTClientObject:
67
+
68
+ def __init__(self, configuration) -> None:
69
+ # urllib3.PoolManager will pass all kw parameters to connectionpool
70
+ # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501
71
+ # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501
72
+ # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501
73
+
74
+ # cert_reqs
75
+ if configuration.verify_ssl:
76
+ cert_reqs = ssl.CERT_REQUIRED
77
+ else:
78
+ cert_reqs = ssl.CERT_NONE
79
+
80
+ pool_args = {
81
+ "cert_reqs": cert_reqs,
82
+ "ca_certs": configuration.ssl_ca_cert,
83
+ "cert_file": configuration.cert_file,
84
+ "key_file": configuration.key_file,
85
+ "ca_cert_data": configuration.ca_cert_data,
86
+ }
87
+ if configuration.assert_hostname is not None:
88
+ pool_args['assert_hostname'] = (
89
+ configuration.assert_hostname
90
+ )
91
+
92
+ if configuration.retries is not None:
93
+ pool_args['retries'] = configuration.retries
94
+
95
+ if configuration.tls_server_name:
96
+ pool_args['server_hostname'] = configuration.tls_server_name
97
+
98
+
99
+ if configuration.socket_options is not None:
100
+ pool_args['socket_options'] = configuration.socket_options
101
+
102
+ if configuration.connection_pool_maxsize is not None:
103
+ pool_args['maxsize'] = configuration.connection_pool_maxsize
104
+
105
+ # https pool manager
106
+ self.pool_manager: urllib3.PoolManager
107
+
108
+ if configuration.proxy:
109
+ if is_socks_proxy_url(configuration.proxy):
110
+ from urllib3.contrib.socks import SOCKSProxyManager
111
+ pool_args["proxy_url"] = configuration.proxy
112
+ pool_args["headers"] = configuration.proxy_headers
113
+ self.pool_manager = SOCKSProxyManager(**pool_args)
114
+ else:
115
+ pool_args["proxy_url"] = configuration.proxy
116
+ pool_args["proxy_headers"] = configuration.proxy_headers
117
+ self.pool_manager = urllib3.ProxyManager(**pool_args)
118
+ else:
119
+ self.pool_manager = urllib3.PoolManager(**pool_args)
120
+
121
+ def request(
122
+ self,
123
+ method,
124
+ url,
125
+ headers=None,
126
+ body=None,
127
+ post_params=None,
128
+ _request_timeout=None
129
+ ):
130
+ """Perform requests.
131
+
132
+ :param method: http request method
133
+ :param url: http request url
134
+ :param headers: http request headers
135
+ :param body: request json body, for `application/json`
136
+ :param post_params: request post parameters,
137
+ `application/x-www-form-urlencoded`
138
+ and `multipart/form-data`
139
+ :param _request_timeout: timeout setting for this request. If one
140
+ number provided, it will be total request
141
+ timeout. It can also be a pair (tuple) of
142
+ (connection, read) timeouts.
143
+ """
144
+ method = method.upper()
145
+ assert method in [
146
+ 'GET',
147
+ 'HEAD',
148
+ 'DELETE',
149
+ 'POST',
150
+ 'PUT',
151
+ 'PATCH',
152
+ 'OPTIONS'
153
+ ]
154
+
155
+ if post_params and body:
156
+ raise ApiValueError(
157
+ "body parameter cannot be used with post_params parameter."
158
+ )
159
+
160
+ post_params = post_params or {}
161
+ headers = headers or {}
162
+
163
+ timeout = None
164
+ if _request_timeout:
165
+ if isinstance(_request_timeout, (int, float)):
166
+ timeout = urllib3.Timeout(total=_request_timeout)
167
+ elif (
168
+ isinstance(_request_timeout, tuple)
169
+ and len(_request_timeout) == 2
170
+ ):
171
+ timeout = urllib3.Timeout(
172
+ connect=_request_timeout[0],
173
+ read=_request_timeout[1]
174
+ )
175
+
176
+ try:
177
+ # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
178
+ if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']:
179
+
180
+ # no content type provided or payload is json
181
+ content_type = headers.get('Content-Type')
182
+ if (
183
+ not content_type
184
+ or re.search('json', content_type, re.IGNORECASE)
185
+ ):
186
+ request_body = None
187
+ if body is not None:
188
+ request_body = json.dumps(body)
189
+ r = self.pool_manager.request(
190
+ method,
191
+ url,
192
+ body=request_body,
193
+ timeout=timeout,
194
+ headers=headers,
195
+ preload_content=False
196
+ )
197
+ elif content_type == 'application/x-www-form-urlencoded':
198
+ r = self.pool_manager.request(
199
+ method,
200
+ url,
201
+ fields=post_params,
202
+ encode_multipart=False,
203
+ timeout=timeout,
204
+ headers=headers,
205
+ preload_content=False
206
+ )
207
+ elif content_type == 'multipart/form-data':
208
+ # must del headers['Content-Type'], or the correct
209
+ # Content-Type which generated by urllib3 will be
210
+ # overwritten.
211
+ del headers['Content-Type']
212
+ # Ensures that dict objects are serialized
213
+ post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a,b) for a, b in post_params]
214
+ r = self.pool_manager.request(
215
+ method,
216
+ url,
217
+ fields=post_params,
218
+ encode_multipart=True,
219
+ timeout=timeout,
220
+ headers=headers,
221
+ preload_content=False
222
+ )
223
+ # Pass a `string` parameter directly in the body to support
224
+ # other content types than JSON when `body` argument is
225
+ # provided in serialized form.
226
+ elif isinstance(body, str) or isinstance(body, bytes):
227
+ r = self.pool_manager.request(
228
+ method,
229
+ url,
230
+ body=body,
231
+ timeout=timeout,
232
+ headers=headers,
233
+ preload_content=False
234
+ )
235
+ elif headers['Content-Type'].startswith('text/') and isinstance(body, bool):
236
+ request_body = "true" if body else "false"
237
+ r = self.pool_manager.request(
238
+ method,
239
+ url,
240
+ body=request_body,
241
+ preload_content=False,
242
+ timeout=timeout,
243
+ headers=headers)
244
+ else:
245
+ # Cannot generate the request from given parameters
246
+ msg = """Cannot prepare a request message for provided
247
+ arguments. Please check that your arguments match
248
+ declared content type."""
249
+ raise ApiException(status=0, reason=msg)
250
+ # For `GET`, `HEAD`
251
+ else:
252
+ r = self.pool_manager.request(
253
+ method,
254
+ url,
255
+ fields={},
256
+ timeout=timeout,
257
+ headers=headers,
258
+ preload_content=False
259
+ )
260
+ except urllib3.exceptions.SSLError as e:
261
+ msg = "\n".join([type(e).__name__, str(e)])
262
+ raise ApiException(status=0, reason=msg)
263
+
264
+ return RESTResponse(r)
@@ -0,0 +1,100 @@
1
+ Metadata-Version: 2.4
2
+ Name: elastly
3
+ Version: 0.1.0
4
+ Summary: Elastly API
5
+ Home-page: https://elastly.io/docs/sdk
6
+ Author: Elastly
7
+ Author-email: Elastly <support@elastly.io>
8
+ License: MIT
9
+ Project-URL: Repository, https://github.com/elastly/elastly-python
10
+ Keywords: OpenAPI,OpenAPI-Generator,Elastly API
11
+ Requires-Python: >=3.9
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Requires-Dist: urllib3<3.0.0,>=2.1.0
15
+ Requires-Dist: python-dateutil>=2.8.2
16
+ Requires-Dist: pydantic>=2.11
17
+ Requires-Dist: typing-extensions>=4.7.1
18
+ Dynamic: author
19
+ Dynamic: home-page
20
+ Dynamic: license-file
21
+
22
+ # Elastly Python SDK
23
+
24
+ The official Python client for the [Elastly](https://elastly.io) REST API.
25
+
26
+ Elastly prices quote and order lines for B2B sellers. Send a line (product, customer, quantity) and get back a price with the reasoning behind it: which pricing rules fired, what each one added, and how confident the engine is. The engine learns from the outcomes you feed back, so prices improve over time.
27
+
28
+ This client covers the full v1 API:
29
+
30
+ - **Prices**: price up to 100 lines in one call.
31
+ - **Ingest**: push products, customers, quotes, and orders from your own system in staged batches.
32
+ - **Write-backs**: pull approved price changes into your system and confirm them once applied.
33
+
34
+ ## Install
35
+
36
+ ```bash
37
+ pip install elastly
38
+ ```
39
+
40
+ Requires Python 3.9 or newer.
41
+
42
+ ## Authenticate
43
+
44
+ Create an API key in the dashboard (Settings, then API keys). Keys are scoped: an `erp` key prices lines, a `connector` key ingests data and claims write-backs. Send the key as a bearer token.
45
+
46
+ ## Price a line
47
+
48
+ ```python
49
+ import uuid
50
+
51
+ import elastly
52
+
53
+ configuration = elastly.Configuration(access_token="elastly_live_...")
54
+
55
+ with elastly.ApiClient(configuration) as api_client:
56
+ prices = elastly.PricesApi(api_client)
57
+
58
+ response = prices.get_prices(
59
+ idempotency_key=str(uuid.uuid4()),
60
+ prices_request=elastly.PricesRequest(
61
+ lines=[
62
+ elastly.PricesRequestLinesInner(
63
+ product_sku="SKU-1042",
64
+ customer_external_id="CUST-88",
65
+ quantity=25,
66
+ )
67
+ ]
68
+ ),
69
+ )
70
+
71
+ for line in response.lines:
72
+ result = line.actual_instance
73
+ if result.ok:
74
+ print(result.price_cents, result.currency, result.reason_summary)
75
+ else:
76
+ print("failed:", result.code, result.message)
77
+ ```
78
+
79
+ Every response line is either a priced result (`ok` is true) or a per-line error. One bad line never fails the batch.
80
+
81
+ ## Retries and idempotency
82
+
83
+ `POST /v1/prices` requires an `Idempotency-Key` header. Use a fresh key for each logical request and reuse the same key on retries. A replay returns the stored response, so a retried call never prices twice.
84
+
85
+ ## Close the loop
86
+
87
+ Elastly learns from the difference between the price it recommended and the price your team actually charged. When you ingest quotes, echo the `pricingDecisionId` you received from the prices call on the matching quote line. Skip that and the engine has nothing to learn from.
88
+
89
+ ## Documentation
90
+
91
+ - [API reference](https://elastly.io/docs/api)
92
+ - Per-endpoint docs for this client live in [docs](./docs).
93
+
94
+ ## About this repository
95
+
96
+ This code is generated from the Elastly OpenAPI contract, so pull requests against generated files get overwritten by the next release. If something is broken or missing, open an issue or email support@elastly.io.
97
+
98
+ ## License
99
+
100
+ [MIT](./LICENSE)
@@ -0,0 +1,49 @@
1
+ elastly/__init__.py,sha256=iwN6tChEZh3EvVymuAUOZkobmLChZL_0LLDajUTYH3A,6491
2
+ elastly/api_client.py,sha256=4HpoGQMQZFMbXqMItaIP510A9SMWtzElGBSjZ4Tt8z8,27869
3
+ elastly/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
4
+ elastly/configuration.py,sha256=5AHGfk7TtX0pv30GVy85Z7BYdOAP9VvmRwPryZH8ms4,19922
5
+ elastly/exceptions.py,sha256=ae7HN-3jIsUIe2JINrb4-b_Z2aYFUaELGPgagF-FgUQ,6622
6
+ elastly/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ elastly/rest.py,sha256=XAIPf-jrTPnQiDJxQnjnL1FO-qNgLFVCHB3jsHVub08,9748
8
+ elastly/api/__init__.py,sha256=7e1hkgZHc41ZBFzd0dTaq9-KexV973r2JCBokn1b9Ns,191
9
+ elastly/api/ingest_api.py,sha256=MTn2ALQx15SKZyErbJRIUfoX-bPYeOVg1FGEA-fnyOA,43900
10
+ elastly/api/prices_api.py,sha256=oGSxbvqdlnCHRe8afmYtrNyaw5NIf3AK-c62Q5ISQow,14073
11
+ elastly/api/writebacks_api.py,sha256=8Uq9Y7Lyo4TJjWCyQptwovlA7pkMmLsRA9WVyjhJW2A,23976
12
+ elastly/models/__init__.py,sha256=JFB_yvOxlenHcgdqy1GL1zfrVslzfxokd4QHf21dvU0,3264
13
+ elastly/models/ack_writebacks_response.py,sha256=IxpKTNvS5Hb4nCyHogKCvSs3m3PBjgPleEyiAqFf9Nc,3006
14
+ elastly/models/api_error.py,sha256=haMxugYkxrbPGhnI4VP3POFsZFog4QMjhlq2Z88MsB8,2826
15
+ elastly/models/api_error_error.py,sha256=QB63nFOfq9fjqsX9gsxKxqkVRt6We8lq_79ElLYmMSQ,4003
16
+ elastly/models/batch_created_response.py,sha256=vgjL9FoF0Uyod51t_n6U4FaavW2dbA2r-ZsVoOvWwLM,2768
17
+ elastly/models/batch_status_response.py,sha256=5geBYBnSpdwadwQmBNNYbbN4Z3FxroM-Cv1MuDN1iqI,3772
18
+ elastly/models/claim_writebacks_request.py,sha256=Tdk3lFtddND1KenjGFnR3Vgs4Pe05kL-4OGwTIhbK6s,2754
19
+ elastly/models/claim_writebacks_response.py,sha256=Tf2XyfzhorZqdicg2l3hhcgo6mOH3AXZoAobbZEp-q4,3153
20
+ elastly/models/claim_writebacks_response_tasks_inner.py,sha256=o76gahsDOFxgH4Yx1IfpJKW5ImOEnOCmsxZCJV5is_c,4677
21
+ elastly/models/commit_batch_response.py,sha256=HF0aIkOO4nnL04uSlrwG6_Wxyb0bqr-JiGDrXzs2R8c,2631
22
+ elastly/models/prices_request.py,sha256=9OV6Nec7UmMNVBeUISjGG81zv2RNVdp3SVevvVNF4Og,3167
23
+ elastly/models/prices_request_lines_inner.py,sha256=g_GT2tTKDFrMLJ479qYZ8Awd0DhuXopDiYNGZ-8fWJQ,4550
24
+ elastly/models/prices_response.py,sha256=llRo2cKBM1AWHUXXxdQdfu6YJ7VdA6EtIm5ZpIeoghI,3080
25
+ elastly/models/prices_response_lines_inner.py,sha256=WKJSNRsiV5oKeLqA_cL4prWvY7EEJGASxVDhtpeR3mc,6016
26
+ elastly/models/prices_response_lines_inner_one_of.py,sha256=U5hf5rp6c8NynVf5o19ndSmQaVYGVxrxjk3UHdwFJW0,5343
27
+ elastly/models/prices_response_lines_inner_one_of1.py,sha256=ITExAs9aYf7aVxhIO0u61RgcXzqx2HJ2kwGvvvkULF4,4155
28
+ elastly/models/prices_response_lines_inner_one_of_explanation.py,sha256=X8sx19lRZGmv8twyL2IH_so_ZII1HapDHFBQoEe3fdg,4549
29
+ elastly/models/prices_response_lines_inner_one_of_explanation_drivers_inner.py,sha256=cu976drbQ5RKJkeymAfv0PUgBAvpkdVrx9ec0gmAxFg,3280
30
+ elastly/models/prices_response_lines_inner_one_of_reason_inner.py,sha256=HKPGOeLV5D3XfJsVLsljchPcC5T_oVVwg_eq1RUSYMc,3063
31
+ elastly/models/stage_records_request.py,sha256=iyVVtWMsT-2J3jXpcLjC90APSmfUXoJ9Yi-HynkAPao,7692
32
+ elastly/models/stage_records_request_one_of.py,sha256=xpXIi7U66xQdkjHC47-PummWp8eeej4g4U_Z7keuKOE,3633
33
+ elastly/models/stage_records_request_one_of1.py,sha256=FjEhgTjvTwXkV8HXXBt5KnubFmk5pK5WuogytOiFbvM,3643
34
+ elastly/models/stage_records_request_one_of1_records_inner.py,sha256=g5G99FnAEs_NWHQuovoXQJryivVMZagEy9SLqPGFk4Y,4524
35
+ elastly/models/stage_records_request_one_of2.py,sha256=D_wxAu1wREBPa7DHaHmPhAXgvM22pOBn8kVUnxHhiOg,3637
36
+ elastly/models/stage_records_request_one_of2_records_inner.py,sha256=SCVjYP6nWLIGMBCG6iGIvzit9uHsdlHHGZrA_yx1gEM,7395
37
+ elastly/models/stage_records_request_one_of2_records_inner_lines_inner.py,sha256=GGZnCU3RxTgb2RqmuXkZnG91iqCleURP-pNtg5z2GiI,4966
38
+ elastly/models/stage_records_request_one_of3.py,sha256=oiscd5TiSyWPe4kPfTpLOk_0F6cWqUudo61Uwkycb3U,3637
39
+ elastly/models/stage_records_request_one_of3_records_inner.py,sha256=VBnDzWC7zcPaon_e70bV40wxv4g3-EudMd_eJSJ8JL8,5795
40
+ elastly/models/stage_records_request_one_of3_records_inner_lines_inner.py,sha256=om1ZOXCoAoTYLHJ7gIVX0eb2OzbQ3A5OecGgi1BXFcc,3483
41
+ elastly/models/stage_records_request_one_of_records_inner.py,sha256=82LiX06D4tRIWEuUwo-LFeLw1gUW-KKnVXIYEhrX_DE,4820
42
+ elastly/models/stage_records_response.py,sha256=xey5i_ePHHJT-Vna_t_pGbLDFUdqOb-pM2NjWkDTEXc,2712
43
+ elastly/models/writeback_ack_request.py,sha256=yqDeEobC-x2wRxhDbQuC633iX_CAjmF_svBSIhKQ6B0,3248
44
+ elastly/models/writeback_ack_request_results_inner.py,sha256=XSgSqHuvhEagVTyDWIN2En5STjNweuIp9Wv1SnZIri4,2802
45
+ elastly-0.1.0.dist-info/licenses/LICENSE,sha256=rpV3vU7iX3rhXWyLOo7fPu0wu_KH7VESfNOEbTG0Fh4,1064
46
+ elastly-0.1.0.dist-info/METADATA,sha256=yzUreB4FTSw-HfRwKMjlX8mokNSABYSnQFlBoeK5Kf8,3453
47
+ elastly-0.1.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
48
+ elastly-0.1.0.dist-info/top_level.txt,sha256=gaFFVlxXhUUqQmbGGrBs-i7qZ5GeawVtcrwbnVSWFJ0,8
49
+ elastly-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Elastly
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ elastly