dtlpy 1.115.44__py3-none-any.whl → 1.117.6__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 +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +347 -347
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +292 -292
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -449
- dtlpy/entities/dataset.py +1299 -1299
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -235
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +152 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +975 -959
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -505
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +974 -963
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +1287 -1230
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -332
- dtlpy/repositories/commands.py +152 -152
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -439
- dtlpy/repositories/datasets.py +1585 -1504
- dtlpy/repositories/downloader.py +1157 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +256 -226
- dtlpy/repositories/features.py +255 -255
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -912
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -1000
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +429 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -661
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1786 -1785
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +285 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.115.44.data → dtlpy-1.117.6.data}/scripts/dlp +1 -1
- dtlpy-1.117.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.117.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/METADATA +186 -186
- dtlpy-1.117.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
- dtlpy-1.115.44.dist-info/RECORD +0 -240
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/top_level.txt +0 -0
dtlpy/entities/reflect_dict.py
CHANGED
|
@@ -1,102 +1,102 @@
|
|
|
1
|
-
class ReflectDict(dict):
|
|
2
|
-
|
|
3
|
-
def __init__(self, value_type: type, start: int = None, end: int = None, on_access: callable = None):
|
|
4
|
-
super(ReflectDict, self).__init__()
|
|
5
|
-
self.value_type = value_type
|
|
6
|
-
self.on_access = on_access
|
|
7
|
-
self._start = int(start) if start is not None else 0
|
|
8
|
-
self._end = int(end) if end is not None else 0
|
|
9
|
-
|
|
10
|
-
@property
|
|
11
|
-
def start(self):
|
|
12
|
-
return self._start
|
|
13
|
-
|
|
14
|
-
@start.setter
|
|
15
|
-
def start(self, start):
|
|
16
|
-
if not isinstance(start, float) and not isinstance(start, int):
|
|
17
|
-
raise ValueError('Must input a valid number')
|
|
18
|
-
self._start = int(start) if start is not None else 0
|
|
19
|
-
|
|
20
|
-
@property
|
|
21
|
-
def end(self):
|
|
22
|
-
return self._end
|
|
23
|
-
|
|
24
|
-
@end.setter
|
|
25
|
-
def end(self, end):
|
|
26
|
-
if not isinstance(end, float) and not isinstance(end, int):
|
|
27
|
-
raise ValueError('Must input a valid number')
|
|
28
|
-
self._end = int(end) if end is not None else 0
|
|
29
|
-
|
|
30
|
-
def actual_keys(self):
|
|
31
|
-
return super(ReflectDict, self).keys()
|
|
32
|
-
|
|
33
|
-
def keys(self):
|
|
34
|
-
sorted_keys = list(super(ReflectDict, self).keys())
|
|
35
|
-
sorted_keys.sort()
|
|
36
|
-
|
|
37
|
-
yield self._start
|
|
38
|
-
last_yielded = self._start
|
|
39
|
-
|
|
40
|
-
for key in sorted_keys:
|
|
41
|
-
if last_yielded == key - 1:
|
|
42
|
-
last_yielded = key
|
|
43
|
-
yield key
|
|
44
|
-
else:
|
|
45
|
-
while last_yielded < key:
|
|
46
|
-
last_yielded = last_yielded + 1
|
|
47
|
-
yield last_yielded
|
|
48
|
-
|
|
49
|
-
while last_yielded < self._end:
|
|
50
|
-
last_yielded = last_yielded + 1
|
|
51
|
-
yield last_yielded
|
|
52
|
-
|
|
53
|
-
def values(self):
|
|
54
|
-
for key in self.keys():
|
|
55
|
-
yield self[key]
|
|
56
|
-
|
|
57
|
-
def items(self):
|
|
58
|
-
for key in self.keys():
|
|
59
|
-
yield key, self[key]
|
|
60
|
-
|
|
61
|
-
def __iter__(self):
|
|
62
|
-
return self.keys()
|
|
63
|
-
|
|
64
|
-
def __contains__(self, key):
|
|
65
|
-
return key in list(self.keys())
|
|
66
|
-
|
|
67
|
-
def __setitem__(self, key, value):
|
|
68
|
-
if not isinstance(key, int):
|
|
69
|
-
raise Exception('Key Error - key must be an integer')
|
|
70
|
-
|
|
71
|
-
if key > self._end:
|
|
72
|
-
self._end = key
|
|
73
|
-
|
|
74
|
-
if key < self._start:
|
|
75
|
-
self._start = key
|
|
76
|
-
|
|
77
|
-
super(ReflectDict, self).__setitem__(key, value)
|
|
78
|
-
|
|
79
|
-
def __getitem__(self, key):
|
|
80
|
-
requested_key = key
|
|
81
|
-
if not isinstance(key, int):
|
|
82
|
-
raise Exception('Key Error - key must be an integer')
|
|
83
|
-
|
|
84
|
-
if key < self._start or key > self._end:
|
|
85
|
-
raise KeyError(key)
|
|
86
|
-
elif super(ReflectDict, self).__contains__(key):
|
|
87
|
-
return super(ReflectDict, self).__getitem__(key)
|
|
88
|
-
else:
|
|
89
|
-
while key > self._start:
|
|
90
|
-
key = key - 1
|
|
91
|
-
if super(ReflectDict, self).__contains__(key):
|
|
92
|
-
item = super(ReflectDict, self).__getitem__(key)
|
|
93
|
-
if isinstance(item, self.value_type):
|
|
94
|
-
if self.on_access is not None:
|
|
95
|
-
item = self.on_access(self, actual_key=key, requested_key=requested_key, val=item)
|
|
96
|
-
return item
|
|
97
|
-
else:
|
|
98
|
-
raise Exception('Unknown value type, dict must be of type: {}'.format(
|
|
99
|
-
self.value_type))
|
|
100
|
-
|
|
101
|
-
def __len__(self):
|
|
102
|
-
return len(list(self.keys()))
|
|
1
|
+
class ReflectDict(dict):
|
|
2
|
+
|
|
3
|
+
def __init__(self, value_type: type, start: int = None, end: int = None, on_access: callable = None):
|
|
4
|
+
super(ReflectDict, self).__init__()
|
|
5
|
+
self.value_type = value_type
|
|
6
|
+
self.on_access = on_access
|
|
7
|
+
self._start = int(start) if start is not None else 0
|
|
8
|
+
self._end = int(end) if end is not None else 0
|
|
9
|
+
|
|
10
|
+
@property
|
|
11
|
+
def start(self):
|
|
12
|
+
return self._start
|
|
13
|
+
|
|
14
|
+
@start.setter
|
|
15
|
+
def start(self, start):
|
|
16
|
+
if not isinstance(start, float) and not isinstance(start, int):
|
|
17
|
+
raise ValueError('Must input a valid number')
|
|
18
|
+
self._start = int(start) if start is not None else 0
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def end(self):
|
|
22
|
+
return self._end
|
|
23
|
+
|
|
24
|
+
@end.setter
|
|
25
|
+
def end(self, end):
|
|
26
|
+
if not isinstance(end, float) and not isinstance(end, int):
|
|
27
|
+
raise ValueError('Must input a valid number')
|
|
28
|
+
self._end = int(end) if end is not None else 0
|
|
29
|
+
|
|
30
|
+
def actual_keys(self):
|
|
31
|
+
return super(ReflectDict, self).keys()
|
|
32
|
+
|
|
33
|
+
def keys(self):
|
|
34
|
+
sorted_keys = list(super(ReflectDict, self).keys())
|
|
35
|
+
sorted_keys.sort()
|
|
36
|
+
|
|
37
|
+
yield self._start
|
|
38
|
+
last_yielded = self._start
|
|
39
|
+
|
|
40
|
+
for key in sorted_keys:
|
|
41
|
+
if last_yielded == key - 1:
|
|
42
|
+
last_yielded = key
|
|
43
|
+
yield key
|
|
44
|
+
else:
|
|
45
|
+
while last_yielded < key:
|
|
46
|
+
last_yielded = last_yielded + 1
|
|
47
|
+
yield last_yielded
|
|
48
|
+
|
|
49
|
+
while last_yielded < self._end:
|
|
50
|
+
last_yielded = last_yielded + 1
|
|
51
|
+
yield last_yielded
|
|
52
|
+
|
|
53
|
+
def values(self):
|
|
54
|
+
for key in self.keys():
|
|
55
|
+
yield self[key]
|
|
56
|
+
|
|
57
|
+
def items(self):
|
|
58
|
+
for key in self.keys():
|
|
59
|
+
yield key, self[key]
|
|
60
|
+
|
|
61
|
+
def __iter__(self):
|
|
62
|
+
return self.keys()
|
|
63
|
+
|
|
64
|
+
def __contains__(self, key):
|
|
65
|
+
return key in list(self.keys())
|
|
66
|
+
|
|
67
|
+
def __setitem__(self, key, value):
|
|
68
|
+
if not isinstance(key, int):
|
|
69
|
+
raise Exception('Key Error - key must be an integer')
|
|
70
|
+
|
|
71
|
+
if key > self._end:
|
|
72
|
+
self._end = key
|
|
73
|
+
|
|
74
|
+
if key < self._start:
|
|
75
|
+
self._start = key
|
|
76
|
+
|
|
77
|
+
super(ReflectDict, self).__setitem__(key, value)
|
|
78
|
+
|
|
79
|
+
def __getitem__(self, key):
|
|
80
|
+
requested_key = key
|
|
81
|
+
if not isinstance(key, int):
|
|
82
|
+
raise Exception('Key Error - key must be an integer')
|
|
83
|
+
|
|
84
|
+
if key < self._start or key > self._end:
|
|
85
|
+
raise KeyError(key)
|
|
86
|
+
elif super(ReflectDict, self).__contains__(key):
|
|
87
|
+
return super(ReflectDict, self).__getitem__(key)
|
|
88
|
+
else:
|
|
89
|
+
while key > self._start:
|
|
90
|
+
key = key - 1
|
|
91
|
+
if super(ReflectDict, self).__contains__(key):
|
|
92
|
+
item = super(ReflectDict, self).__getitem__(key)
|
|
93
|
+
if isinstance(item, self.value_type):
|
|
94
|
+
if self.on_access is not None:
|
|
95
|
+
item = self.on_access(self, actual_key=key, requested_key=requested_key, val=item)
|
|
96
|
+
return item
|
|
97
|
+
else:
|
|
98
|
+
raise Exception('Unknown value type, dict must be of type: {}'.format(
|
|
99
|
+
self.value_type))
|
|
100
|
+
|
|
101
|
+
def __len__(self):
|
|
102
|
+
return len(list(self.keys()))
|
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
import attr
|
|
2
|
-
import logging
|
|
3
|
-
import traceback
|
|
4
|
-
|
|
5
|
-
from .. import repositories, entities
|
|
6
|
-
from ..services.api_client import ApiClient
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(name='dtlpy')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@attr.s
|
|
12
|
-
class ResourceExecution(entities.BaseEntity):
|
|
13
|
-
"""
|
|
14
|
-
Resource execution entity
|
|
15
|
-
"""
|
|
16
|
-
# platform
|
|
17
|
-
resource_id = attr.ib()
|
|
18
|
-
resource_type = attr.ib()
|
|
19
|
-
execution_id = attr.ib()
|
|
20
|
-
status = attr.ib()
|
|
21
|
-
timestamp = attr.ib()
|
|
22
|
-
progress = attr.ib()
|
|
23
|
-
message = attr.ib()
|
|
24
|
-
error = attr.ib()
|
|
25
|
-
service_name = attr.ib()
|
|
26
|
-
function_name = attr.ib()
|
|
27
|
-
module_name = attr.ib()
|
|
28
|
-
package_name = attr.ib()
|
|
29
|
-
org_name = attr.ib()
|
|
30
|
-
creator = attr.ib()
|
|
31
|
-
project_id = attr.ib()
|
|
32
|
-
|
|
33
|
-
# sdk
|
|
34
|
-
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
35
|
-
_project = attr.ib()
|
|
36
|
-
resource = attr.ib()
|
|
37
|
-
|
|
38
|
-
@staticmethod
|
|
39
|
-
def _protected_from_json(_json, client_api, project=None, resource=None, is_fetched=True):
|
|
40
|
-
"""
|
|
41
|
-
Same as from_json but with try-except to catch if error
|
|
42
|
-
|
|
43
|
-
:param _json: platform json
|
|
44
|
-
:param client_api: ApiClient entity
|
|
45
|
-
:return:
|
|
46
|
-
"""
|
|
47
|
-
try:
|
|
48
|
-
execution = ResourceExecution.from_json(_json=_json,
|
|
49
|
-
client_api=client_api,
|
|
50
|
-
project=project,
|
|
51
|
-
resource=resource,
|
|
52
|
-
is_fetched=is_fetched)
|
|
53
|
-
status = True
|
|
54
|
-
except Exception:
|
|
55
|
-
execution = traceback.format_exc()
|
|
56
|
-
status = False
|
|
57
|
-
return status, execution
|
|
58
|
-
|
|
59
|
-
@classmethod
|
|
60
|
-
def from_json(cls, _json, client_api, project=None, resource=None, is_fetched=True):
|
|
61
|
-
"""
|
|
62
|
-
:param dict _json: platform json
|
|
63
|
-
:param dl.ApiClient client_api: ApiClient entity
|
|
64
|
-
:param dtlpy.entities.project.Project project: project entity
|
|
65
|
-
:param entity resource: an entity object (item, dataset, ...)
|
|
66
|
-
:param is_fetched: is Entity fetched from Platform
|
|
67
|
-
"""
|
|
68
|
-
if project is not None:
|
|
69
|
-
if project.id != _json.get('projectId', None):
|
|
70
|
-
logger.warning('Execution has been fetched from a project that is not belong to it')
|
|
71
|
-
project = None
|
|
72
|
-
inst = cls(
|
|
73
|
-
resource_id=_json.get('resourceId', None),
|
|
74
|
-
resource_type=_json.get('resourceType', None),
|
|
75
|
-
execution_id=_json.get('executionId', None),
|
|
76
|
-
status=_json.get('status', None),
|
|
77
|
-
timestamp=_json.get('timestamp', None),
|
|
78
|
-
progress=_json.get('progress', None),
|
|
79
|
-
message=_json.get('message', None),
|
|
80
|
-
error=_json.get('error', None),
|
|
81
|
-
service_name=_json.get('serviceName', None),
|
|
82
|
-
function_name=_json.get('functionName', None),
|
|
83
|
-
module_name=_json.get('moduleName', None),
|
|
84
|
-
package_name=_json.get('packageName', None),
|
|
85
|
-
org_name=_json.get('orgName', None),
|
|
86
|
-
creator=_json.get('creator', None),
|
|
87
|
-
project_id=_json.get('projectId', None),
|
|
88
|
-
client_api=client_api,
|
|
89
|
-
project=project,
|
|
90
|
-
resource=resource,
|
|
91
|
-
)
|
|
92
|
-
inst.is_fetched = is_fetched
|
|
93
|
-
return inst
|
|
94
|
-
|
|
95
|
-
def to_json(self):
|
|
96
|
-
"""
|
|
97
|
-
Returns platform _json format of object
|
|
98
|
-
|
|
99
|
-
:return: platform json format of object
|
|
100
|
-
:rtype: dict
|
|
101
|
-
"""
|
|
102
|
-
# get excluded
|
|
103
|
-
_json = attr.asdict(
|
|
104
|
-
self, filter=attr.filters.exclude(
|
|
105
|
-
attr.fields(ResourceExecution)._client_api,
|
|
106
|
-
attr.fields(ResourceExecution)._project,
|
|
107
|
-
attr.fields(ResourceExecution).resource_id,
|
|
108
|
-
attr.fields(ResourceExecution).resource_type,
|
|
109
|
-
attr.fields(ResourceExecution).execution_id,
|
|
110
|
-
attr.fields(ResourceExecution).function_name,
|
|
111
|
-
attr.fields(ResourceExecution).service_name,
|
|
112
|
-
attr.fields(ResourceExecution).module_name,
|
|
113
|
-
attr.fields(ResourceExecution).package_name,
|
|
114
|
-
attr.fields(ResourceExecution).org_name,
|
|
115
|
-
attr.fields(ResourceExecution).project_id,
|
|
116
|
-
)
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
# rename
|
|
120
|
-
_json['projectId'] = self.project_id
|
|
121
|
-
_json['resourceId'] = self.resource_id
|
|
122
|
-
_json['resourceType'] = self.resource_type
|
|
123
|
-
_json['functionName'] = self.function_name
|
|
124
|
-
_json['executionId'] = self.execution_id
|
|
125
|
-
_json['serviceName'] = self.service_name
|
|
126
|
-
_json['moduleName'] = self.module_name
|
|
127
|
-
_json['packageName'] = self.package_name
|
|
128
|
-
_json['orgName'] = self.org_name
|
|
129
|
-
|
|
130
|
-
return _json
|
|
131
|
-
|
|
132
|
-
@property
|
|
133
|
-
def project(self):
|
|
134
|
-
if self._project is None:
|
|
135
|
-
self._project = repositories.Projects(client_api=self._client_api).get(project_id=self.project_id,
|
|
136
|
-
fetch=None)
|
|
137
|
-
assert isinstance(self._project, entities.Project)
|
|
138
|
-
return self._project
|
|
1
|
+
import attr
|
|
2
|
+
import logging
|
|
3
|
+
import traceback
|
|
4
|
+
|
|
5
|
+
from .. import repositories, entities
|
|
6
|
+
from ..services.api_client import ApiClient
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(name='dtlpy')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@attr.s
|
|
12
|
+
class ResourceExecution(entities.BaseEntity):
|
|
13
|
+
"""
|
|
14
|
+
Resource execution entity
|
|
15
|
+
"""
|
|
16
|
+
# platform
|
|
17
|
+
resource_id = attr.ib()
|
|
18
|
+
resource_type = attr.ib()
|
|
19
|
+
execution_id = attr.ib()
|
|
20
|
+
status = attr.ib()
|
|
21
|
+
timestamp = attr.ib()
|
|
22
|
+
progress = attr.ib()
|
|
23
|
+
message = attr.ib()
|
|
24
|
+
error = attr.ib()
|
|
25
|
+
service_name = attr.ib()
|
|
26
|
+
function_name = attr.ib()
|
|
27
|
+
module_name = attr.ib()
|
|
28
|
+
package_name = attr.ib()
|
|
29
|
+
org_name = attr.ib()
|
|
30
|
+
creator = attr.ib()
|
|
31
|
+
project_id = attr.ib()
|
|
32
|
+
|
|
33
|
+
# sdk
|
|
34
|
+
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
35
|
+
_project = attr.ib()
|
|
36
|
+
resource = attr.ib()
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def _protected_from_json(_json, client_api, project=None, resource=None, is_fetched=True):
|
|
40
|
+
"""
|
|
41
|
+
Same as from_json but with try-except to catch if error
|
|
42
|
+
|
|
43
|
+
:param _json: platform json
|
|
44
|
+
:param client_api: ApiClient entity
|
|
45
|
+
:return:
|
|
46
|
+
"""
|
|
47
|
+
try:
|
|
48
|
+
execution = ResourceExecution.from_json(_json=_json,
|
|
49
|
+
client_api=client_api,
|
|
50
|
+
project=project,
|
|
51
|
+
resource=resource,
|
|
52
|
+
is_fetched=is_fetched)
|
|
53
|
+
status = True
|
|
54
|
+
except Exception:
|
|
55
|
+
execution = traceback.format_exc()
|
|
56
|
+
status = False
|
|
57
|
+
return status, execution
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def from_json(cls, _json, client_api, project=None, resource=None, is_fetched=True):
|
|
61
|
+
"""
|
|
62
|
+
:param dict _json: platform json
|
|
63
|
+
:param dl.ApiClient client_api: ApiClient entity
|
|
64
|
+
:param dtlpy.entities.project.Project project: project entity
|
|
65
|
+
:param entity resource: an entity object (item, dataset, ...)
|
|
66
|
+
:param is_fetched: is Entity fetched from Platform
|
|
67
|
+
"""
|
|
68
|
+
if project is not None:
|
|
69
|
+
if project.id != _json.get('projectId', None):
|
|
70
|
+
logger.warning('Execution has been fetched from a project that is not belong to it')
|
|
71
|
+
project = None
|
|
72
|
+
inst = cls(
|
|
73
|
+
resource_id=_json.get('resourceId', None),
|
|
74
|
+
resource_type=_json.get('resourceType', None),
|
|
75
|
+
execution_id=_json.get('executionId', None),
|
|
76
|
+
status=_json.get('status', None),
|
|
77
|
+
timestamp=_json.get('timestamp', None),
|
|
78
|
+
progress=_json.get('progress', None),
|
|
79
|
+
message=_json.get('message', None),
|
|
80
|
+
error=_json.get('error', None),
|
|
81
|
+
service_name=_json.get('serviceName', None),
|
|
82
|
+
function_name=_json.get('functionName', None),
|
|
83
|
+
module_name=_json.get('moduleName', None),
|
|
84
|
+
package_name=_json.get('packageName', None),
|
|
85
|
+
org_name=_json.get('orgName', None),
|
|
86
|
+
creator=_json.get('creator', None),
|
|
87
|
+
project_id=_json.get('projectId', None),
|
|
88
|
+
client_api=client_api,
|
|
89
|
+
project=project,
|
|
90
|
+
resource=resource,
|
|
91
|
+
)
|
|
92
|
+
inst.is_fetched = is_fetched
|
|
93
|
+
return inst
|
|
94
|
+
|
|
95
|
+
def to_json(self):
|
|
96
|
+
"""
|
|
97
|
+
Returns platform _json format of object
|
|
98
|
+
|
|
99
|
+
:return: platform json format of object
|
|
100
|
+
:rtype: dict
|
|
101
|
+
"""
|
|
102
|
+
# get excluded
|
|
103
|
+
_json = attr.asdict(
|
|
104
|
+
self, filter=attr.filters.exclude(
|
|
105
|
+
attr.fields(ResourceExecution)._client_api,
|
|
106
|
+
attr.fields(ResourceExecution)._project,
|
|
107
|
+
attr.fields(ResourceExecution).resource_id,
|
|
108
|
+
attr.fields(ResourceExecution).resource_type,
|
|
109
|
+
attr.fields(ResourceExecution).execution_id,
|
|
110
|
+
attr.fields(ResourceExecution).function_name,
|
|
111
|
+
attr.fields(ResourceExecution).service_name,
|
|
112
|
+
attr.fields(ResourceExecution).module_name,
|
|
113
|
+
attr.fields(ResourceExecution).package_name,
|
|
114
|
+
attr.fields(ResourceExecution).org_name,
|
|
115
|
+
attr.fields(ResourceExecution).project_id,
|
|
116
|
+
)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# rename
|
|
120
|
+
_json['projectId'] = self.project_id
|
|
121
|
+
_json['resourceId'] = self.resource_id
|
|
122
|
+
_json['resourceType'] = self.resource_type
|
|
123
|
+
_json['functionName'] = self.function_name
|
|
124
|
+
_json['executionId'] = self.execution_id
|
|
125
|
+
_json['serviceName'] = self.service_name
|
|
126
|
+
_json['moduleName'] = self.module_name
|
|
127
|
+
_json['packageName'] = self.package_name
|
|
128
|
+
_json['orgName'] = self.org_name
|
|
129
|
+
|
|
130
|
+
return _json
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def project(self):
|
|
134
|
+
if self._project is None:
|
|
135
|
+
self._project = repositories.Projects(client_api=self._client_api).get(project_id=self.project_id,
|
|
136
|
+
fetch=None)
|
|
137
|
+
assert isinstance(self._project, entities.Project)
|
|
138
|
+
return self._project
|