dtlpy 1.99.12__py3-none-any.whl → 1.100.5__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.
dtlpy/__init__.py CHANGED
@@ -239,7 +239,7 @@ def checkout_state():
239
239
 
240
240
 
241
241
  def use_attributes_2(state: bool = True):
242
- warnings.warn("Function 'use_attributes_2()' is deprecated as of version 1.99.11 and has been non-functional since version 1.90.39. To work with attributes 2.0, simply use 'update_attributes()'.", DeprecationWarning)
242
+ warnings.warn("Function 'use_attributes_2()' is deprecated as of version 1.99.12 and has been non-functional since version 1.90.39. To work with attributes 2.0, simply use 'update_attributes()'.", DeprecationWarning)
243
243
  client_api.attributes_mode.use_attributes_2 = state
244
244
 
245
245
 
dtlpy/__version__.py CHANGED
@@ -1 +1 @@
1
- version = '1.99.12'
1
+ version = '1.100.5'
@@ -15,12 +15,31 @@ class Segmentation(BaseAnnotationDefinition):
15
15
  """
16
16
  type = "binary"
17
17
 
18
- def __init__(self, geo, label, attributes=None, description=None, color=None):
18
+ def __init__(self, geo: np.ndarray, label: str, attributes=None, description=None, color=None):
19
19
  super().__init__(description=description, attributes=attributes)
20
- self.geo = geo
20
+ self._geo = geo
21
+ self._coordinates = None
21
22
  self.label = label
22
23
  self._color = color
23
24
 
25
+ @property
26
+ def geo(self) -> np.ndarray:
27
+ if self._geo is None:
28
+ self._geo = self.from_coordinates(self._coordinates)
29
+ if self._color is None:
30
+ color = None
31
+ fill_coordinates = self._geo.nonzero()
32
+ if len(fill_coordinates) > 0 and len(fill_coordinates[0]) > 0 and len(fill_coordinates[1]) > 0:
33
+ color = self._geo[fill_coordinates[0][0]][fill_coordinates[1][0]]
34
+ self._color = color
35
+ self._geo = (self._geo[:, :, 3] > 127).astype(float)
36
+ return self._geo
37
+
38
+ @geo.setter
39
+ def geo(self, geo: np.ndarray):
40
+ self._geo = geo
41
+ self._coordinates = None
42
+
24
43
  @property
25
44
  def x(self):
26
45
  return
@@ -106,25 +125,31 @@ class Segmentation(BaseAnnotationDefinition):
106
125
  return image
107
126
 
108
127
  def to_coordinates(self, color=None):
109
- if color is None:
110
- if self._color:
128
+ need_encode = False
129
+ if color is not None and self._color is not None:
130
+ # if input color is not the same as the annotation's color - need to re-encode
131
+ if self._color != color:
132
+ need_encode = True
133
+
134
+ if need_encode or self._coordinates is None:
135
+ if self._color is not None:
111
136
  color = self._color
112
137
  else:
113
138
  color = (255, 255, 255)
114
- max_val = np.max(self.geo)
115
- if max_val > 1:
116
- self.geo = self.geo / max_val
117
- png_ann = np.stack((color[0] * self.geo,
118
- color[1] * self.geo,
119
- color[2] * self.geo,
120
- 255 * self.geo),
121
- axis=2).astype(np.uint8)
122
- pil_img = Image.fromarray(png_ann)
123
- buff = io.BytesIO()
124
- pil_img.save(buff, format="PNG")
125
- new_image_string = base64.b64encode(buff.getvalue()).decode("utf-8")
126
- coordinates = "data:image/png;base64,%s" % new_image_string
127
- return coordinates
139
+ max_val = np.max(self.geo)
140
+ if max_val > 1:
141
+ self.geo = self.geo / max_val
142
+ png_ann = np.stack((color[0] * self.geo,
143
+ color[1] * self.geo,
144
+ color[2] * self.geo,
145
+ 255 * self.geo),
146
+ axis=2).astype(np.uint8)
147
+ pil_img = Image.fromarray(png_ann)
148
+ buff = io.BytesIO()
149
+ pil_img.save(buff, format="PNG")
150
+ new_image_string = base64.b64encode(buff.getvalue()).decode("utf-8")
151
+ self._coordinates = "data:image/png;base64,%s" % new_image_string
152
+ return self._coordinates
128
153
 
129
154
  def to_box(self):
130
155
  """
