dtlpy 1.115.44__py3-none-any.whl → 1.116.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dtlpy/__init__.py +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +347 -347
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +292 -292
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -449
- dtlpy/entities/dataset.py +1299 -1299
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -235
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -959
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -505
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +963 -963
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +1257 -1230
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -332
- dtlpy/repositories/commands.py +152 -152
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -439
- dtlpy/repositories/datasets.py +1504 -1504
- dtlpy/repositories/downloader.py +976 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +255 -255
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -912
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -1000
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +419 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -661
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1785 -1785
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +285 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -186
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
- dtlpy-1.115.44.dist-info/RECORD +0 -240
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from .dataset_generator import DatasetGenerator
|
|
4
|
-
|
|
5
|
-
logger = logging.getLogger(name='dtlpy')
|
|
6
|
-
|
|
7
|
-
try:
|
|
8
|
-
import tensorflow
|
|
9
|
-
except (ImportError, ModuleNotFoundError):
|
|
10
|
-
logger.error('Failed importing tensorflow package, cannot use DatasetGeneratorTensorflow')
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class DatasetGeneratorTensorflow(DatasetGenerator, tensorflow.keras.utils.Sequence):
|
|
14
|
-
def __getitem__(self, item):
|
|
15
|
-
batch = super(DatasetGeneratorTensorflow, self).__getitem__(item)
|
|
16
|
-
x = batch['image']
|
|
17
|
-
y = batch['annotations']
|
|
18
|
-
return x, y
|
|
19
|
-
|
|
20
|
-
def __iter__(self):
|
|
21
|
-
"""Create a generator that iterate over the Sequence."""
|
|
22
|
-
for item in (self[i] for i in range(len(self))):
|
|
23
|
-
yield item
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from .dataset_generator import DatasetGenerator
|
|
4
|
+
|
|
5
|
+
logger = logging.getLogger(name='dtlpy')
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
import tensorflow
|
|
9
|
+
except (ImportError, ModuleNotFoundError):
|
|
10
|
+
logger.error('Failed importing tensorflow package, cannot use DatasetGeneratorTensorflow')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DatasetGeneratorTensorflow(DatasetGenerator, tensorflow.keras.utils.Sequence):
|
|
14
|
+
def __getitem__(self, item):
|
|
15
|
+
batch = super(DatasetGeneratorTensorflow, self).__getitem__(item)
|
|
16
|
+
x = batch['image']
|
|
17
|
+
y = batch['annotations']
|
|
18
|
+
return x, y
|
|
19
|
+
|
|
20
|
+
def __iter__(self):
|
|
21
|
+
"""Create a generator that iterate over the Sequence."""
|
|
22
|
+
for item in (self[i] for i in range(len(self))):
|
|
23
|
+
yield item
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from .dataset_generator import DatasetGenerator
|
|
3
|
-
|
|
4
|
-
logger = logging.getLogger(name='dtlpy')
|
|
5
|
-
|
|
6
|
-
try:
|
|
7
|
-
import torch
|
|
8
|
-
from torch.utils.data import Dataset
|
|
9
|
-
except (ImportError, ModuleNotFoundError):
|
|
10
|
-
logger.error('Failed importing torch package, cannot use DatasetGeneratorTorch')
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class DatasetGeneratorTorch(DatasetGenerator, Dataset):
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
def __getitem__(self, idx):
|
|
19
|
-
if torch.is_tensor(idx):
|
|
20
|
-
idx = idx.tolist()
|
|
21
|
-
return super(DatasetGeneratorTorch, self).__getitem__(idx)
|
|
1
|
+
import logging
|
|
2
|
+
from .dataset_generator import DatasetGenerator
|
|
3
|
+
|
|
4
|
+
logger = logging.getLogger(name='dtlpy')
|
|
5
|
+
|
|
6
|
+
try:
|
|
7
|
+
import torch
|
|
8
|
+
from torch.utils.data import Dataset
|
|
9
|
+
except (ImportError, ModuleNotFoundError):
|
|
10
|
+
logger.error('Failed importing torch package, cannot use DatasetGeneratorTorch')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DatasetGeneratorTorch(DatasetGenerator, Dataset):
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __getitem__(self, idx):
|
|
19
|
+
if torch.is_tensor(idx):
|
|
20
|
+
idx = idx.tolist()
|
|
21
|
+
return super(DatasetGeneratorTorch, self).__getitem__(idx)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
from .local_session import start_session, stop_session, pause_session
|
|
1
|
+
from .local_session import start_session, stop_session, pause_session
|
|
@@ -1,179 +1,179 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
import logging
|
|
3
|
-
import shutil
|
|
4
|
-
import time
|
|
5
|
-
import sys
|
|
6
|
-
import os
|
|
7
|
-
|
|
8
|
-
import dtlpy as dl
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger('dtlpy')
|
|
11
|
-
DOCKER_CONTAINER_NAME = 'dtlpy-development'
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def spinning_cursor():
|
|
15
|
-
while True:
|
|
16
|
-
for cursor in ["(● ●)",
|
|
17
|
-
"( ● ● )",
|
|
18
|
-
"( ● ● )",
|
|
19
|
-
"( ● ● )",
|
|
20
|
-
"( ● ● )",
|
|
21
|
-
"( ● ● )",
|
|
22
|
-
"( ● ● )",
|
|
23
|
-
"( ● )",
|
|
24
|
-
"( ● ● )",
|
|
25
|
-
"( ● ● )",
|
|
26
|
-
"( ● ● )",
|
|
27
|
-
"( ● ● )",
|
|
28
|
-
"( ● ● )",
|
|
29
|
-
"( ● ● )",
|
|
30
|
-
"(● ●)",
|
|
31
|
-
]:
|
|
32
|
-
yield cursor
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def copy_files_to_docker_container():
|
|
36
|
-
from distutils.dir_util import copy_tree
|
|
37
|
-
local_state_directory = os.path.dirname(dl.client_api.state_io.COOKIE)
|
|
38
|
-
root_dir = os.path.dirname(local_state_directory)
|
|
39
|
-
dtlpy_code_server_dir = os.path.join(dl.__path__[0], 'assets', 'code_server')
|
|
40
|
-
local_code_server_dir = os.path.join(local_state_directory, 'code_server')
|
|
41
|
-
copy_tree(src=dtlpy_code_server_dir, dst=local_code_server_dir)
|
|
42
|
-
if not os.path.isdir(os.path.join(root_dir, '.vscode')):
|
|
43
|
-
os.makedirs(os.path.join(root_dir, '.vscode'))
|
|
44
|
-
shutil.copy(src=os.path.join(dl.__path__[0], 'assets', 'code_server', 'launch.json'),
|
|
45
|
-
dst=os.path.join(root_dir, '.vscode', 'launch.json'))
|
|
46
|
-
shutil.copy(src=os.path.join(dl.__path__[0], 'assets', 'code_server', 'settings.json'),
|
|
47
|
-
dst=os.path.join(root_dir, '.vscode', 'settings.json'))
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def get_container(client):
|
|
51
|
-
try:
|
|
52
|
-
container = client.containers.get(container_id=DOCKER_CONTAINER_NAME)
|
|
53
|
-
except Exception:
|
|
54
|
-
container = None
|
|
55
|
-
return container
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def start_session():
|
|
59
|
-
try:
|
|
60
|
-
import docker
|
|
61
|
-
except (ImportError, ModuleNotFoundError):
|
|
62
|
-
logger.error(
|
|
63
|
-
'Import Error! Cant import "docker". Must install docker package for local development. run "pip install docker"')
|
|
64
|
-
raise
|
|
65
|
-
|
|
66
|
-
try:
|
|
67
|
-
client = docker.from_env()
|
|
68
|
-
client.ping()
|
|
69
|
-
except Exception:
|
|
70
|
-
raise RuntimeError(
|
|
71
|
-
'Cannot communicate with docker daemon. Make sure everything is up and ready (docker client ping)'
|
|
72
|
-
) from None
|
|
73
|
-
copy_files_to_docker_container()
|
|
74
|
-
logger.info('Starting local development session')
|
|
75
|
-
development = dl.client_api.state_io.get('development')
|
|
76
|
-
port = development['port']
|
|
77
|
-
docker_image = development['docker_image']
|
|
78
|
-
hostname = f"http://localhost:{port}"
|
|
79
|
-
logger.info(f'Starting docker image: {docker_image}, to {hostname}')
|
|
80
|
-
|
|
81
|
-
need_to_create_container = True
|
|
82
|
-
container = get_container(client=client)
|
|
83
|
-
if container is not None:
|
|
84
|
-
if not any([tag == docker_image for tag in container.image.tags]):
|
|
85
|
-
# container with different image already running - delete it
|
|
86
|
-
logger.info(f'Found a running image: {container.image.tags!r}, replacing to {docker_image!r}')
|
|
87
|
-
container.stop()
|
|
88
|
-
container.remove()
|
|
89
|
-
need_to_create_container = True
|
|
90
|
-
else:
|
|
91
|
-
# container with SAME image already running - verify is running
|
|
92
|
-
need_to_create_container = False
|
|
93
|
-
|
|
94
|
-
if need_to_create_container:
|
|
95
|
-
logger.info(f'Creating a container from docker image: {docker_image}')
|
|
96
|
-
container = client.containers.run(docker_image,
|
|
97
|
-
name=DOCKER_CONTAINER_NAME,
|
|
98
|
-
tty=True,
|
|
99
|
-
volumes={os.getcwd(): {'bind': "/tmp/app", 'mode': 'rw'}},
|
|
100
|
-
ports={port: port},
|
|
101
|
-
detach=True,
|
|
102
|
-
command='/bin/bash')
|
|
103
|
-
|
|
104
|
-
logger.info('Installing vscode on in the docker container')
|
|
105
|
-
container = client.containers.get(container_id=DOCKER_CONTAINER_NAME)
|
|
106
|
-
if container.status in "exited":
|
|
107
|
-
container.start()
|
|
108
|
-
elif container.status in "paused":
|
|
109
|
-
container.unpause()
|
|
110
|
-
|
|
111
|
-
resp = container.exec_run(
|
|
112
|
-
cmd=f'/tmp/app/.dataloop/code_server/installation.sh {port}',
|
|
113
|
-
detach=True,
|
|
114
|
-
tty=True)
|
|
115
|
-
spinner = spinning_cursor()
|
|
116
|
-
while True:
|
|
117
|
-
try:
|
|
118
|
-
resp = requests.get(hostname, verify=False, timeout=0.5)
|
|
119
|
-
success = resp.ok
|
|
120
|
-
except Exception:
|
|
121
|
-
success = False
|
|
122
|
-
# write spinner
|
|
123
|
-
sys.stdout.write(f'\r{next(spinner)}')
|
|
124
|
-
sys.stdout.flush()
|
|
125
|
-
time.sleep(0.1)
|
|
126
|
-
sys.stdout.write('\b')
|
|
127
|
-
|
|
128
|
-
# check response to break
|
|
129
|
-
if success:
|
|
130
|
-
logger.info(f'VScode server is up! {hostname}')
|
|
131
|
-
break
|
|
132
|
-
|
|
133
|
-
# open webbrowser to debug
|
|
134
|
-
import webbrowser
|
|
135
|
-
webbrowser.open(url=hostname, new=2, autoraise=True)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def pause_session():
|
|
139
|
-
try:
|
|
140
|
-
import docker
|
|
141
|
-
except (ImportError, ModuleNotFoundError):
|
|
142
|
-
logger.error(
|
|
143
|
-
'Import Error! Cant import "docker". Must install docker package for local development. run "pip install docker"')
|
|
144
|
-
raise
|
|
145
|
-
|
|
146
|
-
try:
|
|
147
|
-
client = docker.from_env()
|
|
148
|
-
client.ping()
|
|
149
|
-
except Exception:
|
|
150
|
-
raise RuntimeError(
|
|
151
|
-
'Cannot communicate with docker daemon. Make sure everything is up and ready (docker client ping)'
|
|
152
|
-
) from None
|
|
153
|
-
|
|
154
|
-
container = get_container(client)
|
|
155
|
-
if container is not None:
|
|
156
|
-
container.pause()
|
|
157
|
-
logger.info('Local development session paused')
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def stop_session():
|
|
161
|
-
try:
|
|
162
|
-
import docker
|
|
163
|
-
except (ImportError, ModuleNotFoundError):
|
|
164
|
-
logger.error(
|
|
165
|
-
'Import Error! Cant import "docker". Must install docker package for local development. run "pip install docker"')
|
|
166
|
-
raise
|
|
167
|
-
|
|
168
|
-
try:
|
|
169
|
-
client = docker.from_env()
|
|
170
|
-
client.ping()
|
|
171
|
-
except Exception:
|
|
172
|
-
raise RuntimeError(
|
|
173
|
-
'Cannot communicate with docker daemon. Make sure everything is up and ready (docker client ping)'
|
|
174
|
-
) from None
|
|
175
|
-
|
|
176
|
-
container = get_container(client=client)
|
|
177
|
-
if container is not None:
|
|
178
|
-
container.stop()
|
|
179
|
-
logger.info('Local development session stopped')
|
|
1
|
+
import requests
|
|
2
|
+
import logging
|
|
3
|
+
import shutil
|
|
4
|
+
import time
|
|
5
|
+
import sys
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
import dtlpy as dl
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger('dtlpy')
|
|
11
|
+
DOCKER_CONTAINER_NAME = 'dtlpy-development'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def spinning_cursor():
|
|
15
|
+
while True:
|
|
16
|
+
for cursor in ["(● ●)",
|
|
17
|
+
"( ● ● )",
|
|
18
|
+
"( ● ● )",
|
|
19
|
+
"( ● ● )",
|
|
20
|
+
"( ● ● )",
|
|
21
|
+
"( ● ● )",
|
|
22
|
+
"( ● ● )",
|
|
23
|
+
"( ● )",
|
|
24
|
+
"( ● ● )",
|
|
25
|
+
"( ● ● )",
|
|
26
|
+
"( ● ● )",
|
|
27
|
+
"( ● ● )",
|
|
28
|
+
"( ● ● )",
|
|
29
|
+
"( ● ● )",
|
|
30
|
+
"(● ●)",
|
|
31
|
+
]:
|
|
32
|
+
yield cursor
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def copy_files_to_docker_container():
|
|
36
|
+
from distutils.dir_util import copy_tree
|
|
37
|
+
local_state_directory = os.path.dirname(dl.client_api.state_io.COOKIE)
|
|
38
|
+
root_dir = os.path.dirname(local_state_directory)
|
|
39
|
+
dtlpy_code_server_dir = os.path.join(dl.__path__[0], 'assets', 'code_server')
|
|
40
|
+
local_code_server_dir = os.path.join(local_state_directory, 'code_server')
|
|
41
|
+
copy_tree(src=dtlpy_code_server_dir, dst=local_code_server_dir)
|
|
42
|
+
if not os.path.isdir(os.path.join(root_dir, '.vscode')):
|
|
43
|
+
os.makedirs(os.path.join(root_dir, '.vscode'))
|
|
44
|
+
shutil.copy(src=os.path.join(dl.__path__[0], 'assets', 'code_server', 'launch.json'),
|
|
45
|
+
dst=os.path.join(root_dir, '.vscode', 'launch.json'))
|
|
46
|
+
shutil.copy(src=os.path.join(dl.__path__[0], 'assets', 'code_server', 'settings.json'),
|
|
47
|
+
dst=os.path.join(root_dir, '.vscode', 'settings.json'))
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_container(client):
|
|
51
|
+
try:
|
|
52
|
+
container = client.containers.get(container_id=DOCKER_CONTAINER_NAME)
|
|
53
|
+
except Exception:
|
|
54
|
+
container = None
|
|
55
|
+
return container
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def start_session():
|
|
59
|
+
try:
|
|
60
|
+
import docker
|
|
61
|
+
except (ImportError, ModuleNotFoundError):
|
|
62
|
+
logger.error(
|
|
63
|
+
'Import Error! Cant import "docker". Must install docker package for local development. run "pip install docker"')
|
|
64
|
+
raise
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
client = docker.from_env()
|
|
68
|
+
client.ping()
|
|
69
|
+
except Exception:
|
|
70
|
+
raise RuntimeError(
|
|
71
|
+
'Cannot communicate with docker daemon. Make sure everything is up and ready (docker client ping)'
|
|
72
|
+
) from None
|
|
73
|
+
copy_files_to_docker_container()
|
|
74
|
+
logger.info('Starting local development session')
|
|
75
|
+
development = dl.client_api.state_io.get('development')
|
|
76
|
+
port = development['port']
|
|
77
|
+
docker_image = development['docker_image']
|
|
78
|
+
hostname = f"http://localhost:{port}"
|
|
79
|
+
logger.info(f'Starting docker image: {docker_image}, to {hostname}')
|
|
80
|
+
|
|
81
|
+
need_to_create_container = True
|
|
82
|
+
container = get_container(client=client)
|
|
83
|
+
if container is not None:
|
|
84
|
+
if not any([tag == docker_image for tag in container.image.tags]):
|
|
85
|
+
# container with different image already running - delete it
|
|
86
|
+
logger.info(f'Found a running image: {container.image.tags!r}, replacing to {docker_image!r}')
|
|
87
|
+
container.stop()
|
|
88
|
+
container.remove()
|
|
89
|
+
need_to_create_container = True
|
|
90
|
+
else:
|
|
91
|
+
# container with SAME image already running - verify is running
|
|
92
|
+
need_to_create_container = False
|
|
93
|
+
|
|
94
|
+
if need_to_create_container:
|
|
95
|
+
logger.info(f'Creating a container from docker image: {docker_image}')
|
|
96
|
+
container = client.containers.run(docker_image,
|
|
97
|
+
name=DOCKER_CONTAINER_NAME,
|
|
98
|
+
tty=True,
|
|
99
|
+
volumes={os.getcwd(): {'bind': "/tmp/app", 'mode': 'rw'}},
|
|
100
|
+
ports={port: port},
|
|
101
|
+
detach=True,
|
|
102
|
+
command='/bin/bash')
|
|
103
|
+
|
|
104
|
+
logger.info('Installing vscode on in the docker container')
|
|
105
|
+
container = client.containers.get(container_id=DOCKER_CONTAINER_NAME)
|
|
106
|
+
if container.status in "exited":
|
|
107
|
+
container.start()
|
|
108
|
+
elif container.status in "paused":
|
|
109
|
+
container.unpause()
|
|
110
|
+
|
|
111
|
+
resp = container.exec_run(
|
|
112
|
+
cmd=f'/tmp/app/.dataloop/code_server/installation.sh {port}',
|
|
113
|
+
detach=True,
|
|
114
|
+
tty=True)
|
|
115
|
+
spinner = spinning_cursor()
|
|
116
|
+
while True:
|
|
117
|
+
try:
|
|
118
|
+
resp = requests.get(hostname, verify=False, timeout=0.5)
|
|
119
|
+
success = resp.ok
|
|
120
|
+
except Exception:
|
|
121
|
+
success = False
|
|
122
|
+
# write spinner
|
|
123
|
+
sys.stdout.write(f'\r{next(spinner)}')
|
|
124
|
+
sys.stdout.flush()
|
|
125
|
+
time.sleep(0.1)
|
|
126
|
+
sys.stdout.write('\b')
|
|
127
|
+
|
|
128
|
+
# check response to break
|
|
129
|
+
if success:
|
|
130
|
+
logger.info(f'VScode server is up! {hostname}')
|
|
131
|
+
break
|
|
132
|
+
|
|
133
|
+
# open webbrowser to debug
|
|
134
|
+
import webbrowser
|
|
135
|
+
webbrowser.open(url=hostname, new=2, autoraise=True)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def pause_session():
|
|
139
|
+
try:
|
|
140
|
+
import docker
|
|
141
|
+
except (ImportError, ModuleNotFoundError):
|
|
142
|
+
logger.error(
|
|
143
|
+
'Import Error! Cant import "docker". Must install docker package for local development. run "pip install docker"')
|
|
144
|
+
raise
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
client = docker.from_env()
|
|
148
|
+
client.ping()
|
|
149
|
+
except Exception:
|
|
150
|
+
raise RuntimeError(
|
|
151
|
+
'Cannot communicate with docker daemon. Make sure everything is up and ready (docker client ping)'
|
|
152
|
+
) from None
|
|
153
|
+
|
|
154
|
+
container = get_container(client)
|
|
155
|
+
if container is not None:
|
|
156
|
+
container.pause()
|
|
157
|
+
logger.info('Local development session paused')
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def stop_session():
|
|
161
|
+
try:
|
|
162
|
+
import docker
|
|
163
|
+
except (ImportError, ModuleNotFoundError):
|
|
164
|
+
logger.error(
|
|
165
|
+
'Import Error! Cant import "docker". Must install docker package for local development. run "pip install docker"')
|
|
166
|
+
raise
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
client = docker.from_env()
|
|
170
|
+
client.ping()
|
|
171
|
+
except Exception:
|
|
172
|
+
raise RuntimeError(
|
|
173
|
+
'Cannot communicate with docker daemon. Make sure everything is up and ready (docker client ping)'
|
|
174
|
+
) from None
|
|
175
|
+
|
|
176
|
+
container = get_container(client=client)
|
|
177
|
+
if container is not None:
|
|
178
|
+
container.stop()
|
|
179
|
+
logger.info('Local development session stopped')
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
from .report import Report
|
|
2
|
-
from .figures import Table, ConfusionMatrix, Doughnut, FigOptions, Bar, Hbar, Line, Pie, Scatter
|
|
1
|
+
from .report import Report
|
|
2
|
+
from .figures import Table, ConfusionMatrix, Doughnut, FigOptions, Bar, Hbar, Line, Pie, Scatter
|