dtlpy 1.116.6__py3-none-any.whl → 1.118.12__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.
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import copy
2
3
  from .. import exceptions, entities, miscellaneous, _api_reference, repositories
3
4
  from ..services.api_client import ApiClient
4
5
 
@@ -9,18 +10,25 @@ class FeatureSets:
9
10
  """
10
11
  Feature Sets repository
11
12
  """
13
+
12
14
  URL = '/features/sets'
13
15
 
14
- def __init__(self,
15
- client_api: ApiClient,
16
- project_id: str = None,
17
- project: entities.Project = None,
18
- model_id: str = None,
19
- model: entities.Model = None):
16
+ def __init__(
17
+ self,
18
+ client_api: ApiClient,
19
+ project_id: str = None,
20
+ project: entities.Project = None,
21
+ model_id: str = None,
22
+ model: entities.Model = None,
23
+ dataset_id: str = None,
24
+ dataset: entities.Dataset = None,
25
+ ):
20
26
  self._project = project
21
27
  self._project_id = project_id
22
28
  self._model = model
23
29
  self._model_id = model_id
30
+ self._dataset = dataset
31
+ self._dataset_id = dataset_id
24
32
  self._client_api = client_api
25
33
 
26
34
  ############
@@ -28,6 +36,9 @@ class FeatureSets:
28
36
  ############
29
37
  @property
30
38
  def project(self) -> entities.Project:
39
+ if self._project is None and self._project_id is None and self.dataset is not None:
40
+ self._project = self.dataset.project
41
+ self._project_id = self._project.id
31
42
  if self._project is None and self._project_id is not None:
32
43
  # get from id
33
44
  self._project = repositories.Projects(client_api=self._client_api).get(project_id=self._project_id)
@@ -38,9 +49,8 @@ class FeatureSets:
38
49
  self._project = entities.Project.from_json(_json=project, client_api=self._client_api)
39
50
  if self._project is None:
40
51
  raise exceptions.PlatformException(
41
- error='2001',
42
- message='Cannot perform action WITHOUT Project entity in FeatureSets repository.'
43
- ' Please checkout or set a project')
52
+ error='2001', message='Cannot perform action WITHOUT Project entity in FeatureSets repository.' ' Please checkout or set a project'
53
+ )
44
54
  assert isinstance(self._project, entities.Project)
45
55
  return self._project
46
56
 
@@ -50,21 +60,27 @@ class FeatureSets:
50
60
  # get from id
51
61
  self._model = repositories.Models(client_api=self._client_api).get(model_id=self._model_id)
52
62
  if self._model is None:
53
- raise exceptions.PlatformException(
54
- error='2001',
55
- message='Cannot perform action WITHOUT Model entity in FeatureSets repository.')
63
+ raise exceptions.PlatformException(error='2001', message='Cannot perform action WITHOUT Model entity in FeatureSets repository.')
56
64
  assert isinstance(self._model, entities.Model)
57
65
  return self._model
58
66
 
67
+ @property
68
+ def dataset(self) -> entities.Dataset:
69
+ if self._dataset is None and self._dataset_id is not None:
70
+ # get from id
71
+ self._dataset = repositories.Datasets(client_api=self._client_api).get(dataset_id=self._dataset_id)
72
+ if self._dataset is None:
73
+ return None
74
+ assert isinstance(self._dataset, entities.Dataset)
75
+ return self._dataset
76
+
59
77
  ###########
60
78
  # methods #
61
79
  ###########
62
80
 
63
81
  def _list(self, filters: entities.Filters):
64
82
  # request
65
- success, response = self._client_api.gen_request(req_type='POST',
66
- path='/features/sets/query',
67
- json_req=filters.prepare())
83
+ success, response = self._client_api.gen_request(req_type='POST', path='/features/sets/query', json_req=filters.prepare())
68
84
  if not success:
69
85
  raise exceptions.PlatformException(response)
70
86
  return response.json()
@@ -78,29 +94,101 @@ class FeatureSets:
78
94
  :return: Paged entity
79
95
  :rtype: dtlpy.entities.paged_entities.PagedEntities
