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
dtlpy/exceptions.py
CHANGED
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
|
|
3
|
-
from . import services
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class PlatformException(Exception):
|
|
7
|
-
"""
|
|
8
|
-
Dataloop Exceptions
|
|
9
|
-
"""
|
|
10
|
-
def __init__(self, error=None, message=None):
|
|
11
|
-
"""
|
|
12
|
-
:param error: 'str' status code out of list
|
|
13
|
-
:param message: `str` describing the error
|
|
14
|
-
"""
|
|
15
|
-
self.status_code = None
|
|
16
|
-
self.message = message
|
|
17
|
-
|
|
18
|
-
exceptions = {
|
|
19
|
-
'400': BadRequest,
|
|
20
|
-
'401': Unauthorized,
|
|
21
|
-
'403': Forbidden,
|
|
22
|
-
'404': NotFound,
|
|
23
|
-
'408': RequestTimeout,
|
|
24
|
-
'409': Conflict,
|
|
25
|
-
'424': FailedDependency,
|
|
26
|
-
'500': InternalServerError,
|
|
27
|
-
'600': TokenExpired,
|
|
28
|
-
'1001': ShowAnnotationError,
|
|
29
|
-
'1002': ExportAnnotationError,
|
|
30
|
-
'2001': MissingEntity,
|
|
31
|
-
'3001': SDKError,
|
|
32
|
-
'3002': EntityPrintError
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if isinstance(error, requests.models.Response) or isinstance(error, services.AsyncResponse):
|
|
36
|
-
if hasattr(error, 'status_code'):
|
|
37
|
-
self.status_code = str(error.status_code)
|
|
38
|
-
if hasattr(error, 'text'):
|
|
39
|
-
try:
|
|
40
|
-
self.message = error.json().get('message', error.text)
|
|
41
|
-
except Exception:
|
|
42
|
-
self.message = error.text
|
|
43
|
-
|
|
44
|
-
else:
|
|
45
|
-
self.status_code = error
|
|
46
|
-
self.message = message
|
|
47
|
-
|
|
48
|
-
if self.status_code in exceptions:
|
|
49
|
-
raise exceptions[self.status_code](status_code=self.status_code, message=self.message)
|
|
50
|
-
else:
|
|
51
|
-
raise UnknownException(status_code=self.status_code, message=self.message)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
class ExceptionMain(Exception):
|
|
55
|
-
def __init__(self, status_code='Unknown Status Code', message='Unknown Error Message'):
|
|
56
|
-
self.status_code = status_code
|
|
57
|
-
self.message = message
|
|
58
|
-
super().__init__(status_code, message)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class NotFound(ExceptionMain):
|
|
62
|
-
pass
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
class InternalServerError(ExceptionMain):
|
|
66
|
-
pass
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class Forbidden(ExceptionMain):
|
|
70
|
-
pass
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
class Conflict(ExceptionMain):
|
|
74
|
-
pass
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class FailedDependency(ExceptionMain):
|
|
78
|
-
pass
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class BadRequest(ExceptionMain):
|
|
82
|
-
pass
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
class Unauthorized(ExceptionMain):
|
|
86
|
-
pass
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
class RequestTimeout(ExceptionMain):
|
|
90
|
-
pass
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class TokenExpired(ExceptionMain):
|
|
94
|
-
pass
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
class UnknownException(ExceptionMain):
|
|
98
|
-
pass
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
class MissingEntity(ExceptionMain):
|
|
102
|
-
pass
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
##########################
|
|
106
|
-
# annotations exceptions #
|
|
107
|
-
##########################
|
|
108
|
-
class ShowAnnotationError(ExceptionMain):
|
|
109
|
-
""" raised when error in annotations drawing"""
|
|
110
|
-
pass
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
class ExportAnnotationError(ExceptionMain):
|
|
114
|
-
""" raised when error in annotations drawing"""
|
|
115
|
-
pass
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
class SDKError(ExceptionMain):
|
|
119
|
-
""" raised when error in annotations drawing"""
|
|
120
|
-
pass
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
class EntityPrintError(ExceptionMain):
|
|
124
|
-
""" raised when error in annotations drawing"""
|
|
125
|
-
pass
|
|
1
|
+
import requests
|
|
2
|
+
|
|
3
|
+
from . import services
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class PlatformException(Exception):
|
|
7
|
+
"""
|
|
8
|
+
Dataloop Exceptions
|
|
9
|
+
"""
|
|
10
|
+
def __init__(self, error=None, message=None):
|
|
11
|
+
"""
|
|
12
|
+
:param error: 'str' status code out of list
|
|
13
|
+
:param message: `str` describing the error
|
|
14
|
+
"""
|
|
15
|
+
self.status_code = None
|
|
16
|
+
self.message = message
|
|
17
|
+
|
|
18
|
+
exceptions = {
|
|
19
|
+
'400': BadRequest,
|
|
20
|
+
'401': Unauthorized,
|
|
21
|
+
'403': Forbidden,
|
|
22
|
+
'404': NotFound,
|
|
23
|
+
'408': RequestTimeout,
|
|
24
|
+
'409': Conflict,
|
|
25
|
+
'424': FailedDependency,
|
|
26
|
+
'500': InternalServerError,
|
|
27
|
+
'600': TokenExpired,
|
|
28
|
+
'1001': ShowAnnotationError,
|
|
29
|
+
'1002': ExportAnnotationError,
|
|
30
|
+
'2001': MissingEntity,
|
|
31
|
+
'3001': SDKError,
|
|
32
|
+
'3002': EntityPrintError
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if isinstance(error, requests.models.Response) or isinstance(error, services.AsyncResponse):
|
|
36
|
+
if hasattr(error, 'status_code'):
|
|
37
|
+
self.status_code = str(error.status_code)
|
|
38
|
+
if hasattr(error, 'text'):
|
|
39
|
+
try:
|
|
40
|
+
self.message = error.json().get('message', error.text)
|
|
41
|
+
except Exception:
|
|
42
|
+
self.message = error.text
|
|
43
|
+
|
|
44
|
+
else:
|
|
45
|
+
self.status_code = error
|
|
46
|
+
self.message = message
|
|
47
|
+
|
|
48
|
+
if self.status_code in exceptions:
|
|
49
|
+
raise exceptions[self.status_code](status_code=self.status_code, message=self.message)
|
|
50
|
+
else:
|
|
51
|
+
raise UnknownException(status_code=self.status_code, message=self.message)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ExceptionMain(Exception):
|
|
55
|
+
def __init__(self, status_code='Unknown Status Code', message='Unknown Error Message'):
|
|
56
|
+
self.status_code = status_code
|
|
57
|
+
self.message = message
|
|
58
|
+
super().__init__(status_code, message)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class NotFound(ExceptionMain):
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class InternalServerError(ExceptionMain):
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class Forbidden(ExceptionMain):
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class Conflict(ExceptionMain):
|
|
74
|
+
pass
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class FailedDependency(ExceptionMain):
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class BadRequest(ExceptionMain):
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class Unauthorized(ExceptionMain):
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class RequestTimeout(ExceptionMain):
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TokenExpired(ExceptionMain):
|
|
94
|
+
pass
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class UnknownException(ExceptionMain):
|
|
98
|
+
pass
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class MissingEntity(ExceptionMain):
|
|
102
|
+
pass
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
##########################
|
|
106
|
+
# annotations exceptions #
|
|
107
|
+
##########################
|
|
108
|
+
class ShowAnnotationError(ExceptionMain):
|
|
109
|
+
""" raised when error in annotations drawing"""
|
|
110
|
+
pass
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class ExportAnnotationError(ExceptionMain):
|
|
114
|
+
""" raised when error in annotations drawing"""
|
|
115
|
+
pass
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class SDKError(ExceptionMain):
|
|
119
|
+
""" raised when error in annotations drawing"""
|
|
120
|
+
pass
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class EntityPrintError(ExceptionMain):
|
|
124
|
+
""" raised when error in annotations drawing"""
|
|
125
|
+
pass
|
dtlpy/miscellaneous/__init__.py
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
#! /usr/bin/env python3
|
|
2
|
-
# This file is part of DTLPY.
|
|
3
|
-
#
|
|
4
|
-
# DTLPY is free software: you can redistribute it and/or modify
|
|
5
|
-
# it under the terms of the GNU General Public License as published by
|
|
6
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
-
# (at your option) any later version.
|
|
8
|
-
#
|
|
9
|
-
# DTLPY is distributed in the hope that it will be useful,
|
|
10
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
-
# GNU General Public License for more details.
|
|
13
|
-
#
|
|
14
|
-
# You should have received a copy of the GNU General Public License
|
|
15
|
-
# along with DTLPY. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
-
from .dict_differ import DictDiffer
|
|
17
|
-
from .git_utils import GitUtils
|
|
18
|
-
from .zipping import Zipping
|
|
19
|
-
from .list_print import List
|
|
20
|
-
from .json_utils import JsonUtils
|
|
1
|
+
#! /usr/bin/env python3
|
|
2
|
+
# This file is part of DTLPY.
|
|
3
|
+
#
|
|
4
|
+
# DTLPY is free software: you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# DTLPY is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with DTLPY. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
from .dict_differ import DictDiffer
|
|
17
|
+
from .git_utils import GitUtils
|
|
18
|
+
from .zipping import Zipping
|
|
19
|
+
from .list_print import List
|
|
20
|
+
from .json_utils import JsonUtils
|
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
import dictdiffer
|
|
2
|
-
import logging
|
|
3
|
-
from typing import Union
|
|
4
|
-
|
|
5
|
-
logger = logging.getLogger(name='dtlpy')
|
|
6
|
-
TYPE = 0
|
|
7
|
-
FIELD = 1
|
|
8
|
-
LIST = 2
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class DictDiffer:
|
|
12
|
-
|
|
13
|
-
@staticmethod
|
|
14
|
-
def diff(origin, modified):
|
|
15
|
-
diffs = dict()
|
|
16
|
-
|
|
17
|
-
dict_diff = list(dictdiffer.diff(origin, modified))
|
|
18
|
-
for i_diff, diff in enumerate(dict_diff):
|
|
19
|
-
modified_field_pointer = modified
|
|
20
|
-
root_change = False
|
|
21
|
-
if len(diff[FIELD]) > 0:
|
|
22
|
-
field_pointer, modified_field_pointer, is_list = DictDiffer.get_field_path(
|
|
23
|
-
diffs=diffs,
|
|
24
|
-
path=diff[FIELD],
|
|
25
|
-
diff_type=diff[TYPE],
|
|
26
|
-
values=diff[LIST],
|
|
27
|
-
modified_field_pointer=modified_field_pointer
|
|
28
|
-
)
|
|
29
|
-
else:
|
|
30
|
-
field_pointer, modified_field_pointer, is_list, root_change = origin, modified, False, True
|
|
31
|
-
|
|
32
|
-
if is_list:
|
|
33
|
-
for i in modified_field_pointer:
|
|
34
|
-
if i not in field_pointer:
|
|
35
|
-
field_pointer.append(i)
|
|
36
|
-
continue
|
|
37
|
-
else:
|
|
38
|
-
if diff[TYPE] == 'add':
|
|
39
|
-
for addition in diff[LIST]:
|
|
40
|
-
field_pointer[addition[0]] = addition[1]
|
|
41
|
-
if root_change is True:
|
|
42
|
-
diffs[addition[0]] = addition[1]
|
|
43
|
-
|
|
44
|
-
elif diff[TYPE] == 'remove':
|
|
45
|
-
for deletion in diff[LIST]:
|
|
46
|
-
field_pointer[deletion[0]] = None
|
|
47
|
-
|
|
48
|
-
elif diff[TYPE] == 'change':
|
|
49
|
-
change = diff[LIST]
|
|
50
|
-
field = diff[FIELD]
|
|
51
|
-
if not isinstance(field, list):
|
|
52
|
-
field = field.split('.')
|
|
53
|
-
field_pointer[field[-1]] = change[1]
|
|
54
|
-
return diffs
|
|
55
|
-
|
|
56
|
-
@staticmethod
|
|
57
|
-
def next_is_list(path: list, i_level: Union[str, int], values):
|
|
58
|
-
if len(path) > (i_level + 1):
|
|
59
|
-
if isinstance(path[i_level + 1], int):
|
|
60
|
-
return True
|
|
61
|
-
elif isinstance(values[0][0], int):
|
|
62
|
-
return True
|
|
63
|
-
return False
|
|
64
|
-
|
|
65
|
-
@staticmethod
|
|
66
|
-
def get_field_path(diffs, path, diff_type, modified_field_pointer, values):
|
|
67
|
-
field_pointer = diffs
|
|
68
|
-
if not isinstance(path, list):
|
|
69
|
-
path = path.split('.')
|
|
70
|
-
|
|
71
|
-
next_is_list = False
|
|
72
|
-
if len(path) > 1 or diff_type != 'change':
|
|
73
|
-
for i_level, level in enumerate(path):
|
|
74
|
-
next_is_list = DictDiffer.next_is_list(i_level=i_level, path=path, values=values)
|
|
75
|
-
if diff_type == 'change' and level == path[-2]:
|
|
76
|
-
if level not in field_pointer:
|
|
77
|
-
if next_is_list:
|
|
78
|
-
field_pointer[level] = list()
|
|
79
|
-
else:
|
|
80
|
-
field_pointer[level] = dict()
|
|
81
|
-
field_pointer = field_pointer[level]
|
|
82
|
-
modified_field_pointer = modified_field_pointer[level]
|
|
83
|
-
break
|
|
84
|
-
if level not in field_pointer:
|
|
85
|
-
if next_is_list:
|
|
86
|
-
field_pointer[level] = list()
|
|
87
|
-
else:
|
|
88
|
-
field_pointer[level] = dict()
|
|
89
|
-
field_pointer = field_pointer[level]
|
|
90
|
-
modified_field_pointer = modified_field_pointer[level]
|
|
91
|
-
|
|
92
|
-
if next_is_list:
|
|
93
|
-
break
|
|
94
|
-
|
|
95
|
-
return field_pointer, modified_field_pointer, next_is_list
|
|
1
|
+
import dictdiffer
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Union
|
|
4
|
+
|
|
5
|
+
logger = logging.getLogger(name='dtlpy')
|
|
6
|
+
TYPE = 0
|
|
7
|
+
FIELD = 1
|
|
8
|
+
LIST = 2
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class DictDiffer:
|
|
12
|
+
|
|
13
|
+
@staticmethod
|
|
14
|
+
def diff(origin, modified):
|
|
15
|
+
diffs = dict()
|
|
16
|
+
|
|
17
|
+
dict_diff = list(dictdiffer.diff(origin, modified))
|
|
18
|
+
for i_diff, diff in enumerate(dict_diff):
|
|
19
|
+
modified_field_pointer = modified
|
|
20
|
+
root_change = False
|
|
21
|
+
if len(diff[FIELD]) > 0:
|
|
22
|
+
field_pointer, modified_field_pointer, is_list = DictDiffer.get_field_path(
|
|
23
|
+
diffs=diffs,
|
|
24
|
+
path=diff[FIELD],
|
|
25
|
+
diff_type=diff[TYPE],
|
|
26
|
+
values=diff[LIST],
|
|
27
|
+
modified_field_pointer=modified_field_pointer
|
|
28
|
+
)
|
|
29
|
+
else:
|
|
30
|
+
field_pointer, modified_field_pointer, is_list, root_change = origin, modified, False, True
|
|
31
|
+
|
|
32
|
+
if is_list:
|
|
33
|
+
for i in modified_field_pointer:
|
|
34
|
+
if i not in field_pointer:
|
|
35
|
+
field_pointer.append(i)
|
|
36
|
+
continue
|
|
37
|
+
else:
|
|
38
|
+
if diff[TYPE] == 'add':
|
|
39
|
+
for addition in diff[LIST]:
|
|
40
|
+
field_pointer[addition[0]] = addition[1]
|
|
41
|
+
if root_change is True:
|
|
42
|
+
diffs[addition[0]] = addition[1]
|
|
43
|
+
|
|
44
|
+
elif diff[TYPE] == 'remove':
|
|
45
|
+
for deletion in diff[LIST]:
|
|
46
|
+
field_pointer[deletion[0]] = None
|
|
47
|
+
|
|
48
|
+
elif diff[TYPE] == 'change':
|
|
49
|
+
change = diff[LIST]
|
|
50
|
+
field = diff[FIELD]
|
|
51
|
+
if not isinstance(field, list):
|
|
52
|
+
field = field.split('.')
|
|
53
|
+
field_pointer[field[-1]] = change[1]
|
|
54
|
+
return diffs
|
|
55
|
+
|
|
56
|
+
@staticmethod
|
|
57
|
+
def next_is_list(path: list, i_level: Union[str, int], values):
|
|
58
|
+
if len(path) > (i_level + 1):
|
|
59
|
+
if isinstance(path[i_level + 1], int):
|
|
60
|
+
return True
|
|
61
|
+
elif isinstance(values[0][0], int):
|
|
62
|
+
return True
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def get_field_path(diffs, path, diff_type, modified_field_pointer, values):
|
|
67
|
+
field_pointer = diffs
|
|
68
|
+
if not isinstance(path, list):
|
|
69
|
+
path = path.split('.')
|
|
70
|
+
|
|
71
|
+
next_is_list = False
|
|
72
|
+
if len(path) > 1 or diff_type != 'change':
|
|
73
|
+
for i_level, level in enumerate(path):
|
|
74
|
+
next_is_list = DictDiffer.next_is_list(i_level=i_level, path=path, values=values)
|
|
75
|
+
if diff_type == 'change' and level == path[-2]:
|
|
76
|
+
if level not in field_pointer:
|
|
77
|
+
if next_is_list:
|
|
78
|
+
field_pointer[level] = list()
|
|
79
|
+
else:
|
|
80
|
+
field_pointer[level] = dict()
|
|
81
|
+
field_pointer = field_pointer[level]
|
|
82
|
+
modified_field_pointer = modified_field_pointer[level]
|
|
83
|
+
break
|
|
84
|
+
if level not in field_pointer:
|
|
85
|
+
if next_is_list:
|
|
86
|
+
field_pointer[level] = list()
|
|
87
|
+
else:
|
|
88
|
+
field_pointer[level] = dict()
|
|
89
|
+
field_pointer = field_pointer[level]
|
|
90
|
+
modified_field_pointer = modified_field_pointer[level]
|
|
91
|
+
|
|
92
|
+
if next_is_list:
|
|
93
|
+
break
|
|
94
|
+
|
|
95
|
+
return field_pointer, modified_field_pointer, next_is_list
|