dtlpy 1.113.10__py3-none-any.whl → 1.114.13__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 +488 -488
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/__pycache__/__init__.cpython-38.pyc +0 -0
- 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 +311 -311
- 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 +296 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +442 -442
- dtlpy/entities/dataset.py +1285 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +222 -222
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +641 -641
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +953 -953
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +694 -691
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +803 -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 +290 -267
- dtlpy/entities/pipeline.py +593 -593
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +499 -499
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +958 -958
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +491 -491
- 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 +945 -940
- 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 -348
- dtlpy/repositories/commands.py +158 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +434 -406
- dtlpy/repositories/datasets.py +1291 -1291
- dtlpy/repositories/downloader.py +895 -895
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +266 -266
- dtlpy/repositories/executions.py +817 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +238 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +909 -915
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +877 -867
- 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 +448 -448
- dtlpy/repositories/pipelines.py +642 -642
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +399 -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 +1124 -1124
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +651 -651
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1782 -1782
- 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 +264 -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.113.10.data → dtlpy-1.114.13.data}/scripts/dlp +1 -1
- dtlpy-1.114.13.data/scripts/dlp.bat +2 -0
- {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp.py +128 -128
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/LICENSE +200 -200
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/METADATA +172 -172
- dtlpy-1.114.13.dist-info/RECORD +240 -0
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/WHEEL +1 -1
- tests/features/environment.py +551 -550
- dtlpy-1.113.10.data/scripts/dlp.bat +0 -2
- dtlpy-1.113.10.dist-info/RECORD +0 -244
- tests/assets/__init__.py +0 -0
- tests/assets/models_flow/__init__.py +0 -0
- tests/assets/models_flow/failedmain.py +0 -52
- tests/assets/models_flow/main.py +0 -62
- tests/assets/models_flow/main_model.py +0 -54
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/top_level.txt +0 -0
dtlpy/entities/codebase.py
CHANGED
|
@@ -1,296 +1,296 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import os
|
|
3
|
-
|
|
4
|
-
from .. import entities, repositories, services
|
|
5
|
-
|
|
6
|
-
logger = logging.getLogger(name='dtlpy')
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class PackageCodebaseType:
|
|
10
|
-
ITEM = 'item'
|
|
11
|
-
GIT = 'git'
|
|
12
|
-
FILESYSTEM = 'filesystem'
|
|
13
|
-
LOCAL = 'local'
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def Codebase(**kwargs):
|
|
17
|
-
"""
|
|
18
|
-
Factory function to init all codebases types
|
|
19
|
-
"""
|
|
20
|
-
client_api = kwargs.pop('client_api', None)
|
|
21
|
-
# take it out because we dont need it from the factory method
|
|
22
|
-
_dict = kwargs.pop('_dict', None)
|
|
23
|
-
|
|
24
|
-
if kwargs['type'] == PackageCodebaseType.GIT:
|
|
25
|
-
cls = GitCodebase.from_json(_json=kwargs,
|
|
26
|
-
client_api=client_api)
|
|
27
|
-
elif kwargs['type'] == PackageCodebaseType.ITEM:
|
|
28
|
-
cls = ItemCodebase.from_json(_json=kwargs,
|
|
29
|
-
client_api=client_api)
|
|
30
|
-
elif kwargs['type'] == PackageCodebaseType.FILESYSTEM:
|
|
31
|
-
cls = FilesystemCodebase.from_json(_json=kwargs,
|
|
32
|
-
client_api=client_api)
|
|
33
|
-
elif kwargs['type'] == PackageCodebaseType.LOCAL:
|
|
34
|
-
cls = LocalCodebase.from_json(_json=kwargs,
|
|
35
|
-
client_api=client_api)
|
|
36
|
-
else:
|
|
37
|
-
raise ValueError('[Codebase constructor] Unknown codebase type: {}'.format(kwargs['type']))
|
|
38
|
-
return cls
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class GitCodebase(entities.DlEntity):
|
|
42
|
-
type = entities.DlProperty(location=['type'], _type=str, default='git')
|
|
43
|
-
git_url = entities.DlProperty(location=['gitUrl'], _type=str)
|
|
44
|
-
git_tag = entities.DlProperty(location=['gitTag'], _type=str)
|
|
45
|
-
credentials = entities.DlProperty(location=['credentials'], _type=dict)
|
|
46
|
-
_codebases = None
|
|
47
|
-
client_api: 'services.ClientApi'
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
def is_remote(self):
|
|
51
|
-
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
52
|
-
return True
|
|
53
|
-
|
|
54
|
-
@property
|
|
55
|
-
def is_local(self):
|
|
56
|
-
""" Return whether the codebase is locally and has no management implementations"""
|
|
57
|
-
return not self.is_remote
|
|
58
|
-
|
|
59
|
-
@property
|
|
60
|
-
def codebases(self):
|
|
61
|
-
if self._codebases is None:
|
|
62
|
-
if self._item is not None:
|
|
63
|
-
dataset = self.item.dataset
|
|
64
|
-
else:
|
|
65
|
-
dataset = None
|
|
66
|
-
self._codebases = repositories.Codebases(client_api=self.client_api,
|
|
67
|
-
dataset=dataset)
|
|
68
|
-
assert isinstance(self._codebases, repositories.Codebases)
|
|
69
|
-
return self._codebases
|
|
70
|
-
|
|
71
|
-
def to_json(self) -> dict:
|
|
72
|
-
_dict = self._dict.copy()
|
|
73
|
-
return _dict
|
|
74
|
-
|
|
75
|
-
@classmethod
|
|
76
|
-
def from_json(cls, _json: dict, client_api):
|
|
77
|
-
"""
|
|
78
|
-
:param _json: platform json
|
|
79
|
-
:param client_api: ApiClient entity
|
|
80
|
-
"""
|
|
81
|
-
return cls(_dict=_json.copy(),
|
|
82
|
-
client_api=client_api)
|
|
83
|
-
|
|
84
|
-
@property
|
|
85
|
-
def git_user_name(self):
|
|
86
|
-
return self.git_url.split('/')[-2]
|
|
87
|
-
|
|
88
|
-
@property
|
|
89
|
-
def git_repo_name(self):
|
|
90
|
-
last = self.git_url.split('/')[-1]
|
|
91
|
-
return os.path.splitext(last)[0]
|
|
92
|
-
|
|
93
|
-
@property
|
|
94
|
-
def git_username(self):
|
|
95
|
-
if self.credentials is not None:
|
|
96
|
-
return os.environ.get(
|
|
97
|
-
self.credentials.get('username', {}).get('key', ''),
|
|
98
|
-
None
|
|
99
|
-
)
|
|
100
|
-
return None
|
|
101
|
-
|
|
102
|
-
@property
|
|
103
|
-
def git_password(self):
|
|
104
|
-
if self.credentials is not None:
|
|
105
|
-
return os.environ.get(
|
|
106
|
-
self.credentials.get('password', {}).get('key', ''),
|
|
107
|
-
None
|
|
108
|
-
)
|
|
109
|
-
return None
|
|
110
|
-
|
|
111
|
-
@staticmethod
|
|
112
|
-
def is_git_repo(path):
|
|
113
|
-
"""
|
|
114
|
-
:param path: `str` TODO: Currently only for local folder
|
|
115
|
-
:return: `bool` testing if the path is valid git repo
|
|
116
|
-
"""
|
|
117
|
-
return os.path.isdir(os.path.join(path, '.git'))
|
|
118
|
-
|
|
119
|
-
def unpack(self, local_path):
|
|
120
|
-
"""
|
|
121
|
-
Clones the git codebase
|
|
122
|
-
:param local_path:
|
|
123
|
-
"""
|
|
124
|
-
return self.codebases.clone_git(
|
|
125
|
-
codebase=self,
|
|
126
|
-
local_path=local_path
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
class LocalCodebase(entities.DlEntity):
|
|
131
|
-
type: str
|
|
132
|
-
local_path: str
|
|
133
|
-
_client_api: 'services.ClientApi'
|
|
134
|
-
|
|
135
|
-
@property
|
|
136
|
-
def is_remote(self):
|
|
137
|
-
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
138
|
-
return False
|
|
139
|
-
|
|
140
|
-
@property
|
|
141
|
-
def is_local(self):
|
|
142
|
-
""" Return whether the codebase is locally and has no management implementations"""
|
|
143
|
-
return not self.is_remote
|
|
144
|
-
|
|
145
|
-
def to_json(self):
|
|
146
|
-
_json = {'type': self.type,
|
|
147
|
-
'localPath': self._local_path}
|
|
148
|
-
return _json
|
|
149
|
-
|
|
150
|
-
@classmethod
|
|
151
|
-
def from_json(cls, _json: dict, client_api):
|
|
152
|
-
"""
|
|
153
|
-
:param _json: platform json
|
|
154
|
-
:param client_api: ApiClient entity
|
|
155
|
-
"""
|
|
156
|
-
return cls(
|
|
157
|
-
client_api=client_api,
|
|
158
|
-
local_path=_json.get('localPath', None),
|
|
159
|
-
type=_json.get('type', None)
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
class FilesystemCodebase(entities.DlEntity):
|
|
164
|
-
type: str
|
|
165
|
-
host_path: str
|
|
166
|
-
container_path: str
|
|
167
|
-
_client_api: 'services.ClientApi'
|
|
168
|
-
|
|
169
|
-
@property
|
|
170
|
-
def is_remote(self):
|
|
171
|
-
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
172
|
-
return False
|
|
173
|
-
|
|
174
|
-
@property
|
|
175
|
-
def is_local(self):
|
|
176
|
-
""" Return whether the codebase is locally and has no management implementations"""
|
|
177
|
-
return not self.is_remote
|
|
178
|
-
|
|
179
|
-
def to_json(self):
|
|
180
|
-
_json = super().to_json()
|
|
181
|
-
if self.host_path is not None:
|
|
182
|
-
_json['hostPath'] = self.host_path
|
|
183
|
-
if self.container_path is not None:
|
|
184
|
-
_json['containerPath'] = self.container_path
|
|
185
|
-
return _json
|
|
186
|
-
|
|
187
|
-
@classmethod
|
|
188
|
-
def from_json(cls, _json: dict, client_api):
|
|
189
|
-
"""
|
|
190
|
-
:param _json: platform json
|
|
191
|
-
:param client_api: ApiClient entity
|
|
192
|
-
"""
|
|
193
|
-
return cls(
|
|
194
|
-
client_api=client_api,
|
|
195
|
-
container_path=_json.get('containerPath', None),
|
|
196
|
-
host_path=_json.get('hostPath', None),
|
|
197
|
-
type=_json.get('type', None)
|
|
198
|
-
)
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
class ItemCodebase(entities.DlEntity):
|
|
202
|
-
type = entities.DlProperty(location=['type'], _type=str)
|
|
203
|
-
item_id = entities.DlProperty(location=['itemId'], _type=str)
|
|
204
|
-
_item = entities.DlProperty(location=['item'], _type=str, default=None)
|
|
205
|
-
_codebases = None
|
|
206
|
-
client_api: 'services.ClientApi'
|
|
207
|
-
|
|
208
|
-
@property
|
|
209
|
-
def item(self):
|
|
210
|
-
if self._item is None:
|
|
211
|
-
self._item = self.codebases.items_repository.get(item_id=self.item_id)
|
|
212
|
-
return self._item
|
|
213
|
-
|
|
214
|
-
@property
|
|
215
|
-
def is_remote(self):
|
|
216
|
-
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
217
|
-
return True
|
|
218
|
-
|
|
219
|
-
@property
|
|
220
|
-
def is_local(self):
|
|
221
|
-
""" Return whether the codebase is locally and has no management implementations"""
|
|
222
|
-
return not self.is_remote
|
|
223
|
-
|
|
224
|
-
@property
|
|
225
|
-
def codebases(self):
|
|
226
|
-
if self._codebases is None:
|
|
227
|
-
if self._item is not None:
|
|
228
|
-
dataset = self.item.dataset
|
|
229
|
-
else:
|
|
230
|
-
dataset = None
|
|
231
|
-
self._codebases = repositories.Codebases(client_api=self.client_api,
|
|
232
|
-
dataset=dataset)
|
|
233
|
-
assert isinstance(self._codebases, repositories.Codebases)
|
|
234
|
-
return self._codebases
|
|
235
|
-
|
|
236
|
-
def to_json(self) -> dict:
|
|
237
|
-
_dict = self._dict.copy()
|
|
238
|
-
_dict.pop('item', None)
|
|
239
|
-
return _dict
|
|
240
|
-
|
|
241
|
-
@classmethod
|
|
242
|
-
def from_json(cls, _json: dict, client_api):
|
|
243
|
-
"""
|
|
244
|
-
:param _json: platform json
|
|
245
|
-
:param client_api: ApiClient entity
|
|
246
|
-
"""
|
|
247
|
-
return cls(_dict=_json.copy(),
|
|
248
|
-
client_api=client_api)
|
|
249
|
-
|
|
250
|
-
def unpack(self, local_path):
|
|
251
|
-
"""
|
|
252
|
-
Clones the git codebase
|
|
253
|
-
:param local_path:
|
|
254
|
-
"""
|
|
255
|
-
return self.codebases.unpack(
|
|
256
|
-
codebase_id=self.item_id,
|
|
257
|
-
local_path=local_path
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
@property
|
|
261
|
-
def version(self):
|
|
262
|
-
return str(self.item.name.split('.')[0])
|
|
263
|
-
|
|
264
|
-
@property
|
|
265
|
-
def md5(self):
|
|
266
|
-
md5 = None
|
|
267
|
-
if 'system' in self.item.metadata:
|
|
268
|
-
md5 = self.item.metadata['system'].get('md5', None)
|
|
269
|
-
return md5
|
|
270
|
-
|
|
271
|
-
@md5.setter
|
|
272
|
-
def md5(self, md5):
|
|
273
|
-
if 'system' not in self.item.metadata:
|
|
274
|
-
self.item.metadata['system'] = dict()
|
|
275
|
-
self.item.metadata['system']['md5'] = md5
|
|
276
|
-
|
|
277
|
-
@property
|
|
278
|
-
def description(self):
|
|
279
|
-
description = None
|
|
280
|
-
if 'system' in self.item.metadata:
|
|
281
|
-
description = self.item.metadata['system'].get('description', None)
|
|
282
|
-
return description
|
|
283
|
-
|
|
284
|
-
@description.setter
|
|
285
|
-
def description(self, description):
|
|
286
|
-
if 'system' not in self.item.metadata:
|
|
287
|
-
self.item.metadata['system'] = dict()
|
|
288
|
-
self.item.metadata['system']['description'] = description
|
|
289
|
-
|
|
290
|
-
def list_versions(self):
|
|
291
|
-
"""
|
|
292
|
-
List Codebase versions
|
|
293
|
-
"""
|
|
294
|
-
# get codebase name
|
|
295
|
-
codebase_name = self.item.filename.split('/')[len(self.item.filename.split('/')) - 2]
|
|
296
|
-
return self.codebases.list_versions(codebase_name=codebase_name)
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
from .. import entities, repositories, services
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(name='dtlpy')
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PackageCodebaseType:
|
|
10
|
+
ITEM = 'item'
|
|
11
|
+
GIT = 'git'
|
|
12
|
+
FILESYSTEM = 'filesystem'
|
|
13
|
+
LOCAL = 'local'
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def Codebase(**kwargs):
|
|
17
|
+
"""
|
|
18
|
+
Factory function to init all codebases types
|
|
19
|
+
"""
|
|
20
|
+
client_api = kwargs.pop('client_api', None)
|
|
21
|
+
# take it out because we dont need it from the factory method
|
|
22
|
+
_dict = kwargs.pop('_dict', None)
|
|
23
|
+
|
|
24
|
+
if kwargs['type'] == PackageCodebaseType.GIT:
|
|
25
|
+
cls = GitCodebase.from_json(_json=kwargs,
|
|
26
|
+
client_api=client_api)
|
|
27
|
+
elif kwargs['type'] == PackageCodebaseType.ITEM:
|
|
28
|
+
cls = ItemCodebase.from_json(_json=kwargs,
|
|
29
|
+
client_api=client_api)
|
|
30
|
+
elif kwargs['type'] == PackageCodebaseType.FILESYSTEM:
|
|
31
|
+
cls = FilesystemCodebase.from_json(_json=kwargs,
|
|
32
|
+
client_api=client_api)
|
|
33
|
+
elif kwargs['type'] == PackageCodebaseType.LOCAL:
|
|
34
|
+
cls = LocalCodebase.from_json(_json=kwargs,
|
|
35
|
+
client_api=client_api)
|
|
36
|
+
else:
|
|
37
|
+
raise ValueError('[Codebase constructor] Unknown codebase type: {}'.format(kwargs['type']))
|
|
38
|
+
return cls
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class GitCodebase(entities.DlEntity):
|
|
42
|
+
type = entities.DlProperty(location=['type'], _type=str, default='git')
|
|
43
|
+
git_url = entities.DlProperty(location=['gitUrl'], _type=str)
|
|
44
|
+
git_tag = entities.DlProperty(location=['gitTag'], _type=str)
|
|
45
|
+
credentials = entities.DlProperty(location=['credentials'], _type=dict)
|
|
46
|
+
_codebases = None
|
|
47
|
+
client_api: 'services.ClientApi'
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def is_remote(self):
|
|
51
|
+
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
52
|
+
return True
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def is_local(self):
|
|
56
|
+
""" Return whether the codebase is locally and has no management implementations"""
|
|
57
|
+
return not self.is_remote
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def codebases(self):
|
|
61
|
+
if self._codebases is None:
|
|
62
|
+
if self._item is not None:
|
|
63
|
+
dataset = self.item.dataset
|
|
64
|
+
else:
|
|
65
|
+
dataset = None
|
|
66
|
+
self._codebases = repositories.Codebases(client_api=self.client_api,
|
|
67
|
+
dataset=dataset)
|
|
68
|
+
assert isinstance(self._codebases, repositories.Codebases)
|
|
69
|
+
return self._codebases
|
|
70
|
+
|
|
71
|
+
def to_json(self) -> dict:
|
|
72
|
+
_dict = self._dict.copy()
|
|
73
|
+
return _dict
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def from_json(cls, _json: dict, client_api):
|
|
77
|
+
"""
|
|
78
|
+
:param _json: platform json
|
|
79
|
+
:param client_api: ApiClient entity
|
|
80
|
+
"""
|
|
81
|
+
return cls(_dict=_json.copy(),
|
|
82
|
+
client_api=client_api)
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def git_user_name(self):
|
|
86
|
+
return self.git_url.split('/')[-2]
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def git_repo_name(self):
|
|
90
|
+
last = self.git_url.split('/')[-1]
|
|
91
|
+
return os.path.splitext(last)[0]
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def git_username(self):
|
|
95
|
+
if self.credentials is not None:
|
|
96
|
+
return os.environ.get(
|
|
97
|
+
self.credentials.get('username', {}).get('key', ''),
|
|
98
|
+
None
|
|
99
|
+
)
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def git_password(self):
|
|
104
|
+
if self.credentials is not None:
|
|
105
|
+
return os.environ.get(
|
|
106
|
+
self.credentials.get('password', {}).get('key', ''),
|
|
107
|
+
None
|
|
108
|
+
)
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
@staticmethod
|
|
112
|
+
def is_git_repo(path):
|
|
113
|
+
"""
|
|
114
|
+
:param path: `str` TODO: Currently only for local folder
|
|
115
|
+
:return: `bool` testing if the path is valid git repo
|
|
116
|
+
"""
|
|
117
|
+
return os.path.isdir(os.path.join(path, '.git'))
|
|
118
|
+
|
|
119
|
+
def unpack(self, local_path):
|
|
120
|
+
"""
|
|
121
|
+
Clones the git codebase
|
|
122
|
+
:param local_path:
|
|
123
|
+
"""
|
|
124
|
+
return self.codebases.clone_git(
|
|
125
|
+
codebase=self,
|
|
126
|
+
local_path=local_path
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class LocalCodebase(entities.DlEntity):
|
|
131
|
+
type: str
|
|
132
|
+
local_path: str
|
|
133
|
+
_client_api: 'services.ClientApi'
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def is_remote(self):
|
|
137
|
+
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
138
|
+
return False
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def is_local(self):
|
|
142
|
+
""" Return whether the codebase is locally and has no management implementations"""
|
|
143
|
+
return not self.is_remote
|
|
144
|
+
|
|
145
|
+
def to_json(self):
|
|
146
|
+
_json = {'type': self.type,
|
|
147
|
+
'localPath': self._local_path}
|
|
148
|
+
return _json
|
|
149
|
+
|
|
150
|
+
@classmethod
|
|
151
|
+
def from_json(cls, _json: dict, client_api):
|
|
152
|
+
"""
|
|
153
|
+
:param _json: platform json
|
|
154
|
+
:param client_api: ApiClient entity
|
|
155
|
+
"""
|
|
156
|
+
return cls(
|
|
157
|
+
client_api=client_api,
|
|
158
|
+
local_path=_json.get('localPath', None),
|
|
159
|
+
type=_json.get('type', None)
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class FilesystemCodebase(entities.DlEntity):
|
|
164
|
+
type: str
|
|
165
|
+
host_path: str
|
|
166
|
+
container_path: str
|
|
167
|
+
_client_api: 'services.ClientApi'
|
|
168
|
+
|
|
169
|
+
@property
|
|
170
|
+
def is_remote(self):
|
|
171
|
+
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
172
|
+
return False
|
|
173
|
+
|
|
174
|
+
@property
|
|
175
|
+
def is_local(self):
|
|
176
|
+
""" Return whether the codebase is locally and has no management implementations"""
|
|
177
|
+
return not self.is_remote
|
|
178
|
+
|
|
179
|
+
def to_json(self):
|
|
180
|
+
_json = super().to_json()
|
|
181
|
+
if self.host_path is not None:
|
|
182
|
+
_json['hostPath'] = self.host_path
|
|
183
|
+
if self.container_path is not None:
|
|
184
|
+
_json['containerPath'] = self.container_path
|
|
185
|
+
return _json
|
|
186
|
+
|
|
187
|
+
@classmethod
|
|
188
|
+
def from_json(cls, _json: dict, client_api):
|
|
189
|
+
"""
|
|
190
|
+
:param _json: platform json
|
|
191
|
+
:param client_api: ApiClient entity
|
|
192
|
+
"""
|
|
193
|
+
return cls(
|
|
194
|
+
client_api=client_api,
|
|
195
|
+
container_path=_json.get('containerPath', None),
|
|
196
|
+
host_path=_json.get('hostPath', None),
|
|
197
|
+
type=_json.get('type', None)
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class ItemCodebase(entities.DlEntity):
|
|
202
|
+
type = entities.DlProperty(location=['type'], _type=str)
|
|
203
|
+
item_id = entities.DlProperty(location=['itemId'], _type=str)
|
|
204
|
+
_item = entities.DlProperty(location=['item'], _type=str, default=None)
|
|
205
|
+
_codebases = None
|
|
206
|
+
client_api: 'services.ClientApi'
|
|
207
|
+
|
|
208
|
+
@property
|
|
209
|
+
def item(self):
|
|
210
|
+
if self._item is None:
|
|
211
|
+
self._item = self.codebases.items_repository.get(item_id=self.item_id)
|
|
212
|
+
return self._item
|
|
213
|
+
|
|
214
|
+
@property
|
|
215
|
+
def is_remote(self):
|
|
216
|
+
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
217
|
+
return True
|
|
218
|
+
|
|
219
|
+
@property
|
|
220
|
+
def is_local(self):
|
|
221
|
+
""" Return whether the codebase is locally and has no management implementations"""
|
|
222
|
+
return not self.is_remote
|
|
223
|
+
|
|
224
|
+
@property
|
|
225
|
+
def codebases(self):
|
|
226
|
+
if self._codebases is None:
|
|
227
|
+
if self._item is not None:
|
|
228
|
+
dataset = self.item.dataset
|
|
229
|
+
else:
|
|
230
|
+
dataset = None
|
|
231
|
+
self._codebases = repositories.Codebases(client_api=self.client_api,
|
|
232
|
+
dataset=dataset)
|
|
233
|
+
assert isinstance(self._codebases, repositories.Codebases)
|
|
234
|
+
return self._codebases
|
|
235
|
+
|
|
236
|
+
def to_json(self) -> dict:
|
|
237
|
+
_dict = self._dict.copy()
|
|
238
|
+
_dict.pop('item', None)
|
|
239
|
+
return _dict
|
|
240
|
+
|
|
241
|
+
@classmethod
|
|
242
|
+
def from_json(cls, _json: dict, client_api):
|
|
243
|
+
"""
|
|
244
|
+
:param _json: platform json
|
|
245
|
+
:param client_api: ApiClient entity
|
|
246
|
+
"""
|
|
247
|
+
return cls(_dict=_json.copy(),
|
|
248
|
+
client_api=client_api)
|
|
249
|
+
|
|
250
|
+
def unpack(self, local_path):
|
|
251
|
+
"""
|
|
252
|
+
Clones the git codebase
|
|
253
|
+
:param local_path:
|
|
254
|
+
"""
|
|
255
|
+
return self.codebases.unpack(
|
|
256
|
+
codebase_id=self.item_id,
|
|
257
|
+
local_path=local_path
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
@property
|
|
261
|
+
def version(self):
|
|
262
|
+
return str(self.item.name.split('.')[0])
|
|
263
|
+
|
|
264
|
+
@property
|
|
265
|
+
def md5(self):
|
|
266
|
+
md5 = None
|
|
267
|
+
if 'system' in self.item.metadata:
|
|
268
|
+
md5 = self.item.metadata['system'].get('md5', None)
|
|
269
|
+
return md5
|
|
270
|
+
|
|
271
|
+
@md5.setter
|
|
272
|
+
def md5(self, md5):
|
|
273
|
+
if 'system' not in self.item.metadata:
|
|
274
|
+
self.item.metadata['system'] = dict()
|
|
275
|
+
self.item.metadata['system']['md5'] = md5
|
|
276
|
+
|
|
277
|
+
@property
|
|
278
|
+
def description(self):
|
|
279
|
+
description = None
|
|
280
|
+
if 'system' in self.item.metadata:
|
|
281
|
+
description = self.item.metadata['system'].get('description', None)
|
|
282
|
+
return description
|
|
283
|
+
|
|
284
|
+
@description.setter
|
|
285
|
+
def description(self, description):
|
|
286
|
+
if 'system' not in self.item.metadata:
|
|
287
|
+
self.item.metadata['system'] = dict()
|
|
288
|
+
self.item.metadata['system']['description'] = description
|
|
289
|
+
|
|
290
|
+
def list_versions(self):
|
|
291
|
+
"""
|
|
292
|
+
List Codebase versions
|
|
293
|
+
"""
|
|
294
|
+
# get codebase name
|
|
295
|
+
codebase_name = self.item.filename.split('/')[len(self.item.filename.split('/')) - 2]
|
|
296
|
+
return self.codebases.list_versions(codebase_name=codebase_name)
|
dtlpy/entities/collection.py
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
from .. import entities
|
|
2
|
-
from ..services.api_client import ApiClient
|
|
3
|
-
import attr
|
|
4
|
-
|
|
5
|
-
@attr.s
|
|
6
|
-
class Collection(entities.BaseEntity):
|
|
7
|
-
"""
|
|
8
|
-
Represents a collection in the dataset.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
# sdk
|
|
12
|
-
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
13
|
-
|
|
14
|
-
key = attr.ib(type=str)
|
|
15
|
-
name = attr.ib(type=str)
|
|
16
|
-
|
|
17
|
-
@classmethod
|
|
18
|
-
def from_json(cls, _json, client_api, is_fetched=True):
|
|
19
|
-
"""
|
|
20
|
-
Create a single Collection entity from the dataset JSON.
|
|
21
|
-
|
|
22
|
-
:param _json: A dictionary containing collection data in the format:
|
|
23
|
-
{ "metadata.system.collections.c0": {"name": "Justice League"} }
|
|
24
|
-
:param client_api: The client API instance.
|
|
25
|
-
:param is_fetched: Whether the entity was fetched from the platform.
|
|
26
|
-
:return: A single Collection entity.
|
|
27
|
-
"""
|
|
28
|
-
full_key, value = next(iter(_json.items()))
|
|
29
|
-
# Strip the prefix
|
|
30
|
-
key = full_key.replace("metadata.system.collections.", "")
|
|
31
|
-
name = value.get("name")
|
|
32
|
-
|
|
33
|
-
inst = cls(
|
|
34
|
-
key=key,
|
|
35
|
-
name=name,
|
|
36
|
-
client_api=client_api,
|
|
37
|
-
)
|
|
38
|
-
inst.is_fetched = is_fetched
|
|
1
|
+
from .. import entities
|
|
2
|
+
from ..services.api_client import ApiClient
|
|
3
|
+
import attr
|
|
4
|
+
|
|
5
|
+
@attr.s
|
|
6
|
+
class Collection(entities.BaseEntity):
|
|
7
|
+
"""
|
|
8
|
+
Represents a collection in the dataset.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# sdk
|
|
12
|
+
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
13
|
+
|
|
14
|
+
key = attr.ib(type=str)
|
|
15
|
+
name = attr.ib(type=str)
|
|
16
|
+
|
|
17
|
+
@classmethod
|
|
18
|
+
def from_json(cls, _json, client_api, is_fetched=True):
|
|
19
|
+
"""
|
|
20
|
+
Create a single Collection entity from the dataset JSON.
|
|
21
|
+
|
|
22
|
+
:param _json: A dictionary containing collection data in the format:
|
|
23
|
+
{ "metadata.system.collections.c0": {"name": "Justice League"} }
|
|
24
|
+
:param client_api: The client API instance.
|
|
25
|
+
:param is_fetched: Whether the entity was fetched from the platform.
|
|
26
|
+
:return: A single Collection entity.
|
|
27
|
+
"""
|
|
28
|
+
full_key, value = next(iter(_json.items()))
|
|
29
|
+
# Strip the prefix
|
|
30
|
+
key = full_key.replace("metadata.system.collections.", "")
|
|
31
|
+
name = value.get("name")
|
|
32
|
+
|
|
33
|
+
inst = cls(
|
|
34
|
+
key=key,
|
|
35
|
+
name=name,
|
|
36
|
+
client_api=client_api,
|
|
37
|
+
)
|
|
38
|
+
inst.is_fetched = is_fetched
|
|
39
39
|
return inst
|