verda 0.1.0__py3-none-any.whl → 1.17.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.
@@ -0,0 +1,386 @@
1
+ from verda.constants import Locations, VolumeActions
2
+ from verda.helpers import stringify_class_object_properties
3
+
4
+ VOLUMES_ENDPOINT = '/volumes'
5
+
6
+
7
+ class Volume:
8
+ """A volume model class."""
9
+
10
+ def __init__(
11
+ self,
12
+ id: str,
13
+ status: str,
14
+ name: str,
15
+ size: int,
16
+ type: str,
17
+ is_os_volume: bool,
18
+ created_at: str,
19
+ target: str | None = None,
20
+ location: str = Locations.FIN_03,
21
+ instance_id: str | None = None,
22
+ ssh_key_ids: list[str] = [],
23
+ deleted_at: str | None = None,
24
+ ) -> None:
25
+ """Initialize the volume object.
26
+
27
+ :param id: volume id
28
+ :type id: str
29
+ :param status: volume status
30
+ :type status: str
31
+ :param name: volume name
32
+ :type name: str
33
+ :param size: volume size in GB
34
+ :type size: int
35
+ :param type: volume type
36
+ :type type: str
37
+ :param is_os_volume: indication whether this is an operating systen volume
38
+ :type is_os_volume: bool
39
+ :param created_at: the time the volume was created (UTC)
40
+ :type created_at: str
41
+ :param target: target device e.g. vda
42
+ :type target: str, optional
43
+ :param location: datacenter location, defaults to "FIN-03"
44
+ :type location: str, optional
45
+ :param instance_id: the instance id the volume is attached to, None if detached
46
+ :type instance_id: str
47
+ :param ssh_key_ids: list of ssh keys ids
48
+ :type ssh_key_ids: list[str]
49
+ :param deleted_at: the time the volume was deleted (UTC), defaults to None
50
+ :type deleted_at: str, optional
51
+ """
52
+ self._id = id
53
+ self._status = status
54
+ self._name = name
55
+ self._size = size
56
+ self._type = type
57
+ self._is_os_volume = is_os_volume
58
+ self._created_at = created_at
59
+ self._target = target
60
+ self._location = location
61
+ self._instance_id = instance_id
62
+ self._ssh_key_ids = ssh_key_ids
63
+ self._deleted_at = deleted_at
64
+
65
+ @property
66
+ def id(self) -> str:
67
+ """Get the volume id.
68
+
69
+ :return: volume id
70
+ :rtype: str
71
+ """
72
+ return self._id
73
+
74
+ @property
75
+ def status(self) -> str:
76
+ """Get the volume status.
77
+
78
+ :return: volume status
79
+ :rtype: str
80
+ """
81
+ return self._status
82
+
83
+ @property
84
+ def name(self) -> str:
85
+ """Get the volume name.
86
+
87
+ :return: volume name
88
+ :rtype: str
89
+ """
90
+ return self._name
91
+
92
+ @property
93
+ def size(self) -> int:
94
+ """Get the volume size.
95
+
96
+ :return: volume size
97
+ :rtype: int
98
+ """
99
+ return self._size
100
+
101
+ @property
102
+ def type(self) -> int:
103
+ """Get the volume type.
104
+
105
+ :return: volume type
106
+ :rtype: string
107
+ """
108
+ return self._type
109
+
110
+ @property
111
+ def is_os_volume(self) -> bool:
112
+ """Return true iff the volume contains an operating system.
113
+
114
+ :return: true iff the volume contains an OS
115
+ :rtype: bool
116
+ """
117
+ return self._is_os_volume
118
+
119
+ @property
120
+ def created_at(self) -> str:
121
+ """Get the time when the volume was created (UTC).
122
+
123
+ :return: time
124
+ :rtype: str
125
+ """
126
+ return self._created_at
127
+
128
+ @property
129
+ def target(self) -> str | None:
130
+ """Get the target device.
131
+
132
+ :return: target device
133
+ :rtype: str, optional
134
+ """
135
+ return self._target
136
+
137
+ @property
138
+ def location(self) -> str:
139
+ """Get the volume datacenter location.
140
+
141
+ :return: datacenter location
142
+ :rtype: str
143
+ """
144
+ return self._location
145
+
146
+ @property
147
+ def instance_id(self) -> str | None:
148
+ """Get the instance id the volume is attached to, if attached. Otherwise None.
149
+
150
+ :return: instance id if attached, None otherwise
151
+ :rtype: str, optional
152
+ """
153
+ return self._instance_id
154
+
155
+ @property
156
+ def ssh_key_ids(self) -> list[str]:
157
+ """Get the SSH key IDs of the instance.
158
+
159
+ :return: SSH key IDs
160
+ :rtype: list[str]
161
+ """
162
+ return self._ssh_key_ids
163
+
164
+ @property
165
+ def deleted_at(self) -> str | None:
166
+ """Get the time when the volume was deleted (UTC).
167
+
168
+ :return: time
169
+ :rtype: str
170
+ """
171
+ return self._deleted_at
172
+
173
+ @classmethod
174
+ def create_from_dict(cls: 'Volume', volume_dict: dict) -> 'Volume':
175
+ """Create a Volume object from a dictionary.
176
+
177
+ :param volume_dict: dictionary representing the volume
178
+ :type volume_dict: dict
179
+ :return: Volume
180
+ :rtype: Volume
181
+ """
182
+ return cls(
183
+ id=volume_dict['id'],
184
+ status=volume_dict['status'],
185
+ name=volume_dict['name'],
186
+ size=volume_dict['size'],
187
+ type=volume_dict['type'],
188
+ is_os_volume=volume_dict['is_os_volume'],
189
+ created_at=volume_dict['created_at'],
190
+ target=volume_dict['target'],
191
+ location=volume_dict['location'],
192
+ instance_id=volume_dict['instance_id'],
193
+ ssh_key_ids=volume_dict['ssh_key_ids'],
194
+ deleted_at=volume_dict.get('deleted_at'),
195
+ )
196
+
197
+ def __str__(self) -> str:
198
+ """Returns a string of the json representation of the volume.
199
+
200
+ :return: json representation of the volume
201
+ :rtype: str
202
+ """
203
+ return stringify_class_object_properties(self)
204
+
205
+
206
+ class VolumesService:
207
+ """A service for interacting with the volumes endpoint."""
208
+
209
+ def __init__(self, http_client) -> None:
210
+ self._http_client = http_client
211
+
212
+ def get(self, status: str | None = None) -> list[Volume]:
213
+ """Get all of the client's non-deleted volumes, or volumes with specific status.
214
+
215
+ :param status: optional, status of the volumes, defaults to None
216
+ :type status: str, optional
217
+ :return: list of volume details objects
218
+ :rtype: list[Volume]
219
+ """
220
+ volumes_dict = self._http_client.get(VOLUMES_ENDPOINT, params={'status': status}).json()
221
+ return list(map(Volume.create_from_dict, volumes_dict))
222
+
223
+ def get_by_id(self, id: str) -> Volume:
224
+ """Get a specific volume by its.
225
+
226
+ :param id: volume id
227
+ :type id: str
228
+ :return: Volume details object
229
+ :rtype: Volume
230
+ """
231
+ volume_dict = self._http_client.get(VOLUMES_ENDPOINT + f'/{id}').json()
232
+
233
+ return Volume.create_from_dict(volume_dict)
234
+
235
+ def get_in_trash(self) -> list[Volume]:
236
+ """Get all volumes that are in trash.
237
+
238
+ :return: list of volume details objects
239
+ :rtype: list[Volume]
240
+ """
241
+ volumes_dicts = self._http_client.get(VOLUMES_ENDPOINT + '/trash').json()
242
+
243
+ return list(map(Volume.create_from_dict, volumes_dicts))
244
+
245
+ def create(
246
+ self,
247
+ type: str,
248
+ name: str,
249
+ size: int,
250
+ instance_id: str | None = None,
251
+ location: str = Locations.FIN_03,
252
+ ) -> Volume:
253
+ """Create new volume.
254
+
255
+ :param type: volume type
256
+ :type type: str
257
+ :param name: volume name
258
+ :type name: str
259
+ :param size: volume size, in GB
260
+ :type size: int
261
+ :param instance_id: Instance id to be attached to, defaults to None
262
+ :type instance_id: str, optional
263
+ :param location: datacenter location, defaults to "FIN-03"
264
+ :type location: str, optional
265
+ :return: the new volume object
266
+ :rtype: Volume
267
+ """
268
+ payload = {
269
+ 'type': type,
270
+ 'name': name,
271
+ 'size': size,
272
+ 'instance_id': instance_id,
273
+ 'location_code': location,
274
+ }
275
+ id = self._http_client.post(VOLUMES_ENDPOINT, json=payload).text
276
+ volume = self.get_by_id(id)
277
+ return volume
278
+
279
+ def attach(self, id_list: list[str] | str, instance_id: str) -> None:
280
+ """Attach multiple volumes or single volume to an instance.
281
+
282
+ Note: the instance needs to be shut-down (offline)
283
+
284
+ :param id_list: list of volume ids, or a volume id
285
+ :type id_list: Union[list[str], str]
286
+ :param instance_id: instance id the volume(s) will be attached to
287
+ :type instance_id: str
288
+ """
289
+ payload = {
290
+ 'id': id_list,
291
+ 'action': VolumeActions.ATTACH,
292
+ 'instance_id': instance_id,
293
+ }
294
+
295
+ self._http_client.put(VOLUMES_ENDPOINT, json=payload)
296
+ return
297
+
298
+ def detach(self, id_list: list[str] | str) -> None:
299
+ """Detach multiple volumes or single volume from an instance(s).
300
+
301
+ Note: the instances need to be shut-down (offline)
302
+
303
+ :param id_list: list of volume ids, or a volume id
304
+ :type id_list: Union[list[str], str]
305
+ """
306
+ payload = {
307
+ 'id': id_list,
308
+ 'action': VolumeActions.DETACH,
309
+ }
310
+
311
+ self._http_client.put(VOLUMES_ENDPOINT, json=payload)
312
+ return
313
+
314
+ def clone(self, id: str, name: str | None = None, type: str | None = None) -> Volume:
315
+ """Clone a volume or multiple volumes.
316
+
317
+ :param id: volume id or list of volume ids
318
+ :type id: str or list[str]
319
+ :param name: new volume name
320
+ :type name: str
321
+ :param type: volume type
322
+ :type type: str, optional
323
+ :return: the new volume object, or a list of volume objects if cloned mutliple volumes
324
+ :rtype: Volume or list[Volume]
325
+ """
326
+ payload = {'id': id, 'action': VolumeActions.CLONE, 'name': name, 'type': type}
327
+
328
+ # clone volume(s)
329
+ volume_ids_array = self._http_client.put(VOLUMES_ENDPOINT, json=payload).json()
330
+
331
+ # map the IDs into Volume objects
332
+ volumes_array = [self.get_by_id(volume_id) for volume_id in volume_ids_array]
333
+
334
+ # if the array has only one element, return that element
335
+ if len(volumes_array) == 1:
336
+ return volumes_array[0]
337
+
338
+ # otherwise return the volumes array
339
+ return volumes_array
340
+
341
+ def rename(self, id_list: list[str] | str, name: str) -> None:
342
+ """Rename multiple volumes or single volume.
343
+
344
+ :param id_list: list of volume ids, or a volume id
345
+ :type id_list: Union[list[str], str]
346
+ :param name: new name
347
+ :type name: str
348
+ """
349
+ payload = {'id': id_list, 'action': VolumeActions.RENAME, 'name': name}
350
+
351
+ self._http_client.put(VOLUMES_ENDPOINT, json=payload)
352
+ return
353
+
354
+ def increase_size(self, id_list: list[str] | str, size: int) -> None:
355
+ """Increase size of multiple volumes or single volume.
356
+
357
+ :param id_list: list of volume ids, or a volume id
358
+ :type id_list: Union[list[str], str]
359
+ :param size: new size in GB
360
+ :type size: int
361
+ """
362
+ payload = {
363
+ 'id': id_list,
364
+ 'action': VolumeActions.INCREASE_SIZE,
365
+ 'size': size,
366
+ }
367
+
368
+ self._http_client.put(VOLUMES_ENDPOINT, json=payload)
369
+ return
370
+
371
+ def delete(self, id_list: list[str] | str, is_permanent: bool = False) -> None:
372
+ """Delete multiple volumes or single volume.
373
+
374
+ Note: if attached to any instances, they need to be shut-down (offline)
375
+
376
+ :param id_list: list of volume ids, or a volume id
377
+ :type id_list: Union[list[str], str]
378
+ """
379
+ payload = {
380
+ 'id': id_list,
381
+ 'action': VolumeActions.DELETE,
382
+ 'is_permanent': is_permanent,
383
+ }
384
+
385
+ self._http_client.put(VOLUMES_ENDPOINT, json=payload)
386
+ return
@@ -0,0 +1,182 @@
1
+ Metadata-Version: 2.3
2
+ Name: verda
3
+ Version: 1.17.0
4
+ Summary: Official Python SDK for Verda (formerly DataCrunch) Public API
5
+ Author: Verda Cloud Oy
6
+ Author-email: Verda Cloud Oy <info@verda.com>
7
+ Classifier: Development Status :: 5 - Production/Stable
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Natural Language :: English
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
18
+ Requires-Dist: requests>=2.25.1,<3
19
+ Requires-Dist: dataclasses-json>=0.6.7
20
+ Requires-Python: >=3.10
21
+ Project-URL: Changelog, https://datacrunch-python.readthedocs.io/en/latest/changelog.html
22
+ Project-URL: Documentation, https://datacrunch-python.readthedocs.io/
23
+ Project-URL: Homepage, https://github.com/verda-cloud
24
+ Project-URL: Repository, https://github.com/verda-cloud/sdk-python
25
+ Description-Content-Type: text/markdown
26
+
27
+ # Verda Python SDK
28
+
29
+ [<img src='https://github.com/verda-cloud/sdk-python/workflows/Unit%20Tests/badge.svg'>](https://github.com/verda-cloud/sdk-python/actions?query=workflow%3A%22Unit+Tests%22+branch%3Amaster)
30
+ [<img src='https://github.com/verda-cloud/sdk-python/workflows/Code%20Style/badge.svg'>](https://github.com/verda-cloud/sdk-python/actions?query=workflow%3A%22Code+Style%22+branch%3Amaster)
31
+ [<img src="https://codecov.io/gh/verda-cloud/sdk-python/branch/master/graph/badge.svg?token=5X5KTYSSPK">](https://codecov.io/gh/verda-cloud/sdk-python)
32
+ [<img src='https://readthedocs.org/projects/datacrunch-python/badge/?version=latest'>](https://datacrunch-python.readthedocs.io/en/latest/)
33
+ [<img src='https://img.shields.io/github/license/verda-cloud/sdk-python'>](https://github.com/verda-cloud/sdk-python/blob/master/LICENSE)
34
+ [<img src='https://img.shields.io/pypi/v/verda?logo=python'>](https://pypi.org/project/verda/)
35
+ [<img src='https://img.shields.io/pypi/pyversions/verda'>](https://pypi.org/project/verda/)
36
+
37
+ The official [Verda](https://verda.com) (formerly DataCrunch) Python SDK.
38
+
39
+ The SDK's documentation is available on [ReadTheDocs](https://datacrunch-python.readthedocs.io/en/latest/)
40
+
41
+ Verda Public API documentation [is available here](https://api.verda.com/v1/docs).
42
+
43
+ ## Getting Started - Using the SDK:
44
+
45
+ - Install:
46
+
47
+ ```bash
48
+ # via pip
49
+ pip3 install verda
50
+
51
+ # via uv
52
+ uv add verda
53
+ ```
54
+
55
+ - Generate your client credentials - [instructions in the public API docs](https://api.verda.com/v1/docs#description/quick-start-guide).
56
+
57
+
58
+ - Add your client id and client secret to an environment variable (don't want it to be hardcoded):
59
+
60
+ Linux (bash):
61
+
62
+ ```bash
63
+ export VERDA_CLIENT_ID=YOUR_ID_HERE
64
+ export VERDA_CLIENT_SECRET=YOUR_SECRET_HERE
65
+ ```
66
+
67
+ - To enable sending inference requests from SDK you must generate an inference key - [Instructions on inference authorization](https://docs.verda.com/inference/authorization)
68
+
69
+
70
+ - Add your inference key to an environment variable
71
+
72
+ Linux (bash):
73
+
74
+ ```bash
75
+ export VERDA_INFERENCE_KEY=YOUR_API_KEY_HERE
76
+ ```
77
+
78
+ Other platforms:
79
+ https://en.wikipedia.org/wiki/Environment_variable
80
+
81
+
82
+
83
+ - Example for creating a new instance:
84
+
85
+ ```python
86
+ import os
87
+ from verda import VerdaClient
88
+
89
+ # Get credentials from environment variables
90
+ CLIENT_ID = os.environ.get('VERDA_CLIENT_ID')
91
+ CLIENT_SECRET = os.environ['VERDA_CLIENT_SECRET']
92
+
93
+ # Create client
94
+ verda = VerdaClient(CLIENT_ID, CLIENT_SECRET)
95
+
96
+ # Get all SSH keys
97
+ ssh_keys = [key.id for key in verda.ssh_keys.get()]
98
+
99
+ # Create a new instance
100
+ instance = verda.instances.create(instance_type='1V100.6V',
101
+ image='ubuntu-24.04-cuda-12.8-open-docker',
102
+ ssh_key_ids=ssh_keys,
103
+ hostname='example',
104
+ description='example instance')
105
+
106
+ # Delete instance
107
+ verda.instances.action(instance.id, verda.constants.instance_actions.DELETE)
108
+ ```
109
+
110
+ More examples can be found in the `/examples` folder or in the [documentation](https://datacrunch-python.readthedocs.io/en/latest/).
111
+
112
+ ## Development
113
+
114
+ ### Set up the local development environment
115
+
116
+ Prerequisite: install [`uv`](https://docs.astral.sh/uv/).
117
+
118
+ Clone the repository, create local environment and install dependencies:
119
+
120
+ ```bash
121
+ git clone git@github.com:verda-cloud/sdk-python.git
122
+ cd sdk-python
123
+ uv sync
124
+ ```
125
+
126
+ ### Run Tests
127
+
128
+ - Execute all tests
129
+
130
+ ```bash
131
+ uv run pytest
132
+ ```
133
+
134
+ - Execute a single test file
135
+
136
+ ```bash
137
+ uv run pytest tests/unit_tests/test_file.py
138
+ ```
139
+
140
+ ### Local Manual Testing
141
+
142
+ Create a file in the root directory of the project:
143
+
144
+ ```python
145
+ # example.py
146
+ from verda.verda import VerdaClient
147
+
148
+ CLIENT_SECRET = 'secret'
149
+ CLIENT_ID = 'your-id'
150
+
151
+ # Create client
152
+ verda = VerdaClient(CLIENT_ID, CLIENT_SECRET, base_url='http://localhost:3001/v1')
153
+ ```
154
+
155
+ Run it:
156
+
157
+ ```bash
158
+ uv run python example.py
159
+ ```
160
+
161
+ ### Generating the documentation
162
+
163
+ If added a new service, create a documentation template under api/services for that service.
164
+
165
+ ```bash
166
+ cd docs
167
+ make html
168
+ ```
169
+
170
+ ### Code style
171
+
172
+ ```bash
173
+ # Lint
174
+ uv run ruff check
175
+
176
+ # Format code
177
+ uv run ruff format
178
+ ```
179
+
180
+ ## Contact
181
+
182
+ You can [contact us here](https://verda.com/contact), or open an issue in the repo.
@@ -0,0 +1,36 @@
1
+ verda/InferenceClient/__init__.py,sha256=oe7RQfoKbKJnIFWOt6TNtdzjXk5Gcl4-smO5DjLE6M0,117
2
+ verda/InferenceClient/inference_client.py,sha256=Lqq7NxpisZdRauThoJCNOnRLdh2UdQGUpnFSAy5eqL4,17209
3
+ verda/__init__.py,sha256=b-GHju7CuRktp2jbyQ0b-HOh1LrgXE5fa_fAvRJtl4k,623
4
+ verda/_version.py,sha256=T11BBcYkWMV48TEHtEI08YyNekJT7iKT6JgY-3Xg6Ws,160
5
+ verda/authentication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ verda/authentication/authentication.py,sha256=rCp46zoQNMoNyJZRIcfXLphZNk18LzMh8a4PgO9-A6Q,3506
7
+ verda/balance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ verda/balance/balance.py,sha256=tMuulgL7U4pSPG2hIts1UkB9KShdqLcrjnR3uhYj7KM,1221
9
+ verda/constants.py,sha256=cL0rj35X1VS-IHisqxwDgn8PXUjGjfuqUqotS4GB98E,2687
10
+ verda/containers/__init__.py,sha256=I6_H8w90MzlHi4MQ-Oo3R7kUopgU4yLRkaSjOAB6jWI,744
11
+ verda/containers/containers.py,sha256=0wgviFHMdO0O0fzZNz5bIgjWhbuL3R17lQmDToBnmSY,35666
12
+ verda/datacrunch.py,sha256=m1AiQbAm3rCBfDnJesuRzD_NA1IiqGWW73V4dd7493I,1376
13
+ verda/exceptions.py,sha256=B0GD8nHDDvBT8meFnrott8kEZtn8PF6eID6Xcdb8RQE,786
14
+ verda/helpers.py,sha256=qvpWNoh1jqfBGxsYPFTNs_fDeF_H7WsalKeCXTH-bDw,657
15
+ verda/http_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ verda/http_client/http_client.py,sha256=ywyJK-PBfHRbatKTl2uqp8UHcpLBrqwyMRL-0tKXv7s,8342
17
+ verda/images/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ verda/images/images.py,sha256=mmuvubOTdnkvVeWX3wkOjm2sQXTpQ0Z-kBqQUL0t5xo,2156
19
+ verda/instance_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ verda/instance_types/instance_types.py,sha256=pc5uo4HKo9Vrqr8uegylhVslZZDClrE9m9UXa67IPxo,2046
21
+ verda/instances/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ verda/instances/instances.py,sha256=o_dq9iqp9_OMSkzwFbO0ucaph9_brm7lT_mb9GESvNM,9690
23
+ verda/locations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ verda/locations/locations.py,sha256=SxmKVgxU8TAas_ca5OBBpi-SkbN87CeWOUEihL8g4Ws,372
25
+ verda/ssh_keys/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ verda/ssh_keys/ssh_keys.py,sha256=5K9UYiNUtKNaUuRb_wGNVMgOJj40YLXlkZaOGoROxio,2868
27
+ verda/startup_scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ verda/startup_scripts/startup_scripts.py,sha256=Q5i5NESB_DOJ9PjCNQFYQubn1CsankMudD217TbfMB8,3129
29
+ verda/verda.py,sha256=Ki7jl4459g2Tz_3fG3vWIs1OsfECy--o3DiTD50Mg_g,3391
30
+ verda/volume_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ verda/volume_types/volume_types.py,sha256=unvFrhWONbOPcsFzf2Oo29IZ8cC5czNRxuAO0dNiVko,1833
32
+ verda/volumes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ verda/volumes/volumes.py,sha256=V_W51f25HkLrr_PTJwfH4Z532xEZlHaG3MxOpNAoy7Q,11536
34
+ verda-1.17.0.dist-info/WHEEL,sha256=YUH1mBqsx8Dh2cQG2rlcuRYUhJddG9iClegy4IgnHik,79
35
+ verda-1.17.0.dist-info/METADATA,sha256=aujtucH0vBcBJiKtRfhXWjdB39eI5f9Ol1s02EnJ2xo,5427
36
+ verda-1.17.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.8.18
2
+ Generator: uv 0.9.11
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,10 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: verda
3
- Version: 0.1.0
4
- Summary: Reserved package name for an upcoming tool
5
- Author: Alexey Shamrin
6
- Author-email: Alexey Shamrin <alexey@datacrunch.io>
7
- Requires-Python: >=3.13
8
- Description-Content-Type: text/markdown
9
-
10
- Reserved package name for an upcoming tool.
@@ -1,5 +0,0 @@
1
- verda/__init__.py,sha256=b0D0eMbK86mxpXwD5aJJ270aHflBixw-Q6guXO73ygs,51
2
- verda/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- verda-0.1.0.dist-info/WHEEL,sha256=5h_Q-_6zWQhhADpsAD_Xpw7gFbCRK5WjOOEq0nB806Q,79
4
- verda-0.1.0.dist-info/METADATA,sha256=9E74tHNEXrDcZ6bxQ7rgysQQDJO4hc9y4LjZBewFkPA,285
5
- verda-0.1.0.dist-info/RECORD,,
File without changes