dtlpy 1.88.15__py3-none-any.whl → 1.90.37__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 (45) hide show
  1. dtlpy/__init__.py +3 -2
  2. dtlpy/__version__.py +1 -1
  3. dtlpy/assets/lock_open.png +0 -0
  4. dtlpy/dlp/command_executor.py +23 -10
  5. dtlpy/dlp/parser.py +2 -2
  6. dtlpy/entities/__init__.py +2 -2
  7. dtlpy/entities/app.py +56 -4
  8. dtlpy/entities/dataset.py +7 -1
  9. dtlpy/entities/dpk.py +29 -34
  10. dtlpy/entities/filters.py +7 -1
  11. dtlpy/entities/integration.py +8 -3
  12. dtlpy/entities/model.py +30 -2
  13. dtlpy/entities/package_function.py +1 -0
  14. dtlpy/entities/package_module.py +1 -0
  15. dtlpy/entities/pipeline.py +1 -1
  16. dtlpy/entities/service.py +17 -3
  17. dtlpy/examples/upload_items_with_modalities.py +1 -1
  18. dtlpy/ml/base_feature_extractor_adapter.py +28 -0
  19. dtlpy/ml/base_model_adapter.py +37 -10
  20. dtlpy/repositories/__init__.py +1 -0
  21. dtlpy/repositories/apps.py +82 -4
  22. dtlpy/repositories/dpks.py +37 -9
  23. dtlpy/repositories/executions.py +10 -6
  24. dtlpy/repositories/features.py +8 -2
  25. dtlpy/repositories/integrations.py +1 -0
  26. dtlpy/repositories/models.py +57 -10
  27. dtlpy/repositories/packages.py +5 -2
  28. dtlpy/repositories/pipeline_executions.py +8 -5
  29. dtlpy/repositories/recipes.py +3 -2
  30. dtlpy/repositories/schema.py +120 -0
  31. dtlpy/repositories/services.py +5 -2
  32. dtlpy/services/api_client.py +9 -0
  33. dtlpy/services/logins.py +49 -18
  34. dtlpy/utilities/converter.py +37 -20
  35. dtlpy/utilities/dataset_generators/dataset_generator.py +2 -1
  36. {dtlpy-1.88.15.dist-info → dtlpy-1.90.37.dist-info}/METADATA +2 -2
  37. {dtlpy-1.88.15.dist-info → dtlpy-1.90.37.dist-info}/RECORD +45 -43
  38. tests/features/environment.py +5 -1
  39. {dtlpy-1.88.15.data → dtlpy-1.90.37.data}/scripts/dlp +0 -0
  40. {dtlpy-1.88.15.data → dtlpy-1.90.37.data}/scripts/dlp.bat +0 -0
  41. {dtlpy-1.88.15.data → dtlpy-1.90.37.data}/scripts/dlp.py +0 -0
  42. {dtlpy-1.88.15.dist-info → dtlpy-1.90.37.dist-info}/LICENSE +0 -0
  43. {dtlpy-1.88.15.dist-info → dtlpy-1.90.37.dist-info}/WHEEL +0 -0
  44. {dtlpy-1.88.15.dist-info → dtlpy-1.90.37.dist-info}/entry_points.txt +0 -0
  45. {dtlpy-1.88.15.dist-info → dtlpy-1.90.37.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import traceback
3
+ import urllib.parse
3
4
 
4
5
  from .. import entities, miscellaneous, repositories, exceptions, _api_reference
5
6
  from ..services.api_client import ApiClient
@@ -198,9 +199,9 @@ class Recipes:
198
199
 
199
200
  def _list(self, filters: entities.Filters):
200
201
  url = filters.generate_url_query_params('/recipes')
201
-
202
+ encoded_url = urllib.parse.quote(url, safe='/:?=&')
202
203
  # request
203
- success, response = self._client_api.gen_request(req_type='get', path=url)
204
+ success, response = self._client_api.gen_request(req_type='get', path=encoded_url)
204
205
  if not success:
205
206
  raise exceptions.PlatformException(response)
206
207
  return response.json()
@@ -0,0 +1,120 @@
1
+ from typing import List
2
+ import logging
3
+
4
+ from .. import entities, exceptions
5
+ from ..services.api_client import ApiClient
6
+
7
+ logger = logging.getLogger(name='dtlpy')
8
+
9
+
10
+ class UnsearchablePaths:
11
+ """
12
+ Unsearchable Paths
13
+
14
+ """
15
+
16
+ def __init__(self, client_api: ApiClient, dataset: entities.Dataset = None):
17
+ self._client_api = client_api
18
+ self._dataset = dataset
19
+
20
+ @property
21
+ def dataset(self) -> entities.Dataset:
22
+ if self._dataset is None:
23
+ raise exceptions.PlatformException(
24
+ error='2001',
25
+ message='Cannot perform action WITHOUT Dataset entity in {} repository.'.format(
26
+ self.__class__.__name__) + ' Please use dataset.schema or set a dataset')
27
+ assert isinstance(self._dataset, entities.Dataset)
28
+ return self._dataset
29
+
30
+ def __unsearchable_paths_request(self, payload):
31
+ """
32
+ Set unsearchable paths in dataset schema
33
+ """
34
+ success, response = self._client_api.gen_request(req_type='post',
35
+ path='/datasets/{}/schema/items'.format(self.dataset.id),
36
+ json_req=
37
+ {
38
+ "unsearchablePaths": payload
39
+ })
40
+ if not success:
41
+ raise exceptions.PlatformException(response)
42
+
43
+ resp = response.json()
44
+ if isinstance(resp, dict):
45
+ command = entities.Command.from_json(_json=resp,
46
+ client_api=self._client_api)
47
+
48
+ try:
49
+ command.wait()
50
+ except Exception as e:
51
+ logger.error('Command failed: {}'.format(e))
52
+ else:
53
+ logger.warning(resp)
54
+ return success
55
+
56
+ def add(self, paths: List[str]):
57
+ """
58
+ Add metadata paths to `unsearchablePaths` to exclude keys under these paths from indexing, making them unsearchable through the Dataset Browser UI and DQL queries.
59
+
60
+ :param paths: list of paths to create
61
+ :return: true if success, else raise exception
62
+ :rtype: bool
63
+
64
+ **Example**:
65
+
66
+ .. code-block:: python
67
+
68
+ success = dataset.schema.unsearchable_paths.add(paths=['metadata.key1', 'metadata.key2'])
69
+ """
70
+ return self.__unsearchable_paths_request(payload={"add": paths})
71
+
72
+ def remove(self, paths: List[str]):
73
+ """
74
+ Remove metadata paths from `unsearchablePaths` to index keys under these paths, making them searchable through the Dataset Browser UI and DQL queries.
75
+
76
+ :param paths: list of paths to delete
77
+ :return: true if success, else raise exception
78
+ :rtype: bool
79
+
80
+ **Example**:
81
+
82
+ .. code-block:: python
83
+
84
+ success = dataset.schema.unsearchable_paths.remove(paths=['metadata.key1', 'metadata.key2'])
85
+ """
86
+ return self.__unsearchable_paths_request(payload={"remove": paths})
87
+
88
+
89
+ class Schema:
90
+ """
91
+ Schema Repository
92
+ """
93
+
94
+ def __init__(self, client_api: ApiClient, dataset: entities.Dataset):
95
+ self._client_api = client_api
96
+ self.dataset = dataset
97
+ self.unsearchable_paths = UnsearchablePaths(client_api=self._client_api, dataset=dataset)
98
+
99
+ ###########
100
+ # methods #
101
+ ###########
102
+ def get(self):
103
+ """
104
+ Get dataset schema
105
+
106
+ :return: dataset schema
107
+ :rtype: dict
108
+
109
+ **Example**:
110
+
111
+ .. code-block:: python
112
+
113
+ json = dataset.schema.get()
114
+ """
115
+ success, response = self._client_api.gen_request(req_type='get',
116
+ path='/datasets/{}/schema'.format(self.dataset.id))
117
+ if not success:
118
+ raise exceptions.PlatformException(response)
119
+
120
+ return response.json()
@@ -450,7 +450,8 @@ class Services:
450
450
  name: str,
451
451
  action: str = 'created',
452
452
  support: str = None,
453
- docs: str = None
453
+ docs: str = None,
454
+ agent_info: dict = None
454
455
  ):
455
456
  url = "/services/{}/notify".format(service_id)
456
457
  payload = {
@@ -458,6 +459,8 @@ class Services:
458
459
  'message': message,
459
460
  'notificationName': name
460
461
  }
462
+ if agent_info is not None:
463
+ payload['agentInfo'] = agent_info
461
464
 
462
465
  if support:
463
466
  payload['support'] = support
@@ -1260,7 +1263,7 @@ class Services:
1260
1263
  else:
1261
1264
  project_id = self._project_id
1262
1265
 
1263
- filters = entities.Filters(resource=entities.FiltersResource.SERVICE)
1266
+ filters = entities.Filters(resource=entities.FiltersResource.SERVICE, use_defaults=False)
1264
1267
  filters.add(field='name', values=service_name)
1265
1268
  if project_id is not None:
1266
1269
  filters.add(field='projectId', values=project_id)
@@ -1451,6 +1451,7 @@ class ApiClient:
1451
1451
  :param force: force login. in case login with same user but want to get a new JWT
1452
1452
  :return:
1453
1453
  """
1454
+ logger.warning('dl.login_secret is deprecated. Please use dl.login_m2m instead.')
1454
1455
  return login_secret(api_client=self,
1455
1456
  email=email,
1456
1457
  password=password,
@@ -1486,6 +1487,14 @@ class ApiClient:
1486
1487
  """
1487
1488
  self.token = token # this will also set the refresh_token to None
1488
1489
 
1490
+ def login_api_key(self, api_key):
1491
+ """
1492
+ Login using API key
1493
+ :param api_key: a valid API key
1494
+ :return:
1495
+ """
1496
+ self.token = api_key
1497
+
1489
1498
  @property
1490
1499
  def login_domain(self):
1491
1500
  if self._login_domain is None:
dtlpy/services/logins.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from urllib.parse import urlsplit, urlunsplit
2
+ import base64
2
3
  import requests
3
4
  import logging
4
5
  import json
@@ -89,6 +90,51 @@ def logout(api_client):
89
90
  return True
90
91
 
91
92
 
93
+ def login_html():
94
+ try:
95
+ location = os.path.dirname(os.path.realpath(__file__))
96
+ except NameError:
97
+ location = './dtlpy/services'
98
+ filename = os.path.join(location, '..', 'assets', 'lock_open.png')
99
+
100
+ if os.path.isfile(filename):
101
+
102
+ with open(filename, 'rb') as f:
103
+ image = f.read()
104
+
105
+ html = (
106
+ " <!doctype html>\n"
107
+ " <html>\n"
108
+ " <head>\n"
109
+ " <style>\n"
110
+ " body {{\n"
111
+ " background-color: #F7F7F9 !important;\n"
112
+ " display: flex;\n"
113
+ " justify-content: center;\n"
114
+ " align-items: center;\n"
115
+ " height: 100vh;\n"
116
+ " width: 100vw;\n"
117
+ " margin: 0;\n"
118
+ " }}\n"
119
+ " img {{\n"
120
+ " display: block;\n"
121
+ " max-width: 100%;\n"
122
+ " max-height: 100%;\n"
123
+ " margin: auto;\n"
124
+ " }}\n"
125
+ " </style>\n"
126
+ " </head>\n"
127
+ " <body>\n"
128
+ " <img src='data:image/png;base64,{image}'>\n"
129
+ " </body>\n"
130
+ " </html>\n"
131
+ ).format(image=base64.b64encode(image).decode())
132
+ else:
133
+ html = "<!doctype html><html><body>Logged in successfully</body></html>"
134
+
135
+ return html.encode('utf-8')
136
+
137
+
92
138
  def login(api_client, auth0_url=None, audience=None, client_id=None, login_domain=None, callback_port=None):
93
139
  import webbrowser
94
140
  from http.server import BaseHTTPRequestHandler, HTTPServer
@@ -111,24 +157,9 @@ def login(api_client, auth0_url=None, audience=None, client_id=None, login_domai
111
157
  parsed_path = urlparse(self.path)
112
158
  query = parse_qs(parsed_path.query)
113
159
  self.send_response(200)
114
-
115
- # get display image
116
- try:
117
- # working directory when running from command line
118
- location = os.path.dirname(os.path.realpath(__file__))
119
- except NameError:
120
- # working directory when running from console
121
- location = './dtlpy/services'
122
- filename = os.path.join(location, '..', 'assets', 'lock_open.png')
123
- if os.path.isfile(filename):
124
- with open(filename, 'rb') as f:
125
- self.send_header('Content-type', 'image/jpg')
126
- self.end_headers()
127
- self.wfile.write(f.read())
128
- else:
129
- self.send_header('Content-type', 'text/html')
130
- self.end_headers()
131
- self.wfile.write(bytes("<!doctype html><html><body>Logged in successfully</body></html>", 'utf-8'))
160
+ self.send_header('Content-type', 'text/html')
161
+ self.end_headers()
162
+ self.wfile.write(login_html())
132
163
  self.__class__.id_token = query['id_token'][0]
133
164
  self.__class__.access_token = query['access_token'][0]
134
165
  self.__class__.refresh_token = query['refresh_token'][0]
@@ -349,6 +349,7 @@ class Converter:
349
349
 
350
350
  def __convert_dataset_to_coco(self, dataset: entities.Dataset, local_path, filters=None, annotation_filter=None):
351
351
  pages = dataset.items.list(filters=filters)
352
+ logger.info('items count: {}'.format(pages.items_count))
352
353
  dataset.download_annotations(local_path=local_path, filters=filters, annotation_filters=annotation_filter)
353
354
  path_to_dataloop_annotations_dir = os.path.join(local_path, 'json')
354
355
  label_to_id = dataset.instance_map
@@ -368,20 +369,23 @@ class Converter:
368
369
  )
369
370
  for page in pages:
370
371
  for item in page:
371
- pool.apply_async(func=self.__single_item_to_coco,
372
- kwds={
373
- 'item': item,
374
- 'images': images,
375
- 'path_to_dataloop_annotations_dir': path_to_dataloop_annotations_dir,
376
- 'item_id': item_id_counter,
377
- 'reporter': reporter,
378
- 'converted_annotations': converted_annotations,
379
- 'annotation_filter': annotation_filter,
380
- 'label_to_id': label_to_id,
381
- 'categories': categories,
382
- 'pbar': pbar
383
- })
384
- item_id_counter += 1
372
+ try:
373
+ pool.apply_async(func=self.__single_item_to_coco,
374
+ kwds={
375
+ 'item': item,
376
+ 'images': images,
377
+ 'path_to_dataloop_annotations_dir': path_to_dataloop_annotations_dir,
378
+ 'item_id': item_id_counter,
379
+ 'reporter': reporter,
380
+ 'converted_annotations': converted_annotations,
381
+ 'annotation_filter': annotation_filter,
382
+ 'label_to_id': label_to_id,
383
+ 'categories': categories,
384
+ 'pbar': pbar
385
+ })
386
+ item_id_counter += 1
387
+ except Exception as e:
388
+ logger.error('Failed to convert item: {}'.format(item.id))
385
389
 
386
390
  pool.close()
387
391
  pool.join()
@@ -414,8 +418,11 @@ class Converter:
414
418
  logger.warning(
415
419
  'Converted with some errors. Please see log in {} for more information.'.format(log_filepath))
416
420
 
417
- logger.info('Total converted: {}'.format(reporter.status_count('success')))
418
- logger.info('Total failed: {}'.format(reporter.status_count('failed')))
421
+ logger.info('Total converted: {}'.format(reporter.success_count))
422
+ logger.info('Total failed: {}'.format(reporter.failure_count))
423
+ logger.info('Total skipped: {}'.format(reporter.status_count('skip')))
424
+ if reporter.success_count + reporter.status_count('skip') + reporter.failure_count != pages.items_count:
425
+ raise ValueError('Not all items were processed')
419
426
 
420
427
  return coco_json, reporter.has_errors, log_filepath
421
428
 
@@ -501,8 +508,16 @@ class Converter:
501
508
  item_id=item_id, i_annotation=pose_idx,
502
509
  item_converted_annotations=item_converted_annotations)
503
510
 
504
- def __single_item_to_coco(self, item: entities.Item, images, path_to_dataloop_annotations_dir, item_id,
505
- converted_annotations, annotation_filter, label_to_id, reporter, categories, pbar=None):
511
+ def __single_item_to_coco(self, item: entities.Item,
512
+ images,
513
+ path_to_dataloop_annotations_dir,
514
+ item_id,
515
+ converted_annotations,
516
+ annotation_filter,
517
+ label_to_id,
518
+ reporter,
519
+ categories,
520
+ pbar=None):
506
521
  try:
507
522
  if item.type != 'dir':
508
523
  item = Converter.__get_item_shape(item=item)
@@ -562,11 +577,13 @@ class Converter:
562
577
  error=errors)
563
578
  else:
564
579
  reporter.set_index(ref=item.id, status='success', success=True)
580
+ else:
581
+ reporter.set_index(ref=item.id, status='skipped', success=True)
565
582
  except Exception:
566
583
  reporter.set_index(ref=item.id, status='failed', success=False,
567
584
  error=traceback.format_exc())
568
- raise
569
-
585
+ logger.debug('Error converting item: {}\n{}'.format(item.id, traceback.format_exc()))
586
+ raise Exception('Error converting item: {}\n{}'.format(item.id, traceback.format_exc()))
570
587
  if pbar is not None:
571
588
  pbar.update()
572
589
 
@@ -250,10 +250,11 @@ class DatasetGenerator:
250
250
  entities.AnnotationType.BOX,
251
251
  entities.AnnotationType.POLYGON]:
252
252
  raise ValueError('unsupported annotation type: {}'.format(annotation.type))
253
+ dtype = object if self.annotation_type == entities.AnnotationType.POLYGON else None
253
254
  # reorder for output
254
255
  item_info.update({entities.AnnotationType.BOX.value: np.asarray(box_coordinates).astype(float),
255
256
  entities.AnnotationType.CLASSIFICATION.value: np.asarray(classes_ids),
256
- entities.AnnotationType.POLYGON.value: np.asarray(polygon_coordinates, dtype=object),
257
+ entities.AnnotationType.POLYGON.value: np.asarray(polygon_coordinates, dtype=dtype),
257
258
  'labels': labels})
258
259
  if len(item_info[entities.AnnotationType.CLASSIFICATION.value]) == 0:
259
260
  logger.debug('Empty annotation (nothing matched label_to_id_map) for image filename: {}'.format(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dtlpy
3
- Version: 1.88.15
3
+ Version: 1.90.37
4
4
  Summary: SDK and CLI for Dataloop platform
5
5
  Home-page: https://github.com/dataloop-ai/dtlpy
6
6
  Author: Dataloop Team
@@ -43,7 +43,7 @@ Requires-Dist: redis (>=3.5)
43
43
  Requires-Dist: inquirer
44
44
  Requires-Dist: dtlpymetrics
45
45
 
46
- ![logo](https://mk0dataloop4fni44fjg.kinstacdn.com/wp-content/uploads/2020/03/logo.svg)
46
+ ![logo.svg](docs%2F_static%2Flogo.svg)
47
47
  [![Documentation Status](https://readthedocs.org/projects/dtlpy/badge/?version=latest)](https://sdk-docs.dataloop.ai/en/latest/?badge=latest)
48
48
  [![pypi](https://img.shields.io/pypi/v/dtlpy.svg)](https://pypi.org/project/dtlpy/)
49
49
  [![versions](https://img.shields.io/pypi/pyversions/dtlpy.svg)](https://github.com/dataloop-ai/dtlpy)
@@ -1,9 +1,9 @@
1
- dtlpy/__init__.py,sha256=T_6RQvFl0hF5gmKdFBBNDHg0RcLJFd31KthBJlYEXa4,20063
2
- dtlpy/__version__.py,sha256=YEo2XJg62s_8oBaaMR3HIU7dAshSQJmIP0okU3Wx0UA,20
1
+ dtlpy/__init__.py,sha256=pJiyuUv6L9bWnW1vcknHAjYP-pouMCYzzexyDKxELoI,20127
2
+ dtlpy/__version__.py,sha256=1qj3PS0_EjKdBgEzjxUCdo97julDX9MXnun0P6V3QAE,20
3
3
  dtlpy/exceptions.py,sha256=EQCKs3pwhwZhgMByQN3D3LpWpdxwcKPEEt-bIaDwURM,2871
4
4
  dtlpy/new_instance.py,sha256=_-F1NTJgGCCHnW68eIexwq7leLGTCHcPxodbw9mfasI,5555
5
5
  dtlpy/assets/__init__.py,sha256=D_hAa6NM8Zoy32sF_9b7m0b7I-BQEyBFg8-9Tg2WOeo,976
6
- dtlpy/assets/lock_open.png,sha256=vXHune4YF__fINPQ2l61G2zI3BeJPX_z5gkwzUNFAxs,24081
6
+ dtlpy/assets/lock_open.png,sha256=WhGXI8pYNXF3nkbbwUV7BMY8QInXmyyZbS04JoYh3UY,18132
7
7
  dtlpy/assets/main.py,sha256=N1JUsx79qnXI7Hx22C8JOzHJdGHxvrXeTx5UZAxvJfE,1380
8
8
  dtlpy/assets/main_partial.py,sha256=d8Be4Whg9Tb2VFiT85-57_L9IvxRipQXiZ83SxFs0Ro,267
9
9
  dtlpy/assets/mock.json,sha256=aByh4XlsFQJM2pOjmd7bd9zT1LSOj5pfutZDHwt8c_8,149
@@ -42,16 +42,16 @@ dtlpy/callbacks/piper_progress_reporter.py,sha256=L9OK-n6zqBP0SFhq0lrMXuMjf4uWfy
42
42
  dtlpy/callbacks/progress_viewer.py,sha256=ZZw8ljXVP2kpndLRxOhY09dOgUN7Luop-4TUuT5nSDc,2314
43
43
  dtlpy/dlp/__init__.py,sha256=QG_BxSqeic0foFBmzIkpZEF4EvxOZamknj2f5Cb6T6Q,868
44
44
  dtlpy/dlp/cli_utilities.py,sha256=Kzr-AKbRlXLdGKY2RTUNm0U_vKHxyMOB17TQegeDMdM,16037
45
- dtlpy/dlp/command_executor.py,sha256=1cnFX9eRV_4wrjIiJCUrLhj5fh-OnLIhUROezkD1_Ks,31529
45
+ dtlpy/dlp/command_executor.py,sha256=JKtRKTwrKfkXHa1VuFhPw15FuwexBPq_9ANAu2pSyXs,32113
46
46
  dtlpy/dlp/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
47
47
  dtlpy/dlp/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
48
48
  dtlpy/dlp/dlp.py,sha256=YjNBjeCDTXJ7tj8qdiGZ8lFb8DtPZl-FvViyjxt9xF8,4278
49
- dtlpy/dlp/parser.py,sha256=dU8hwomLdBs5MdCUsm574eipgo0Q4SJuvXPrc3KtlwY,30551
50
- dtlpy/entities/__init__.py,sha256=eRIF_SjX2pxZUT7p4NLYPy2Ew2-03PdxkvvhQF_5yhI,4487
49
+ dtlpy/dlp/parser.py,sha256=p-TFaiAU2c3QkI97TXzL2LDR3Eq0hGDFrTc9J2jWLh4,30551
50
+ dtlpy/entities/__init__.py,sha256=cwA3ZOsZbdiixwhH6D15sU_bwybDAB8P2mg1zThajBU,4510
51
51
  dtlpy/entities/analytic.py,sha256=5eAavh_NmvSWsD7uzon2vQn08chbc-dh1nlJc0awkQI,11374
52
52
  dtlpy/entities/annotation.py,sha256=s-g39sdUFafhsbGN1Taf2DSqoKbyRtWc0TVNhPpEAwA,67515
53
53
  dtlpy/entities/annotation_collection.py,sha256=Uh7pnyhAv4epMApHRtIdWRG_ro9U6p7yNV7Lnjzdzqk,29979
54
- dtlpy/entities/app.py,sha256=IuqIlDPGSjBvhfNf5cS3FbkllHnpjaWNd-aACNbwG4Y,5021
54
+ dtlpy/entities/app.py,sha256=7i7xDRnyN2PgJ_oUNfhkTh7CxRHaXf-uGS2eX_DjAAg,6295
55
55
  dtlpy/entities/app_module.py,sha256=0UiAbBX1q8iEImi3nY7ySWZZHoRRwu0qUXmyXmgVAc4,3645
56
56
  dtlpy/entities/artifact.py,sha256=wtLtBuidOPbnba0ok40JyunCCIBGbAl4bP_ebK39Kk4,5711
57
57
  dtlpy/entities/assignment.py,sha256=LTUxE2ZB5iZSbSeoroHe5P7Kv6E_K2b5cdY-7TZ4HFE,14346
@@ -59,37 +59,37 @@ dtlpy/entities/base_entity.py,sha256=i8VzoXdkkJbUJD7U7U-bkbQKiUWkRwZZhl-mQT5WUsc
59
59
  dtlpy/entities/bot.py,sha256=is3NUCnPg56HSjsHIvFcVkymValMqDV0uHRDC1Ib-ds,3819
60
60
  dtlpy/entities/codebase.py,sha256=pwRkAq2GV0wvmzshg89IAmE-0I2Wsy_-QNOu8OV8uqc,8999
61
61
  dtlpy/entities/command.py,sha256=dv7w0GfTqq4OeLUoAUElYCdOrvE2Lp9Cx-XdA9N4314,4976
62
- dtlpy/entities/dataset.py,sha256=6n_0TeH4A8Je-ZUwX1Vc2GFJO9k8HU67n_j2hHWcFi4,44831
62
+ dtlpy/entities/dataset.py,sha256=6rqfC4YA6q75-q3Hbfv2XR4tGkajMwXEgzP-b0OQw8U,45075
63
63
  dtlpy/entities/directory_tree.py,sha256=Rni6pLSWytR6yeUPgEdCCRfTg_cqLOdUc9uCqz9KT-Q,1186
64
- dtlpy/entities/dpk.py,sha256=QnmFAroFkxbCrGP9z47faxbo3CetWoBFTC2vfX7hIlY,16746
64
+ dtlpy/entities/dpk.py,sha256=zTqzFIIagaJ3jUcFFI3wAmmNzVD4q0fBt41Ts0TLxeg,16788
65
65
  dtlpy/entities/driver.py,sha256=O_QdK1EaLjQyQkmvKsmkNgmvmMb1mPjKnJGxK43KrOA,7197
66
66
  dtlpy/entities/execution.py,sha256=xZxfF3tYtf7tJ_GKzwSoEkF1zhlnWmbBzLoVXrNl8DE,12800
67
67
  dtlpy/entities/feature.py,sha256=9fFjD0W57anOVSAVU55ypxN_WTCsWTG03Wkc3cAAj78,3732
68
68
  dtlpy/entities/feature_set.py,sha256=lKbaLLklYC8dZGCDzQa8T-LSYpUygqLwlC_jhHtOfLw,4326
69
- dtlpy/entities/filters.py,sha256=HV06ipH6APG1r4PnlUVvlIMSoR76kbk7Nywz8-kcwpM,18826
70
- dtlpy/entities/integration.py,sha256=BaqdMbI4OqRVpB_GX1pHfNYgDO8OBfV06wKRNFR1ohI,5482
69
+ dtlpy/entities/filters.py,sha256=H3_EYUNp0K8HHcddma1s308EIM0ALmXCJxmPyXA7GzU,19029
70
+ dtlpy/entities/integration.py,sha256=Hi4PsIbrVx0LnytxI9GtPcrqRgm8Mq_BZUln1KUtxo8,5733
71
71
  dtlpy/entities/item.py,sha256=JGdBa8RDPWnVOdqRdKoz-T3o8rCOsLbKFdhs0KQDa6o,28369
72
72
  dtlpy/entities/label.py,sha256=ycDYavIgKhz806plIX-64c07_TeHpDa-V7LnfFVe4Rg,3869
73
73
  dtlpy/entities/links.py,sha256=FAmEwHtsrqKet3c0UHH9u_gHgG6_OwF1-rl4xK7guME,2516
74
74
  dtlpy/entities/message.py,sha256=ApJuaKEqxATpXjNYUjGdYPu3ibQzEMo8-LtJ_4xAcPI,5865
75
- dtlpy/entities/model.py,sha256=SProbsv3FVyd_eld3bc3mD-RinldD6Gq797UueEz_EM,24144
75
+ dtlpy/entities/model.py,sha256=GXfQoLa06GSsymBiRTqI2FYegLwyrc5S8lWMwGWxhjw,24959
76
76
  dtlpy/entities/node.py,sha256=jpf_aQRoBxD6XEZ3xjpgTPp8Iuj6Z4mAQbK7RC0Larw,37463
77
77
  dtlpy/entities/ontology.py,sha256=hpex7wLJ2JXMFq3lxLfN49LPz4M3GJIjqD-7HL5hOEw,29265
78
78
  dtlpy/entities/organization.py,sha256=AMkx8hNIIIjnu5pYlNjckMRuKt6H3lnOAqtEynkr7wg,9893
79
79
  dtlpy/entities/package.py,sha256=EA5cB3nFBlsbxVK-QroZILjol2bYSVGqCby-mOyJJjQ,26353
80
80
  dtlpy/entities/package_defaults.py,sha256=wTD7Z7rGYjVy8AcUxTFEnkOkviiJaLVZYvduiUBKNZo,211
81
- dtlpy/entities/package_function.py,sha256=kQsfW-LOTAVd8oDm-F0iWLvKsFmAXSp5ZoBrXPvISRE,6067
82
- dtlpy/entities/package_module.py,sha256=MBaJ5j8eCERsP-s1SIO8_daTU1gEqcaDSpUBu_gUTAk,4035
81
+ dtlpy/entities/package_function.py,sha256=Y24zVxTxN602cv63I8gIZ9J7wu9lThj8XF0xW4cHutk,6166
82
+ dtlpy/entities/package_module.py,sha256=PpEe635I8jnPbA1YDr_5jX3a_mEk-z-mBeX8Lw3HIgY,4134
83
83
  dtlpy/entities/package_slot.py,sha256=XBwCodQe618sQm0bmx46Npo94mEk-zUV7ZX0mDRcsD8,3946
84
84
  dtlpy/entities/paged_entities.py,sha256=A6_D0CUJsN52dBG6yn-oHHzjuVDkBNejTG5r-KxWOxI,5848
85
- dtlpy/entities/pipeline.py,sha256=-_Y50J3bFSfRbZVcqgg4H__x35Jp6fK6aX27o4jL1QQ,20070
85
+ dtlpy/entities/pipeline.py,sha256=Fh3vB2SvM-yhA8wWtIv9zojaqnE2c1cjJQr5CmveBS0,20119
86
86
  dtlpy/entities/pipeline_execution.py,sha256=2FKZhvcksWFYjTBQxnLtpRVy2PFGNkkt0EipWMan1JA,8907
87
87
  dtlpy/entities/project.py,sha256=ZUx8zA3mr6N145M62R3UDPCCzO1vxfyWO6vjES-bO-g,14653
88
88
  dtlpy/entities/prompt_item.py,sha256=42U1gp9CmasMUPjr6JdEXNGfek_lDn8_2M2Xb1GPeSw,2469
89
89
  dtlpy/entities/recipe.py,sha256=m8EDczbNcEY5H8xyyendX5q1ECSC1qrpRmwDQrW221g,10193
90
90
  dtlpy/entities/reflect_dict.py,sha256=2NaSAL-CO0T0FYRYFQlaSpbsoLT2Q18AqdHgQSLX5Y4,3273
91
91
  dtlpy/entities/resource_execution.py,sha256=1HuVV__U4jAUOtOkWlWImnM3Yts8qxMSAkMA9sBhArY,5033
92
- dtlpy/entities/service.py,sha256=hTO2-c52jKgqNa8GSn2_tPFTirfdXjcn7I0DVHcnxiU,28479
92
+ dtlpy/entities/service.py,sha256=8CayT9r84OEUBy7LzIGzHfwIqcNIXyRbfTUiFuprqmY,29053
93
93
  dtlpy/entities/setting.py,sha256=koydO8b0_bWVNklR2vpsXswxzBo8q83XtGk3wkma0MI,8522
94
94
  dtlpy/entities/task.py,sha256=XHiEqZYFlrDCtmw1MXsysjoBLdIzAk7coMrVk8bNIiE,19534
95
95
  dtlpy/entities/time_series.py,sha256=336jWNckjuSn0G29WJFetB7nBoFAKqs4VH9_IB4m4FE,4017
@@ -137,7 +137,7 @@ dtlpy/examples/show_item_and_mask.py,sha256=PmZJWLAULUC1G47CuREDMPsNV6ZHYmDaZABk
137
137
  dtlpy/examples/triggers.py,sha256=LJrwSQ3IoXQroyFNrohEhzWqDsEW9aXa_29FItq1boU,1591
138
138
  dtlpy/examples/upload_batch_of_items.py,sha256=7sVZoHabsGESUCuWc_A2iysdtT5jQ0gXBivaieHgIr0,671
139
139
  dtlpy/examples/upload_items_and_custom_format_annotations.py,sha256=KgGeIs2Q6MoTnWeAVuWJ3Q0Oy5HpaQ97NGMo-Oun6SI,2308
140
- dtlpy/examples/upload_items_with_modalities.py,sha256=YAkiXZnnQKOSh5xGRtx_JPqhuZX5eVETCThevY1UuhM,1848
140
+ dtlpy/examples/upload_items_with_modalities.py,sha256=PJyzPIvRSWi_nh7JlOR9YZKFrMuvYffDx5mz9TiVIvU,1848
141
141
  dtlpy/examples/upload_segmentation_annotations_from_mask_image.py,sha256=JQGc8wQ3zTRRlVcRLs223UwCYCAfChKlvU0QOPEqezI,1388
142
142
  dtlpy/examples/upload_yolo_format_annotations.py,sha256=PDLhC5pBGrC68Pix-7I7SgdaCweYNZPgJxg0h4ssWyc,2610
143
143
  dtlpy/miscellaneous/__init__.py,sha256=twbvfsKdiNHNR-vUuy8nUlY3vuUVaSnm-wO83yQdeFY,829
@@ -147,15 +147,16 @@ dtlpy/miscellaneous/json_utils.py,sha256=0P4YTlL6o_L7AUrvAeqkqA46MZZK_hDdTrdnmI5
147
147
  dtlpy/miscellaneous/list_print.py,sha256=leEg3RodgYfH5t_0JG8VuM8NiesR8sJLK_mRSttL5pY,4808
148
148
  dtlpy/miscellaneous/zipping.py,sha256=GMdPhAeHQXeMS5ClaiKWMJWVYQLBLAaJUWxvdYrL4Ro,5337
149
149
  dtlpy/ml/__init__.py,sha256=vPkyXpc9kcWWZ_PxyPEOsjKBJdEbowLkZr8FZIb_OBM,799
150
- dtlpy/ml/base_model_adapter.py,sha256=5sD5qtMhm_eRLgnnQJT9A9q0L4MpLkzyZtLN_MS3QC0,38767
150
+ dtlpy/ml/base_feature_extractor_adapter.py,sha256=iiEGYAx0Rdn4K46H_FlKrAv3ebTXHSxNVAmio0BxhaI,1178
151
+ dtlpy/ml/base_model_adapter.py,sha256=QTcYhOZ1wiiyVAjFj5tzTl396xpAVw6hSu8Qf3SD3-8,39941
151
152
  dtlpy/ml/metrics.py,sha256=BG2E-1Mvjv2e2No9mIJKVmvzqBvLqytKcw3hA7wVUNc,20037
152
153
  dtlpy/ml/predictions_utils.py,sha256=He_84U14oS2Ss7T_-Zj5GDiBZwS-GjMPURUh7u7DjF8,12484
153
154
  dtlpy/ml/summary_writer.py,sha256=dehDi8zmGC1sAGyy_3cpSWGXoGQSiQd7bL_Thoo8yIs,2784
154
155
  dtlpy/ml/train_utils.py,sha256=R-BHKRfqDoLLhFyLzsRFyJ4E-8iedj9s9oZqy3IO2rg,2404
155
- dtlpy/repositories/__init__.py,sha256=RskGSdPzJwsukYEIgs_7MW_1tqVx6hTPQ2WUhQ5PA5w,1922
156
+ dtlpy/repositories/__init__.py,sha256=_p6RafEniBXbeTAbz8efnIr4G4mCwV9x6LEkXhTRWUE,1949
156
157
  dtlpy/repositories/analytics.py,sha256=dQPCYTPAIuyfVI_ppR49W7_GBj0033feIm9Gd7LW1V0,2966
157
158
  dtlpy/repositories/annotations.py,sha256=E7iHo8UwDAhdulqh0lGr3fGQ-TSwZXXGsEXZA-WJ_NA,35780
158
- dtlpy/repositories/apps.py,sha256=j8KXqR32llwJPes82KuHq5KHcByHSQLO5HqSMbDRKZk,10554
159
+ dtlpy/repositories/apps.py,sha256=6LHvjp8LlHmta4kJo3D4a0potSodfQ59yFkNQ08t4EU,13402
159
160
  dtlpy/repositories/artifacts.py,sha256=Ke2ustTNw-1eQ0onLsWY7gL2aChjXPAX5p1uQ_EzMbo,19081
160
161
  dtlpy/repositories/assignments.py,sha256=M1vlixBdAjwStqCG1MQjHsj3dH15KT0Rb5UTDtyDpEQ,25464
161
162
  dtlpy/repositories/bots.py,sha256=q1SqH01JHloljKxknhHU09psV1vQx9lPhu3g8mBBeRg,8104
@@ -164,25 +165,26 @@ dtlpy/repositories/commands.py,sha256=jJnHctZEloRH6Zxf1yFwpgWrv449EU_40QOexKwKlk
164
165
  dtlpy/repositories/compositions.py,sha256=H417BvlQAiWr5NH2eANFke6CfEO5o7DSvapYpf7v5Hk,2150
165
166
  dtlpy/repositories/datasets.py,sha256=GjJLh5masXCdyuj8jTxvvLIvhxJuXtc0o4pn-Sfjr4A,45084
166
167
  dtlpy/repositories/downloader.py,sha256=pNwL7Nid8xmOyYNiv4DB_WY4RoKlxQ-U9nG2V99Gyr8,41342
167
- dtlpy/repositories/dpks.py,sha256=-E2mrw0tqS2poFwfUPj9pCljgJo19VkxYDRJuKyNd4g,13927
168
+ dtlpy/repositories/dpks.py,sha256=lVaVsDElhO6vfvGbrsKvzAXdY3L4qjQMRCZPWIrDq6A,15380
168
169
  dtlpy/repositories/drivers.py,sha256=fF0UuHCyBzop8pHfryex23mf0kVFAkqzNdOmwBbaWxY,10204
169
- dtlpy/repositories/executions.py,sha256=LexiO2KaTNMpjkDKIxQ5NHRU3huTfvdDZPKAOqUCdSs,30314
170
+ dtlpy/repositories/executions.py,sha256=ixfekN5quQ_tQL7kdfPOb4r3qCvNTlWIBV8hPk2ElbE,30480
170
171
  dtlpy/repositories/feature_sets.py,sha256=xSceAIwK608JSU42IPT1NrvCtnaDJ582JfLd05F3Cck,8811
171
- dtlpy/repositories/features.py,sha256=CiZTnHatek6pqJup1hcHryI-0waagN4273eyhirCxgM,9301
172
- dtlpy/repositories/integrations.py,sha256=oT5N3CMmOtMTrhwJhC_j9GjG0OmHzTcoUDoWDPfszFs,11575
172
+ dtlpy/repositories/features.py,sha256=X9luMRoTMbwhIEh3UTVQtd3jl6ToFUmv9s39EHuLKIc,9616
173
+ dtlpy/repositories/integrations.py,sha256=gNQmw5ykFtBaimdxUkzCXQqefZaM8yQPnxWZkIJK7ww,11666
173
174
  dtlpy/repositories/items.py,sha256=DqJ3g9bc4OLMm9KqI-OebXbr-zcEiohO1wGZJ1uE2Lg,37874
174
175
  dtlpy/repositories/messages.py,sha256=zYcoz8Us6j8Tb5Z7luJuvtO9xSRTuOCS7pl-ztt97Ac,3082
175
- dtlpy/repositories/models.py,sha256=K3MUpSCypkTqfEfDR4ykKMuuTfkWrl2vwioPhZNr13c,32771
176
+ dtlpy/repositories/models.py,sha256=7kYYE0cfw57bsv_T18QqjCBZsd6fSp99y_Vm94Ya44o,34813
176
177
  dtlpy/repositories/nodes.py,sha256=xXJm_YA0vDUn0dVvaGeq6ORM0vI3YXvfjuylvGRtkxo,3061
177
178
  dtlpy/repositories/ontologies.py,sha256=unnMhD2isR9DVE5S8Fg6fSDf1ZZ5Xemxxufx4LEUT3w,19577
178
179
  dtlpy/repositories/organizations.py,sha256=6ijUDFbsogfRul1g_vUB5AZOb41MRmV5NhNU7WLHt3A,22825
179
- dtlpy/repositories/packages.py,sha256=MTVhlcCq2vycUUvEZZdSqSmvf3FuCoQaxcysq0Qh6ok,86610
180
- dtlpy/repositories/pipeline_executions.py,sha256=j5t_PtAHm1s9AIqgBHmnrxC6Z1YqTrI53eYLWWlcMlU,14312
180
+ dtlpy/repositories/packages.py,sha256=FCshPoEDuKNfA3WIPqzqr_w_fJV2dFw2IvLdSuVVxv8,86741
181
+ dtlpy/repositories/pipeline_executions.py,sha256=CYxJ_Lt5yeZI0Y0uhaolmgshu6_96QmPQUtyWrNGYFE,14421
181
182
  dtlpy/repositories/pipelines.py,sha256=VDAOsGbgD1_AKdMrJl_qB3gxPs7f3pwUnPx0pT1iAWk,23977
182
183
  dtlpy/repositories/projects.py,sha256=tZyFLqVs-8ggTIi5echlX7XdGOJGW4LzKuXke7jkRnw,22140
183
- dtlpy/repositories/recipes.py,sha256=kPsN6htcEzdO4JLq3cidzSnZUdx8RDVW2fvNFXdPKWk,15756
184
+ dtlpy/repositories/recipes.py,sha256=ZZDhHn9g28C99bsf0nFaIpVYn6f6Jisz9upkHEkeaYY,15843
184
185
  dtlpy/repositories/resource_executions.py,sha256=PyzsbdJxz6jf17Gx13GZmqdu6tZo3TTVv-DypnJ_sY0,5374
185
- dtlpy/repositories/services.py,sha256=oOatkm_F3C1JMUYvNu8dNRgORvk0_VITck02e29jWEA,66217
186
+ dtlpy/repositories/schema.py,sha256=kTKDrbwm7BfQnBAK81LpAl9ChNFdyUweSLNazlJJhjk,3953
187
+ dtlpy/repositories/services.py,sha256=MDXQ6vAwZNXtBfhjekFHl2vzjGSZdbk6EJ1cAOkkKHs,66355
186
188
  dtlpy/repositories/settings.py,sha256=pvqNse0ANCdU3NSLJEzHco-PZq__OIsPSPVJveB9E4I,12296
187
189
  dtlpy/repositories/tasks.py,sha256=bbk0l0EZzFFEN_TjHBqDh6GNVum3yF902gdjO0iEFhk,48076
188
190
  dtlpy/repositories/times_series.py,sha256=m-bKFEgiZ13yQNelDjBfeXMUy_HgsPD_JAHj1GVx9fU,11420
@@ -192,7 +194,7 @@ dtlpy/repositories/uploader.py,sha256=PzEq4yHsxJT1lv_wYGS-gh7Wmu37TA-14ww_r-6HBr
192
194
  dtlpy/repositories/webhooks.py,sha256=IIpxOJ-7KeQp1TY9aJZz-FuycSjAoYx0TDk8z86KAK8,9033
193
195
  dtlpy/services/__init__.py,sha256=VfVJy2otIrDra6i7Sepjyez2ujiE6171ChQZp-YgxsM,904
194
196
  dtlpy/services/aihttp_retry.py,sha256=tgntZsAY0dW9v08rkjX1T5BLNDdDd8svtgn7nH8DSGU,5022
195
- dtlpy/services/api_client.py,sha256=Ew3neG7P8giK3CwFXYWMJnbRAYbGFA2K_jIVavUqnB8,65848
197
+ dtlpy/services/api_client.py,sha256=u2cp3clDsR9X7Rn_pW82dxSJKWGjHpAifSBWZFGE-2Q,66115
196
198
  dtlpy/services/api_reference.py,sha256=cW-B3eoi9Xs3AwI87_Kr6GV_E6HPoC73aETFaGz3A-0,1515
197
199
  dtlpy/services/async_utils.py,sha256=lfpkTkRUvQoMTxaRZBHbPt5e43qdvpCGDe_-KcY2Jps,2810
198
200
  dtlpy/services/calls_counter.py,sha256=gr0io5rIsO5-7Cgc8neA1vK8kUtYhgFPmDQ2jXtiZZs,1036
@@ -200,16 +202,16 @@ dtlpy/services/check_sdk.py,sha256=tnFWCzkJa8w2jLtw-guwuqpOtXGyiVU7ZCDFiUZUqzY,3
200
202
  dtlpy/services/cookie.py,sha256=sSZR1QV4ienCcZ8lEK_Y4nZYBgAxO3kHrcBXFKGcmwQ,3694
201
203
  dtlpy/services/create_logger.py,sha256=WFQjuvCuwrZoftFaU9jQkmEcOrL1XD-NqsuBqb5_SN4,6332
202
204
  dtlpy/services/events.py,sha256=mpcu8RusLPrBcJEbWR61uFb4FiU_dQv3xoa7uM-rTcY,3686
203
- dtlpy/services/logins.py,sha256=sSE4kmXw9EZylgIQaUYgHH-MgtpEcjUMJpFn5X5C-lA,7906
205
+ dtlpy/services/logins.py,sha256=YMMi_C_A97ZNtIlREE30hpBRhULAZJtORiVL6OL0oPQ,8766
204
206
  dtlpy/services/reporter.py,sha256=4zi9-bshKAPHG2XMOXS39cFZ0mhqNc3Qa9uaMN7CSZ8,9122
205
207
  dtlpy/services/service_defaults.py,sha256=a7KoqkVmn2TXmM9gN9JRaVVtcG2b8JGIieVnaZeEaao,3860
206
208
  dtlpy/utilities/__init__.py,sha256=ncQD1O5lZ7L9n9rNRBivyqNVFDZyQcmqn-X-wyQhhIs,898
207
209
  dtlpy/utilities/base_package_runner.py,sha256=tux_XCiCoOhMPtFaQludzhj0ny6OTKhyoN1aXjPal54,8522
208
- dtlpy/utilities/converter.py,sha256=Bsu_POyokUY2VAMpG6ZNksWCtAOJR29k8u2h9AEPLe4,73804
210
+ dtlpy/utilities/converter.py,sha256=8mOdKiLe1ATgR1Q56-c6d716aKGRt0A3M9AelijaYN8,74816
209
211
  dtlpy/utilities/annotations/__init__.py,sha256=Eb72MloiwDQWe8H4NptFP1RZEEhcY2Fz_w_e34tdCiE,728
210
212
  dtlpy/utilities/annotations/annotation_converters.py,sha256=KOqLVtb88GnrvuVi5x-t5vtzVN9Am98RersBl_D44SU,10796
211
213
  dtlpy/utilities/dataset_generators/__init__.py,sha256=pA7UqhTh51gC407FyNa_WG8fUFnd__4tmEUTkNBlcLs,65
212
- dtlpy/utilities/dataset_generators/dataset_generator.py,sha256=-zVhDESAfy3rMTBE79JuU9S8ENYee_MVoCyWl7mouQk,31380
214
+ dtlpy/utilities/dataset_generators/dataset_generator.py,sha256=QOuydoXL9NlYYMw2jY8Dl6y4dNcldT3kkeu0V95R0MQ,31479
213
215
  dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py,sha256=ZY97o4UAR5tM_req9O1Wh_N-U3cebSypub6kibykYP8,716
214
216
  dtlpy/utilities/dataset_generators/dataset_generator_torch.py,sha256=qPm03zVZmga_BQSyWgcodYQL25WYiiBtz8QpCsU4oYc,536
215
217
  dtlpy/utilities/local_development/__init__.py,sha256=6s1Ns7mN20J3yyIlgQbKAhPRqy7zQo-hIafLDrIj5cg,70
@@ -220,14 +222,14 @@ dtlpy/utilities/reports/report.py,sha256=3nEsNnIWmdPEsd21nN8vMMgaZVcPKn9iawKTTeO
220
222
  dtlpy/utilities/videos/__init__.py,sha256=SV3w51vfPuGBxaMeNemx6qEMHw_C4lLpWNGXMvdsKSY,734
221
223
  dtlpy/utilities/videos/video_player.py,sha256=LCxg0EZ_DeuwcT7U_r7MRC6Q19s0xdFb7x5Gk39PRms,24072
222
224
  dtlpy/utilities/videos/videos.py,sha256=Dj916B4TQRIhI7HZVevl3foFrCsPp0eeWwvGbgX3-_A,21875
223
- dtlpy-1.88.15.data/scripts/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
224
- dtlpy-1.88.15.data/scripts/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
225
- dtlpy-1.88.15.data/scripts/dlp.py,sha256=tEokRaDINISXnq8yNx_CBw1qM5uwjYiZoJOYGqWB3RU,4267
225
+ dtlpy-1.90.37.data/scripts/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
226
+ dtlpy-1.90.37.data/scripts/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
227
+ dtlpy-1.90.37.data/scripts/dlp.py,sha256=tEokRaDINISXnq8yNx_CBw1qM5uwjYiZoJOYGqWB3RU,4267
226
228
  tests/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
227
- tests/features/environment.py,sha256=U3LVKfWcgRXWvG2mBy57uojhKpqbwFykPvae40Ac4ZY,13706
228
- dtlpy-1.88.15.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
229
- dtlpy-1.88.15.dist-info/METADATA,sha256=YoKL73uayKxqEmycCBpNQPLfZ5win2bxQC1ua5mveQ0,3026
230
- dtlpy-1.88.15.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
231
- dtlpy-1.88.15.dist-info/entry_points.txt,sha256=C4PyKthCs_no88HU39eioO68oei64STYXC2ooGZTc4Y,43
232
- dtlpy-1.88.15.dist-info/top_level.txt,sha256=ZWuLmQGUOtWAdgTf4Fbx884w1o0vBYq9dEc1zLv9Mig,12
233
- dtlpy-1.88.15.dist-info/RECORD,,
229
+ tests/features/environment.py,sha256=V0FuAjbwiN1ddlJrCjjGSgPrU9TEQWraZkp1E7QDzdQ,13849
230
+ dtlpy-1.90.37.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
231
+ dtlpy-1.90.37.dist-info/METADATA,sha256=spLXXrJqRARvSiL5MpaflToCFrKek87S0TudPLNfXr4,2976
232
+ dtlpy-1.90.37.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
233
+ dtlpy-1.90.37.dist-info/entry_points.txt,sha256=C4PyKthCs_no88HU39eioO68oei64STYXC2ooGZTc4Y,43
234
+ dtlpy-1.90.37.dist-info/top_level.txt,sha256=ZWuLmQGUOtWAdgTf4Fbx884w1o0vBYq9dEc1zLv9Mig,12
235
+ dtlpy-1.90.37.dist-info/RECORD,,
@@ -153,6 +153,9 @@ def before_feature(context, feature):
153
153
  if 'rc_only' in context.tags and 'rc' not in os.environ.get("DLP_ENV_NAME"):
154
154
  feature.skip("Marked with @rc_only")
155
155
  return
156
+ if 'skip_test' in context.tags:
157
+ feature.skip("Marked with @skip_test")
158
+ return
156
159
 
157
160
 
158
161
  def fix_project_with_frozen_datasets(project):
@@ -166,7 +169,8 @@ def fix_project_with_frozen_datasets(project):
166
169
  def before_tag(context, tag):
167
170
  if "skip_test" in tag:
168
171
  dat = tag.split("_")[-1] if "DAT" in tag else ""
169
- context.scenario.skip(f"Test mark as SKIPPED, Should be merged after {dat}")
172
+ if hasattr(context, "scenario"):
173
+ context.scenario.skip(f"Test mark as SKIPPED, Should be merged after {dat}")
170
174
 
171
175
 
172
176
  @fixture
File without changes