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
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
import datetime
|
|
2
|
-
import tabulate
|
|
3
|
-
import typing
|
|
4
|
-
import logging
|
|
5
|
-
import pandas
|
|
6
|
-
|
|
7
|
-
from .. import exceptions
|
|
8
|
-
|
|
9
|
-
logger = logging.getLogger(name='dtlpy')
|
|
10
|
-
|
|
11
|
-
T = typing.TypeVar('T')
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class List(list, typing.MutableSequence[T]):
|
|
15
|
-
def to_df(self, show_all=False, columns=None):
|
|
16
|
-
try:
|
|
17
|
-
to_print = list()
|
|
18
|
-
keys_list = list()
|
|
19
|
-
for element in self.__iter__():
|
|
20
|
-
if hasattr(element, 'to_json'):
|
|
21
|
-
item_dict = element.to_json()
|
|
22
|
-
else:
|
|
23
|
-
item_dict = element
|
|
24
|
-
to_print.append(item_dict)
|
|
25
|
-
[keys_list.append(key) for key in list(item_dict.keys()) if key not in keys_list]
|
|
26
|
-
try:
|
|
27
|
-
# try sorting bt creation date
|
|
28
|
-
to_print = sorted(to_print, key=lambda k: k['createdAt'] if k['createdAt'] is not None else "")
|
|
29
|
-
except KeyError:
|
|
30
|
-
pass
|
|
31
|
-
except Exception:
|
|
32
|
-
logger.exception('Error sorting printing:')
|
|
33
|
-
|
|
34
|
-
remove_keys_list = ['contributors', 'url', 'annotations', 'items', 'export', 'directoryTree', 'org',
|
|
35
|
-
'_contributors', 'role', 'account', 'featureConstraints',
|
|
36
|
-
'attributes', 'partitions', 'metadata', 'stream', 'updatedAt', 'arch',
|
|
37
|
-
'input', 'revisions', 'pipeline', # task fields
|
|
38
|
-
'feedbackQueue', # session fields
|
|
39
|
-
'_ontology_ids', '_labels', # dataset
|
|
40
|
-
'esInstance', 'esIndex', # time series fields
|
|
41
|
-
'thumbnail', # item thumnail too long
|
|
42
|
-
# services fields
|
|
43
|
-
'driverId', 'useUserJwt', 'versions', 'runtime', 'mq', 'global',
|
|
44
|
-
# triggers
|
|
45
|
-
'scope',
|
|
46
|
-
# Package
|
|
47
|
-
'modules'
|
|
48
|
-
]
|
|
49
|
-
if not show_all:
|
|
50
|
-
if columns is not None:
|
|
51
|
-
# take columns from inputs
|
|
52
|
-
if not isinstance(columns, list):
|
|
53
|
-
if not isinstance(columns, str):
|
|
54
|
-
raise exceptions.PlatformException(
|
|
55
|
-
error='3002',
|
|
56
|
-
message='"columns" input must be str or list. found: {}'.format(type(columns)))
|
|
57
|
-
columns = [columns]
|
|
58
|
-
keys_list = columns
|
|
59
|
-
else:
|
|
60
|
-
# take default columns
|
|
61
|
-
for key in remove_keys_list:
|
|
62
|
-
if key in keys_list:
|
|
63
|
-
keys_list.remove(key)
|
|
64
|
-
|
|
65
|
-
for element in to_print:
|
|
66
|
-
# handle printing errors for not ascii string when in cli
|
|
67
|
-
if 'name' in element:
|
|
68
|
-
try:
|
|
69
|
-
# check if ascii
|
|
70
|
-
element['name'].encode('ascii')
|
|
71
|
-
except UnicodeEncodeError:
|
|
72
|
-
# if not - print bytes instead
|
|
73
|
-
element['name'] = str(element['name']).encode('utf-8')
|
|
74
|
-
if 'createdAt' in element:
|
|
75
|
-
try:
|
|
76
|
-
str_timestamp = str(element['createdAt'])
|
|
77
|
-
if len(str_timestamp) > 10:
|
|
78
|
-
str_timestamp = str_timestamp[:10]
|
|
79
|
-
element['createdAt'] = datetime.datetime.fromtimestamp(int(str_timestamp), datetime.timezone.utc).isoformat()
|
|
80
|
-
except Exception:
|
|
81
|
-
pass
|
|
82
|
-
df = pandas.DataFrame(to_print, columns=keys_list)
|
|
83
|
-
return df
|
|
84
|
-
except Exception:
|
|
85
|
-
raise exceptions.PlatformException(error='3002',
|
|
86
|
-
message='Failed converting to DataFrame')
|
|
87
|
-
|
|
88
|
-
def print(self, show_all=False, level='print', to_return=False, columns=None):
|
|
89
|
-
try:
|
|
90
|
-
df = self.to_df(show_all=show_all, columns=columns)
|
|
91
|
-
if 'name' in list(df.columns.values):
|
|
92
|
-
df['name'] = df['name'].astype(str)
|
|
93
|
-
|
|
94
|
-
if to_return:
|
|
95
|
-
return tabulate.tabulate(df, headers='keys', tablefmt='psql')
|
|
96
|
-
else:
|
|
97
|
-
if level == 'print':
|
|
98
|
-
print('\n{}'.format(tabulate.tabulate(df, headers='keys', tablefmt='psql')))
|
|
99
|
-
elif level == 'debug':
|
|
100
|
-
logger.debug('\n{}'.format(tabulate.tabulate(df, headers='keys', tablefmt='psql')))
|
|
101
|
-
else:
|
|
102
|
-
raise ValueError('unknown log level in printing: {}'.format(level))
|
|
103
|
-
|
|
104
|
-
except Exception:
|
|
105
|
-
raise exceptions.PlatformException(error='3002', message='Failed printing entity')
|
|
1
|
+
import datetime
|
|
2
|
+
import tabulate
|
|
3
|
+
import typing
|
|
4
|
+
import logging
|
|
5
|
+
import pandas
|
|
6
|
+
|
|
7
|
+
from .. import exceptions
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(name='dtlpy')
|
|
10
|
+
|
|
11
|
+
T = typing.TypeVar('T')
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class List(list, typing.MutableSequence[T]):
|
|
15
|
+
def to_df(self, show_all=False, columns=None):
|
|
16
|
+
try:
|
|
17
|
+
to_print = list()
|
|
18
|
+
keys_list = list()
|
|
19
|
+
for element in self.__iter__():
|
|
20
|
+
if hasattr(element, 'to_json'):
|
|
21
|
+
item_dict = element.to_json()
|
|
22
|
+
else:
|
|
23
|
+
item_dict = element
|
|
24
|
+
to_print.append(item_dict)
|
|
25
|
+
[keys_list.append(key) for key in list(item_dict.keys()) if key not in keys_list]
|
|
26
|
+
try:
|
|
27
|
+
# try sorting bt creation date
|
|
28
|
+
to_print = sorted(to_print, key=lambda k: k['createdAt'] if k['createdAt'] is not None else "")
|
|
29
|
+
except KeyError:
|
|
30
|
+
pass
|
|
31
|
+
except Exception:
|
|
32
|
+
logger.exception('Error sorting printing:')
|
|
33
|
+
|
|
34
|
+
remove_keys_list = ['contributors', 'url', 'annotations', 'items', 'export', 'directoryTree', 'org',
|
|
35
|
+
'_contributors', 'role', 'account', 'featureConstraints',
|
|
36
|
+
'attributes', 'partitions', 'metadata', 'stream', 'updatedAt', 'arch',
|
|
37
|
+
'input', 'revisions', 'pipeline', # task fields
|
|
38
|
+
'feedbackQueue', # session fields
|
|
39
|
+
'_ontology_ids', '_labels', # dataset
|
|
40
|
+
'esInstance', 'esIndex', # time series fields
|
|
41
|
+
'thumbnail', # item thumnail too long
|
|
42
|
+
# services fields
|
|
43
|
+
'driverId', 'useUserJwt', 'versions', 'runtime', 'mq', 'global',
|
|
44
|
+
# triggers
|
|
45
|
+
'scope',
|
|
46
|
+
# Package
|
|
47
|
+
'modules'
|
|
48
|
+
]
|
|
49
|
+
if not show_all:
|
|
50
|
+
if columns is not None:
|
|
51
|
+
# take columns from inputs
|
|
52
|
+
if not isinstance(columns, list):
|
|
53
|
+
if not isinstance(columns, str):
|
|
54
|
+
raise exceptions.PlatformException(
|
|
55
|
+
error='3002',
|
|
56
|
+
message='"columns" input must be str or list. found: {}'.format(type(columns)))
|
|
57
|
+
columns = [columns]
|
|
58
|
+
keys_list = columns
|
|
59
|
+
else:
|
|
60
|
+
# take default columns
|
|
61
|
+
for key in remove_keys_list:
|
|
62
|
+
if key in keys_list:
|
|
63
|
+
keys_list.remove(key)
|
|
64
|
+
|
|
65
|
+
for element in to_print:
|
|
66
|
+
# handle printing errors for not ascii string when in cli
|
|
67
|
+
if 'name' in element:
|
|
68
|
+
try:
|
|
69
|
+
# check if ascii
|
|
70
|
+
element['name'].encode('ascii')
|
|
71
|
+
except UnicodeEncodeError:
|
|
72
|
+
# if not - print bytes instead
|
|
73
|
+
element['name'] = str(element['name']).encode('utf-8')
|
|
74
|
+
if 'createdAt' in element:
|
|
75
|
+
try:
|
|
76
|
+
str_timestamp = str(element['createdAt'])
|
|
77
|
+
if len(str_timestamp) > 10:
|
|
78
|
+
str_timestamp = str_timestamp[:10]
|
|
79
|
+
element['createdAt'] = datetime.datetime.fromtimestamp(int(str_timestamp), datetime.timezone.utc).isoformat()
|
|
80
|
+
except Exception:
|
|
81
|
+
pass
|
|
82
|
+
df = pandas.DataFrame(to_print, columns=keys_list)
|
|
83
|
+
return df
|
|
84
|
+
except Exception:
|
|
85
|
+
raise exceptions.PlatformException(error='3002',
|
|
86
|
+
message='Failed converting to DataFrame')
|
|
87
|
+
|
|
88
|
+
def print(self, show_all=False, level='print', to_return=False, columns=None):
|
|
89
|
+
try:
|
|
90
|
+
df = self.to_df(show_all=show_all, columns=columns)
|
|
91
|
+
if 'name' in list(df.columns.values):
|
|
92
|
+
df['name'] = df['name'].astype(str)
|
|
93
|
+
|
|
94
|
+
if to_return:
|
|
95
|
+
return tabulate.tabulate(df, headers='keys', tablefmt='psql')
|
|
96
|
+
else:
|
|
97
|
+
if level == 'print':
|
|
98
|
+
print('\n{}'.format(tabulate.tabulate(df, headers='keys', tablefmt='psql')))
|
|
99
|
+
elif level == 'debug':
|
|
100
|
+
logger.debug('\n{}'.format(tabulate.tabulate(df, headers='keys', tablefmt='psql')))
|
|
101
|
+
else:
|
|
102
|
+
raise ValueError('unknown log level in printing: {}'.format(level))
|
|
103
|
+
|
|
104
|
+
except Exception:
|
|
105
|
+
raise exceptions.PlatformException(error='3002', message='Failed printing entity')
|
dtlpy/miscellaneous/zipping.py
CHANGED
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import os
|
|
3
|
-
import zipfile
|
|
4
|
-
from typing import List
|
|
5
|
-
|
|
6
|
-
import numpy as np
|
|
7
|
-
import pathspec
|
|
8
|
-
|
|
9
|
-
logger = logging.getLogger(name='dtlpy')
|
|
10
|
-
|
|
11
|
-
MAX_ZIP_FILE = 100e6 # 100MB
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Zipping:
|
|
15
|
-
def __init__(self):
|
|
16
|
-
pass
|
|
17
|
-
|
|
18
|
-
@staticmethod
|
|
19
|
-
def zip_directory(zip_filename, directory=None, ignore_max_file_size=False, ignore_directories: List[str] = None):
|
|
20
|
-
"""
|
|
21
|
-
Zip Directory
|
|
22
|
-
Will ignore .gitignore files
|
|
23
|
-
|
|
24
|
-
:param directory: the directory to zip
|
|
25
|
-
:param zip_filename: the name of the zipfile.
|
|
26
|
-
:param ignore_max_file_size: ignore the limitation on the zip file size
|
|
27
|
-
:param list[str] ignore_directories: directories to ignore.
|
|
28
|
-
:return: None
|
|
29
|
-
"""
|
|
30
|
-
# default path
|
|
31
|
-
if directory is None:
|
|
32
|
-
directory = os.getcwd()
|
|
33
|
-
# check if directory
|
|
34
|
-
assert os.path.isdir(directory), '[ERROR] Directory does not exists: {}'.format(directory)
|
|
35
|
-
|
|
36
|
-
if '.gitignore' in os.listdir(directory):
|
|
37
|
-
with open(os.path.join(directory, '.gitignore')) as f:
|
|
38
|
-
spec_src = f.read()
|
|
39
|
-
else:
|
|
40
|
-
spec_src = ''
|
|
41
|
-
ignore_lines = spec_src.splitlines() + ['.git', '.dataloop']
|
|
42
|
-
if ignore_directories is not None:
|
|
43
|
-
ignore_lines += ignore_directories
|
|
44
|
-
spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, ignore_lines)
|
|
45
|
-
|
|
46
|
-
# init zip file
|
|
47
|
-
zip_file = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED)
|
|
48
|
-
try:
|
|
49
|
-
for root, dirs, files in os.walk(directory):
|
|
50
|
-
# remove dirs to avoid going file by file
|
|
51
|
-
for d in dirs:
|
|
52
|
-
if spec.match_file(os.path.relpath(os.path.join(root, d), directory)):
|
|
53
|
-
dirs.remove(d)
|
|
54
|
-
for file in files:
|
|
55
|
-
filepath = os.path.join(root, file)
|
|
56
|
-
if not spec.match_file(os.path.relpath(filepath, directory)):
|
|
57
|
-
Zipping.__add_to_zip_file(directory, filepath, ignore_max_file_size, zip_file)
|
|
58
|
-
finally:
|
|
59
|
-
zip_file.close()
|
|
60
|
-
|
|
61
|
-
@staticmethod
|
|
62
|
-
def zip_directory_inclusive(zip_filename, directory=None, ignore_max_file_size=False,
|
|
63
|
-
subpaths: List[str] = None):
|
|
64
|
-
"""
|
|
65
|
-
Zip Directory
|
|
66
|
-
Will ignore .gitignore files
|
|
67
|
-
|
|
68
|
-
:param directory: the directory to zip.
|
|
69
|
-
:param zip_filename: the name of the zipfile
|
|
70
|
-
:param ignore_max_file_size: ignore the limitation on the zip file size
|
|
71
|
-
:param list[str] subpaths: paths to include in the final zip (relative path).
|
|
72
|
-
:return: None
|
|
73
|
-
"""
|
|
74
|
-
# default path
|
|
75
|
-
if directory is None:
|
|
76
|
-
directory = os.getcwd()
|
|
77
|
-
# check if directory
|
|
78
|
-
assert os.path.isdir(directory), '[ERROR] Directory does not exists: %s' % directory
|
|
79
|
-
|
|
80
|
-
if '.gitignore' in os.listdir(directory):
|
|
81
|
-
with open(os.path.join(directory, '.gitignore')) as f:
|
|
82
|
-
spec_src = f.read()
|
|
83
|
-
else:
|
|
84
|
-
spec_src = ''
|
|
85
|
-
ignore_lines = spec_src.splitlines() + ['.git', '.dataloop']
|
|
86
|
-
spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, ignore_lines)
|
|
87
|
-
|
|
88
|
-
# init zip file
|
|
89
|
-
zip_file = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED)
|
|
90
|
-
try:
|
|
91
|
-
for root, dirs, files in os.walk(directory):
|
|
92
|
-
for file in files:
|
|
93
|
-
filepath = os.path.join(root, file)
|
|
94
|
-
if not spec.match_file(os.path.relpath(filepath, directory)) \
|
|
95
|
-
and Zipping.__check_filepath(os.path.relpath(filepath, directory), subpaths):
|
|
96
|
-
Zipping.__add_to_zip_file(directory, filepath, ignore_max_file_size, zip_file)
|
|
97
|
-
finally:
|
|
98
|
-
zip_file.close()
|
|
99
|
-
|
|
100
|
-
@staticmethod
|
|
101
|
-
def __check_filepath(filepath: str, paths: List[str]):
|
|
102
|
-
"""
|
|
103
|
-
Checks whether a specific file is inside one of the subdirectories
|
|
104
|
-
"""
|
|
105
|
-
return any(filepath.startswith(directory) for directory in paths)
|
|
106
|
-
|
|
107
|
-
@staticmethod
|
|
108
|
-
def __add_to_zip_file(directory, filepath, ignore_max_file_size, zip_file):
|
|
109
|
-
zip_file.write(filepath, arcname=os.path.relpath(filepath, directory))
|
|
110
|
-
if not ignore_max_file_size:
|
|
111
|
-
if np.sum([f.file_size for f in list(zip_file.NameToInfo.values())]) > MAX_ZIP_FILE:
|
|
112
|
-
logger.error('Failed zipping in file: {}'.format(filepath))
|
|
113
|
-
raise ValueError(
|
|
114
|
-
'Zip file cant be over 100MB. '
|
|
115
|
-
'Please verify that only code is being uploaded or '
|
|
116
|
-
'add files to .gitignore so they wont be zipped and uploaded as code.')
|
|
117
|
-
|
|
118
|
-
@staticmethod
|
|
119
|
-
def unzip_directory(zip_filename, to_directory=None):
|
|
120
|
-
with zipfile.ZipFile(zip_filename) as zipdata:
|
|
121
|
-
zipinfos = zipdata.infolist()
|
|
122
|
-
# iterate through each file
|
|
123
|
-
for zipinfo in zipinfos:
|
|
124
|
-
# encode the file names
|
|
125
|
-
# zip package make decode by cp437 for file that have name that not ascii
|
|
126
|
-
# this happen when the flag_bits be different than 0
|
|
127
|
-
# so we encode the name back
|
|
128
|
-
if not zipinfo.flag_bits:
|
|
129
|
-
zipinfo.filename = zipinfo.filename.encode('cp437').decode('utf-8')
|
|
130
|
-
zipdata.extract(zipinfo, to_directory)
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import zipfile
|
|
4
|
+
from typing import List
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
import pathspec
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(name='dtlpy')
|
|
10
|
+
|
|
11
|
+
MAX_ZIP_FILE = 100e6 # 100MB
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Zipping:
|
|
15
|
+
def __init__(self):
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
@staticmethod
|
|
19
|
+
def zip_directory(zip_filename, directory=None, ignore_max_file_size=False, ignore_directories: List[str] = None):
|
|
20
|
+
"""
|
|
21
|
+
Zip Directory
|
|
22
|
+
Will ignore .gitignore files
|
|
23
|
+
|
|
24
|
+
:param directory: the directory to zip
|
|
25
|
+
:param zip_filename: the name of the zipfile.
|
|
26
|
+
:param ignore_max_file_size: ignore the limitation on the zip file size
|
|
27
|
+
:param list[str] ignore_directories: directories to ignore.
|
|
28
|
+
:return: None
|
|
29
|
+
"""
|
|
30
|
+
# default path
|
|
31
|
+
if directory is None:
|
|
32
|
+
directory = os.getcwd()
|
|
33
|
+
# check if directory
|
|
34
|
+
assert os.path.isdir(directory), '[ERROR] Directory does not exists: {}'.format(directory)
|
|
35
|
+
|
|
36
|
+
if '.gitignore' in os.listdir(directory):
|
|
37
|
+
with open(os.path.join(directory, '.gitignore')) as f:
|
|
38
|
+
spec_src = f.read()
|
|
39
|
+
else:
|
|
40
|
+
spec_src = ''
|
|
41
|
+
ignore_lines = spec_src.splitlines() + ['.git', '.dataloop']
|
|
42
|
+
if ignore_directories is not None:
|
|
43
|
+
ignore_lines += ignore_directories
|
|
44
|
+
spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, ignore_lines)
|
|
45
|
+
|
|
46
|
+
# init zip file
|
|
47
|
+
zip_file = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED)
|
|
48
|
+
try:
|
|
49
|
+
for root, dirs, files in os.walk(directory):
|
|
50
|
+
# remove dirs to avoid going file by file
|
|
51
|
+
for d in dirs:
|
|
52
|
+
if spec.match_file(os.path.relpath(os.path.join(root, d), directory)):
|
|
53
|
+
dirs.remove(d)
|
|
54
|
+
for file in files:
|
|
55
|
+
filepath = os.path.join(root, file)
|
|
56
|
+
if not spec.match_file(os.path.relpath(filepath, directory)):
|
|
57
|
+
Zipping.__add_to_zip_file(directory, filepath, ignore_max_file_size, zip_file)
|
|
58
|
+
finally:
|
|
59
|
+
zip_file.close()
|
|
60
|
+
|
|
61
|
+
@staticmethod
|
|
62
|
+
def zip_directory_inclusive(zip_filename, directory=None, ignore_max_file_size=False,
|
|
63
|
+
subpaths: List[str] = None):
|
|
64
|
+
"""
|
|
65
|
+
Zip Directory
|
|
66
|
+
Will ignore .gitignore files
|
|
67
|
+
|
|
68
|
+
:param directory: the directory to zip.
|
|
69
|
+
:param zip_filename: the name of the zipfile
|
|
70
|
+
:param ignore_max_file_size: ignore the limitation on the zip file size
|
|
71
|
+
:param list[str] subpaths: paths to include in the final zip (relative path).
|
|
72
|
+
:return: None
|
|
73
|
+
"""
|
|
74
|
+
# default path
|
|
75
|
+
if directory is None:
|
|
76
|
+
directory = os.getcwd()
|
|
77
|
+
# check if directory
|
|
78
|
+
assert os.path.isdir(directory), '[ERROR] Directory does not exists: %s' % directory
|
|
79
|
+
|
|
80
|
+
if '.gitignore' in os.listdir(directory):
|
|
81
|
+
with open(os.path.join(directory, '.gitignore')) as f:
|
|
82
|
+
spec_src = f.read()
|
|
83
|
+
else:
|
|
84
|
+
spec_src = ''
|
|
85
|
+
ignore_lines = spec_src.splitlines() + ['.git', '.dataloop']
|
|
86
|
+
spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, ignore_lines)
|
|
87
|
+
|
|
88
|
+
# init zip file
|
|
89
|
+
zip_file = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED)
|
|
90
|
+
try:
|
|
91
|
+
for root, dirs, files in os.walk(directory):
|
|
92
|
+
for file in files:
|
|
93
|
+
filepath = os.path.join(root, file)
|
|
94
|
+
if not spec.match_file(os.path.relpath(filepath, directory)) \
|
|
95
|
+
and Zipping.__check_filepath(os.path.relpath(filepath, directory), subpaths):
|
|
96
|
+
Zipping.__add_to_zip_file(directory, filepath, ignore_max_file_size, zip_file)
|
|
97
|
+
finally:
|
|
98
|
+
zip_file.close()
|
|
99
|
+
|
|
100
|
+
@staticmethod
|
|
101
|
+
def __check_filepath(filepath: str, paths: List[str]):
|
|
102
|
+
"""
|
|
103
|
+
Checks whether a specific file is inside one of the subdirectories
|
|
104
|
+
"""
|
|
105
|
+
return any(filepath.startswith(directory) for directory in paths)
|
|
106
|
+
|
|
107
|
+
@staticmethod
|
|
108
|
+
def __add_to_zip_file(directory, filepath, ignore_max_file_size, zip_file):
|
|
109
|
+
zip_file.write(filepath, arcname=os.path.relpath(filepath, directory))
|
|
110
|
+
if not ignore_max_file_size:
|
|
111
|
+
if np.sum([f.file_size for f in list(zip_file.NameToInfo.values())]) > MAX_ZIP_FILE:
|
|
112
|
+
logger.error('Failed zipping in file: {}'.format(filepath))
|
|
113
|
+
raise ValueError(
|
|
114
|
+
'Zip file cant be over 100MB. '
|
|
115
|
+
'Please verify that only code is being uploaded or '
|
|
116
|
+
'add files to .gitignore so they wont be zipped and uploaded as code.')
|
|
117
|
+
|
|
118
|
+
@staticmethod
|
|
119
|
+
def unzip_directory(zip_filename, to_directory=None):
|
|
120
|
+
with zipfile.ZipFile(zip_filename) as zipdata:
|
|
121
|
+
zipinfos = zipdata.infolist()
|
|
122
|
+
# iterate through each file
|
|
123
|
+
for zipinfo in zipinfos:
|
|
124
|
+
# encode the file names
|
|
125
|
+
# zip package make decode by cp437 for file that have name that not ascii
|
|
126
|
+
# this happen when the flag_bits be different than 0
|
|
127
|
+
# so we encode the name back
|
|
128
|
+
if not zipinfo.flag_bits:
|
|
129
|
+
zipinfo.filename = zipinfo.filename.encode('cp437').decode('utf-8')
|
|
130
|
+
zipdata.extract(zipinfo, to_directory)
|
dtlpy/ml/__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 .base_model_adapter import BaseModelAdapter
|
|
17
|
-
|
|
18
|
-
from . import metrics
|
|
19
|
-
from . import predictions_utils
|
|
20
|
-
from . import train_utils
|
|
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 .base_model_adapter import BaseModelAdapter
|
|
17
|
+
|
|
18
|
+
from . import metrics
|
|
19
|
+
from . import predictions_utils
|
|
20
|
+
from . import train_utils
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
from abc import ABC
|
|
2
|
-
|
|
3
|
-
from base_model_adapter import BaseModelAdapter
|
|
4
|
-
from .. import entities
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class BaseFeatureExtractorAdapter(BaseModelAdapter, ABC):
|
|
8
|
-
def __int__(self, model_entity: entities.Model = None):
|
|
9
|
-
super().__init__(model_entity)
|
|
10
|
-
|
|
11
|
-
def extract_features(self, batch: list, **kwargs):
|
|
12
|
-
""" Runs inference with the model, but does not predict. Instead, extracts features for the input batch.
|
|
13
|
-
|
|
14
|
-
Virtual method - need to implement
|
|
15
|
-
|
|
16
|
-
:param batch: `list` a list containing a batch of items whose features will be extracted
|
|
17
|
-
"""
|
|
18
|
-
raise NotImplementedError("Please implement 'extract_features' method in {}".format(self.__class__.__name__))
|
|
19
|
-
|
|
20
|
-
def extract_dataset_features(self, dataset: entities.Dataset, **kwargs):
|
|
21
|
-
""" Runs inference to extract features for all items in a dataset.
|
|
22
|
-
|
|
23
|
-
Virtual method - need to implement
|
|
24
|
-
|
|
25
|
-
:param dataset: `entities.Dataset` dataset entity whose items will have their features extracted
|
|
26
|
-
"""
|
|
27
|
-
raise NotImplementedError("Please implement 'extract_dataset_features' method in "
|
|
1
|
+
from abc import ABC
|
|
2
|
+
|
|
3
|
+
from base_model_adapter import BaseModelAdapter
|
|
4
|
+
from .. import entities
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class BaseFeatureExtractorAdapter(BaseModelAdapter, ABC):
|
|
8
|
+
def __int__(self, model_entity: entities.Model = None):
|
|
9
|
+
super().__init__(model_entity)
|
|
10
|
+
|
|
11
|
+
def extract_features(self, batch: list, **kwargs):
|
|
12
|
+
""" Runs inference with the model, but does not predict. Instead, extracts features for the input batch.
|
|
13
|
+
|
|
14
|
+
Virtual method - need to implement
|
|
15
|
+
|
|
16
|
+
:param batch: `list` a list containing a batch of items whose features will be extracted
|
|
17
|
+
"""
|
|
18
|
+
raise NotImplementedError("Please implement 'extract_features' method in {}".format(self.__class__.__name__))
|
|
19
|
+
|
|
20
|
+
def extract_dataset_features(self, dataset: entities.Dataset, **kwargs):
|
|
21
|
+
""" Runs inference to extract features for all items in a dataset.
|
|
22
|
+
|
|
23
|
+
Virtual method - need to implement
|
|
24
|
+
|
|
25
|
+
:param dataset: `entities.Dataset` dataset entity whose items will have their features extracted
|
|
26
|
+
"""
|
|
27
|
+
raise NotImplementedError("Please implement 'extract_dataset_features' method in "
|
|
28
28
|
"{}".format(self.__class__.__name__))
|