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
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from .. import exceptions, entities, miscellaneous
|
|
4
|
-
from ..services.api_client import ApiClient
|
|
5
|
-
|
|
6
|
-
logger = logging.getLogger(name='dtlpy')
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ResourceExecutions:
|
|
10
|
-
"""
|
|
11
|
-
Resource Executions Repository
|
|
12
|
-
|
|
13
|
-
The ResourceExecutions class allows the users to manage executions (executions of Resource) and their properties.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
def __init__(self,
|
|
17
|
-
client_api: ApiClient,
|
|
18
|
-
project: entities.Project = None,
|
|
19
|
-
resource=None):
|
|
20
|
-
self._client_api = client_api
|
|
21
|
-
self._project = project
|
|
22
|
-
self._resource = resource
|
|
23
|
-
|
|
24
|
-
############
|
|
25
|
-
# entities #
|
|
26
|
-
############
|
|
27
|
-
@property
|
|
28
|
-
def resource(self):
|
|
29
|
-
if self._resource is None:
|
|
30
|
-
raise exceptions.PlatformException(
|
|
31
|
-
error='2001',
|
|
32
|
-
message='Missing "resource". need to set a entity or use resource.executions repository')
|
|
33
|
-
assert hasattr(entities, self._resource.__class__.__name__)
|
|
34
|
-
return self._resource
|
|
35
|
-
|
|
36
|
-
@resource.setter
|
|
37
|
-
def resource(self, resource):
|
|
38
|
-
if not hasattr(entities, self._resource.__class__.__name__):
|
|
39
|
-
raise ValueError('Must input a valid entity')
|
|
40
|
-
self._resource = resource
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def project(self) -> entities.Project:
|
|
44
|
-
if self._project is None:
|
|
45
|
-
raise exceptions.PlatformException(
|
|
46
|
-
error='2001',
|
|
47
|
-
message='Missing "project". need to set a Project entity or use Project.executions repository')
|
|
48
|
-
assert isinstance(self._project, entities.Project)
|
|
49
|
-
return self._project
|
|
50
|
-
|
|
51
|
-
@project.setter
|
|
52
|
-
def project(self, project: entities.Project):
|
|
53
|
-
if not isinstance(project, entities.Project):
|
|
54
|
-
raise ValueError('Must input a valid Project entity')
|
|
55
|
-
self._project = project
|
|
56
|
-
|
|
57
|
-
def _list(self, filters: entities.Filters):
|
|
58
|
-
"""
|
|
59
|
-
List resource executions
|
|
60
|
-
|
|
61
|
-
:param dtlpy.entities.filters.Filters filters: dl.Filters entity to filters items
|
|
62
|
-
:return:
|
|
63
|
-
"""
|
|
64
|
-
url = "/executions/resource/query"
|
|
65
|
-
|
|
66
|
-
# request
|
|
67
|
-
success, response = self._client_api.gen_request(req_type='POST',
|
|
68
|
-
path=url,
|
|
69
|
-
json_req=filters.prepare())
|
|
70
|
-
if not success:
|
|
71
|
-
raise exceptions.PlatformException(response)
|
|
72
|
-
|
|
73
|
-
return response.json()
|
|
74
|
-
|
|
75
|
-
def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
|
|
76
|
-
"""
|
|
77
|
-
List resource executions
|
|
78
|
-
|
|
79
|
-
**Prerequisites**: You must be in the role of an *owner* or *developer*.
|
|
80
|
-
|
|
81
|
-
:param dtlpy.entities.filters.Filters filters: dl.Filters entity to filters items
|
|
82
|
-
:return: Paged entity
|
|
83
|
-
:rtype: dtlpy.entities.paged_entities.PagedEntities
|
|
84
|
-
|
|
85
|
-
**Example**:
|
|
86
|
-
|
|
87
|
-
.. code-block:: python
|
|
88
|
-
|
|
89
|
-
item.resource_executions.list()
|
|
90
|
-
"""
|
|
91
|
-
if filters is None:
|
|
92
|
-
filters = entities.Filters(resource=entities.FiltersResource.RESOURCE_EXECUTION)
|
|
93
|
-
if self._resource is not None:
|
|
94
|
-
filters.add(field='resourceType', values=self._resource.__class__.__name__)
|
|
95
|
-
filters.add(field='resourceId', values=self._resource.id)
|
|
96
|
-
else:
|
|
97
|
-
raise exceptions.PlatformException(
|
|
98
|
-
error='400',
|
|
99
|
-
message='Must have resource')
|
|
100
|
-
# assert type filters
|
|
101
|
-
elif not isinstance(filters, entities.Filters):
|
|
102
|
-
raise exceptions.PlatformException(
|
|
103
|
-
error='400',
|
|
104
|
-
message='Unknown filters type: {!r}'.format(type(filters)))
|
|
105
|
-
if filters.resource != entities.FiltersResource.RESOURCE_EXECUTION:
|
|
106
|
-
raise exceptions.PlatformException(
|
|
107
|
-
error='400',
|
|
108
|
-
message='Filters resource must to be FiltersResource.RESOURCE_EXECUTION. '
|
|
109
|
-
'Got: {!r}'.format(filters.resource))
|
|
110
|
-
if self._project is not None:
|
|
111
|
-
filters.add(field='projectId', values=self._project.id)
|
|
112
|
-
|
|
113
|
-
paged = entities.PagedEntities(items_repository=self,
|
|
114
|
-
filters=filters,
|
|
115
|
-
page_offset=filters.page,
|
|
116
|
-
page_size=filters.page_size,
|
|
117
|
-
client_api=self._client_api)
|
|
118
|
-
paged.get_page()
|
|
119
|
-
return paged
|
|
120
|
-
|
|
121
|
-
def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Execution]:
|
|
122
|
-
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
123
|
-
jobs = [None for _ in range(len(response_items))]
|
|
124
|
-
# return execution list
|
|
125
|
-
for i_item, item in enumerate(response_items):
|
|
126
|
-
jobs[i_item] = pool.submit(entities.ResourceExecution._protected_from_json,
|
|
127
|
-
**{'client_api': self._client_api,
|
|
128
|
-
'_json': item,
|
|
129
|
-
'project': self._project,
|
|
130
|
-
'resource': self._resource})
|
|
131
|
-
|
|
132
|
-
# get results
|
|
133
|
-
results = [j.result() for j in jobs]
|
|
134
|
-
# log errors
|
|
135
|
-
_ = [logger.warning(r[1]) for r in results if r[0] is False]
|
|
136
|
-
# return good jobs
|
|
137
|
-
return miscellaneous.List([r[1] for r in results if r[0] is True])
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from .. import exceptions, entities, miscellaneous
|
|
4
|
+
from ..services.api_client import ApiClient
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(name='dtlpy')
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ResourceExecutions:
|
|
10
|
+
"""
|
|
11
|
+
Resource Executions Repository
|
|
12
|
+
|
|
13
|
+
The ResourceExecutions class allows the users to manage executions (executions of Resource) and their properties.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self,
|
|
17
|
+
client_api: ApiClient,
|
|
18
|
+
project: entities.Project = None,
|
|
19
|
+
resource=None):
|
|
20
|
+
self._client_api = client_api
|
|
21
|
+
self._project = project
|
|
22
|
+
self._resource = resource
|
|
23
|
+
|
|
24
|
+
############
|
|
25
|
+
# entities #
|
|
26
|
+
############
|
|
27
|
+
@property
|
|
28
|
+
def resource(self):
|
|
29
|
+
if self._resource is None:
|
|
30
|
+
raise exceptions.PlatformException(
|
|
31
|
+
error='2001',
|
|
32
|
+
message='Missing "resource". need to set a entity or use resource.executions repository')
|
|
33
|
+
assert hasattr(entities, self._resource.__class__.__name__)
|
|
34
|
+
return self._resource
|
|
35
|
+
|
|
36
|
+
@resource.setter
|
|
37
|
+
def resource(self, resource):
|
|
38
|
+
if not hasattr(entities, self._resource.__class__.__name__):
|
|
39
|
+
raise ValueError('Must input a valid entity')
|
|
40
|
+
self._resource = resource
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def project(self) -> entities.Project:
|
|
44
|
+
if self._project is None:
|
|
45
|
+
raise exceptions.PlatformException(
|
|
46
|
+
error='2001',
|
|
47
|
+
message='Missing "project". need to set a Project entity or use Project.executions repository')
|
|
48
|
+
assert isinstance(self._project, entities.Project)
|
|
49
|
+
return self._project
|
|
50
|
+
|
|
51
|
+
@project.setter
|
|
52
|
+
def project(self, project: entities.Project):
|
|
53
|
+
if not isinstance(project, entities.Project):
|
|
54
|
+
raise ValueError('Must input a valid Project entity')
|
|
55
|
+
self._project = project
|
|
56
|
+
|
|
57
|
+
def _list(self, filters: entities.Filters):
|
|
58
|
+
"""
|
|
59
|
+
List resource executions
|
|
60
|
+
|
|
61
|
+
:param dtlpy.entities.filters.Filters filters: dl.Filters entity to filters items
|
|
62
|
+
:return:
|
|
63
|
+
"""
|
|
64
|
+
url = "/executions/resource/query"
|
|
65
|
+
|
|
66
|
+
# request
|
|
67
|
+
success, response = self._client_api.gen_request(req_type='POST',
|
|
68
|
+
path=url,
|
|
69
|
+
json_req=filters.prepare())
|
|
70
|
+
if not success:
|
|
71
|
+
raise exceptions.PlatformException(response)
|
|
72
|
+
|
|
73
|
+
return response.json()
|
|
74
|
+
|
|
75
|
+
def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
|
|
76
|
+
"""
|
|
77
|
+
List resource executions
|
|
78
|
+
|
|
79
|
+
**Prerequisites**: You must be in the role of an *owner* or *developer*.
|
|
80
|
+
|
|
81
|
+
:param dtlpy.entities.filters.Filters filters: dl.Filters entity to filters items
|
|
82
|
+
:return: Paged entity
|
|
83
|
+
:rtype: dtlpy.entities.paged_entities.PagedEntities
|
|
84
|
+
|
|
85
|
+
**Example**:
|
|
86
|
+
|
|
87
|
+
.. code-block:: python
|
|
88
|
+
|
|
89
|
+
item.resource_executions.list()
|
|
90
|
+
"""
|
|
91
|
+
if filters is None:
|
|
92
|
+
filters = entities.Filters(resource=entities.FiltersResource.RESOURCE_EXECUTION)
|
|
93
|
+
if self._resource is not None:
|
|
94
|
+
filters.add(field='resourceType', values=self._resource.__class__.__name__)
|
|
95
|
+
filters.add(field='resourceId', values=self._resource.id)
|
|
96
|
+
else:
|
|
97
|
+
raise exceptions.PlatformException(
|
|
98
|
+
error='400',
|
|
99
|
+
message='Must have resource')
|
|
100
|
+
# assert type filters
|
|
101
|
+
elif not isinstance(filters, entities.Filters):
|
|
102
|
+
raise exceptions.PlatformException(
|
|
103
|
+
error='400',
|
|
104
|
+
message='Unknown filters type: {!r}'.format(type(filters)))
|
|
105
|
+
if filters.resource != entities.FiltersResource.RESOURCE_EXECUTION:
|
|
106
|
+
raise exceptions.PlatformException(
|
|
107
|
+
error='400',
|
|
108
|
+
message='Filters resource must to be FiltersResource.RESOURCE_EXECUTION. '
|
|
109
|
+
'Got: {!r}'.format(filters.resource))
|
|
110
|
+
if self._project is not None:
|
|
111
|
+
filters.add(field='projectId', values=self._project.id)
|
|
112
|
+
|
|
113
|
+
paged = entities.PagedEntities(items_repository=self,
|
|
114
|
+
filters=filters,
|
|
115
|
+
page_offset=filters.page,
|
|
116
|
+
page_size=filters.page_size,
|
|
117
|
+
client_api=self._client_api)
|
|
118
|
+
paged.get_page()
|
|
119
|
+
return paged
|
|
120
|
+
|
|
121
|
+
def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Execution]:
|
|
122
|
+
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
123
|
+
jobs = [None for _ in range(len(response_items))]
|
|
124
|
+
# return execution list
|
|
125
|
+
for i_item, item in enumerate(response_items):
|
|
126
|
+
jobs[i_item] = pool.submit(entities.ResourceExecution._protected_from_json,
|
|
127
|
+
**{'client_api': self._client_api,
|
|
128
|
+
'_json': item,
|
|
129
|
+
'project': self._project,
|
|
130
|
+
'resource': self._resource})
|
|
131
|
+
|
|
132
|
+
# get results
|
|
133
|
+
results = [j.result() for j in jobs]
|
|
134
|
+
# log errors
|
|
135
|
+
_ = [logger.warning(r[1]) for r in results if r[0] is False]
|
|
136
|
+
# return good jobs
|
|
137
|
+
return miscellaneous.List([r[1] for r in results if r[0] is True])
|
dtlpy/repositories/schema.py
CHANGED
|
@@ -1,120 +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()
|
|
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()
|