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/base_entity.py
CHANGED
|
@@ -1,214 +1,214 @@
|
|
|
1
|
-
import functools
|
|
2
|
-
import logging
|
|
3
|
-
import enum
|
|
4
|
-
|
|
5
|
-
from .. import miscellaneous
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger('dtlpy')
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class EntityScopeLevel(str, enum.Enum):
|
|
11
|
-
PRIVATE = 'private',
|
|
12
|
-
PROJECT = 'project',
|
|
13
|
-
ORG = 'org',
|
|
14
|
-
PUBLIC = 'public'
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class BaseEntity(object):
|
|
18
|
-
is_fetched = True
|
|
19
|
-
|
|
20
|
-
def print(self, to_return=False, columns=None):
|
|
21
|
-
"""
|
|
22
|
-
:param to_return:
|
|
23
|
-
:param columns:
|
|
24
|
-
"""
|
|
25
|
-
return miscellaneous.List([self]).print(to_return=to_return, columns=columns)
|
|
26
|
-
|
|
27
|
-
def to_df(self, show_all=False, columns=None):
|
|
28
|
-
"""
|
|
29
|
-
:param show_all:
|
|
30
|
-
:param columns:
|
|
31
|
-
"""
|
|
32
|
-
return miscellaneous.List([self]).to_df(show_all=show_all, columns=columns)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
# for auto-complete
|
|
36
|
-
from typing import TYPE_CHECKING
|
|
37
|
-
|
|
38
|
-
RUNTIME = not TYPE_CHECKING
|
|
39
|
-
if RUNTIME:
|
|
40
|
-
def base_model(model):
|
|
41
|
-
return model
|
|
42
|
-
else:
|
|
43
|
-
from dataclasses import dataclass as base_model
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class DlList(list):
|
|
47
|
-
def __init__(self, _list=None, _dict=None, _type=None):
|
|
48
|
-
if _list is None:
|
|
49
|
-
_list = list()
|
|
50
|
-
if _dict is None:
|
|
51
|
-
_dict = list()
|
|
52
|
-
self._dict = _dict
|
|
53
|
-
self._type = _type
|
|
54
|
-
super(DlList, self).__init__(_list)
|
|
55
|
-
|
|
56
|
-
def append(self, item) -> None:
|
|
57
|
-
if self._type is not None:
|
|
58
|
-
assert isinstance(item, self._type), f'Cannot append type: {type(item)}. Must be type {self._type}'
|
|
59
|
-
self._dict.append(item.to_json())
|
|
60
|
-
super(DlList, self).append(item) # append the item to itself (the list)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
@base_model
|
|
64
|
-
class DlEntity(object):
|
|
65
|
-
is_fetched = True
|
|
66
|
-
|
|
67
|
-
def __init__(self, _dict=None, **kwargs):
|
|
68
|
-
# using dict by reference and not creating a new one each time
|
|
69
|
-
if _dict is None:
|
|
70
|
-
_dict = dict()
|
|
71
|
-
self._dict = _dict
|
|
72
|
-
# this will set all the inputs to right location (using the dl.Property definitions)
|
|
73
|
-
for key, value in kwargs.items():
|
|
74
|
-
if key == "_dict":
|
|
75
|
-
self._dict.update(value.copy())
|
|
76
|
-
else:
|
|
77
|
-
self.__setattr__(key, value)
|
|
78
|
-
self._set_defaults()
|
|
79
|
-
|
|
80
|
-
def _set_defaults(self):
|
|
81
|
-
# getting all attribute (that are DlProperty) to set defaults to _dict
|
|
82
|
-
# https://stackoverflow.com/questions/21962769/is-it-possible-to-test-if-object-property-uses-a-descriptor
|
|
83
|
-
for att, a_type in type(self).__mro__[0].__dict__.items():
|
|
84
|
-
if isinstance(a_type, DlProperty):
|
|
85
|
-
_ = self.__getattribute__(att)
|
|
86
|
-
|
|
87
|
-
def print(self, to_return=False, columns=None):
|
|
88
|
-
"""
|
|
89
|
-
:param to_return:
|
|
90
|
-
:param columns:
|
|
91
|
-
"""
|
|
92
|
-
return miscellaneous.List([self]).print(to_return=to_return, columns=columns)
|
|
93
|
-
|
|
94
|
-
def to_df(self, show_all=False, columns=None):
|
|
95
|
-
"""
|
|
96
|
-
:param show_all:
|
|
97
|
-
:param columns:
|
|
98
|
-
"""
|
|
99
|
-
return miscellaneous.List([self]).to_df(show_all=show_all, columns=columns)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
class DlProperty:
|
|
103
|
-
def __init__(self, location=None, default='NODEFAULT', _type=None, _kls=None):
|
|
104
|
-
self.location = location
|
|
105
|
-
self._default = default
|
|
106
|
-
self._type = _type
|
|
107
|
-
self._validator = None
|
|
108
|
-
self._kls = _kls
|
|
109
|
-
|
|
110
|
-
##############
|
|
111
|
-
# decorators #
|
|
112
|
-
##############
|
|
113
|
-
def default(self, method=None):
|
|
114
|
-
@functools.wraps(method)
|
|
115
|
-
def _default(self):
|
|
116
|
-
return method(self)
|
|
117
|
-
|
|
118
|
-
self._default = _default
|
|
119
|
-
return self._default
|
|
120
|
-
|
|
121
|
-
def validator(self, method):
|
|
122
|
-
@functools.wraps(method)
|
|
123
|
-
def _validator(self, value):
|
|
124
|
-
return method(self, value)
|
|
125
|
-
|
|
126
|
-
self._validator = _validator
|
|
127
|
-
return self._validator
|
|
128
|
-
|
|
129
|
-
############
|
|
130
|
-
# privates #
|
|
131
|
-
############
|
|
132
|
-
@staticmethod
|
|
133
|
-
def _get_class(kls):
|
|
134
|
-
import importlib
|
|
135
|
-
module = importlib.import_module(f'.entities', package='dtlpy')
|
|
136
|
-
kls = getattr(module, kls)
|
|
137
|
-
return kls
|
|
138
|
-
|
|
139
|
-
def _get_default(self, instance):
|
|
140
|
-
if callable(self._default):
|
|
141
|
-
default = self._default(self=instance)
|
|
142
|
-
else:
|
|
143
|
-
default = self._default
|
|
144
|
-
return default
|
|
145
|
-
|
|
146
|
-
def _to_dict(self, inst):
|
|
147
|
-
if self._kls is not None:
|
|
148
|
-
if isinstance(inst, list) and all(hasattr(v, 'to_json') for v in inst):
|
|
149
|
-
_dict = [v.to_json() for v in inst]
|
|
150
|
-
elif hasattr(inst, 'to_json'):
|
|
151
|
-
_dict = inst.to_json()
|
|
152
|
-
else:
|
|
153
|
-
_dict = inst
|
|
154
|
-
else:
|
|
155
|
-
_dict = inst
|
|
156
|
-
return _dict
|
|
157
|
-
|
|
158
|
-
def _to_instance(self, _dict):
|
|
159
|
-
if self._kls is not None:
|
|
160
|
-
kls = self._get_class(kls=self._kls)
|
|
161
|
-
if isinstance(_dict, list) and all(isinstance(v, dict) for v in _dict):
|
|
162
|
-
value = DlList(_list=[kls.from_json(v) for v in _dict],
|
|
163
|
-
_type=kls,
|
|
164
|
-
_dict=_dict)
|
|
165
|
-
elif isinstance(_dict, dict):
|
|
166
|
-
value = kls(_dict=_dict, **_dict)
|
|
167
|
-
else:
|
|
168
|
-
value = _dict
|
|
169
|
-
else:
|
|
170
|
-
value = _dict
|
|
171
|
-
return value
|
|
172
|
-
|
|
173
|
-
def __get__(self, instance, owner):
|
|
174
|
-
_dict = instance._dict
|
|
175
|
-
for key in self.location[:-1]:
|
|
176
|
-
_dict = _dict.get(key, dict())
|
|
177
|
-
|
|
178
|
-
# get default if set - can also be callable
|
|
179
|
-
try:
|
|
180
|
-
value = _dict[self.location[-1]]
|
|
181
|
-
except KeyError:
|
|
182
|
-
# get the default only of value doesnt exists
|
|
183
|
-
value = self._get_default(instance=instance)
|
|
184
|
-
if value == 'NODEFAULT':
|
|
185
|
-
# if NODEFAULT - set value to None and DONT save in the _dict
|
|
186
|
-
value = None
|
|
187
|
-
else:
|
|
188
|
-
# if default value is set - add the value into the _dict
|
|
189
|
-
_dict[self.location[-1]] = value
|
|
190
|
-
|
|
191
|
-
# instantiate dictionary to the type
|
|
192
|
-
value = self._to_instance(_dict=value)
|
|
193
|
-
return value
|
|
194
|
-
|
|
195
|
-
def __set__(self, instance, value):
|
|
196
|
-
|
|
197
|
-
# validate - if validator is set
|
|
198
|
-
if self._validator is not None:
|
|
199
|
-
# instantiate the value before validation
|
|
200
|
-
inst = self._to_instance(_dict=value)
|
|
201
|
-
self._validator(self=instance, value=inst)
|
|
202
|
-
|
|
203
|
-
# convert to the value's kls
|
|
204
|
-
value = self._to_dict(inst=value)
|
|
205
|
-
|
|
206
|
-
# set value in the dictionary
|
|
207
|
-
_dict = instance._dict
|
|
208
|
-
for key in self.location[:-1]:
|
|
209
|
-
_tmp_dict = _dict.get(key, None)
|
|
210
|
-
# create the dict inside to be able to point
|
|
211
|
-
if _tmp_dict is None:
|
|
212
|
-
_dict[key] = dict()
|
|
213
|
-
_dict = _dict.get(key, None)
|
|
214
|
-
_dict[self.location[-1]] = value
|
|
1
|
+
import functools
|
|
2
|
+
import logging
|
|
3
|
+
import enum
|
|
4
|
+
|
|
5
|
+
from .. import miscellaneous
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger('dtlpy')
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EntityScopeLevel(str, enum.Enum):
|
|
11
|
+
PRIVATE = 'private',
|
|
12
|
+
PROJECT = 'project',
|
|
13
|
+
ORG = 'org',
|
|
14
|
+
PUBLIC = 'public'
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BaseEntity(object):
|
|
18
|
+
is_fetched = True
|
|
19
|
+
|
|
20
|
+
def print(self, to_return=False, columns=None):
|
|
21
|
+
"""
|
|
22
|
+
:param to_return:
|
|
23
|
+
:param columns:
|
|
24
|
+
"""
|
|
25
|
+
return miscellaneous.List([self]).print(to_return=to_return, columns=columns)
|
|
26
|
+
|
|
27
|
+
def to_df(self, show_all=False, columns=None):
|
|
28
|
+
"""
|
|
29
|
+
:param show_all:
|
|
30
|
+
:param columns:
|
|
31
|
+
"""
|
|
32
|
+
return miscellaneous.List([self]).to_df(show_all=show_all, columns=columns)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# for auto-complete
|
|
36
|
+
from typing import TYPE_CHECKING
|
|
37
|
+
|
|
38
|
+
RUNTIME = not TYPE_CHECKING
|
|
39
|
+
if RUNTIME:
|
|
40
|
+
def base_model(model):
|
|
41
|
+
return model
|
|
42
|
+
else:
|
|
43
|
+
from dataclasses import dataclass as base_model
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class DlList(list):
|
|
47
|
+
def __init__(self, _list=None, _dict=None, _type=None):
|
|
48
|
+
if _list is None:
|
|
49
|
+
_list = list()
|
|
50
|
+
if _dict is None:
|
|
51
|
+
_dict = list()
|
|
52
|
+
self._dict = _dict
|
|
53
|
+
self._type = _type
|
|
54
|
+
super(DlList, self).__init__(_list)
|
|
55
|
+
|
|
56
|
+
def append(self, item) -> None:
|
|
57
|
+
if self._type is not None:
|
|
58
|
+
assert isinstance(item, self._type), f'Cannot append type: {type(item)}. Must be type {self._type}'
|
|
59
|
+
self._dict.append(item.to_json())
|
|
60
|
+
super(DlList, self).append(item) # append the item to itself (the list)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@base_model
|
|
64
|
+
class DlEntity(object):
|
|
65
|
+
is_fetched = True
|
|
66
|
+
|
|
67
|
+
def __init__(self, _dict=None, **kwargs):
|
|
68
|
+
# using dict by reference and not creating a new one each time
|
|
69
|
+
if _dict is None:
|
|
70
|
+
_dict = dict()
|
|
71
|
+
self._dict = _dict
|
|
72
|
+
# this will set all the inputs to right location (using the dl.Property definitions)
|
|
73
|
+
for key, value in kwargs.items():
|
|
74
|
+
if key == "_dict":
|
|
75
|
+
self._dict.update(value.copy())
|
|
76
|
+
else:
|
|
77
|
+
self.__setattr__(key, value)
|
|
78
|
+
self._set_defaults()
|
|
79
|
+
|
|
80
|
+
def _set_defaults(self):
|
|
81
|
+
# getting all attribute (that are DlProperty) to set defaults to _dict
|
|
82
|
+
# https://stackoverflow.com/questions/21962769/is-it-possible-to-test-if-object-property-uses-a-descriptor
|
|
83
|
+
for att, a_type in type(self).__mro__[0].__dict__.items():
|
|
84
|
+
if isinstance(a_type, DlProperty):
|
|
85
|
+
_ = self.__getattribute__(att)
|
|
86
|
+
|
|
87
|
+
def print(self, to_return=False, columns=None):
|
|
88
|
+
"""
|
|
89
|
+
:param to_return:
|
|
90
|
+
:param columns:
|
|
91
|
+
"""
|
|
92
|
+
return miscellaneous.List([self]).print(to_return=to_return, columns=columns)
|
|
93
|
+
|
|
94
|
+
def to_df(self, show_all=False, columns=None):
|
|
95
|
+
"""
|
|
96
|
+
:param show_all:
|
|
97
|
+
:param columns:
|
|
98
|
+
"""
|
|
99
|
+
return miscellaneous.List([self]).to_df(show_all=show_all, columns=columns)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class DlProperty:
|
|
103
|
+
def __init__(self, location=None, default='NODEFAULT', _type=None, _kls=None):
|
|
104
|
+
self.location = location
|
|
105
|
+
self._default = default
|
|
106
|
+
self._type = _type
|
|
107
|
+
self._validator = None
|
|
108
|
+
self._kls = _kls
|
|
109
|
+
|
|
110
|
+
##############
|
|
111
|
+
# decorators #
|
|
112
|
+
##############
|
|
113
|
+
def default(self, method=None):
|
|
114
|
+
@functools.wraps(method)
|
|
115
|
+
def _default(self):
|
|
116
|
+
return method(self)
|
|
117
|
+
|
|
118
|
+
self._default = _default
|
|
119
|
+
return self._default
|
|
120
|
+
|
|
121
|
+
def validator(self, method):
|
|
122
|
+
@functools.wraps(method)
|
|
123
|
+
def _validator(self, value):
|
|
124
|
+
return method(self, value)
|
|
125
|
+
|
|
126
|
+
self._validator = _validator
|
|
127
|
+
return self._validator
|
|
128
|
+
|
|
129
|
+
############
|
|
130
|
+
# privates #
|
|
131
|
+
############
|
|
132
|
+
@staticmethod
|
|
133
|
+
def _get_class(kls):
|
|
134
|
+
import importlib
|
|
135
|
+
module = importlib.import_module(f'.entities', package='dtlpy')
|
|
136
|
+
kls = getattr(module, kls)
|
|
137
|
+
return kls
|
|
138
|
+
|
|
139
|
+
def _get_default(self, instance):
|
|
140
|
+
if callable(self._default):
|
|
141
|
+
default = self._default(self=instance)
|
|
142
|
+
else:
|
|
143
|
+
default = self._default
|
|
144
|
+
return default
|
|
145
|
+
|
|
146
|
+
def _to_dict(self, inst):
|
|
147
|
+
if self._kls is not None:
|
|
148
|
+
if isinstance(inst, list) and all(hasattr(v, 'to_json') for v in inst):
|
|
149
|
+
_dict = [v.to_json() for v in inst]
|
|
150
|
+
elif hasattr(inst, 'to_json'):
|
|
151
|
+
_dict = inst.to_json()
|
|
152
|
+
else:
|
|
153
|
+
_dict = inst
|
|
154
|
+
else:
|
|
155
|
+
_dict = inst
|
|
156
|
+
return _dict
|
|
157
|
+
|
|
158
|
+
def _to_instance(self, _dict):
|
|
159
|
+
if self._kls is not None:
|
|
160
|
+
kls = self._get_class(kls=self._kls)
|
|
161
|
+
if isinstance(_dict, list) and all(isinstance(v, dict) for v in _dict):
|
|
162
|
+
value = DlList(_list=[kls.from_json(v) for v in _dict],
|
|
163
|
+
_type=kls,
|
|
164
|
+
_dict=_dict)
|
|
165
|
+
elif isinstance(_dict, dict):
|
|
166
|
+
value = kls(_dict=_dict, **_dict)
|
|
167
|
+
else:
|
|
168
|
+
value = _dict
|
|
169
|
+
else:
|
|
170
|
+
value = _dict
|
|
171
|
+
return value
|
|
172
|
+
|
|
173
|
+
def __get__(self, instance, owner):
|
|
174
|
+
_dict = instance._dict
|
|
175
|
+
for key in self.location[:-1]:
|
|
176
|
+
_dict = _dict.get(key, dict())
|
|
177
|
+
|
|
178
|
+
# get default if set - can also be callable
|
|
179
|
+
try:
|
|
180
|
+
value = _dict[self.location[-1]]
|
|
181
|
+
except KeyError:
|
|
182
|
+
# get the default only of value doesnt exists
|
|
183
|
+
value = self._get_default(instance=instance)
|
|
184
|
+
if value == 'NODEFAULT':
|
|
185
|
+
# if NODEFAULT - set value to None and DONT save in the _dict
|
|
186
|
+
value = None
|
|
187
|
+
else:
|
|
188
|
+
# if default value is set - add the value into the _dict
|
|
189
|
+
_dict[self.location[-1]] = value
|
|
190
|
+
|
|
191
|
+
# instantiate dictionary to the type
|
|
192
|
+
value = self._to_instance(_dict=value)
|
|
193
|
+
return value
|
|
194
|
+
|
|
195
|
+
def __set__(self, instance, value):
|
|
196
|
+
|
|
197
|
+
# validate - if validator is set
|
|
198
|
+
if self._validator is not None:
|
|
199
|
+
# instantiate the value before validation
|
|
200
|
+
inst = self._to_instance(_dict=value)
|
|
201
|
+
self._validator(self=instance, value=inst)
|
|
202
|
+
|
|
203
|
+
# convert to the value's kls
|
|
204
|
+
value = self._to_dict(inst=value)
|
|
205
|
+
|
|
206
|
+
# set value in the dictionary
|
|
207
|
+
_dict = instance._dict
|
|
208
|
+
for key in self.location[:-1]:
|
|
209
|
+
_tmp_dict = _dict.get(key, None)
|
|
210
|
+
# create the dict inside to be able to point
|
|
211
|
+
if _tmp_dict is None:
|
|
212
|
+
_dict[key] = dict()
|
|
213
|
+
_dict = _dict.get(key, None)
|
|
214
|
+
_dict[self.location[-1]] = value
|
dtlpy/entities/bot.py
CHANGED
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
import traceback
|
|
2
|
-
import logging
|
|
3
|
-
import attr
|
|
4
|
-
|
|
5
|
-
from .. import entities, exceptions, repositories
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger(name='dtlpy')
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@attr.s
|
|
11
|
-
class Bot(entities.User):
|
|
12
|
-
"""
|
|
13
|
-
Bot entity
|
|
14
|
-
"""
|
|
15
|
-
_bots = attr.ib(repr=False, default=None)
|
|
16
|
-
password = attr.ib(default=None)
|
|
17
|
-
|
|
18
|
-
@staticmethod
|
|
19
|
-
def _protected_from_json(_json, project, client_api, bots=None):
|
|
20
|
-
"""
|
|
21
|
-
Same as from_json but with try-except to catch if error
|
|
22
|
-
:param _json: platform json
|
|
23
|
-
:param project: project entity
|
|
24
|
-
:param client_api: ApiClient entity
|
|
25
|
-
:param bots:
|
|
26
|
-
:return:
|
|
27
|
-
"""
|
|
28
|
-
try:
|
|
29
|
-
bot = Bot.from_json(_json=_json,
|
|
30
|
-
project=project,
|
|
31
|
-
bots=bots,
|
|
32
|
-
client_api=client_api)
|
|
33
|
-
status = True
|
|
34
|
-
except Exception:
|
|
35
|
-
bot = traceback.format_exc()
|
|
36
|
-
status = False
|
|
37
|
-
return status, bot
|
|
38
|
-
|
|
39
|
-
@classmethod
|
|
40
|
-
def from_json(cls, _json, project, client_api, bots=None):
|
|
41
|
-
"""
|
|
42
|
-
Build a Bot entity object from a json
|
|
43
|
-
|
|
44
|
-
:param _json: _json response from host
|
|
45
|
-
:param project: project entity
|
|
46
|
-
:param client_api: ApiClient entity
|
|
47
|
-
:param bots: Bots repository
|
|
48
|
-
:return: User object
|
|
49
|
-
"""
|
|
50
|
-
return cls(
|
|
51
|
-
created_at=_json.get('createdAt', None),
|
|
52
|
-
name=_json.get('firstName', None),
|
|
53
|
-
updated_at=_json.get('updatedAt', None),
|
|
54
|
-
last_name=_json.get('lastName', None),
|
|
55
|
-
username=_json.get('username', None),
|
|
56
|
-
avatar=_json.get('avatar', None),
|
|
57
|
-
email=_json.get('email', None),
|
|
58
|
-
type=_json.get('type', None),
|
|
59
|
-
role=_json.get('role', None),
|
|
60
|
-
org=_json.get('org', None),
|
|
61
|
-
id=_json.get('id', None),
|
|
62
|
-
project=project,
|
|
63
|
-
client_api=client_api,
|
|
64
|
-
bots=bots,
|
|
65
|
-
password=_json.get('password', None),
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
@property
|
|
69
|
-
def bots(self):
|
|
70
|
-
if self._bots is None:
|
|
71
|
-
self._bots = repositories.Bots(client_api=self._client_api, project=self._project)
|
|
72
|
-
assert isinstance(self._bots, repositories.Bots)
|
|
73
|
-
return self._bots
|
|
74
|
-
|
|
75
|
-
@property
|
|
76
|
-
def project(self):
|
|
77
|
-
if self._project is None:
|
|
78
|
-
raise exceptions.PlatformException(error='2001',
|
|
79
|
-
message='Missing entity "project".')
|
|
80
|
-
assert isinstance(self._project, entities.Project)
|
|
81
|
-
return self._project
|
|
82
|
-
|
|
83
|
-
def to_json(self):
|
|
84
|
-
"""
|
|
85
|
-
Returns platform _json format of object
|
|
86
|
-
|
|
87
|
-
:return: platform json format of object
|
|
88
|
-
:rtype: dict
|
|
89
|
-
"""
|
|
90
|
-
_json = attr.asdict(self,
|
|
91
|
-
filter=attr.filters.exclude(attr.fields(Bot)._project,
|
|
92
|
-
attr.fields(Bot).name,
|
|
93
|
-
attr.fields(Bot)._client_api,
|
|
94
|
-
attr.fields(Bot)._bots,
|
|
95
|
-
attr.fields(Bot)._users,
|
|
96
|
-
attr.fields(Bot).last_name,
|
|
97
|
-
attr.fields(Bot).created_at,
|
|
98
|
-
attr.fields(Bot).updated_at,
|
|
99
|
-
))
|
|
100
|
-
_json['firstName'] = self.name
|
|
101
|
-
_json['lastName'] = self.last_name
|
|
102
|
-
_json['createdAt'] = self.created_at
|
|
103
|
-
_json['updatedAt'] = self.updated_at
|
|
104
|
-
return _json
|
|
105
|
-
|
|
106
|
-
def delete(self):
|
|
107
|
-
"""
|
|
108
|
-
Delete the bot
|
|
109
|
-
|
|
110
|
-
:return: True
|
|
111
|
-
:rtype: bool
|
|
112
|
-
"""
|
|
113
|
-
return self.bots.delete(bot_id=self.id)
|
|
1
|
+
import traceback
|
|
2
|
+
import logging
|
|
3
|
+
import attr
|
|
4
|
+
|
|
5
|
+
from .. import entities, exceptions, repositories
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(name='dtlpy')
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@attr.s
|
|
11
|
+
class Bot(entities.User):
|
|
12
|
+
"""
|
|
13
|
+
Bot entity
|
|
14
|
+
"""
|
|
15
|
+
_bots = attr.ib(repr=False, default=None)
|
|
16
|
+
password = attr.ib(default=None)
|
|
17
|
+
|
|
18
|
+
@staticmethod
|
|
19
|
+
def _protected_from_json(_json, project, client_api, bots=None):
|
|
20
|
+
"""
|
|
21
|
+
Same as from_json but with try-except to catch if error
|
|
22
|
+
:param _json: platform json
|
|
23
|
+
:param project: project entity
|
|
24
|
+
:param client_api: ApiClient entity
|
|
25
|
+
:param bots:
|
|
26
|
+
:return:
|
|
27
|
+
"""
|
|
28
|
+
try:
|
|
29
|
+
bot = Bot.from_json(_json=_json,
|
|
30
|
+
project=project,
|
|
31
|
+
bots=bots,
|
|
32
|
+
client_api=client_api)
|
|
33
|
+
status = True
|
|
34
|
+
except Exception:
|
|
35
|
+
bot = traceback.format_exc()
|
|
36
|
+
status = False
|
|
37
|
+
return status, bot
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def from_json(cls, _json, project, client_api, bots=None):
|
|
41
|
+
"""
|
|
42
|
+
Build a Bot entity object from a json
|
|
43
|
+
|
|
44
|
+
:param _json: _json response from host
|
|
45
|
+
:param project: project entity
|
|
46
|
+
:param client_api: ApiClient entity
|
|
47
|
+
:param bots: Bots repository
|
|
48
|
+
:return: User object
|
|
49
|
+
"""
|
|
50
|
+
return cls(
|
|
51
|
+
created_at=_json.get('createdAt', None),
|
|
52
|
+
name=_json.get('firstName', None),
|
|
53
|
+
updated_at=_json.get('updatedAt', None),
|
|
54
|
+
last_name=_json.get('lastName', None),
|
|
55
|
+
username=_json.get('username', None),
|
|
56
|
+
avatar=_json.get('avatar', None),
|
|
57
|
+
email=_json.get('email', None),
|
|
58
|
+
type=_json.get('type', None),
|
|
59
|
+
role=_json.get('role', None),
|
|
60
|
+
org=_json.get('org', None),
|
|
61
|
+
id=_json.get('id', None),
|
|
62
|
+
project=project,
|
|
63
|
+
client_api=client_api,
|
|
64
|
+
bots=bots,
|
|
65
|
+
password=_json.get('password', None),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def bots(self):
|
|
70
|
+
if self._bots is None:
|
|
71
|
+
self._bots = repositories.Bots(client_api=self._client_api, project=self._project)
|
|
72
|
+
assert isinstance(self._bots, repositories.Bots)
|
|
73
|
+
return self._bots
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def project(self):
|
|
77
|
+
if self._project is None:
|
|
78
|
+
raise exceptions.PlatformException(error='2001',
|
|
79
|
+
message='Missing entity "project".')
|
|
80
|
+
assert isinstance(self._project, entities.Project)
|
|
81
|
+
return self._project
|
|
82
|
+
|
|
83
|
+
def to_json(self):
|
|
84
|
+
"""
|
|
85
|
+
Returns platform _json format of object
|
|
86
|
+
|
|
87
|
+
:return: platform json format of object
|
|
88
|
+
:rtype: dict
|
|
89
|
+
"""
|
|
90
|
+
_json = attr.asdict(self,
|
|
91
|
+
filter=attr.filters.exclude(attr.fields(Bot)._project,
|
|
92
|
+
attr.fields(Bot).name,
|
|
93
|
+
attr.fields(Bot)._client_api,
|
|
94
|
+
attr.fields(Bot)._bots,
|
|
95
|
+
attr.fields(Bot)._users,
|
|
96
|
+
attr.fields(Bot).last_name,
|
|
97
|
+
attr.fields(Bot).created_at,
|
|
98
|
+
attr.fields(Bot).updated_at,
|
|
99
|
+
))
|
|
100
|
+
_json['firstName'] = self.name
|
|
101
|
+
_json['lastName'] = self.last_name
|
|
102
|
+
_json['createdAt'] = self.created_at
|
|
103
|
+
_json['updatedAt'] = self.updated_at
|
|
104
|
+
return _json
|
|
105
|
+
|
|
106
|
+
def delete(self):
|
|
107
|
+
"""
|
|
108
|
+
Delete the bot
|
|
109
|
+
|
|
110
|
+
:return: True
|
|
111
|
+
:rtype: bool
|
|
112
|
+
"""
|
|
113
|
+
return self.bots.delete(bot_id=self.id)
|