dtlpy 1.114.17__py3-none-any.whl → 1.116.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 -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 +292 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -442
- dtlpy/entities/dataset.py +1299 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -223
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +798 -645
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -953
- 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 -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 +963 -958
- 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 +1257 -1086
- 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 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -435
- dtlpy/repositories/datasets.py +1504 -1291
- dtlpy/repositories/downloader.py +976 -903
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -470
- dtlpy/repositories/executions.py +815 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +255 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -909
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -988
- 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 +419 -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 -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 +1785 -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 +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.114.17.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.114.17.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -183
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.114.17.data/scripts/dlp.bat +0 -2
- dtlpy-1.114.17.dist-info/RECORD +0 -240
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
dtlpy/entities/codebase.py
CHANGED
|
@@ -1,296 +1,292 @@
|
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
@property
|
|
85
|
-
def
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
"""
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
def
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
@property
|
|
261
|
-
def
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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
|
+
self._codebases = repositories.Codebases(client_api=self.client_api,
|
|
63
|
+
dataset=None)
|
|
64
|
+
assert isinstance(self._codebases, repositories.Codebases)
|
|
65
|
+
return self._codebases
|
|
66
|
+
|
|
67
|
+
def to_json(self) -> dict:
|
|
68
|
+
_dict = self._dict.copy()
|
|
69
|
+
return _dict
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def from_json(cls, _json: dict, client_api):
|
|
73
|
+
"""
|
|
74
|
+
:param _json: platform json
|
|
75
|
+
:param client_api: ApiClient entity
|
|
76
|
+
"""
|
|
77
|
+
return cls(_dict=_json.copy(),
|
|
78
|
+
client_api=client_api)
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def git_user_name(self):
|
|
82
|
+
return self.git_url.split('/')[-2]
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def git_repo_name(self):
|
|
86
|
+
last = self.git_url.split('/')[-1]
|
|
87
|
+
return os.path.splitext(last)[0]
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def git_username(self):
|
|
91
|
+
if self.credentials is not None:
|
|
92
|
+
return os.environ.get(
|
|
93
|
+
self.credentials.get('username', {}).get('key', ''),
|
|
94
|
+
None
|
|
95
|
+
)
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def git_password(self):
|
|
100
|
+
if self.credentials is not None:
|
|
101
|
+
return os.environ.get(
|
|
102
|
+
self.credentials.get('password', {}).get('key', ''),
|
|
103
|
+
None
|
|
104
|
+
)
|
|
105
|
+
return None
|
|
106
|
+
|
|
107
|
+
@staticmethod
|
|
108
|
+
def is_git_repo(path):
|
|
109
|
+
"""
|
|
110
|
+
:param path: `str` TODO: Currently only for local folder
|
|
111
|
+
:return: `bool` testing if the path is valid git repo
|
|
112
|
+
"""
|
|
113
|
+
return os.path.isdir(os.path.join(path, '.git'))
|
|
114
|
+
|
|
115
|
+
def unpack(self, local_path):
|
|
116
|
+
"""
|
|
117
|
+
Clones the git codebase
|
|
118
|
+
:param local_path:
|
|
119
|
+
"""
|
|
120
|
+
return self.codebases.clone_git(
|
|
121
|
+
codebase=self,
|
|
122
|
+
local_path=local_path
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class LocalCodebase(entities.DlEntity):
|
|
127
|
+
type: str
|
|
128
|
+
local_path: str
|
|
129
|
+
_client_api: 'services.ClientApi'
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def is_remote(self):
|
|
133
|
+
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
134
|
+
return False
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def is_local(self):
|
|
138
|
+
""" Return whether the codebase is locally and has no management implementations"""
|
|
139
|
+
return not self.is_remote
|
|
140
|
+
|
|
141
|
+
def to_json(self):
|
|
142
|
+
_json = {'type': self.type,
|
|
143
|
+
'localPath': self._local_path}
|
|
144
|
+
return _json
|
|
145
|
+
|
|
146
|
+
@classmethod
|
|
147
|
+
def from_json(cls, _json: dict, client_api):
|
|
148
|
+
"""
|
|
149
|
+
:param _json: platform json
|
|
150
|
+
:param client_api: ApiClient entity
|
|
151
|
+
"""
|
|
152
|
+
return cls(
|
|
153
|
+
client_api=client_api,
|
|
154
|
+
local_path=_json.get('localPath', None),
|
|
155
|
+
type=_json.get('type', None)
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class FilesystemCodebase(entities.DlEntity):
|
|
160
|
+
type: str
|
|
161
|
+
host_path: str
|
|
162
|
+
container_path: str
|
|
163
|
+
_client_api: 'services.ClientApi'
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
def is_remote(self):
|
|
167
|
+
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
168
|
+
return False
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def is_local(self):
|
|
172
|
+
""" Return whether the codebase is locally and has no management implementations"""
|
|
173
|
+
return not self.is_remote
|
|
174
|
+
|
|
175
|
+
def to_json(self):
|
|
176
|
+
_json = super().to_json()
|
|
177
|
+
if self.host_path is not None:
|
|
178
|
+
_json['hostPath'] = self.host_path
|
|
179
|
+
if self.container_path is not None:
|
|
180
|
+
_json['containerPath'] = self.container_path
|
|
181
|
+
return _json
|
|
182
|
+
|
|
183
|
+
@classmethod
|
|
184
|
+
def from_json(cls, _json: dict, client_api):
|
|
185
|
+
"""
|
|
186
|
+
:param _json: platform json
|
|
187
|
+
:param client_api: ApiClient entity
|
|
188
|
+
"""
|
|
189
|
+
return cls(
|
|
190
|
+
client_api=client_api,
|
|
191
|
+
container_path=_json.get('containerPath', None),
|
|
192
|
+
host_path=_json.get('hostPath', None),
|
|
193
|
+
type=_json.get('type', None)
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class ItemCodebase(entities.DlEntity):
|
|
198
|
+
type = entities.DlProperty(location=['type'], _type=str)
|
|
199
|
+
item_id = entities.DlProperty(location=['itemId'], _type=str)
|
|
200
|
+
_item = entities.DlProperty(location=['item'], _type=str, default=None)
|
|
201
|
+
_codebases = None
|
|
202
|
+
client_api: 'services.ClientApi'
|
|
203
|
+
|
|
204
|
+
@property
|
|
205
|
+
def item(self):
|
|
206
|
+
if self._item is None:
|
|
207
|
+
self._item = self.codebases.items_repository.get(item_id=self.item_id)
|
|
208
|
+
return self._item
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def is_remote(self):
|
|
212
|
+
""" Return whether the codebase is managed remotely and supports upload-download"""
|
|
213
|
+
return True
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
def is_local(self):
|
|
217
|
+
""" Return whether the codebase is locally and has no management implementations"""
|
|
218
|
+
return not self.is_remote
|
|
219
|
+
|
|
220
|
+
@property
|
|
221
|
+
def codebases(self):
|
|
222
|
+
if self._codebases is None:
|
|
223
|
+
if self._item is not None:
|
|
224
|
+
dataset = self.item.dataset
|
|
225
|
+
else:
|
|
226
|
+
dataset = None
|
|
227
|
+
self._codebases = repositories.Codebases(client_api=self.client_api,
|
|
228
|
+
dataset=dataset)
|
|
229
|
+
assert isinstance(self._codebases, repositories.Codebases)
|
|
230
|
+
return self._codebases
|
|
231
|
+
|
|
232
|
+
def to_json(self) -> dict:
|
|
233
|
+
_dict = self._dict.copy()
|
|
234
|
+
_dict.pop('item', None)
|
|
235
|
+
return _dict
|
|
236
|
+
|
|
237
|
+
@classmethod
|
|
238
|
+
def from_json(cls, _json: dict, client_api):
|
|
239
|
+
"""
|
|
240
|
+
:param _json: platform json
|
|
241
|
+
:param client_api: ApiClient entity
|
|
242
|
+
"""
|
|
243
|
+
return cls(_dict=_json.copy(),
|
|
244
|
+
client_api=client_api)
|
|
245
|
+
|
|
246
|
+
def unpack(self, local_path):
|
|
247
|
+
"""
|
|
248
|
+
Clones the git codebase
|
|
249
|
+
:param local_path:
|
|
250
|
+
"""
|
|
251
|
+
return self.codebases.unpack(
|
|
252
|
+
codebase_id=self.item_id,
|
|
253
|
+
local_path=local_path
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
@property
|
|
257
|
+
def version(self):
|
|
258
|
+
return str(self.item.name.split('.')[0])
|
|
259
|
+
|
|
260
|
+
@property
|
|
261
|
+
def md5(self):
|
|
262
|
+
md5 = None
|
|
263
|
+
if 'system' in self.item.metadata:
|
|
264
|
+
md5 = self.item.metadata['system'].get('md5', None)
|
|
265
|
+
return md5
|
|
266
|
+
|
|
267
|
+
@md5.setter
|
|
268
|
+
def md5(self, md5):
|
|
269
|
+
if 'system' not in self.item.metadata:
|
|
270
|
+
self.item.metadata['system'] = dict()
|
|
271
|
+
self.item.metadata['system']['md5'] = md5
|
|
272
|
+
|
|
273
|
+
@property
|
|
274
|
+
def description(self):
|
|
275
|
+
description = None
|
|
276
|
+
if 'system' in self.item.metadata:
|
|
277
|
+
description = self.item.metadata['system'].get('description', None)
|
|
278
|
+
return description
|
|
279
|
+
|
|
280
|
+
@description.setter
|
|
281
|
+
def description(self, description):
|
|
282
|
+
if 'system' not in self.item.metadata:
|
|
283
|
+
self.item.metadata['system'] = dict()
|
|
284
|
+
self.item.metadata['system']['description'] = description
|
|
285
|
+
|
|
286
|
+
def list_versions(self):
|
|
287
|
+
"""
|
|
288
|
+
List Codebase versions
|
|
289
|
+
"""
|
|
290
|
+
# get codebase name
|
|
291
|
+
codebase_name = self.item.filename.split('/')[len(self.item.filename.split('/')) - 2]
|
|
292
|
+
return self.codebases.list_versions(codebase_name=codebase_name)
|