@@ -186,23 +211,22 @@ class Segmentation(BaseAnnotationDefinition):
186
211
  else:
187
212
  raise TypeError('unknown binary data type')
188
213
  decode = base64.b64decode(data)
189
- return np.array(Image.open(io.BytesIO(decode)))
214
+ mask = np.array(Image.open(io.BytesIO(decode)))
215
+ return mask
190
216
 
191
217
  @classmethod
192
218
  def from_json(cls, _json):
193
219
  if "coordinates" in _json:
194
- mask = cls.from_coordinates(_json["coordinates"])
220
+ coordinates = _json["coordinates"]
195
221
  elif "data" in _json:
196
- mask = cls.from_coordinates(_json["data"])
222
+ coordinates = _json["data"]
197
223
  else:
198
224
  raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
199
- fill_coordinates = mask.nonzero()
200
- color = None
201
- if len(fill_coordinates) > 0 and len(fill_coordinates[0]) > 0 and len(fill_coordinates[1]) > 0:
202
- color = mask[fill_coordinates[0][0]][fill_coordinates[1][0]]
203
- return cls(
204
- geo=(mask[:, :, 3] > 127).astype(float),
225
+ inst = cls(
226
+ geo=None,
205
227
  label=_json["label"],
206
228
  attributes=_json.get("attributes", None),
207
- color=color
229
+ color=None
208
230
  )
231
+ inst._coordinates = coordinates
232
+ return inst
dtlpy/entities/model.py CHANGED
@@ -114,6 +114,7 @@ class Model(entities.BaseEntity):
114
114
  _project = attr.ib(repr=False)
115
115
  _package = attr.ib(repr=False)
116
116
  _dataset = attr.ib(repr=False)
117
+ _feature_set = attr.ib(repr=False)
117
118
  _client_api = attr.ib(type=ApiClient, repr=False)
118
119
  _repositories = attr.ib(repr=False)
119
120
  _ontology = attr.ib(repr=False, default=None)
@@ -191,6 +192,7 @@ class Model(entities.BaseEntity):
191
192
  project=project,
192
193
  package=package,
193
194
  dataset=None,
195
+ feature_set=None,
194
196
  id=_json.get('id', None),
195
197
  url=_json.get('url', None),
196
198
  scope=_json.get('scope', entities.EntityScopeLevel.PROJECT),
@@ -218,6 +220,7 @@ class Model(entities.BaseEntity):
218
220
  attr.fields(Model)._dataset,
219
221
  attr.fields(Model)._ontology,
220
222
  attr.fields(Model)._repositories,
223
+ attr.fields(Model)._feature_set,
221
224
  attr.fields(Model)._client_api,
222
225
  attr.fields(Model).package_id,
223
226
  attr.fields(Model).project_id,
@@ -267,6 +270,30 @@ class Model(entities.BaseEntity):
267
270
  assert isinstance(self._project, entities.Project)
268
271
  return self._project
269
272
 
273
+ @property
274
+ def feature_set(self) -> 'entities.FeatureSet':
275
+ if self._feature_set is None:
276
+ filters = entities.Filters(field='modelId',
277
+ values=self.id,
278
+ resource=entities.FiltersResource.FEATURE_SET)
279
+ feature_sets = self.project.feature_sets.list(filters=filters)
280
+ if feature_sets.items_count > 1:
281
+ logger.warning("Found more than one feature set associated with model entity. Returning first result."
282
+ "Set feature_set if other feature set entity is needed.")
283
+ self._feature_set = feature_sets.items[0]
284
+ elif feature_sets.items_count == 1:
285
+ self._feature_set = feature_sets.items[0]
286
+ else:
287
+ self._feature_set = None
288
+ return self._feature_set
289
+
290
+ @feature_set.setter
291
+ def feature_set(self, feature_set: 'entities.FeatureSet'):
292
+ if not isinstance(feature_set, entities.FeatureSet):
293
+ raise ValueError("feature_set must be of type dl.FeatureSet")
294
+ else:
295
+ self._feature_set = feature_set
296
+
270
297
  @property
271
298
  def package(self):
272
299
  if self._package is None:
@@ -2,7 +2,9 @@ import dataclasses
2
2
  import tempfile
3
3
  import datetime
4
4
  import logging
5
+ import string
5
6
  import shutil
7
+ import random
6
8
  import base64
7
9
  import tqdm
8
10
  import sys
@@ -119,7 +121,7 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
119
121
  if self._model_entity is not None:
120
122
  self.package = self.model_entity.package
121
123
  if self._package is None:
122
- raise ValueError('Missing Package entity on adapter. please set: "adapter.package=package"')
124
+ raise ValueError('Missing Package entity on adapter. Please set: "adapter.package=package"')
123
125
  assert isinstance(self._package, (entities.Package, entities.Dpk))
124
126
  return self._package
125
127
 
@@ -306,7 +308,7 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
306
308
  data_subset_base_path = os.path.join(data_path, subset)
307
309
  if os.path.isdir(data_subset_base_path) and not overwrite:
308
310
  # existing and dont overwrite
309
- self.logger.debug("Subset {!r} Existing (and overwrite=False). Skipping.".format(subset))
311
+ self.logger.debug("Subset {!r} already exists (and overwrite=False). Skipping.".format(subset))
310
312
  else:
311
313
  self.logger.debug("Downloading subset {!r} of {}".format(subset,
312
314
  self.model_entity.dataset.name))
@@ -349,7 +351,7 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
349
351
 
350
352
  :param model_entity: `str` dl.Model entity
351
353
  :param local_path: `str` directory path in local FileSystem to download the model_entity to
352
- :param overwrite: `bool` (default False) if False does not downloads files with same name else (True) download all
354
+ :param overwrite: `bool` (default False) if False does not download files with same name else (True) download all
353
355
  """
354
356
  if model_entity is not None:
355
357
  self.model_entity = model_entity
@@ -387,8 +389,8 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
387
389
  self.save(local_path=local_path, **kwargs)
388
390
 
389
391
  if self.model_entity is None:
390
- raise ValueError('missing model entity on the adapter. '
391
- 'please set one before saving: "adapter.model_entity=model"')
392
+ raise ValueError('Missing model entity on the adapter. '
393
+ 'Please set before saving: "adapter.model_entity=model"')
392
394
 
393
395
  self.model_entity.artifacts.upload(filepath=os.path.join(local_path, '*'),
394
396
  overwrite=True)
@@ -466,9 +468,9 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
466
468
  """
467
469
  Extract feature from an input list of items (or single) and return the items and the feature vector.
468
470
 
469
- :param items: `List[dl.Item]` list of items to predict
471
+ :param items: `List[dl.Item]` list of items to embed
470
472
  :param upload_features: `bool` uploads the features on the given items
471
- :param batch_size: `int` size of batch to run a single inference
473
+ :param batch_size: `int` size of batch to run a single embed
472
474
 
473
475
  :return: `List[dl.Item]`, `List[List[vector]]`
474
476
  """
@@ -477,16 +479,18 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
477
479
  upload_features = self.adapter_defaults.resolve("upload_features", upload_features)
478
480
  input_type = self.model_entity.input_type
479
481
  self.logger.debug(
480
- "Predicting {} items, using batch size {}. input type: {}".format(len(items), batch_size, input_type))
482
+ "Embedding {} items, using batch size {}. input type: {}".format(len(items), batch_size, input_type))
481
483
 
482
484
  # Search for existing feature set for this model id
483
- filters = entities.Filters(field='modelId',
484
- values=self.model_entity.id,
485
- resource=entities.FiltersResource.FEATURE_SET)
486
- pages = self.model_entity.project.feature_sets.list(filters)
487
- if pages.items_count == 0:
488
- feature_set_name = self.configuration.get('featureSetName', self.model_entity.name)
485
+ feature_set = self.model_entity.feature_set
486
+ if feature_set is None:
489
487
  logger.info('Feature Set not found. creating... ')
488
+ try:
489
+ self.model_entity.project.feature_sets.get(name=self.model_entity.name)
490
+ feature_set_name = f"{self.model_entity.name}-{''.join(random.choices(string.ascii_letters + string.digits, k=5))}"
491
+ logger.warning(f"Feature set with the model name already exists. Creating new feature set with name {feature_set_name}")
492
+ except exceptions.NotFound:
493
+ feature_set_name = self.model_entity.name
490
494
  feature_set = self.model_entity.project.feature_sets.create(name=feature_set_name,
491
495
  entity_type=entities.FeatureEntityType.ITEM,
492
496
  model_id=self.model_entity.id,
@@ -494,22 +498,15 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
494
498
  set_type=self.model_entity.name,
495
499
  size=self.configuration.get('embeddings_size',
496
500
  256))
497
- if 'featureSetName' not in self.model_entity.configuration:
498
- self.model_entity.configuration['featureSetName'] = feature_set_name
499
- self.model_entity.update()
500
501
  logger.info(f'Feature Set created! name: {feature_set.name}, id: {feature_set.id}')
501
- elif pages.items_count > 1:
502
- raise ValueError(
503
- f'More than one feature set for model. model_id: {self.model_entity.id}, feature_sets_ids: {[f.id for f in pages.all()]}')
504
502
  else:
505
- feature_set = pages.items[0]
506
503
  logger.info(f'Feature Set found! name: {feature_set.name}, id: {feature_set.id}')
507
504
 
508
505
  # upload the feature vectors
509
506
  pool = ThreadPoolExecutor(max_workers=16)
510
507
  vectors = list()
511
508
  for i_batch in tqdm.tqdm(range(0, len(items), batch_size),
512
- desc='predicting',
509
+ desc='embedding',
513
510
  unit='bt',
514
511
  leave=None,
515
512
  file=sys.stdout):
@@ -545,19 +542,19 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
545
542
  Extract feature from all items given
546
543
 
547
544
  :param dataset: Dataset entity to predict
548
- :param filters: Filters entity for a filtering before predicting
545
+ :param filters: Filters entity for a filtering before embedding
549
546
  :param upload_features: `bool` uploads the features back to the given items
550
- :param batch_size: `int` size of batch to run a single inference
547
+ :param batch_size: `int` size of batch to run a single embed
551
548
 
552
- :return: `bool` indicating if the prediction process completed successfully
549
+ :return: `bool` indicating if the embedding process completed successfully
553
550
  """
554
551
  if batch_size is None:
555
552
  batch_size = self.configuration.get('batch_size', 4)
556
553
  upload_features = self.adapter_defaults.resolve("upload_features", upload_features)
557
554
 
558
- self.logger.debug("Creating embeddings for dataset (name:{}, id:{}, using batch size {}".format(dataset.name,
559
- dataset.id,
560
- batch_size))
555
+ self.logger.debug("Creating embeddings for dataset (name:{}, id:{}), using batch size {}".format(dataset.name,
556
+ dataset.id,
557
+ batch_size))
561
558
  if not filters:
562
559
  filters = entities.Filters()
563
560
  if filters is not None and isinstance(filters, dict):
@@ -771,7 +768,7 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
771
768
  entity=item)
772
769
  return feature
773
770
  except Exception as e:
774
- logger.error(f'Failed to upload feature vector if length {len(vector)} to item {item.id}, Error: {e}')
771
+ logger.error(f'Failed to upload feature vector of length {len(vector)} to item {item.id}, Error: {e}')
775
772
  return []
776
773
 
777
774
  def _upload_model_annotations(self, item: entities.Item, predictions, clean_annotations):
@@ -794,7 +791,7 @@ class BaseModelAdapter(utilities.BaseServiceRunner):
794
791
  @staticmethod
795
792
  def _item_to_image(item):
796
793
  """
797
- Preprocess items before cvalling the `predict` functions.
794
+ Preprocess items before calling the `predict` functions.
798
795
  Convert item to numpy array
799
796
 
800
797
  :param item:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dtlpy
3
- Version: 1.99.12
3
+ Version: 1.100.5
4
4
  Summary: SDK and CLI for Dataloop platform
5
5
  Home-page: https://github.com/dataloop-ai/dtlpy
6
6
  Author: Dataloop Team
@@ -1,5 +1,5 @@
1
- dtlpy/__init__.py,sha256=XcjyX8cwvOrrIHDS00P2iRvp11Kfysj1-mPlltnIe1s,20899
2
- dtlpy/__version__.py,sha256=4v3cBB21e478cM-NS_h-FMb73VmhWJUy0maYedq5zJY,20
1
+ dtlpy/__init__.py,sha256=1Zngp5ftTgWb3r-sc8z98TYpEs6fOB_7snFhsXYQLVg,20899
2
+ dtlpy/__version__.py,sha256=e4pBVlNGZ5kJJMpSKyUUs4mbQCOloji-ZOOFXliGh94,20
3
3
  dtlpy/exceptions.py,sha256=EQCKs3pwhwZhgMByQN3D3LpWpdxwcKPEEt-bIaDwURM,2871
4
4
  dtlpy/new_instance.py,sha256=u_c6JtgqsKCr7TU24-g7_CaST9ghqamMhM4Z0Zxt50w,10121
5
5
  dtlpy/assets/__init__.py,sha256=D_hAa6NM8Zoy32sF_9b7m0b7I-BQEyBFg8-9Tg2WOeo,976
@@ -71,7 +71,7 @@ dtlpy/entities/item.py,sha256=G6VVcVCudqeShWigZmNIuKD4OkvTRJ05CeXFXNe3Jk8,29691
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=ufrWny7eqpu4J3XKy8SXMLDBnIRuPvcNUcmbtM1pdxc,25567
74
+ dtlpy/entities/model.py,sha256=UJCnb4gvVKpqzu_0U91hFC4_qkcYSoLhupR9lTnWp20,26892
75
75
  dtlpy/entities/node.py,sha256=yPPYDLtNMc6vZbbf4FIffY86y7tkaTvYm42Jb7k3Ofk,39617
76
76
  dtlpy/entities/ontology.py,sha256=ok4p3sLBc_SS5hs2gZr5-gbblrveM7qSIX4z67QSKeQ,31967
77
77
  dtlpy/entities/organization.py,sha256=AMkx8hNIIIjnu5pYlNjckMRuKt6H3lnOAqtEynkr7wg,9893
@@ -112,7 +112,7 @@ dtlpy/entities/annotation_definitions/polygon.py,sha256=gI28yzvYgDj_js6bU9djAzsw
112
112
  dtlpy/entities/annotation_definitions/polyline.py,sha256=8Rid2MxwImHM3-fM-0QjzZZE41-dIpdF45ut8KwNxtA,3237
113
113
  dtlpy/entities/annotation_definitions/pose.py,sha256=Ah4vtcYTEieDHgaZXQGy4KPEZbvTID0CuWHmRiLz3hw,2527
114
114
  dtlpy/entities/annotation_definitions/ref_image.py,sha256=uDXjZPRSU9rjnzkjklUp7P7Bx9ODeBz87vzjz_LHGqA,2826
115
- dtlpy/entities/annotation_definitions/segmentation.py,sha256=TXVvyh4h8I0W93lQ8IuK3wD9xwTLCeGnQwTvLgfrjXg,6475
115
+ dtlpy/entities/annotation_definitions/segmentation.py,sha256=CEHP9iz3Xc8Wu-A8Wy7C0Zcmwo_9OQYC9u4T-XDW5ww,7354
116
116
  dtlpy/entities/annotation_definitions/subtitle.py,sha256=cfNi-19KVYInmxsy5usvjDZdyGgH1Mgss_SiJhT9Bn0,1005
117
117
  dtlpy/entities/annotation_definitions/text.py,sha256=r-7laetbKvXL7hSG7AsRl9B5ZVYopUm5vB7rxgkmrCo,2559
118
118
  dtlpy/entities/annotation_definitions/undefined_annotation.py,sha256=XUocNEnmWst4D0erlf8GBAjedgFLy0K6K4fr2p_dNas,1882
@@ -148,7 +148,7 @@ dtlpy/miscellaneous/list_print.py,sha256=leEg3RodgYfH5t_0JG8VuM8NiesR8sJLK_mRStt
148
148
  dtlpy/miscellaneous/zipping.py,sha256=GMdPhAeHQXeMS5ClaiKWMJWVYQLBLAaJUWxvdYrL4Ro,5337
149
149
  dtlpy/ml/__init__.py,sha256=vPkyXpc9kcWWZ_PxyPEOsjKBJdEbowLkZr8FZIb_OBM,799
150
150
  dtlpy/ml/base_feature_extractor_adapter.py,sha256=iiEGYAx0Rdn4K46H_FlKrAv3ebTXHSxNVAmio0BxhaI,1178
151
- dtlpy/ml/base_model_adapter.py,sha256=DCf9anJLrxh-kBr1WdgXtx84oqBlAue87QV_1V-260E,50881
151
+ dtlpy/ml/base_model_adapter.py,sha256=y7txv5JdTpVCZY6IvYXiQRSz4k3YXhHFEKoDTkcVHz0,50610
152
152
  dtlpy/ml/metrics.py,sha256=BG2E-1Mvjv2e2No9mIJKVmvzqBvLqytKcw3hA7wVUNc,20037
153
153
  dtlpy/ml/predictions_utils.py,sha256=He_84U14oS2Ss7T_-Zj5GDiBZwS-GjMPURUh7u7DjF8,12484
154
154
  dtlpy/ml/summary_writer.py,sha256=dehDi8zmGC1sAGyy_3cpSWGXoGQSiQd7bL_Thoo8yIs,2784
@@ -223,9 +223,9 @@ dtlpy/utilities/reports/report.py,sha256=3nEsNnIWmdPEsd21nN8vMMgaZVcPKn9iawKTTeO
223
223
  dtlpy/utilities/videos/__init__.py,sha256=SV3w51vfPuGBxaMeNemx6qEMHw_C4lLpWNGXMvdsKSY,734
224
224
  dtlpy/utilities/videos/video_player.py,sha256=LCxg0EZ_DeuwcT7U_r7MRC6Q19s0xdFb7x5Gk39PRms,24072
225
225
  dtlpy/utilities/videos/videos.py,sha256=Dj916B4TQRIhI7HZVevl3foFrCsPp0eeWwvGbgX3-_A,21875
226
- dtlpy-1.99.12.data/scripts/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
227
- dtlpy-1.99.12.data/scripts/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
228
- dtlpy-1.99.12.data/scripts/dlp.py,sha256=tEokRaDINISXnq8yNx_CBw1qM5uwjYiZoJOYGqWB3RU,4267
226
+ dtlpy-1.100.5.data/scripts/dlp,sha256=-F0vSCWuSOOtgERAtsPMPyMmzitjhB7Yeftg_PDlDjw,10
227
+ dtlpy-1.100.5.data/scripts/dlp.bat,sha256=QOvx8Dlx5dUbCTMpwbhOcAIXL1IWmgVRSboQqDhIn3A,37
228
+ dtlpy-1.100.5.data/scripts/dlp.py,sha256=tEokRaDINISXnq8yNx_CBw1qM5uwjYiZoJOYGqWB3RU,4267
229
229
  tests/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
230
  tests/assets/models_flow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
231
  tests/assets/models_flow/failedmain.py,sha256=n8F4eu_u7JPrJ1zedbJPvv9e3lHb3ihoErqrBIcseEc,1847
@@ -233,9 +233,9 @@ tests/assets/models_flow/main.py,sha256=xotAjdHpFnIic3Wb-4f7GSg2igtuXZjvRPiYdCTa
233
233
  tests/assets/models_flow/main_model.py,sha256=Hl_tv7Q6KaRL3yLkpUoLMRqu5-ab1QsUYPL6RPEoamw,2042
234
234
  tests/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
235
  tests/features/environment.py,sha256=V23cUx_p4VpNk9kc2I0BDZJHO_xcJBFJq8m3JlYCooc,16736
236
- dtlpy-1.99.12.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
237
- dtlpy-1.99.12.dist-info/METADATA,sha256=3U06ZlarV9179TJfjRb30SuYE-xXV_1fYeslLvmEAm4,3019
238
- dtlpy-1.99.12.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
239
- dtlpy-1.99.12.dist-info/entry_points.txt,sha256=C4PyKthCs_no88HU39eioO68oei64STYXC2ooGZTc4Y,43
240
- dtlpy-1.99.12.dist-info/top_level.txt,sha256=ZWuLmQGUOtWAdgTf4Fbx884w1o0vBYq9dEc1zLv9Mig,12
241
- dtlpy-1.99.12.dist-info/RECORD,,
236
+ dtlpy-1.100.5.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
237
+ dtlpy-1.100.5.dist-info/METADATA,sha256=vOiJBLBtuWXJGkaq6eI81yRcUyFEAiMM9O6EvxoWtsw,3019
238
+ dtlpy-1.100.5.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
239
+ dtlpy-1.100.5.dist-info/entry_points.txt,sha256=C4PyKthCs_no88HU39eioO68oei64STYXC2ooGZTc4Y,43
240
+ dtlpy-1.100.5.dist-info/top_level.txt,sha256=ZWuLmQGUOtWAdgTf4Fbx884w1o0vBYq9dEc1zLv9Mig,12
241
+ dtlpy-1.100.5.dist-info/RECORD,,
File without changes