80
96
  """
81
- # default filters
97
+ # Step 1: Initialize filter (create empty if None)
82
98
  if filters is None:
83
99
  filters = entities.Filters(resource=entities.FiltersResource.FEATURE_SET)
84
- if self._project is not None:
85
- filters.context = {'projects': [self._project.id]}
86
-
87
- # assert type filters
88
- if not isinstance(filters, entities.Filters):
89
- raise exceptions.PlatformException(error='400',
90
- message='Unknown filters type: {!r}'.format(type(filters)))
91
100
 
92
101
  if filters.resource != entities.FiltersResource.FEATURE_SET:
93
102
  raise exceptions.PlatformException(
94
103
  error='400',
95
- message='Filters resource must to be FiltersResource.FEATURE_SET. Got: {!r}'.format(filters.resource))
104
+ message='Filters resource must to be FiltersResource.FEATURE_SET. Got: {!r}'.format(filters.resource),
105
+ )
106
+
107
+ # Step 2: Extract IDs inline (no helper functions, no property access)
108
+ # Extract project_id inline
109
+ if self._project_id is not None:
110
+ project_id = self._project_id
111
+ elif self._project is not None:
112
+ project_id = self._project.id
113
+ else:
114
+ raise exceptions.PlatformException(
115
+ error='2001', message='Cannot perform action WITHOUT Project entity in FeatureSets repository.' ' Please checkout or set a project'
116
+ )
117
+
118
+ # Extract dataset_id inline (only when needed for filtering)
119
+ if self._dataset_id is not None:
120
+ dataset_id = self._dataset_id
121
+ elif self._dataset is not None:
122
+ dataset_id = self._dataset.id
123
+ else:
124
+ dataset_id = None # No dataset filtering needed
125
+
126
+ # Set context with project_id
127
+ filters.context = {'projects': [project_id]}
128
+
129
+ # Preserve original page and page size values before any operations that might modify them
130
+ received_filter = copy.deepcopy(filters)
131
+
132
+ # Step 3: Execute received filter - Run filter with appropriate pagination
133
+ # When dataset_id is None: use original pagination (respect user's page request)
134
+ # When dataset_id is not None: start from page 0 to collect all IDs (pagination applied later)
135
+ if dataset_id is not None:
136
+ page_offset = 0
137
+ received_filter_paged = entities.PagedEntities(
138
+ items_repository=self,
139
+ filters=filters,
140
+ page_offset=page_offset,
141
+ page_size=filters.page_size,
142
+ client_api=self._client_api,
143
+ )
144
+ # Step 5: Dataset_id exists and items exist - extract IDs from all pages
145
+ # Extract feature set IDs from all pages (received_filter_paged.all() will fetch all pages starting from page 0)
146
+ filter_fs_ids = [feature_set.id for feature_set in received_filter_paged.all()]
147
+
148
+ # Step 6: Run aggregation API (when dataset_id exists)
149
+ payload = {
150
+ "projectId": project_id,
151
+ "datasetIds": [dataset_id],
152
+ }
153
+ success, response = self._client_api.gen_request(req_type="POST", path="/features/vectors/project-count-aggregation", json_req=payload)
154
+ if not success:
155
+ raise exceptions.PlatformException(response)
156
+ result = response.json()
157
+ # Extract dataset feature set IDs from response, filtering out entries where count == 0
158
+ dataset_fs_ids = [item['featureSetId'] for item in result if item.get('count', 0) > 0]
159
+
160
+ # Step 7: Intersect IDs
161
+ final_fs_ids = list(set(filter_fs_ids).intersection(set(dataset_fs_ids)))
162
+
163
+ # Step 8: Final return path - Create filter with intersected IDs (no join needed)
164
+ intersected_ids_filter = entities.Filters(resource=entities.FiltersResource.FEATURE_SET)
165
+ intersected_ids_filter.add(field='id', operator=entities.FiltersOperations.IN, values=final_fs_ids)
166
+ intersected_ids_filter.page = received_filter.page # Preserve original pagination
167
+ intersected_ids_filter.page_size = received_filter.page_size
168
+ intersected_ids_filter.context = {'projects': [project_id]}
96
169
 
97
- paged = entities.PagedEntities(items_repository=self,
98
- filters=filters,
99
- page_offset=filters.page,
100
- page_size=filters.page_size,
101
- client_api=self._client_api)
102
- paged.get_page()
103
- return paged
170
+ filter_paged = entities.PagedEntities(
171
+ items_repository=self,
172
+ filters=intersected_ids_filter,
173
+ page_offset=intersected_ids_filter.page,
174
+ page_size=intersected_ids_filter.page_size,
175
+ client_api=self._client_api,
176
+ )
177
+ filter_paged.get_page()
178
+
179
+ else:
180
+ page_offset = filters.page if dataset_id is None else 0
181
+
182
+ filter_paged = entities.PagedEntities(
183
+ items_repository=self,
184
+ filters=filters,
185
+ page_offset=page_offset,
186
+ page_size=filters.page_size,
187
+ client_api=self._client_api,
188
+ )
189
+ filter_paged.get_page()
190
+
191
+ return filter_paged
104
192
 
105
193
  @_api_reference.add(path='/features/sets/{id}', method='get')
106
194
  def get(self, feature_set_name: str = None, feature_set_id: str = None) -> entities.Feature:
@@ -112,45 +200,31 @@ class FeatureSets:
112
200
  :return: Feature object
113
201
  """
114
202
  if feature_set_id is not None:
115
- success, response = self._client_api.gen_request(req_type="GET",
116
- path="{}/{}".format(self.URL, feature_set_id))
203
+ success, response = self._client_api.gen_request(req_type="GET", path="{}/{}".format(self.URL, feature_set_id))
117
204
  if not success:
118
205
  raise exceptions.PlatformException(response)
119
- feature_set = entities.FeatureSet.from_json(client_api=self._client_api,
120
- _json=response.json())
206
+ feature_set = entities.FeatureSet.from_json(client_api=self._client_api, _json=response.json())
121
207
  elif feature_set_name is not None:
122
208
  if not isinstance(feature_set_name, str):
123
- raise exceptions.PlatformException(
124
- error='400',
125
- message='feature_set_name must be string')
209
+ raise exceptions.PlatformException(error='400', message='feature_set_name must be string')
126
210
  filters = entities.Filters(resource=entities.FiltersResource.FEATURE_SET)
127
211
  filters.add(field='name', values=feature_set_name)
128
212
  feature_sets = self.list(filters=filters)
129
213
  if feature_sets.items_count == 0:
130
- raise exceptions.PlatformException(
131
- error='404',
132
- message='Feature set not found. name: {!r}'.format(feature_set_name))
214
+ raise exceptions.PlatformException(error='404', message='Feature set not found. name: {!r}'.format(feature_set_name))
133
215
  elif feature_sets.items_count > 1:
134
216
  # more than one matching project
135
- raise exceptions.PlatformException(
136
- error='404',
137
- message='More than one feature_set with same name. Please "get" by id')
217
+ raise exceptions.PlatformException(error='404', message='More than one feature_set with same name. Please "get" by id')
138
218
  else:
139
219
  feature_set = feature_sets.items[0]
140
220
  else:
