dtlpy 1.115.44__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 -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 +145 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -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 +963 -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 +1257 -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 +1504 -1504
- dtlpy/repositories/downloader.py +976 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +226 -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 +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 -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 +1785 -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.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -186
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.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.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.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
dtlpy/entities/gis_item.py
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from typing import List
|
|
3
|
-
import logging
|
|
4
|
-
import os
|
|
5
|
-
|
|
6
|
-
logger = logging.getLogger(name='dtlpy')
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class Layer:
|
|
10
|
-
def __init__(self, name, layer_type, url):
|
|
11
|
-
self.name = name
|
|
12
|
-
self.type = layer_type
|
|
13
|
-
self.url = url
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class ItemGis:
|
|
17
|
-
def __init__(self,
|
|
18
|
-
name: str,
|
|
19
|
-
data: dict = None,
|
|
20
|
-
layer: Layer = None,
|
|
21
|
-
optional_layers: List[Layer] = None,
|
|
22
|
-
zoom: int = None,
|
|
23
|
-
min_zoom: int = None,
|
|
24
|
-
max_zoom: int = None,
|
|
25
|
-
epsg: str = None,
|
|
26
|
-
bounds: list = None,
|
|
27
|
-
aoi: list = None):
|
|
28
|
-
self.name = name
|
|
29
|
-
|
|
30
|
-
self.layer = layer or Layer(name=data.get('name', None), layer_type=data.get('type', None),
|
|
31
|
-
url=data.get('url', None))
|
|
32
|
-
if self.layer is None:
|
|
33
|
-
raise ValueError('layer is required')
|
|
34
|
-
elif self.layer is not None and isinstance(self.layer, dict):
|
|
35
|
-
self.layer = Layer(name=self.layer.get('name', None), layer_type=self.layer.get('type', None), url=self.layer.get('url', None))
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
self.optional_layers = optional_layers or [
|
|
39
|
-
Layer(name=layer.get('name', None), layer_type=layer.get('type', None), url=layer.get('url', None)) for
|
|
40
|
-
layer in data.get('optionalLayers', [])]
|
|
41
|
-
|
|
42
|
-
if self.optional_layers is not None and isinstance(optional_layers, list):
|
|
43
|
-
new_optional_layers = []
|
|
44
|
-
for op_layer in self.optional_layers:
|
|
45
|
-
if isinstance(op_layer, dict):
|
|
46
|
-
new_optional_layers.append(Layer(name=op_layer.get('name', None), layer_type=op_layer.get('type', None), url=op_layer.get('url', None)))
|
|
47
|
-
else:
|
|
48
|
-
new_optional_layers.append(op_layer)
|
|
49
|
-
self.optional_layers = new_optional_layers
|
|
50
|
-
|
|
51
|
-
self.epsg = epsg or data.get('epsg', None)
|
|
52
|
-
if self.epsg is None:
|
|
53
|
-
raise ValueError('epsg is required')
|
|
54
|
-
|
|
55
|
-
self.zoom = zoom or data.get('zoom', None)
|
|
56
|
-
self.min_zoom = min_zoom or data.get('minZoom', None)
|
|
57
|
-
self.max_zoom = max_zoom or data.get('maxZoom', None)
|
|
58
|
-
self.bounds = bounds or data.get('bounds', None)
|
|
59
|
-
self.aoi = aoi or data.get('aoi', None)
|
|
60
|
-
|
|
61
|
-
def to_json(self):
|
|
62
|
-
_json = {
|
|
63
|
-
"type": "gis",
|
|
64
|
-
"shebang": "dataloop",
|
|
65
|
-
"metadata": {
|
|
66
|
-
"dltype": "gis"
|
|
67
|
-
},
|
|
68
|
-
'layer': {
|
|
69
|
-
'name': self.layer.name,
|
|
70
|
-
'type': self.layer.type,
|
|
71
|
-
'url': self.layer.url
|
|
72
|
-
},
|
|
73
|
-
"epsg": self.epsg
|
|
74
|
-
}
|
|
75
|
-
if self.optional_layers is not None:
|
|
76
|
-
_json['optionalLayers'] = [
|
|
77
|
-
{
|
|
78
|
-
'name': layer.name,
|
|
79
|
-
'type': layer.type,
|
|
80
|
-
'url': layer.url
|
|
81
|
-
} for layer in self.optional_layers
|
|
82
|
-
]
|
|
83
|
-
if self.zoom is not None:
|
|
84
|
-
_json['zoom'] = self.zoom
|
|
85
|
-
if self.min_zoom is not None:
|
|
86
|
-
_json['minZoom'] = self.min_zoom
|
|
87
|
-
if self.max_zoom is not None:
|
|
88
|
-
_json['maxZoom'] = self.max_zoom
|
|
89
|
-
if self.bounds is not None:
|
|
90
|
-
_json['bounds'] = self.bounds
|
|
91
|
-
if self.aoi is not None:
|
|
92
|
-
_json['aoi'] = self.aoi
|
|
93
|
-
return _json
|
|
94
|
-
|
|
95
|
-
@classmethod
|
|
96
|
-
def from_local_file(cls, filepath):
|
|
97
|
-
"""
|
|
98
|
-
Create a new prompt item from a file
|
|
99
|
-
:param filepath: path to the file
|
|
100
|
-
:return: PromptItem object
|
|
101
|
-
"""
|
|
102
|
-
if os.path.exists(filepath) is False:
|
|
103
|
-
raise FileNotFoundError(f'File does not exists: {filepath}')
|
|
104
|
-
if 'json' not in os.path.splitext(filepath)[-1]:
|
|
105
|
-
raise ValueError(f'Expected path to json item, got {os.path.splitext(filepath)[-1]}')
|
|
106
|
-
with open(filepath, 'r', encoding='utf-8') as f:
|
|
107
|
-
data = json.load(f)
|
|
1
|
+
import json
|
|
2
|
+
from typing import List
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(name='dtlpy')
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Layer:
|
|
10
|
+
def __init__(self, name, layer_type, url):
|
|
11
|
+
self.name = name
|
|
12
|
+
self.type = layer_type
|
|
13
|
+
self.url = url
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ItemGis:
|
|
17
|
+
def __init__(self,
|
|
18
|
+
name: str,
|
|
19
|
+
data: dict = None,
|
|
20
|
+
layer: Layer = None,
|
|
21
|
+
optional_layers: List[Layer] = None,
|
|
22
|
+
zoom: int = None,
|
|
23
|
+
min_zoom: int = None,
|
|
24
|
+
max_zoom: int = None,
|
|
25
|
+
epsg: str = None,
|
|
26
|
+
bounds: list = None,
|
|
27
|
+
aoi: list = None):
|
|
28
|
+
self.name = name
|
|
29
|
+
|
|
30
|
+
self.layer = layer or Layer(name=data.get('name', None), layer_type=data.get('type', None),
|
|
31
|
+
url=data.get('url', None))
|
|
32
|
+
if self.layer is None:
|
|
33
|
+
raise ValueError('layer is required')
|
|
34
|
+
elif self.layer is not None and isinstance(self.layer, dict):
|
|
35
|
+
self.layer = Layer(name=self.layer.get('name', None), layer_type=self.layer.get('type', None), url=self.layer.get('url', None))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
self.optional_layers = optional_layers or [
|
|
39
|
+
Layer(name=layer.get('name', None), layer_type=layer.get('type', None), url=layer.get('url', None)) for
|
|
40
|
+
layer in data.get('optionalLayers', [])]
|
|
41
|
+
|
|
42
|
+
if self.optional_layers is not None and isinstance(optional_layers, list):
|
|
43
|
+
new_optional_layers = []
|
|
44
|
+
for op_layer in self.optional_layers:
|
|
45
|
+
if isinstance(op_layer, dict):
|
|
46
|
+
new_optional_layers.append(Layer(name=op_layer.get('name', None), layer_type=op_layer.get('type', None), url=op_layer.get('url', None)))
|
|
47
|
+
else:
|
|
48
|
+
new_optional_layers.append(op_layer)
|
|
49
|
+
self.optional_layers = new_optional_layers
|
|
50
|
+
|
|
51
|
+
self.epsg = epsg or data.get('epsg', None)
|
|
52
|
+
if self.epsg is None:
|
|
53
|
+
raise ValueError('epsg is required')
|
|
54
|
+
|
|
55
|
+
self.zoom = zoom or data.get('zoom', None)
|
|
56
|
+
self.min_zoom = min_zoom or data.get('minZoom', None)
|
|
57
|
+
self.max_zoom = max_zoom or data.get('maxZoom', None)
|
|
58
|
+
self.bounds = bounds or data.get('bounds', None)
|
|
59
|
+
self.aoi = aoi or data.get('aoi', None)
|
|
60
|
+
|
|
61
|
+
def to_json(self):
|
|
62
|
+
_json = {
|
|
63
|
+
"type": "gis",
|
|
64
|
+
"shebang": "dataloop",
|
|
65
|
+
"metadata": {
|
|
66
|
+
"dltype": "gis"
|
|
67
|
+
},
|
|
68
|
+
'layer': {
|
|
69
|
+
'name': self.layer.name,
|
|
70
|
+
'type': self.layer.type,
|
|
71
|
+
'url': self.layer.url
|
|
72
|
+
},
|
|
73
|
+
"epsg": self.epsg
|
|
74
|
+
}
|
|
75
|
+
if self.optional_layers is not None:
|
|
76
|
+
_json['optionalLayers'] = [
|
|
77
|
+
{
|
|
78
|
+
'name': layer.name,
|
|
79
|
+
'type': layer.type,
|
|
80
|
+
'url': layer.url
|
|
81
|
+
} for layer in self.optional_layers
|
|
82
|
+
]
|
|
83
|
+
if self.zoom is not None:
|
|
84
|
+
_json['zoom'] = self.zoom
|
|
85
|
+
if self.min_zoom is not None:
|
|
86
|
+
_json['minZoom'] = self.min_zoom
|
|
87
|
+
if self.max_zoom is not None:
|
|
88
|
+
_json['maxZoom'] = self.max_zoom
|
|
89
|
+
if self.bounds is not None:
|
|
90
|
+
_json['bounds'] = self.bounds
|
|
91
|
+
if self.aoi is not None:
|
|
92
|
+
_json['aoi'] = self.aoi
|
|
93
|
+
return _json
|
|
94
|
+
|
|
95
|
+
@classmethod
|
|
96
|
+
def from_local_file(cls, filepath):
|
|
97
|
+
"""
|
|
98
|
+
Create a new prompt item from a file
|
|
99
|
+
:param filepath: path to the file
|
|
100
|
+
:return: PromptItem object
|
|
101
|
+
"""
|
|
102
|
+
if os.path.exists(filepath) is False:
|
|
103
|
+
raise FileNotFoundError(f'File does not exists: {filepath}')
|
|
104
|
+
if 'json' not in os.path.splitext(filepath)[-1]:
|
|
105
|
+
raise ValueError(f'Expected path to json item, got {os.path.splitext(filepath)[-1]}')
|
|
106
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
107
|
+
data = json.load(f)
|
|
108
108
|
return cls(name=os.path.basename(filepath), data=data)
|
dtlpy/entities/integration.py
CHANGED
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
import logging
|
|
3
|
-
import attr
|
|
4
|
-
|
|
5
|
-
from .. import entities, exceptions, repositories
|
|
6
|
-
from ..services.api_client import ApiClient
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(name='dtlpy')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class IntegrationType(str, Enum):
|
|
12
|
-
""" The type of the Integration.
|
|
13
|
-
|
|
14
|
-
.. list-table::
|
|
15
|
-
:widths: 15 150
|
|
16
|
-
:header-rows: 1
|
|
17
|
-
|
|
18
|
-
* - State
|
|
19
|
-
- Description
|
|
20
|
-
* - S3
|
|
21
|
-
- S3 Integration - for S3 drivers
|
|
22
|
-
* - AWS_CROSS_ACCOUNT
|
|
23
|
-
- AWS CROSS ACCOUNT Integration - for S3 drivers
|
|
24
|
-
* - AWS_STS
|
|
25
|
-
- AWS STS Integration - for S3 drivers
|
|
26
|
-
* - GCS
|
|
27
|
-
- GCS Integration - for GCS drivers
|
|
28
|
-
* - GCP_CROSS_PROJECT
|
|
29
|
-
- GCP CROSS PROJECT Integration - for GCP drivers
|
|
30
|
-
* - AZUREBLOB
|
|
31
|
-
- AZURE BLOB Integration - for S3 AZUREBLOB and AZURE_DATALAKE_GEN2 drivers
|
|
32
|
-
* - KEY_VALUE
|
|
33
|
-
- KEY VALUE Integration - for save secrets in the platform
|
|
34
|
-
* - GCP_WORKLOAD_IDENTITY_FEDERATION
|
|
35
|
-
- GCP Workload Identity Federation Integration - for GCP drivers
|
|
36
|
-
* - PRIVATE_REGISTRY
|
|
37
|
-
- PRIVATE REGISTRY Integration - for private registry drivers
|
|
38
|
-
"""
|
|
39
|
-
S3 = "s3"
|
|
40
|
-
AWS_CROSS_ACCOUNT = 'aws-cross'
|
|
41
|
-
AWS_STS = 'aws-sts'
|
|
42
|
-
GCS = "gcs"
|
|
43
|
-
GCS_CROSS = "gcp-cross"
|
|
44
|
-
AZUREBLOB = "azureblob"
|
|
45
|
-
KEY_VALUE = "key_value"
|
|
46
|
-
GCP_WORKLOAD_IDENTITY_FEDERATION = "gcp-workload-identity-federation",
|
|
47
|
-
PRIVATE_REGISTRY = "private-registry"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
@attr.s
|
|
51
|
-
class Integration(entities.BaseEntity):
|
|
52
|
-
"""
|
|
53
|
-
Integration object
|
|
54
|
-
"""
|
|
55
|
-
id = attr.ib()
|
|
56
|
-
name = attr.ib()
|
|
57
|
-
type = attr.ib()
|
|
58
|
-
org = attr.ib()
|
|
59
|
-
created_at = attr.ib()
|
|
60
|
-
creator = attr.ib()
|
|
61
|
-
update_at = attr.ib()
|
|
62
|
-
url = attr.ib()
|
|
63
|
-
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
64
|
-
metadata = attr.ib(default=None, repr=False)
|
|
65
|
-
_project = attr.ib(default=None, repr=False)
|
|
66
|
-
|
|
67
|
-
@classmethod
|
|
68
|
-
def from_json(cls,
|
|
69
|
-
_json: dict,
|
|
70
|
-
client_api: ApiClient,
|
|
71
|
-
is_fetched=True):
|
|
72
|
-
"""
|
|
73
|
-
Build a Integration entity object from a json
|
|
74
|
-
|
|
75
|
-
:param _json: _json response from host
|
|
76
|
-
:param client_api: ApiClient entity
|
|
77
|
-
:param is_fetched: is Entity fetched from Platform
|
|
78
|
-
:return: Integration object
|
|
79
|
-
"""
|
|
80
|
-
inst = cls(id=_json.get('id', None),
|
|
81
|
-
name=_json.get('name', None),
|
|
82
|
-
creator=_json.get('creator', None),
|
|
83
|
-
created_at=_json.get('createdAt', None),
|
|
84
|
-
update_at=_json.get('updatedAt', None),
|
|
85
|
-
type=_json.get('type', None),
|
|
86
|
-
org=_json.get('org', None),
|
|
87
|
-
client_api=client_api,
|
|
88
|
-
metadata=_json.get('metadata', None),
|
|
89
|
-
url=_json.get('url', None))
|
|
90
|
-
inst.is_fetched = is_fetched
|
|
91
|
-
return inst
|
|
92
|
-
|
|
93
|
-
def to_json(self):
|
|
94
|
-
"""
|
|
95
|
-
Returns platform _json format of object
|
|
96
|
-
|
|
97
|
-
:return: platform json format of object
|
|
98
|
-
:rtype: dict
|
|
99
|
-
"""
|
|
100
|
-
_json = attr.asdict(self, filter=attr.filters.exclude(attr.fields(Integration)._client_api,
|
|
101
|
-
attr.fields(Integration)._project))
|
|
102
|
-
return _json
|
|
103
|
-
|
|
104
|
-
@property
|
|
105
|
-
def project(self):
|
|
106
|
-
return self._project
|
|
107
|
-
|
|
108
|
-
@project.setter
|
|
109
|
-
def project(self, project):
|
|
110
|
-
if not isinstance(project, entities.Project):
|
|
111
|
-
raise ValueError('Must input a valid Project entity')
|
|
112
|
-
self._project = project
|
|
113
|
-
|
|
114
|
-
def update(
|
|
115
|
-
self,
|
|
116
|
-
new_name: str = None,
|
|
117
|
-
new_options: dict = None,
|
|
118
|
-
reload_services: bool = None
|
|
119
|
-
):
|
|
120
|
-
"""
|
|
121
|
-
Update the integration's name.
|
|
122
|
-
|
|
123
|
-
**Prerequisites**: You must be an *owner* in the organization.
|
|
124
|
-
|
|
125
|
-
:param str new_name: new name
|
|
126
|
-
:param dict new_options: new value
|
|
127
|
-
:param bool reload_services: reload services associated with this integration
|
|
128
|
-
:return: Integration object
|
|
129
|
-
:rtype: dtlpy.entities.integration.Integration
|
|
130
|
-
|
|
131
|
-
**Examples for options include**:
|
|
132
|
-
s3 - {key: "", secret: ""};
|
|
133
|
-
gcs - {key: "", secret: "", content: ""};
|
|
134
|
-
azureblob - {key: "", secret: "", clientId: "", tenantId: ""};
|
|
135
|
-
key_value - {key: "", value: ""}
|
|
136
|
-
aws-sts - {key: "", secret: "", roleArns: ""}
|
|
137
|
-
aws-cross - {roleArns: ""}
|
|
138
|
-
|
|
139
|
-
**Example**:
|
|
140
|
-
|
|
141
|
-
.. code-block:: python
|
|
142
|
-
|
|
143
|
-
project.integrations.update(integrations_id='integrations_id', new_name="new_integration_name")
|
|
144
|
-
"""
|
|
145
|
-
if self.project is not None:
|
|
146
|
-
identifier = self.project
|
|
147
|
-
elif self.org is not None:
|
|
148
|
-
identifier = repositories.organizations.Organizations(client_api=self._client_api).get(
|
|
149
|
-
organization_id=self.org)
|
|
150
|
-
else:
|
|
151
|
-
raise exceptions.PlatformException(
|
|
152
|
-
error='400',
|
|
153
|
-
message='Must provide an identifier in inputs')
|
|
154
|
-
|
|
155
|
-
identifier.integrations.update(
|
|
156
|
-
new_name=new_name,
|
|
157
|
-
integrations_id=self.id,
|
|
158
|
-
integration=self,
|
|
159
|
-
new_options=new_options,
|
|
160
|
-
reload_services=reload_services
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
def delete(self,
|
|
164
|
-
sure: bool = False,
|
|
165
|
-
really: bool = False) -> bool:
|
|
166
|
-
"""
|
|
167
|
-
Delete integrations from the Organization
|
|
168
|
-
|
|
169
|
-
:param bool sure: are you sure you want to delete?
|
|
170
|
-
:param bool really: really really?
|
|
171
|
-
:return: True
|
|
172
|
-
:rtype: bool
|
|
173
|
-
"""
|
|
174
|
-
if self.project is not None:
|
|
175
|
-
identifier = self.project
|
|
176
|
-
elif self.org is not None:
|
|
177
|
-
identifier = repositories.organizations.Organizations(client_api=self._client_api).get(
|
|
178
|
-
organization_id=self.org)
|
|
179
|
-
else:
|
|
180
|
-
raise exceptions.PlatformException(
|
|
181
|
-
error='400',
|
|
182
|
-
message='Must provide an identifier in inputs')
|
|
183
|
-
|
|
184
|
-
return identifier.integrations.delete(integrations_id=self.id, sure=sure, really=really)
|
|
1
|
+
from enum import Enum
|
|
2
|
+
import logging
|
|
3
|
+
import attr
|
|
4
|
+
|
|
5
|
+
from .. import entities, exceptions, repositories
|
|
6
|
+
from ..services.api_client import ApiClient
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(name='dtlpy')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class IntegrationType(str, Enum):
|
|
12
|
+
""" The type of the Integration.
|
|
13
|
+
|
|
14
|
+
.. list-table::
|
|
15
|
+
:widths: 15 150
|
|
16
|
+
:header-rows: 1
|
|
17
|
+
|
|
18
|
+
* - State
|
|
19
|
+
- Description
|
|
20
|
+
* - S3
|
|
21
|
+
- S3 Integration - for S3 drivers
|
|
22
|
+
* - AWS_CROSS_ACCOUNT
|
|
23
|
+
- AWS CROSS ACCOUNT Integration - for S3 drivers
|
|
24
|
+
* - AWS_STS
|
|
25
|
+
- AWS STS Integration - for S3 drivers
|
|
26
|
+
* - GCS
|
|
27
|
+
- GCS Integration - for GCS drivers
|
|
28
|
+
* - GCP_CROSS_PROJECT
|
|
29
|
+
- GCP CROSS PROJECT Integration - for GCP drivers
|
|
30
|
+
* - AZUREBLOB
|
|
31
|
+
- AZURE BLOB Integration - for S3 AZUREBLOB and AZURE_DATALAKE_GEN2 drivers
|
|
32
|
+
* - KEY_VALUE
|
|
33
|
+
- KEY VALUE Integration - for save secrets in the platform
|
|
34
|
+
* - GCP_WORKLOAD_IDENTITY_FEDERATION
|
|
35
|
+
- GCP Workload Identity Federation Integration - for GCP drivers
|
|
36
|
+
* - PRIVATE_REGISTRY
|
|
37
|
+
- PRIVATE REGISTRY Integration - for private registry drivers
|
|
38
|
+
"""
|
|
39
|
+
S3 = "s3"
|
|
40
|
+
AWS_CROSS_ACCOUNT = 'aws-cross'
|
|
41
|
+
AWS_STS = 'aws-sts'
|
|
42
|
+
GCS = "gcs"
|
|
43
|
+
GCS_CROSS = "gcp-cross"
|
|
44
|
+
AZUREBLOB = "azureblob"
|
|
45
|
+
KEY_VALUE = "key_value"
|
|
46
|
+
GCP_WORKLOAD_IDENTITY_FEDERATION = "gcp-workload-identity-federation",
|
|
47
|
+
PRIVATE_REGISTRY = "private-registry"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@attr.s
|
|
51
|
+
class Integration(entities.BaseEntity):
|
|
52
|
+
"""
|
|
53
|
+
Integration object
|
|
54
|
+
"""
|
|
55
|
+
id = attr.ib()
|
|
56
|
+
name = attr.ib()
|
|
57
|
+
type = attr.ib()
|
|
58
|
+
org = attr.ib()
|
|
59
|
+
created_at = attr.ib()
|
|
60
|
+
creator = attr.ib()
|
|
61
|
+
update_at = attr.ib()
|
|
62
|
+
url = attr.ib()
|
|
63
|
+
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
64
|
+
metadata = attr.ib(default=None, repr=False)
|
|
65
|
+
_project = attr.ib(default=None, repr=False)
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_json(cls,
|
|
69
|
+
_json: dict,
|
|
70
|
+
client_api: ApiClient,
|
|
71
|
+
is_fetched=True):
|
|
72
|
+
"""
|
|
73
|
+
Build a Integration entity object from a json
|
|
74
|
+
|
|
75
|
+
:param _json: _json response from host
|
|
76
|
+
:param client_api: ApiClient entity
|
|
77
|
+
:param is_fetched: is Entity fetched from Platform
|
|
78
|
+
:return: Integration object
|
|
79
|
+
"""
|
|
80
|
+
inst = cls(id=_json.get('id', None),
|
|
81
|
+
name=_json.get('name', None),
|
|
82
|
+
creator=_json.get('creator', None),
|
|
83
|
+
created_at=_json.get('createdAt', None),
|
|
84
|
+
update_at=_json.get('updatedAt', None),
|
|
85
|
+
type=_json.get('type', None),
|
|
86
|
+
org=_json.get('org', None),
|
|
87
|
+
client_api=client_api,
|
|
88
|
+
metadata=_json.get('metadata', None),
|
|
89
|
+
url=_json.get('url', None))
|
|
90
|
+
inst.is_fetched = is_fetched
|
|
91
|
+
return inst
|
|
92
|
+
|
|
93
|
+
def to_json(self):
|
|
94
|
+
"""
|
|
95
|
+
Returns platform _json format of object
|
|
96
|
+
|
|
97
|
+
:return: platform json format of object
|
|
98
|
+
:rtype: dict
|
|
99
|
+
"""
|
|
100
|
+
_json = attr.asdict(self, filter=attr.filters.exclude(attr.fields(Integration)._client_api,
|
|
101
|
+
attr.fields(Integration)._project))
|
|
102
|
+
return _json
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def project(self):
|
|
106
|
+
return self._project
|
|
107
|
+
|
|
108
|
+
@project.setter
|
|
109
|
+
def project(self, project):
|
|
110
|
+
if not isinstance(project, entities.Project):
|
|
111
|
+
raise ValueError('Must input a valid Project entity')
|
|
112
|
+
self._project = project
|
|
113
|
+
|
|
114
|
+
def update(
|
|
115
|
+
self,
|
|
116
|
+
new_name: str = None,
|
|
117
|
+
new_options: dict = None,
|
|
118
|
+
reload_services: bool = None
|
|
119
|
+
):
|
|
120
|
+
"""
|
|
121
|
+
Update the integration's name.
|
|
122
|
+
|
|
123
|
+
**Prerequisites**: You must be an *owner* in the organization.
|
|
124
|
+
|
|
125
|
+
:param str new_name: new name
|
|
126
|
+
:param dict new_options: new value
|
|
127
|
+
:param bool reload_services: reload services associated with this integration
|
|
128
|
+
:return: Integration object
|
|
129
|
+
:rtype: dtlpy.entities.integration.Integration
|
|
130
|
+
|
|
131
|
+
**Examples for options include**:
|
|
132
|
+
s3 - {key: "", secret: ""};
|
|
133
|
+
gcs - {key: "", secret: "", content: ""};
|
|
134
|
+
azureblob - {key: "", secret: "", clientId: "", tenantId: ""};
|
|
135
|
+
key_value - {key: "", value: ""}
|
|
136
|
+
aws-sts - {key: "", secret: "", roleArns: ""}
|
|
137
|
+
aws-cross - {roleArns: ""}
|
|
138
|
+
|
|
139
|
+
**Example**:
|
|
140
|
+
|
|
141
|
+
.. code-block:: python
|
|
142
|
+
|
|
143
|
+
project.integrations.update(integrations_id='integrations_id', new_name="new_integration_name")
|
|
144
|
+
"""
|
|
145
|
+
if self.project is not None:
|
|
146
|
+
identifier = self.project
|
|
147
|
+
elif self.org is not None:
|
|
148
|
+
identifier = repositories.organizations.Organizations(client_api=self._client_api).get(
|
|
149
|
+
organization_id=self.org)
|
|
150
|
+
else:
|
|
151
|
+
raise exceptions.PlatformException(
|
|
152
|
+
error='400',
|
|
153
|
+
message='Must provide an identifier in inputs')
|
|
154
|
+
|
|
155
|
+
identifier.integrations.update(
|
|
156
|
+
new_name=new_name,
|
|
157
|
+
integrations_id=self.id,
|
|
158
|
+
integration=self,
|
|
159
|
+
new_options=new_options,
|
|
160
|
+
reload_services=reload_services
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
def delete(self,
|
|
164
|
+
sure: bool = False,
|
|
165
|
+
really: bool = False) -> bool:
|
|
166
|
+
"""
|
|
167
|
+
Delete integrations from the Organization
|
|
168
|
+
|
|
169
|
+
:param bool sure: are you sure you want to delete?
|
|
170
|
+
:param bool really: really really?
|
|
171
|
+
:return: True
|
|
172
|
+
:rtype: bool
|
|
173
|
+
"""
|
|
174
|
+
if self.project is not None:
|
|
175
|
+
identifier = self.project
|
|
176
|
+
elif self.org is not None:
|
|
177
|
+
identifier = repositories.organizations.Organizations(client_api=self._client_api).get(
|
|
178
|
+
organization_id=self.org)
|
|
179
|
+
else:
|
|
180
|
+
raise exceptions.PlatformException(
|
|
181
|
+
error='400',
|
|
182
|
+
message='Must provide an identifier in inputs')
|
|
183
|
+
|
|
184
|
+
return identifier.integrations.delete(integrations_id=self.id, sure=sure, really=really)
|