dtlpy 1.115.44__py3-none-any.whl → 1.117.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dtlpy/__init__.py +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +347 -347
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +292 -292
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -449
- dtlpy/entities/dataset.py +1299 -1299
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -235
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +152 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +975 -959
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -505
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +974 -963
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +1287 -1230
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -332
- dtlpy/repositories/commands.py +152 -152
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -439
- dtlpy/repositories/datasets.py +1585 -1504
- dtlpy/repositories/downloader.py +1157 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +256 -226
- dtlpy/repositories/features.py +255 -255
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -912
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -1000
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +429 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -661
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1786 -1785
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +285 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.115.44.data → dtlpy-1.117.6.data}/scripts/dlp +1 -1
- dtlpy-1.117.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.117.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/METADATA +186 -186
- dtlpy-1.117.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
- dtlpy-1.115.44.dist-info/RECORD +0 -240
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
DEFAULT_PACKAGE_ENTRY_POINT = 'main.py'
|
|
2
|
-
DEFAULT_PACKAGE_CLASS_NAME = 'ServiceRunner'
|
|
3
|
-
DEFAULT_PACKAGE_FUNCTION_NAME = 'run'
|
|
4
|
-
DEFAULT_PACKAGE_MODULE_NAME = 'default_module'
|
|
5
|
-
DEFAULT_PACKAGE_NAME = 'default_package'
|
|
1
|
+
DEFAULT_PACKAGE_ENTRY_POINT = 'main.py'
|
|
2
|
+
DEFAULT_PACKAGE_CLASS_NAME = 'ServiceRunner'
|
|
3
|
+
DEFAULT_PACKAGE_FUNCTION_NAME = 'run'
|
|
4
|
+
DEFAULT_PACKAGE_MODULE_NAME = 'default_module'
|
|
5
|
+
DEFAULT_PACKAGE_NAME = 'default_package'
|
|
@@ -1,185 +1,185 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import typing
|
|
3
|
-
import json
|
|
4
|
-
from enum import Enum
|
|
5
|
-
from .. import exceptions, entities
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger(name='dtlpy')
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class PackageInputType(str, Enum):
|
|
11
|
-
DATASET = "Dataset"
|
|
12
|
-
ITEM = "Item"
|
|
13
|
-
ANNOTATION = "Annotation"
|
|
14
|
-
EXECUTION = "Execution"
|
|
15
|
-
TASK = "Task"
|
|
16
|
-
ASSIGNMENT = "Assignment"
|
|
17
|
-
SERVICE = "Service"
|
|
18
|
-
PACKAGE = "Package"
|
|
19
|
-
PROJECT = "Project"
|
|
20
|
-
RECIPE = "Recipe"
|
|
21
|
-
JSON = "Json"
|
|
22
|
-
STRING = "String"
|
|
23
|
-
NUMBER = "Number"
|
|
24
|
-
INT = "Integer"
|
|
25
|
-
FLOAT = "Float"
|
|
26
|
-
BOOLEAN = "Boolean"
|
|
27
|
-
MODEL = "Model"
|
|
28
|
-
DATASETS = "Dataset[]"
|
|
29
|
-
ITEMS = "Item[]"
|
|
30
|
-
ANNOTATIONS = "Annotation[]"
|
|
31
|
-
EXECUTIONS = "Execution[]"
|
|
32
|
-
TASKS = "Task[]"
|
|
33
|
-
ASSIGNMENTS = "Assignment[]"
|
|
34
|
-
SERVICES = "Service[]"
|
|
35
|
-
PACKAGES = "Package[]"
|
|
36
|
-
PROJECTS = "Project[]"
|
|
37
|
-
JSONS = "Json[]"
|
|
38
|
-
STRINGS = "String[]"
|
|
39
|
-
NUMBERS = "Number[]"
|
|
40
|
-
INTS = "Integer[]"
|
|
41
|
-
FLOATS = "Float[]"
|
|
42
|
-
BOOLEANS = "Boolean[]"
|
|
43
|
-
MODELS = "Model[]"
|
|
44
|
-
RECIPES = "Recipe[]"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class PackageFunction(entities.DlEntity):
|
|
48
|
-
"""
|
|
49
|
-
Webhook object
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
# platform
|
|
53
|
-
name: str = entities.DlProperty(location=['name'],
|
|
54
|
-
_type=str,
|
|
55
|
-
default=entities.package_defaults.DEFAULT_PACKAGE_FUNCTION_NAME)
|
|
56
|
-
description: str = entities.DlProperty(location=['description'],
|
|
57
|
-
_type=str)
|
|
58
|
-
display_name: typing.Union[str, None] = entities.DlProperty(location=['displayName'],
|
|
59
|
-
_type=typing.Union[str, None])
|
|
60
|
-
display_icon: typing.Union[str, None] = entities.DlProperty(location=['displayIcon'],
|
|
61
|
-
_type=typing.Union[str, None])
|
|
62
|
-
|
|
63
|
-
outputs: typing.Union[typing.List['entities.FunctionIO'], None] = entities.DlProperty(location=['output'],
|
|
64
|
-
_kls='FunctionIO')
|
|
65
|
-
inputs: typing.Union[typing.List['entities.FunctionIO'], None] = entities.DlProperty(location=['input'],
|
|
66
|
-
_kls='FunctionIO')
|
|
67
|
-
compute_config: str = entities.DlProperty(location=['computeConfig'], _type=str, default=None)
|
|
68
|
-
|
|
69
|
-
def __repr__(self):
|
|
70
|
-
# TODO need to move to DlEntity
|
|
71
|
-
return f"PackageFunction(name={self.name}, description={self.description})"
|
|
72
|
-
|
|
73
|
-
@classmethod
|
|
74
|
-
def from_json(cls, _json):
|
|
75
|
-
inst = cls(_dict=_json)
|
|
76
|
-
return inst
|
|
77
|
-
|
|
78
|
-
@outputs.default
|
|
79
|
-
def get_outputs(self):
|
|
80
|
-
outputs = list()
|
|
81
|
-
return outputs
|
|
82
|
-
|
|
83
|
-
@inputs.default
|
|
84
|
-
def get_inputs(self):
|
|
85
|
-
inputs = list()
|
|
86
|
-
return inputs
|
|
87
|
-
|
|
88
|
-
def to_json(self):
|
|
89
|
-
_json = self._dict.copy()
|
|
90
|
-
return _json
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class FunctionIO(entities.DlEntity):
|
|
94
|
-
INPUT_TYPES: list = [val for key, val in PackageInputType.__dict__.items() if not key.startswith('_')]
|
|
95
|
-
type = entities.DlProperty(location=['type'], _type=str)
|
|
96
|
-
value = entities.DlProperty(location=['value'], _type=str)
|
|
97
|
-
name = entities.DlProperty(location=['name'], _type=str)
|
|
98
|
-
actions = entities.DlProperty(location=['actions'], _type=list)
|
|
99
|
-
description = entities.DlProperty(location=['description'], _type=str)
|
|
100
|
-
integration = entities.DlProperty(location=['integration'], _type=dict)
|
|
101
|
-
mandatory = entities.DlProperty(location=['mandatory'], _type=bool)
|
|
102
|
-
|
|
103
|
-
def __repr__(self):
|
|
104
|
-
# TODO need to move to DlEntity
|
|
105
|
-
return f"FunctionIO(type={self.type}, name={self.name}, value={self.value})"
|
|
106
|
-
|
|
107
|
-
@name.default
|
|
108
|
-
def set_name(self):
|
|
109
|
-
if self.type == PackageInputType.ITEM:
|
|
110
|
-
return 'item'
|
|
111
|
-
elif self.type == PackageInputType.DATASET:
|
|
112
|
-
return 'dataset'
|
|
113
|
-
elif self.type == PackageInputType.ANNOTATION:
|
|
114
|
-
return 'annotation'
|
|
115
|
-
elif self.type == PackageInputType.PROJECT:
|
|
116
|
-
return 'project'
|
|
117
|
-
elif self.type == PackageInputType.PACKAGE:
|
|
118
|
-
return 'package'
|
|
119
|
-
elif self.type == PackageInputType.SERVICE:
|
|
120
|
-
return 'service'
|
|
121
|
-
elif self.type == PackageInputType.EXECUTION:
|
|
122
|
-
return 'execution'
|
|
123
|
-
elif self.type == PackageInputType.MODEL:
|
|
124
|
-
return 'model'
|
|
125
|
-
else:
|
|
126
|
-
return 'config'
|
|
127
|
-
|
|
128
|
-
@type.validator
|
|
129
|
-
def check_type(self, value):
|
|
130
|
-
if value not in self.INPUT_TYPES:
|
|
131
|
-
raise exceptions.PlatformException(
|
|
132
|
-
error='400',
|
|
133
|
-
message='Invalid input type: {!r}. Please one from dl.PackageInputType'.format(value))
|
|
134
|
-
|
|
135
|
-
@staticmethod
|
|
136
|
-
def is_json_serializable(val):
|
|
137
|
-
try:
|
|
138
|
-
json.dumps(val)
|
|
139
|
-
is_json_serializable = True
|
|
140
|
-
except Exception:
|
|
141
|
-
is_json_serializable = False
|
|
142
|
-
return is_json_serializable
|
|
143
|
-
|
|
144
|
-
@value.validator
|
|
145
|
-
def check_value(self, value):
|
|
146
|
-
value_ok = True
|
|
147
|
-
expected_value = 'Expected value should be:'
|
|
148
|
-
if self.type == PackageInputType.JSON:
|
|
149
|
-
expected_value = '{} json serializable'.format(expected_value)
|
|
150
|
-
if not self.is_json_serializable(value):
|
|
151
|
-
value_ok = False
|
|
152
|
-
else:
|
|
153
|
-
expected_value = 'Unknown value type: {}'.format(type(value))
|
|
154
|
-
if type(value) not in [dict, str, float, int, bool, list]:
|
|
155
|
-
value_ok = False
|
|
156
|
-
|
|
157
|
-
if not value_ok and value is not None:
|
|
158
|
-
raise exceptions.PlatformException('400', 'Illegal value. {}'.format(expected_value))
|
|
159
|
-
|
|
160
|
-
def to_json(self, resource='package'):
|
|
161
|
-
"""
|
|
162
|
-
:param resource:
|
|
163
|
-
"""
|
|
164
|
-
if resource == 'package':
|
|
165
|
-
_json = {
|
|
166
|
-
'name': self.name,
|
|
167
|
-
'type': self.type,
|
|
168
|
-
}
|
|
169
|
-
if self.actions:
|
|
170
|
-
_json['actions'] = self.actions
|
|
171
|
-
if self.description:
|
|
172
|
-
_json['description'] = self.description
|
|
173
|
-
elif resource in ['execution', 'service']:
|
|
174
|
-
_json = {
|
|
175
|
-
self.name: self.value
|
|
176
|
-
}
|
|
177
|
-
else:
|
|
178
|
-
raise exceptions.PlatformException('400', 'Please select resource from: package, execution')
|
|
179
|
-
|
|
180
|
-
return _json
|
|
181
|
-
|
|
182
|
-
@classmethod
|
|
183
|
-
def from_json(cls, _json):
|
|
184
|
-
inst = cls(_dict=_json)
|
|
185
|
-
return inst
|
|
1
|
+
import logging
|
|
2
|
+
import typing
|
|
3
|
+
import json
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from .. import exceptions, entities
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(name='dtlpy')
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PackageInputType(str, Enum):
|
|
11
|
+
DATASET = "Dataset"
|
|
12
|
+
ITEM = "Item"
|
|
13
|
+
ANNOTATION = "Annotation"
|
|
14
|
+
EXECUTION = "Execution"
|
|
15
|
+
TASK = "Task"
|
|
16
|
+
ASSIGNMENT = "Assignment"
|
|
17
|
+
SERVICE = "Service"
|
|
18
|
+
PACKAGE = "Package"
|
|
19
|
+
PROJECT = "Project"
|
|
20
|
+
RECIPE = "Recipe"
|
|
21
|
+
JSON = "Json"
|
|
22
|
+
STRING = "String"
|
|
23
|
+
NUMBER = "Number"
|
|
24
|
+
INT = "Integer"
|
|
25
|
+
FLOAT = "Float"
|
|
26
|
+
BOOLEAN = "Boolean"
|
|
27
|
+
MODEL = "Model"
|
|
28
|
+
DATASETS = "Dataset[]"
|
|
29
|
+
ITEMS = "Item[]"
|
|
30
|
+
ANNOTATIONS = "Annotation[]"
|
|
31
|
+
EXECUTIONS = "Execution[]"
|
|
32
|
+
TASKS = "Task[]"
|
|
33
|
+
ASSIGNMENTS = "Assignment[]"
|
|
34
|
+
SERVICES = "Service[]"
|
|
35
|
+
PACKAGES = "Package[]"
|
|
36
|
+
PROJECTS = "Project[]"
|
|
37
|
+
JSONS = "Json[]"
|
|
38
|
+
STRINGS = "String[]"
|
|
39
|
+
NUMBERS = "Number[]"
|
|
40
|
+
INTS = "Integer[]"
|
|
41
|
+
FLOATS = "Float[]"
|
|
42
|
+
BOOLEANS = "Boolean[]"
|
|
43
|
+
MODELS = "Model[]"
|
|
44
|
+
RECIPES = "Recipe[]"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class PackageFunction(entities.DlEntity):
|
|
48
|
+
"""
|
|
49
|
+
Webhook object
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
# platform
|
|
53
|
+
name: str = entities.DlProperty(location=['name'],
|
|
54
|
+
_type=str,
|
|
55
|
+
default=entities.package_defaults.DEFAULT_PACKAGE_FUNCTION_NAME)
|
|
56
|
+
description: str = entities.DlProperty(location=['description'],
|
|
57
|
+
_type=str)
|
|
58
|
+
display_name: typing.Union[str, None] = entities.DlProperty(location=['displayName'],
|
|
59
|
+
_type=typing.Union[str, None])
|
|
60
|
+
display_icon: typing.Union[str, None] = entities.DlProperty(location=['displayIcon'],
|
|
61
|
+
_type=typing.Union[str, None])
|
|
62
|
+
|
|
63
|
+
outputs: typing.Union[typing.List['entities.FunctionIO'], None] = entities.DlProperty(location=['output'],
|
|
64
|
+
_kls='FunctionIO')
|
|
65
|
+
inputs: typing.Union[typing.List['entities.FunctionIO'], None] = entities.DlProperty(location=['input'],
|
|
66
|
+
_kls='FunctionIO')
|
|
67
|
+
compute_config: str = entities.DlProperty(location=['computeConfig'], _type=str, default=None)
|
|
68
|
+
|
|
69
|
+
def __repr__(self):
|
|
70
|
+
# TODO need to move to DlEntity
|
|
71
|
+
return f"PackageFunction(name={self.name}, description={self.description})"
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def from_json(cls, _json):
|
|
75
|
+
inst = cls(_dict=_json)
|
|
76
|
+
return inst
|
|
77
|
+
|
|
78
|
+
@outputs.default
|
|
79
|
+
def get_outputs(self):
|
|
80
|
+
outputs = list()
|
|
81
|
+
return outputs
|
|
82
|
+
|
|
83
|
+
@inputs.default
|
|
84
|
+
def get_inputs(self):
|
|
85
|
+
inputs = list()
|
|
86
|
+
return inputs
|
|
87
|
+
|
|
88
|
+
def to_json(self):
|
|
89
|
+
_json = self._dict.copy()
|
|
90
|
+
return _json
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class FunctionIO(entities.DlEntity):
|
|
94
|
+
INPUT_TYPES: list = [val for key, val in PackageInputType.__dict__.items() if not key.startswith('_')]
|
|
95
|
+
type = entities.DlProperty(location=['type'], _type=str)
|
|
96
|
+
value = entities.DlProperty(location=['value'], _type=str)
|
|
97
|
+
name = entities.DlProperty(location=['name'], _type=str)
|
|
98
|
+
actions = entities.DlProperty(location=['actions'], _type=list)
|
|
99
|
+
description = entities.DlProperty(location=['description'], _type=str)
|
|
100
|
+
integration = entities.DlProperty(location=['integration'], _type=dict)
|
|
101
|
+
mandatory = entities.DlProperty(location=['mandatory'], _type=bool)
|
|
102
|
+
|
|
103
|
+
def __repr__(self):
|
|
104
|
+
# TODO need to move to DlEntity
|
|
105
|
+
return f"FunctionIO(type={self.type}, name={self.name}, value={self.value})"
|
|
106
|
+
|
|
107
|
+
@name.default
|
|
108
|
+
def set_name(self):
|
|
109
|
+
if self.type == PackageInputType.ITEM:
|
|
110
|
+
return 'item'
|
|
111
|
+
elif self.type == PackageInputType.DATASET:
|
|
112
|
+
return 'dataset'
|
|
113
|
+
elif self.type == PackageInputType.ANNOTATION:
|
|
114
|
+
return 'annotation'
|
|
115
|
+
elif self.type == PackageInputType.PROJECT:
|
|
116
|
+
return 'project'
|
|
117
|
+
elif self.type == PackageInputType.PACKAGE:
|
|
118
|
+
return 'package'
|
|
119
|
+
elif self.type == PackageInputType.SERVICE:
|
|
120
|
+
return 'service'
|
|
121
|
+
elif self.type == PackageInputType.EXECUTION:
|
|
122
|
+
return 'execution'
|
|
123
|
+
elif self.type == PackageInputType.MODEL:
|
|
124
|
+
return 'model'
|
|
125
|
+
else:
|
|
126
|
+
return 'config'
|
|
127
|
+
|
|
128
|
+
@type.validator
|
|
129
|
+
def check_type(self, value):
|
|
130
|
+
if value not in self.INPUT_TYPES:
|
|
131
|
+
raise exceptions.PlatformException(
|
|
132
|
+
error='400',
|
|
133
|
+
message='Invalid input type: {!r}. Please one from dl.PackageInputType'.format(value))
|
|
134
|
+
|
|
135
|
+
@staticmethod
|
|
136
|
+
def is_json_serializable(val):
|
|
137
|
+
try:
|
|
138
|
+
json.dumps(val)
|
|
139
|
+
is_json_serializable = True
|
|
140
|
+
except Exception:
|
|
141
|
+
is_json_serializable = False
|
|
142
|
+
return is_json_serializable
|
|
143
|
+
|
|
144
|
+
@value.validator
|
|
145
|
+
def check_value(self, value):
|
|
146
|
+
value_ok = True
|
|
147
|
+
expected_value = 'Expected value should be:'
|
|
148
|
+
if self.type == PackageInputType.JSON:
|
|
149
|
+
expected_value = '{} json serializable'.format(expected_value)
|
|
150
|
+
if not self.is_json_serializable(value):
|
|
151
|
+
value_ok = False
|
|
152
|
+
else:
|
|
153
|
+
expected_value = 'Unknown value type: {}'.format(type(value))
|
|
154
|
+
if type(value) not in [dict, str, float, int, bool, list]:
|
|
155
|
+
value_ok = False
|
|
156
|
+
|
|
157
|
+
if not value_ok and value is not None:
|
|
158
|
+
raise exceptions.PlatformException('400', 'Illegal value. {}'.format(expected_value))
|
|
159
|
+
|
|
160
|
+
def to_json(self, resource='package'):
|
|
161
|
+
"""
|
|
162
|
+
:param resource:
|
|
163
|
+
"""
|
|
164
|
+
if resource == 'package':
|
|
165
|
+
_json = {
|
|
166
|
+
'name': self.name,
|
|
167
|
+
'type': self.type,
|
|
168
|
+
}
|
|
169
|
+
if self.actions:
|
|
170
|
+
_json['actions'] = self.actions
|
|
171
|
+
if self.description:
|
|
172
|
+
_json['description'] = self.description
|
|
173
|
+
elif resource in ['execution', 'service']:
|
|
174
|
+
_json = {
|
|
175
|
+
self.name: self.value
|
|
176
|
+
}
|
|
177
|
+
else:
|
|
178
|
+
raise exceptions.PlatformException('400', 'Please select resource from: package, execution')
|
|
179
|
+
|
|
180
|
+
return _json
|
|
181
|
+
|
|
182
|
+
@classmethod
|
|
183
|
+
def from_json(cls, _json):
|
|
184
|
+
inst = cls(_dict=_json)
|
|
185
|
+
return inst
|
dtlpy/entities/package_module.py
CHANGED
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
import importlib.util
|
|
2
|
-
import inspect
|
|
3
|
-
import logging
|
|
4
|
-
import typing
|
|
5
|
-
|
|
6
|
-
from .. import entities
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(name='dtlpy')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class PackageModule(entities.DlEntity):
|
|
12
|
-
"""
|
|
13
|
-
PackageModule object
|
|
14
|
-
"""
|
|
15
|
-
# platform
|
|
16
|
-
name: str = entities.DlProperty(location=['name'], _type=str)
|
|
17
|
-
init_inputs: typing.List['entities.FunctionIO'] = entities.DlProperty(location=['initInputs'],
|
|
18
|
-
_type=typing.Union[list, None],
|
|
19
|
-
_kls='FunctionIO')
|
|
20
|
-
|
|
21
|
-
entry_point = entities.DlProperty(location=['entryPoint'],
|
|
22
|
-
_type=str,
|
|
23
|
-
default=entities.package_defaults.DEFAULT_PACKAGE_ENTRY_POINT)
|
|
24
|
-
class_name = entities.DlProperty(location=['className'],
|
|
25
|
-
_type=dict,
|
|
26
|
-
default=entities.package_defaults.DEFAULT_PACKAGE_CLASS_NAME)
|
|
27
|
-
functions: typing.List['entities.PackageFunction'] = entities.DlProperty(location=['functions'],
|
|
28
|
-
_type=list,
|
|
29
|
-
default=list(),
|
|
30
|
-
_kls='PackageFunction')
|
|
31
|
-
compute_config: str = entities.DlProperty(location=['computeConfig'], _type=str, default=None)
|
|
32
|
-
|
|
33
|
-
def __repr__(self):
|
|
34
|
-
# TODO need to move to DlEntity
|
|
35
|
-
return f"PackageModule(name={self.name}, entry_point={self.entry_point}, class_name={self.class_name})"
|
|
36
|
-
|
|
37
|
-
@functions.validator
|
|
38
|
-
def validate_functions(self, value: list):
|
|
39
|
-
if not isinstance(value, list):
|
|
40
|
-
raise Exception('Module functions must be a list.')
|
|
41
|
-
if not self.unique_functions(value):
|
|
42
|
-
raise Exception('Cannot have 2 functions by the same name in one module.')
|
|
43
|
-
|
|
44
|
-
@staticmethod
|
|
45
|
-
def unique_functions(functions: list):
|
|
46
|
-
return len(functions) == len(set([function.name for function in functions]))
|
|
47
|
-
|
|
48
|
-
@name.default
|
|
49
|
-
def set_name(self):
|
|
50
|
-
logger.warning('No module name was given. Using default name: {}'.format(
|
|
51
|
-
entities.package_defaults.DEFAULT_PACKAGE_MODULE_NAME))
|
|
52
|
-
return entities.package_defaults.DEFAULT_PACKAGE_MODULE_NAME
|
|
53
|
-
|
|
54
|
-
@init_inputs.default
|
|
55
|
-
def set_init_inputs(self):
|
|
56
|
-
return list()
|
|
57
|
-
|
|
58
|
-
@classmethod
|
|
59
|
-
def from_json(cls, _json):
|
|
60
|
-
inst = cls(_dict=_json)
|
|
61
|
-
return inst
|
|
62
|
-
|
|
63
|
-
@classmethod
|
|
64
|
-
def from_entry_point(cls, entry_point):
|
|
65
|
-
"""
|
|
66
|
-
Create a dl.PackageModule entity using decorator on the service class.
|
|
67
|
-
|
|
68
|
-
:param entry_point: path to the python file with the runner class (relative to the package path)
|
|
69
|
-
:return:
|
|
70
|
-
"""
|
|
71
|
-
file_spec = importlib.util.spec_from_file_location(entry_point, entry_point)
|
|
72
|
-
file_module = importlib.util.module_from_spec(file_spec)
|
|
73
|
-
file_spec.loader.exec_module(file_module)
|
|
74
|
-
module = None
|
|
75
|
-
for cls_name, cls_inst in inspect.getmembers(file_module, predicate=inspect.isclass):
|
|
76
|
-
spec = getattr(cls_inst, '__dtlpy__', None)
|
|
77
|
-
if spec is not None:
|
|
78
|
-
functions = spec['functions']
|
|
79
|
-
available_methods = [name for name in ['train', 'predict']
|
|
80
|
-
if 'BaseModelAdapter' not in getattr(cls_inst, name).__qualname__]
|
|
81
|
-
if "train" not in available_methods:
|
|
82
|
-
# remove train_model from functions list if train is not available
|
|
83
|
-
functions[:] = [d for d in functions if d.get('name') != "train_model"]
|
|
84
|
-
if "predict" not in available_methods:
|
|
85
|
-
# remove predict_items from functions list if predict is not available
|
|
86
|
-
functions[:] = [d for d in functions if d.get('name') != "predict_items"]
|
|
87
|
-
if "extract_features" not in available_methods:
|
|
88
|
-
# remove extract_item_features from functions list if extract_features is not available
|
|
89
|
-
functions[:] = [d for d in functions if d.get('name') != "extract_item_features"]
|
|
90
|
-
spec['entryPoint'] = entry_point
|
|
91
|
-
spec['functions'] = functions
|
|
92
|
-
module = cls.from_json(spec)
|
|
93
|
-
break
|
|
94
|
-
if module is None:
|
|
95
|
-
raise ValueError('Failed to find a decorated Runner class in file: {}'.format(entry_point))
|
|
96
|
-
return module
|
|
97
|
-
|
|
98
|
-
def add_function(self, function):
|
|
99
|
-
"""
|
|
100
|
-
:param function:
|
|
101
|
-
"""
|
|
102
|
-
if not isinstance(self.functions, list):
|
|
103
|
-
self.functions = [self.functions]
|
|
104
|
-
if isinstance(function, entities.PackageFunction):
|
|
105
|
-
self.functions.append(function)
|
|
106
|
-
elif isinstance(function, dict):
|
|
107
|
-
self.functions.append(entities.PackageFunction.from_json(function))
|
|
108
|
-
else:
|
|
109
|
-
raise ValueError('Unknown function type: {}. Expecting dl.PackageFunction or dict')
|
|
110
|
-
|
|
111
|
-
def to_json(self):
|
|
112
|
-
_json = self._dict.copy()
|
|
113
|
-
return _json
|
|
1
|
+
import importlib.util
|
|
2
|
+
import inspect
|
|
3
|
+
import logging
|
|
4
|
+
import typing
|
|
5
|
+
|
|
6
|
+
from .. import entities
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(name='dtlpy')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PackageModule(entities.DlEntity):
|
|
12
|
+
"""
|
|
13
|
+
PackageModule object
|
|
14
|
+
"""
|
|
15
|
+
# platform
|
|
16
|
+
name: str = entities.DlProperty(location=['name'], _type=str)
|
|
17
|
+
init_inputs: typing.List['entities.FunctionIO'] = entities.DlProperty(location=['initInputs'],
|
|
18
|
+
_type=typing.Union[list, None],
|
|
19
|
+
_kls='FunctionIO')
|
|
20
|
+
|
|
21
|
+
entry_point = entities.DlProperty(location=['entryPoint'],
|
|
22
|
+
_type=str,
|
|
23
|
+
default=entities.package_defaults.DEFAULT_PACKAGE_ENTRY_POINT)
|
|
24
|
+
class_name = entities.DlProperty(location=['className'],
|
|
25
|
+
_type=dict,
|
|
26
|
+
default=entities.package_defaults.DEFAULT_PACKAGE_CLASS_NAME)
|
|
27
|
+
functions: typing.List['entities.PackageFunction'] = entities.DlProperty(location=['functions'],
|
|
28
|
+
_type=list,
|
|
29
|
+
default=list(),
|
|
30
|
+
_kls='PackageFunction')
|
|
31
|
+
compute_config: str = entities.DlProperty(location=['computeConfig'], _type=str, default=None)
|
|
32
|
+
|
|
33
|
+
def __repr__(self):
|
|
34
|
+
# TODO need to move to DlEntity
|
|
35
|
+
return f"PackageModule(name={self.name}, entry_point={self.entry_point}, class_name={self.class_name})"
|
|
36
|
+
|
|
37
|
+
@functions.validator
|
|
38
|
+
def validate_functions(self, value: list):
|
|
39
|
+
if not isinstance(value, list):
|
|
40
|
+
raise Exception('Module functions must be a list.')
|
|
41
|
+
if not self.unique_functions(value):
|
|
42
|
+
raise Exception('Cannot have 2 functions by the same name in one module.')
|
|
43
|
+
|
|
44
|
+
@staticmethod
|
|
45
|
+
def unique_functions(functions: list):
|
|
46
|
+
return len(functions) == len(set([function.name for function in functions]))
|
|
47
|
+
|
|
48
|
+
@name.default
|
|
49
|
+
def set_name(self):
|
|
50
|
+
logger.warning('No module name was given. Using default name: {}'.format(
|
|
51
|
+
entities.package_defaults.DEFAULT_PACKAGE_MODULE_NAME))
|
|
52
|
+
return entities.package_defaults.DEFAULT_PACKAGE_MODULE_NAME
|
|
53
|
+
|
|
54
|
+
@init_inputs.default
|
|
55
|
+
def set_init_inputs(self):
|
|
56
|
+
return list()
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def from_json(cls, _json):
|
|
60
|
+
inst = cls(_dict=_json)
|
|
61
|
+
return inst
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def from_entry_point(cls, entry_point):
|
|
65
|
+
"""
|
|
66
|
+
Create a dl.PackageModule entity using decorator on the service class.
|
|
67
|
+
|
|
68
|
+
:param entry_point: path to the python file with the runner class (relative to the package path)
|
|
69
|
+
:return:
|
|
70
|
+
"""
|
|
71
|
+
file_spec = importlib.util.spec_from_file_location(entry_point, entry_point)
|
|
72
|
+
file_module = importlib.util.module_from_spec(file_spec)
|
|
73
|
+
file_spec.loader.exec_module(file_module)
|
|
74
|
+
module = None
|
|
75
|
+
for cls_name, cls_inst in inspect.getmembers(file_module, predicate=inspect.isclass):
|
|
76
|
+
spec = getattr(cls_inst, '__dtlpy__', None)
|
|
77
|
+
if spec is not None:
|
|
78
|
+
functions = spec['functions']
|
|
79
|
+
available_methods = [name for name in ['train', 'predict']
|
|
80
|
+
if 'BaseModelAdapter' not in getattr(cls_inst, name).__qualname__]
|
|
81
|
+
if "train" not in available_methods:
|
|
82
|
+
# remove train_model from functions list if train is not available
|
|
83
|
+
functions[:] = [d for d in functions if d.get('name') != "train_model"]
|
|
84
|
+
if "predict" not in available_methods:
|
|
85
|
+
# remove predict_items from functions list if predict is not available
|
|
86
|
+
functions[:] = [d for d in functions if d.get('name') != "predict_items"]
|
|
87
|
+
if "extract_features" not in available_methods:
|
|
88
|
+
# remove extract_item_features from functions list if extract_features is not available
|
|
89
|
+
functions[:] = [d for d in functions if d.get('name') != "extract_item_features"]
|
|
90
|
+
spec['entryPoint'] = entry_point
|
|
91
|
+
spec['functions'] = functions
|
|
92
|
+
module = cls.from_json(spec)
|
|
93
|
+
break
|
|
94
|
+
if module is None:
|
|
95
|
+
raise ValueError('Failed to find a decorated Runner class in file: {}'.format(entry_point))
|
|
96
|
+
return module
|
|
97
|
+
|
|
98
|
+
def add_function(self, function):
|
|
99
|
+
"""
|
|
100
|
+
:param function:
|
|
101
|
+
"""
|
|
102
|
+
if not isinstance(self.functions, list):
|
|
103
|
+
self.functions = [self.functions]
|
|
104
|
+
if isinstance(function, entities.PackageFunction):
|
|
105
|
+
self.functions.append(function)
|
|
106
|
+
elif isinstance(function, dict):
|
|
107
|
+
self.functions.append(entities.PackageFunction.from_json(function))
|
|
108
|
+
else:
|
|
109
|
+
raise ValueError('Unknown function type: {}. Expecting dl.PackageFunction or dict')
|
|
110
|
+
|
|
111
|
+
def to_json(self):
|
|
112
|
+
_json = self._dict.copy()
|
|
113
|
+
return _json
|