141
- raise exceptions.PlatformException(
142
- error='400',
143
- message='Must provide an identifier in inputs, feature_set_name or feature_set_id')
221
+ raise exceptions.PlatformException(error='400', message='Must provide an identifier in inputs, feature_set_name or feature_set_id')
144
222
  return feature_set
145
223
 
146
224
  @_api_reference.add(path='/features/sets', method='post')
147
- def create(self, name: str,
148
- size: int,
149
- set_type: str,
150
- entity_type: entities.FeatureEntityType,
151
- project_id: str = None,
152
- model_id: set = None,
153
- org_id: str = None):
225
+ def create(
226
+ self, name: str, size: int, set_type: str, entity_type: entities.FeatureEntityType, project_id: str = None, model_id: set = None, org_id: str = None
227
+ ):
154
228
  """
155
229
  Create a new Feature Set
156
230
 
@@ -169,25 +243,17 @@ class FeatureSets:
169
243
  else:
170
244
  project_id = self._project.id
171
245
 
172
- payload = {'name': name,
173
- 'size': size,
174
- 'type': set_type,
175
- 'project': project_id,
176
- 'modelId': model_id,
177
- 'entityType': entity_type}
246
+ payload = {'name': name, 'size': size, 'type': set_type, 'project': project_id, 'modelId': model_id, 'entityType': entity_type}
178
247
  if org_id is not None:
179
248
  payload['org'] = org_id
180
- success, response = self._client_api.gen_request(req_type="post",
181
- json_req=payload,
182
- path=self.URL)
249
+ success, response = self._client_api.gen_request(req_type="post", json_req=payload, path=self.URL)
183
250
 
184
251
  # exception handling
185
252
  if not success:
186
253
  raise exceptions.PlatformException(response)
187
254
 
188
255
  # return entity
189
- return entities.FeatureSet.from_json(client_api=self._client_api,
190
- _json=response.json()[0])
256
+ return entities.FeatureSet.from_json(client_api=self._client_api, _json=response.json()[0])
191
257
 
192
258
  @_api_reference.add(path='/features/sets/{id}', method='delete')
193
259
  def delete(self, feature_set_id: str):
@@ -199,8 +265,7 @@ class FeatureSets:
199
265
  :rtype: bool
200
266
  """
201
267
 
202
- success, response = self._client_api.gen_request(req_type="delete",
203
- path="{}/{}".format(self.URL, feature_set_id))
268
+ success, response = self._client_api.gen_request(req_type="delete", path=f"{self.URL}/{feature_set_id}")
204
269
 
205
270
  # check response
206
271
  if success:
@@ -209,14 +274,38 @@ class FeatureSets:
209
274
  else:
210
275
  raise exceptions.PlatformException(response)
211
276
 
277
+ @_api_reference.add(path='/features/set/{id}', method='patch')
278
+ def update(self, feature_set: entities.FeatureSet) -> entities.FeatureSet:
279
+ """
280
+ Update a Feature Set
281
+
282
+ **Prerequisites**: You must be in the role of an *owner* or *developer*.
283
+
284
+ :param dtlpy.entities.FeatureSet feature_set: FeatureSet object
285
+ :return: FeatureSet
286
+ :rtype: dtlpy.entities.FeatureSet
287
+
288
+ **Example**:
289
+
290
+ .. code-block:: python
291
+
292
+ dl.feature_sets.update(feature_set='feature_set')
293
+ """
294
+ success, response = self._client_api.gen_request(req_type="patch", path=f"{self.URL}/{feature_set.id}", json_req=feature_set.to_json())
295
+ if not success:
296
+ raise exceptions.PlatformException(response)
297
+
298
+ logger.debug("feature_set updated successfully")
299
+ # update dataset labels
300
+ feature_set = entities.FeatureSet.from_json(_json=response.json(), client_api=self._client_api, is_fetched=True)
301
+ return feature_set
302
+
212
303
  def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Item]:
213
304
  pool = self._client_api.thread_pools(pool_name='entity.create')
214
305
  jobs = [None for _ in range(len(response_items))]
215
306
  # return triggers list
216
307
  for i_item, item in enumerate(response_items):
217
- jobs[i_item] = pool.submit(entities.FeatureSet._protected_from_json,
218
- **{'client_api': self._client_api,
219
- '_json': item})
308
+ jobs[i_item] = pool.submit(entities.FeatureSet._protected_from_json, **{'client_api': self._client_api, '_json': item})
220
309
  # get all results
221
310
  results = [j.result() for j in jobs]
222
311
  # log errors
@@ -42,10 +42,6 @@ class Recipes:
42
42
  @property
43
43
  def project(self) -> entities.Project:
44
44
  if self._project is None:
45
- project = self._client_api.state_io.get('project')
46
- if project is not None:
47
- self._project = entities.Project.from_json(_json=project, client_api=self._client_api)
48
- self._project_id = self._project.id
49
45
  if self._project_id is None:
50
46
  if self._dataset is None:
51
47
  raise exceptions.PlatformException(
@@ -122,7 +118,21 @@ class Recipes:
122
118
  if attributes is None:
123
119
  attributes = list()
124
120
  if project_ids is None:
125
- project_ids = [self.project.id]
121
+ if self._dataset is not None:
122
+ project_ids = [self._dataset.project.id]
123
+ else:
124
+ # get from cache
125
+ project = self._client_api.state_io.get('project')
126
+ if project is not None:
127
+ # build entity from json
128
+ p = entities.Project.from_json(_json=project, client_api=self._client_api)
129
+ project_ids = [p.id]
130
+ else:
131
+ # get from self.project property
132
+ try:
133
+ project_ids = [self.project.id]
134
+ except exceptions.PlatformException:
135
+ raise exceptions.PlatformException('Must provide project_ids')
126
136
  if ontology_ids is None:
127
137
  ontolgies = repositories.Ontologies(client_api=self._client_api,
128
138
  recipe=None)
@@ -830,10 +830,11 @@ class ApiClient:
830
830
  environments = self.environments
831
831
  if environment in environments:
832
832
  logger.warning('Environment exists. Overwriting. env: {}'.format(environment))
833
- if token is None:
834
- token = None
835
- if alias is None:
836
- alias = None
833
+ if alias is not None:
834
+ keys_to_remove = [e for e, v in environments.items() if v.get('alias') == alias]
835
+ for e in keys_to_remove:
836
+ logger.warning('Alias exists. Overwriting. alias: {}'.format(alias))
837
+ environments.pop(e)
837
838
  environments[environment] = {'audience': audience,
838
839
  'client_id': client_id,
839
840
  'auth0_url': auth0_url,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dtlpy
3
- Version: 1.116.6
3
+ Version: 1.118.12
4
4
  Summary: SDK and CLI for Dataloop platform
5
5
  Home-page: https://github.com/dataloop-ai/dtlpy
6
6
  Author: Dataloop Team
@@ -9,12 +9,12 @@ License: Apache License 2.0
9
9
  Classifier: Programming Language :: Python
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3 :: Only
12
- Classifier: Programming Language :: Python :: 3.7
13
- Classifier: Programming Language :: Python :: 3.8
14
- Classifier: Programming Language :: Python :: 3.9
15
12
  Classifier: Programming Language :: Python :: 3.10
16
13
  Classifier: Programming Language :: Python :: 3.11
17
- Requires-Python: >=3.7
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Requires-Python: >=3.8
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: urllib3>=1.26
@@ -30,7 +30,7 @@ Requires-Dist: tabulate>=0.8.9
30
30
  Requires-Dist: Pillow>=7.2
31
31
  Requires-Dist: PyJWT>=2.4
32
32
  Requires-Dist: jinja2>=2.11.3
33
- Requires-Dist: attrs<=22.2.0
33
+ Requires-Dist: attrs<25.0,>=22.2.0
34
34
  Requires-Dist: prompt_toolkit>=2.0.9
35
35
  Requires-Dist: fuzzyfinder<=2.1.0
36
36
  Requires-Dist: dictdiffer>=0.8.1
@@ -41,8 +41,7 @@ Requires-Dist: diskcache>=5.4
41
41
  Requires-Dist: redis>=3.5
42
42
  Requires-Dist: inquirer
43
43
  Requires-Dist: dtlpymetrics
44
- Requires-Dist: dataclasses
45
- Requires-Dist: bson
44
+ Requires-Dist: pymongo<5.0,>=4.9
46
45
  Dynamic: author
47
46
  Dynamic: author-email
48
47
  Dynamic: classifier
@@ -144,13 +143,13 @@ dlp datasets ls --project-name your-project-name
144
143
 
145
144
  DTLPY supports multiple Python versions as follows:
146
145
 
147
- | Python Version | 3.11 | 3.10 | 3.9 | 3.8 | 3.7 | 3.6 | 3.5 |
148
- |--------------------|------|------|-----|-----|-----|-----|-----|
149
- | **dtlpy >= 1.99** | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
150
- | **dtlpy 1.76–1.98**| | | ✅ | ✅ | ✅ | ✅ | |
151
- | **dtlpy >= 1.61** | ❌ | | ✅ | ✅ | ✅ | ✅ | |
152
- | **dtlpy 1.50–1.60**| ❌ | ❌ | | ✅ | ✅ | ✅ | |
153
- | **dtlpy <= 1.49** | ❌ | ❌ | | | ✅ | ✅ | ✅ |
146
+ | Python Version | 3.14 | 3.13 | 3.12 | 3.11 | 3.10 | 3.9 | 3.8 | 3.7 |
147
+ |---------------------|------|------|------|------|------|-----|-----|-----|
148
+ | **dtlpy >= 1.118** | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
149
+ | **dtlpy 1.99–1.117**| | | ❌ | | ✅ | ✅ | ✅ | |
150
+ | **dtlpy 1.76–1.98** | ❌ | | ❌ | | ✅ | ✅ | ✅ | |
151
+ | **dtlpy >= 1.61** | ❌ | ❌ | | ❌ | | ✅ | ✅ | |
152
+ | **dtlpy 1.50–1.60** | ❌ | ❌ | | | ❌ | ✅ | ✅ | ✅ |
154
153
 
155
154
  ---
156
155
 
@@ -1,5 +1,5 @@
1
- dtlpy/__init__.py,sha256=59ZkyPzyOQJaA9O8ZpyyFAWvof8OxQO2IrmoEN4QA2Y,20593
2
- dtlpy/__version__.py,sha256=qhqfKmFRYTm7tEnTLeiyuBcjOerPrhpw7PACo1jXzlE,20
1
+ dtlpy/__init__.py,sha256=p9qDLEQ01cTj0Xx8FkxJPHSmP7LMHMv8b5-ZWW1FPrU,20625
2
+ dtlpy/__version__.py,sha256=zzDq0O015CukNUyAYZIC27rY6zu8_tSZPOwxCHkmfnw,21
3
3
  dtlpy/exceptions.py,sha256=EQCKs3pwhwZhgMByQN3D3LpWpdxwcKPEEt-bIaDwURM,2871
4
4
  dtlpy/new_instance.py,sha256=XegQav2hzPrPAUzuRFvUIGSPidoK-rbb02Q43NPsIpo,9982
5
5
  dtlpy/assets/__init__.py,sha256=D_hAa6NM8Zoy32sF_9b7m0b7I-BQEyBFg8-9Tg2WOeo,976
@@ -43,11 +43,11 @@ dtlpy/dlp/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
43
43
  dtlpy/dlp/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
44
44
  dtlpy/dlp/dlp.py,sha256=Zv9yoXwNAx4gkED-JiayN-ZkX2dPn4FB0SDx9qc7muo,4404
45
45
  dtlpy/dlp/parser.py,sha256=p-TFaiAU2c3QkI97TXzL2LDR3Eq0hGDFrTc9J2jWLh4,30551
46
- dtlpy/entities/__init__.py,sha256=rAA5GbNpbwa37vdKIe9FtpvIOI1rEHYwj0Da_Mv4Xn4,5018
46
+ dtlpy/entities/__init__.py,sha256=tHndgUHZOaiXJdOY-NTvGoHcJ29EkGzz389sWQPWyaI,5050
47
47
  dtlpy/entities/analytic.py,sha256=6bMG4FD7VIDr3ca8hJ25yd9IyAuzPdaN1lsV4VD7z2Q,13739
48
- dtlpy/entities/annotation.py,sha256=0bF-N3ApbUaTWa_cIPNHMGxaWGG0q3lQos6fMDX5mCc,66661
48
+ dtlpy/entities/annotation.py,sha256=OPnkYtSC6C87tc8gWPgaPXSJmhsdZsDmg4SEM1hTJpY,66666
49
49
  dtlpy/entities/annotation_collection.py,sha256=CEYSBHhhDkC0VJdHsBSrA6TgdKGMcKeI3tFM40UJwS8,29838
50
- dtlpy/entities/app.py,sha256=vQ7hSMnuRIpoZqZc2NwjGTtWiPTCgi47x_oOgGUB-Pk,6996
50
+ dtlpy/entities/app.py,sha256=zGqJYSpq7r6D4jauSCk5vt2lqlaolFSoDvSISLa0oyA,6997
51
51
  dtlpy/entities/app_module.py,sha256=0UiAbBX1q8iEImi3nY7ySWZZHoRRwu0qUXmyXmgVAc4,3645
52
52
  dtlpy/entities/artifact.py,sha256=wtLtBuidOPbnba0ok40JyunCCIBGbAl4bP_ebK39Kk4,5711
53
53
  dtlpy/entities/assignment.py,sha256=Dc1QcfVf67GGcmDDi4ubESDuPkSgjXqdqjTBQ31faUM,14722
@@ -56,31 +56,31 @@ dtlpy/entities/bot.py,sha256=is3NUCnPg56HSjsHIvFcVkymValMqDV0uHRDC1Ib-ds,3819
56
56
  dtlpy/entities/codebase.py,sha256=7ZxEGhG_52mdZWfjg9ge6vkgLf3NDh1INZMkCHns-6Y,8864
57
57
  dtlpy/entities/collection.py,sha256=FPPPfIxOsBG1ujORPJVq8uXyF8vhIqC6N4EiI9SJzl0,1160
58
58
  dtlpy/entities/command.py,sha256=5RMQYjOGLRF8JZd7QFAPyE8utsp4eZzLApI2dEAbaqo,5301
59
- dtlpy/entities/compute.py,sha256=OpVVzJaSptOd0OzZn_HAGIiE1Z4PRUe4kI6kziU2mz0,15003
60
- dtlpy/entities/dataset.py,sha256=f4fzeOwi9MxVNzG7Bh85Ng-6OpjROEPYpDvz4yYoHqQ,54633
59
+ dtlpy/entities/compute.py,sha256=egdoRQCaJ2e5E3bA72n0nUmUfIjWBhD9sWr8nTWI3G8,15031
60
+ dtlpy/entities/dataset.py,sha256=p0AmaYsX8IlUr8lkJphXG-ke6EcONa8ediwZo2o6PgQ,55425
61
61
  dtlpy/entities/directory_tree.py,sha256=Rni6pLSWytR6yeUPgEdCCRfTg_cqLOdUc9uCqz9KT-Q,1186
62
62
  dtlpy/entities/dpk.py,sha256=XrK8X8p4Ag6LMjDrDpMstY-h_yTll_sMmKTZT6bLbWE,17923
63
63
  dtlpy/entities/driver.py,sha256=usyWqlM8KxQ-L9uCTSAmPXCu2dU4fordAN8uL0I2wRM,7720
64
64
  dtlpy/entities/execution.py,sha256=uQe535w9OcAoDiNWf96KcpFzUDEUU-DYsUalv5VziyM,13673
65
65
  dtlpy/entities/feature.py,sha256=9fFjD0W57anOVSAVU55ypxN_WTCsWTG03Wkc3cAAj78,3732
66
- dtlpy/entities/feature_set.py,sha256=niw4MkmrDbD_LWQu1X30uE6U4DCzmFhPTaYeZ6VZDB0,4443
66
+ dtlpy/entities/feature_set.py,sha256=fCBEJVyo91SWz9bw8HczduRfgPJkBsAgeT6PPrYfy5k,4600
67
67
  dtlpy/entities/filters.py,sha256=6CK66kkh5LbLjnzKoGe9jsLP8KBfdBRvNumkj-4EtfM,29399
68
68
  dtlpy/entities/gis_item.py,sha256=Uk-wMBxwcHsImjz4qOjP-EyZAohbRzN43kMpCaVjCXU,3982
69
69
  dtlpy/entities/integration.py,sha256=XraOApW9jbT6EdZraRX2In6sMbfNgEGf2V5Um2RCRqA,6001
70
- dtlpy/entities/item.py,sha256=iR8qzk-8h5YuQDR4P9KYIEhKOaYZSVgnVMxS32L-3Hg,34884
70
+ dtlpy/entities/item.py,sha256=JoF3vTlsBUXwsC7b5KCkvDOeGP7Iby--Ww4PJQ5_UF4,35586
71
71
  dtlpy/entities/label.py,sha256=ycDYavIgKhz806plIX-64c07_TeHpDa-V7LnfFVe4Rg,3869
72
72
  dtlpy/entities/links.py,sha256=FAmEwHtsrqKet3c0UHH9u_gHgG6_OwF1-rl4xK7guME,2516
73
73
  dtlpy/entities/message.py,sha256=ApJuaKEqxATpXjNYUjGdYPu3ibQzEMo8-LtJ_4xAcPI,5865
74
- dtlpy/entities/model.py,sha256=gFZ_I6Th4KqkWS5X57aVfEoMAGtAhcPlCOXofo9ARUM,27792
74
+ dtlpy/entities/model.py,sha256=YvkLjH4Gdk9vUcuWJ3KLJe6v9fY82692kzjqCuAAU4Y,27815
75
75
  dtlpy/entities/node.py,sha256=RiCqG659Pb1PZNMewR-F7eNbU5tt713fiZY9xW6-Pes,39199
76
- dtlpy/entities/ontology.py,sha256=R29baDbx_TKdaUJZKVJPee1_sJ-DLwwlQ2AEjExP2Ko,32530
76
+ dtlpy/entities/ontology.py,sha256=qA8XOhHPiZ7fUK2QPBola2xA8SGEdzsgCy5oozgARwc,32534
77
77
  dtlpy/entities/organization.py,sha256=Zm-tTHV82PvYyTNetRRXqvmvzBCbXEwS-gAENf7Zny4,9874
78
78
  dtlpy/entities/package.py,sha256=QSDePHlp4ik19aUE3dAUC7edh0oUUVjzSmMG867avc4,26363
79
79
  dtlpy/entities/package_defaults.py,sha256=wTD7Z7rGYjVy8AcUxTFEnkOkviiJaLVZYvduiUBKNZo,211
80
80
  dtlpy/entities/package_function.py,sha256=M42Kvw9A8b6msAkv-wRNAQg_-UC2bejniCjeKDugudc,6314
81
81
  dtlpy/entities/package_module.py,sha256=cOkIITATkzzCQpE0sdPiBUisAz8ImlPG2YGZ0K7SypA,5151
82
82
  dtlpy/entities/package_slot.py,sha256=XBwCodQe618sQm0bmx46Npo94mEk-zUV7ZX0mDRcsD8,3946
83
- dtlpy/entities/paged_entities.py,sha256=3MKFqohp1z0PSMeCwXq8d6mqd16_s2LXckc1MKyPZeE,10980
83
+ dtlpy/entities/paged_entities.py,sha256=S7QyjUPkQhXIxS0saFU8oOfiybP5BpbNRy772GWkbGs,11175
84
84
  dtlpy/entities/pipeline.py,sha256=nDSAQlYPw7LtpdwkbjeSiORLURmuc2jHlaQ8sAdKLgY,21766
85
85
  dtlpy/entities/pipeline_execution.py,sha256=EQhW4W_G1bIPShYbJSAT--1WNQuvxVQbcQ_MCHIX0KI,9938
86
86
  dtlpy/entities/project.py,sha256=ZUx8zA3mr6N145M62R3UDPCCzO1vxfyWO6vjES-bO-g,14653
@@ -88,7 +88,7 @@ dtlpy/entities/prompt_item.py,sha256=S_cgekiUsAK0OLP_XXbfvpNv7Zr5XT86jCB2w1yyyjQ
88
88
  dtlpy/entities/recipe.py,sha256=SX0T7gw-_9Cs2FZyC_htIxQd7CwDwb2zA3SqB37vymM,11917
89
89
  dtlpy/entities/reflect_dict.py,sha256=2NaSAL-CO0T0FYRYFQlaSpbsoLT2Q18AqdHgQSLX5Y4,3273
90
90
  dtlpy/entities/resource_execution.py,sha256=1HuVV__U4jAUOtOkWlWImnM3Yts8qxMSAkMA9sBhArY,5033
91
- dtlpy/entities/service.py,sha256=xG4Rj-kyhJNreesJgq7_Php7vTYztCvFVXifWbCog7s,33479
91
+ dtlpy/entities/service.py,sha256=3E4pqn7Zg5pDaaagpyHfHuKK1uSDZ8-UbPrIzJfXuu4,33932
92
92
  dtlpy/entities/service_driver.py,sha256=N3fL_xTPLu75UBFQZO5Plxx2kpED-UIILxTYbD58rzQ,3917
93
93
  dtlpy/entities/setting.py,sha256=uXagJHtcCR3nJYClR_AUGZjz_kx3TejPcUZ8ginHFIA,8561
94
94
  dtlpy/entities/task.py,sha256=ajVIkB-3Aqm9Udn87ITvIsGwduyCTtGeqV-FjSYtZKg,19605
@@ -149,7 +149,7 @@ dtlpy/miscellaneous/list_print.py,sha256=fBGTMXFUwDG8DD4W6HyR8BTGtbTckLf4W09quNR
149
149
  dtlpy/miscellaneous/zipping.py,sha256=JplTc8UDFvO8WaD5vKuumVLN0lU_-GtHoE0doWKtmKg,5383
150
150
  dtlpy/ml/__init__.py,sha256=vPkyXpc9kcWWZ_PxyPEOsjKBJdEbowLkZr8FZIb_OBM,799
151
151
  dtlpy/ml/base_feature_extractor_adapter.py,sha256=iiEGYAx0Rdn4K46H_FlKrAv3ebTXHSxNVAmio0BxhaI,1178
152
- dtlpy/ml/base_model_adapter.py,sha256=YQrO2mG2FiC3WobRUnaLqlq-GJEHvmBSyB3nuQGaU9o,62822
152
+ dtlpy/ml/base_model_adapter.py,sha256=qXikBauw3jBsy3iO4CRLXku8RFTSQj8jLhgKYSWy7Jg,64136
153
153
  dtlpy/ml/metrics.py,sha256=BG2E-1Mvjv2e2No9mIJKVmvzqBvLqytKcw3hA7wVUNc,20037
154
154
  dtlpy/ml/predictions_utils.py,sha256=He_84U14oS2Ss7T_-Zj5GDiBZwS-GjMPURUh7u7DjF8,12484
155
155
  dtlpy/ml/summary_writer.py,sha256=dehDi8zmGC1sAGyy_3cpSWGXoGQSiQd7bL_Thoo8yIs,2784
@@ -157,7 +157,7 @@ dtlpy/ml/train_utils.py,sha256=t607DfyGBRrUQZ9jPmPe4V9Udzfk0hPWuw4OvKZKAeo,2440
157
157
  dtlpy/repositories/__init__.py,sha256=D2YI3ZLlSx0OlgVr8y_E9rsj-IxCDOj0MB6QTlv2NSA,2061
158
158
  dtlpy/repositories/analytics.py,sha256=dQPCYTPAIuyfVI_ppR49W7_GBj0033feIm9Gd7LW1V0,2966
159
159
  dtlpy/repositories/annotations.py,sha256=idTKzanNt-ncB0eIKE5p6WclrVGNjceI2Y7dAzDFtzY,43595
160
- dtlpy/repositories/apps.py,sha256=OE2UbxE2oGA44-7pso7fm9GErTRFyGEFK2k7ibC_h6U,16002
160
+ dtlpy/repositories/apps.py,sha256=miCYJNqte8TVFkBezE8yzueMsz593jNO9sSUfZRVV7M,15969
161
161
  dtlpy/repositories/artifacts.py,sha256=Ke2ustTNw-1eQ0onLsWY7gL2aChjXPAX5p1uQ_EzMbo,19081
162
162
  dtlpy/repositories/assignments.py,sha256=1VwJZ7ctQe1iaDDDpeYDgoj2G-TCgzolVLUEqUocd2w,25506
163
163
  dtlpy/repositories/bots.py,sha256=q1SqH01JHloljKxknhHU09psV1vQx9lPhu3g8mBBeRg,8104
@@ -166,12 +166,12 @@ dtlpy/repositories/collections.py,sha256=lA4T7irQ_dtI_bcVxrHHikClcglp8ltsoPcLwHy
166
166
  dtlpy/repositories/commands.py,sha256=aismmQOkZbpo9vN1fVYTHXrsJoQNrN7wiANUCiUWUmY,5717
167
167
  dtlpy/repositories/compositions.py,sha256=H417BvlQAiWr5NH2eANFke6CfEO5o7DSvapYpf7v5Hk,2150
168
168
  dtlpy/repositories/computes.py,sha256=K1a28vJn3tB-h_Xvl8blr-lOytfz3MvyzFzauCja8UA,16936
169
- dtlpy/repositories/datasets.py,sha256=W-nuH5oX0PGu3lj3-Z0EJpZy10wt-eEMKp0EZ3N4gYo,69846
170
- dtlpy/repositories/downloader.py,sha256=_GCYBtGR7Rkd0MlLSt7OFOAIck92kPuXmFJfKo_QCWw,49103
169
+ dtlpy/repositories/datasets.py,sha256=1-ud7Ulc8z5IwQezjrW4C6V24xVUhR0U_dgix76zDYw,72778
170
+ dtlpy/repositories/downloader.py,sha256=EkCscU8QHa6H0-t17laFZn49Up-wNHbFd2DxVIqX8Fc,56209
171
171
  dtlpy/repositories/dpks.py,sha256=Cu8pqFZr6MlrdidjysQT_X1hyKaL5YNUn81puOM5FX0,18508
172
172
  dtlpy/repositories/drivers.py,sha256=z9qu4I2lwa0aujkKxj0bvn71Zzs8U8byqSx8S9DAIQw,19553
173
173
  dtlpy/repositories/executions.py,sha256=BuFv7J6U2Q7om4OlC0q6tnk-1Vcw5m0adfR9a5Mj98Y,32361
174
- dtlpy/repositories/feature_sets.py,sha256=UowMDAl_CRefRB5oZzubnsjU_OFgiPPdQXn8q2j4Kuw,9666
174
+ dtlpy/repositories/feature_sets.py,sha256=ueYIGQIz-XYbbiuQy0YnpqO3dqJKGwtbGK0H5ZgkaBs,13892
175
175
  dtlpy/repositories/features.py,sha256=SNmECqKSfHlNgjjG_RlX-GAU3udYN9_ZYOe8mFNy010,10671
176
176
  dtlpy/repositories/integrations.py,sha256=Y5c37fQCaIkw1p5jPEbAqytgRVXuqe771eHC1hNDE7A,19491
177
177
  dtlpy/repositories/items.py,sha256=u2Vg0jOTZ9EhV1sPJdAeIUyfqBRv63Gl-IXaMlon8PM,40028
@@ -184,7 +184,7 @@ dtlpy/repositories/packages.py,sha256=QhkXMZkpseCt0pDropJuqoHJL0RMa5plk8AN0V3w6N
184
184
  dtlpy/repositories/pipeline_executions.py,sha256=sEC03bu5DsHc554z3xDbMCP529rhfADcktXgWkswEwI,17281
185
185
  dtlpy/repositories/pipelines.py,sha256=5qosyxLFgNbcmL7uoTr9klAj1VM-7mWvsOvngbUU1Qk,24320
186
186
  dtlpy/repositories/projects.py,sha256=TKLCuL7Inlv4GwgcQcuXkPQtgacfrXYjsTQng8nPC7Y,21623
187
- dtlpy/repositories/recipes.py,sha256=ZtH9s3BBLCpzlx59onqvrw3PvKYCWEM7payQbAY9tgA,16677
187
+ dtlpy/repositories/recipes.py,sha256=q1FMk4kBPzBS-QIbkxeSsMcAJmYuS7gpYL8t3XIBWII,17117
188
188
  dtlpy/repositories/resource_executions.py,sha256=PyzsbdJxz6jf17Gx13GZmqdu6tZo3TTVv-DypnJ_sY0,5374
189
189
  dtlpy/repositories/schema.py,sha256=kTKDrbwm7BfQnBAK81LpAl9ChNFdyUweSLNazlJJhjk,3953
190
190
  dtlpy/repositories/service_drivers.py,sha256=rxbhLUtT7TCbkVxH4HJtFT9ywcikByPFdX7_4kiTiK0,6766
@@ -198,7 +198,7 @@ dtlpy/repositories/uploader.py,sha256=I9mP-Ikj0zUOdMTf-7FN_huHWXYeWc8gzVRpfUPAXj
198
198
  dtlpy/repositories/webhooks.py,sha256=IIpxOJ-7KeQp1TY9aJZz-FuycSjAoYx0TDk8z86KAK8,9033
199
199
  dtlpy/services/__init__.py,sha256=VfVJy2otIrDra6i7Sepjyez2ujiE6171ChQZp-YgxsM,904
200
200
  dtlpy/services/aihttp_retry.py,sha256=tgntZsAY0dW9v08rkjX1T5BLNDdDd8svtgn7nH8DSGU,5022
201
- dtlpy/services/api_client.py,sha256=vTysmEqXMEyEwAKaQK9JGILkHfrQNJFtZ60WEqQG8QQ,71728
201
+ dtlpy/services/api_client.py,sha256=MbpTsGVgFonv04pWCfYkOP0shM3LcfCOrucVEXvNn4M,71907
202
202
  dtlpy/services/api_reference.py,sha256=cW-B3eoi9Xs3AwI87_Kr6GV_E6HPoC73aETFaGz3A-0,1515
203
203
  dtlpy/services/async_utils.py,sha256=kaYHTPw0Lg8PeJJq8whPyzrBYkzD7offs5hsKRZXJm8,3960
204
204
  dtlpy/services/calls_counter.py,sha256=gr0io5rIsO5-7Cgc8neA1vK8kUtYhgFPmDQ2jXtiZZs,1036
@@ -226,14 +226,12 @@ dtlpy/utilities/reports/report.py,sha256=3nEsNnIWmdPEsd21nN8vMMgaZVcPKn9iawKTTeO
226
226
  dtlpy/utilities/videos/__init__.py,sha256=SV3w51vfPuGBxaMeNemx6qEMHw_C4lLpWNGXMvdsKSY,734
227
227
  dtlpy/utilities/videos/video_player.py,sha256=LCxg0EZ_DeuwcT7U_r7MRC6Q19s0xdFb7x5Gk39PRms,24072
228
228
  dtlpy/utilities/videos/videos.py,sha256=Dj916B4TQRIhI7HZVevl3foFrCsPp0eeWwvGbgX3-_A,21875
229
- dtlpy-1.116.6.data/scripts/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
230
- dtlpy-1.116.6.data/scripts/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
231
- dtlpy-1.116.6.data/scripts/dlp.py,sha256=ZpfJvYE1_OTSorEYBphqTOutnHSb5TqOXh0y_mUCTJs,4393
232
- dtlpy-1.116.6.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
233
- tests/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
234
- tests/features/environment.py,sha256=FjOLwKvQx44TNvIidvoQaTXxvoEaSFsXQ9xkqkskkdo,18933
235
- dtlpy-1.116.6.dist-info/METADATA,sha256=a4Z5q1gGBk5e-PnmYqRC6FfPNynDl1N8LqbMm0Tmawo,5835
236
- dtlpy-1.116.6.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
237
- dtlpy-1.116.6.dist-info/entry_points.txt,sha256=C4PyKthCs_no88HU39eioO68oei64STYXC2ooGZTc4Y,43
238
- dtlpy-1.116.6.dist-info/top_level.txt,sha256=ZWuLmQGUOtWAdgTf4Fbx884w1o0vBYq9dEc1zLv9Mig,12
239
- dtlpy-1.116.6.dist-info/RECORD,,
229
+ dtlpy-1.118.12.data/scripts/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
230
+ dtlpy-1.118.12.data/scripts/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
231
+ dtlpy-1.118.12.data/scripts/dlp.py,sha256=ZpfJvYE1_OTSorEYBphqTOutnHSb5TqOXh0y_mUCTJs,4393
232
+ dtlpy-1.118.12.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
233
+ dtlpy-1.118.12.dist-info/METADATA,sha256=-R4pN-l-KYSHK8DgWK-kWCA5eLuISDOrpK-7nIUmd9I,5908
234
+ dtlpy-1.118.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
235
+ dtlpy-1.118.12.dist-info/entry_points.txt,sha256=C4PyKthCs_no88HU39eioO68oei64STYXC2ooGZTc4Y,43
236
+ dtlpy-1.118.12.dist-info/top_level.txt,sha256=MSr60TGZYlwXCKxlLoZCfILRZ6pU_3L-20d2SZvygyA,6
237
+ dtlpy-1.118.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes