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
dtlpy/caches/dl_cache.py
CHANGED
|
@@ -1,201 +1,201 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import sqlite3
|
|
3
|
-
import re
|
|
4
|
-
|
|
5
|
-
from diskcache import Cache
|
|
6
|
-
import os
|
|
7
|
-
from .base_cache import BaseCache
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class DiskCache(BaseCache):
|
|
11
|
-
def __init__(self, name, level=1, options=None, enable_stats=False, ttl=1000):
|
|
12
|
-
if options is None:
|
|
13
|
-
options = dict()
|
|
14
|
-
self.name = name
|
|
15
|
-
self.level = level
|
|
16
|
-
self.ttl = ttl
|
|
17
|
-
self.cache_dir = options.get(
|
|
18
|
-
"cachePath", os.path.join(self.dataloop_path, "cache", name)
|
|
19
|
-
)
|
|
20
|
-
self.cache = Cache(directory=self.cache_dir)
|
|
21
|
-
self.cache.stats(enable=enable_stats)
|
|
22
|
-
|
|
23
|
-
self.conn = sqlite3.connect(os.path.join(self.cache_dir, 'cache.db'), check_same_thread=False)
|
|
24
|
-
self.cursor = self.conn.cursor()
|
|
25
|
-
|
|
26
|
-
@property
|
|
27
|
-
def dataloop_path(self):
|
|
28
|
-
return os.environ['DATALOOP_PATH'] if 'DATALOOP_PATH' in os.environ \
|
|
29
|
-
else os.path.join(os.path.expanduser('~'), '.dataloop')
|
|
30
|
-
|
|
31
|
-
def set(self, key, value):
|
|
32
|
-
"""
|
|
33
|
-
set or add a key and value to the cache
|
|
34
|
-
:param key: str or int type of key
|
|
35
|
-
:param value: pickled value
|
|
36
|
-
:return:
|
|
37
|
-
"""
|
|
38
|
-
if not isinstance(key, str) and not isinstance(key, int):
|
|
39
|
-
raise ValueError("key must be string or int")
|
|
40
|
-
with Cache(self.cache.directory) as reference:
|
|
41
|
-
reference.set(key=key, value=value, expire=self.ttl)
|
|
42
|
-
|
|
43
|
-
def _key_fix(self, key):
|
|
44
|
-
if '**' in key:
|
|
45
|
-
key = key.replace('**', '%')
|
|
46
|
-
if '*' in key:
|
|
47
|
-
key = key.replace('*', '%')
|
|
48
|
-
return key
|
|
49
|
-
|
|
50
|
-
def list(self, pattern):
|
|
51
|
-
"""
|
|
52
|
-
list the keys py pattern from the cache
|
|
53
|
-
|
|
54
|
-
:param pattern: str or int type of key
|
|
55
|
-
:return: the value of the key
|
|
56
|
-
"""
|
|
57
|
-
self.cache.close()
|
|
58
|
-
|
|
59
|
-
key = self._key_fix(pattern)
|
|
60
|
-
|
|
61
|
-
try:
|
|
62
|
-
self.cursor.execute("SELECT key FROM Cache WHERE key LIKE '{}'".format(key))
|
|
63
|
-
|
|
64
|
-
rows = self.cursor.fetchall()
|
|
65
|
-
for row in rows:
|
|
66
|
-
for key in row:
|
|
67
|
-
yield key
|
|
68
|
-
except:
|
|
69
|
-
return None
|
|
70
|
-
|
|
71
|
-
def ping(self):
|
|
72
|
-
"""
|
|
73
|
-
Cache ping check if connection is working
|
|
74
|
-
"""
|
|
75
|
-
if os.path.exists(os.path.join(self.cache_dir, 'cache.db')):
|
|
76
|
-
return True
|
|
77
|
-
else:
|
|
78
|
-
raise Exception('cache db not fond')
|
|
79
|
-
|
|
80
|
-
def get(self, key):
|
|
81
|
-
"""
|
|
82
|
-
get the value of the key from the cache
|
|
83
|
-
:param key: str or int type of key
|
|
84
|
-
:return: the value of the key
|
|
85
|
-
"""
|
|
86
|
-
self.cache.close()
|
|
87
|
-
res = self.cache.get(key=key)
|
|
88
|
-
if res is not None:
|
|
89
|
-
try:
|
|
90
|
-
return json.loads(res)
|
|
91
|
-
except:
|
|
92
|
-
return res
|
|
93
|
-
|
|
94
|
-
def delete(self, key):
|
|
95
|
-
"""
|
|
96
|
-
delete the element from the cache
|
|
97
|
-
:param key: str or int type of key
|
|
98
|
-
:return:
|
|
99
|
-
"""
|
|
100
|
-
self.cache.close()
|
|
101
|
-
self.cache.delete(key=key)
|
|
102
|
-
|
|
103
|
-
def add(self, key, value):
|
|
104
|
-
"""
|
|
105
|
-
add the element to the cache if the key is not already present.
|
|
106
|
-
:param key: str or int type of key
|
|
107
|
-
:param value: pickled value
|
|
108
|
-
:return: bool: True if add False if not
|
|
109
|
-
"""
|
|
110
|
-
if not isinstance(key, str) and not isinstance(key, int):
|
|
111
|
-
raise ValueError("key must be string or int")
|
|
112
|
-
self.cache.close()
|
|
113
|
-
return self.cache.add(key=key, value=value, expire=self.ttl)
|
|
114
|
-
|
|
115
|
-
def push(self, value):
|
|
116
|
-
"""
|
|
117
|
-
push the element to the cache
|
|
118
|
-
:param value: pickled value
|
|
119
|
-
:return: bool: True if add False if not
|
|
120
|
-
"""
|
|
121
|
-
self.cache.close()
|
|
122
|
-
return self.cache.push(value=value, expire=self.ttl)
|
|
123
|
-
|
|
124
|
-
def incr(self, key, value=1):
|
|
125
|
-
"""
|
|
126
|
-
incremented the value of this key
|
|
127
|
-
:param key: str or int type of key
|
|
128
|
-
:param value: the amount of incremented
|
|
129
|
-
:return:
|
|
130
|
-
"""
|
|
131
|
-
self.cache.incr(key=key, delta=value)
|
|
132
|
-
|
|
133
|
-
def decr(self, key, value=1):
|
|
134
|
-
"""
|
|
135
|
-
decremented the value of this key
|
|
136
|
-
:param key: str or int type of key
|
|
137
|
-
:param value: the amount of decremented
|
|
138
|
-
:return:
|
|
139
|
-
"""
|
|
140
|
-
self.cache.decr(key=key, delta=value)
|
|
141
|
-
|
|
142
|
-
def pop(self, key):
|
|
143
|
-
"""
|
|
144
|
-
delete the element from the cache and return it
|
|
145
|
-
:param key: str or int type of key
|
|
146
|
-
:return: the deleted element
|
|
147
|
-
"""
|
|
148
|
-
self.cache.close()
|
|
149
|
-
return self.cache.pop(key)
|
|
150
|
-
|
|
151
|
-
def volume(self):
|
|
152
|
-
"""
|
|
153
|
-
returns the estimated total size in bytes of the cache directory on disk.
|
|
154
|
-
:return: size in bytes
|
|
155
|
-
"""
|
|
156
|
-
return self.cache.volume()
|
|
157
|
-
|
|
158
|
-
def clear(self):
|
|
159
|
-
"""
|
|
160
|
-
simply removes all items from the cache.
|
|
161
|
-
:return: number of the items
|
|
162
|
-
"""
|
|
163
|
-
return self.cache.clear()
|
|
164
|
-
|
|
165
|
-
def stats(self):
|
|
166
|
-
"""
|
|
167
|
-
returns cache hits and misses.
|
|
168
|
-
:return: tuple (hits, misses)
|
|
169
|
-
"""
|
|
170
|
-
hits, misses = self.cache.stats(enable=False, reset=False)
|
|
171
|
-
self.cache.stats(enable=True)
|
|
172
|
-
return hits, misses
|
|
173
|
-
|
|
174
|
-
def reset_stats(self):
|
|
175
|
-
"""
|
|
176
|
-
reset cache hits and misses.
|
|
177
|
-
:return:
|
|
178
|
-
"""
|
|
179
|
-
self.cache.stats(enable=False, reset=True)
|
|
180
|
-
self.cache.stats(enable=True)
|
|
181
|
-
|
|
182
|
-
def keys(self):
|
|
183
|
-
"""
|
|
184
|
-
return all the cache keys
|
|
185
|
-
:return: list of the keys
|
|
186
|
-
"""
|
|
187
|
-
for output in list(self.cache.iterkeys()):
|
|
188
|
-
if output is not None:
|
|
189
|
-
yield output
|
|
190
|
-
|
|
191
|
-
def delete_cache(self):
|
|
192
|
-
"""
|
|
193
|
-
Delete the cache folder
|
|
194
|
-
"""
|
|
195
|
-
self.cache.close()
|
|
196
|
-
import shutil
|
|
197
|
-
|
|
198
|
-
try:
|
|
199
|
-
shutil.rmtree(self.cache.directory)
|
|
200
|
-
except OSError: # Windows wonkiness
|
|
201
|
-
pass
|
|
1
|
+
import json
|
|
2
|
+
import sqlite3
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
from diskcache import Cache
|
|
6
|
+
import os
|
|
7
|
+
from .base_cache import BaseCache
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DiskCache(BaseCache):
|
|
11
|
+
def __init__(self, name, level=1, options=None, enable_stats=False, ttl=1000):
|
|
12
|
+
if options is None:
|
|
13
|
+
options = dict()
|
|
14
|
+
self.name = name
|
|
15
|
+
self.level = level
|
|
16
|
+
self.ttl = ttl
|
|
17
|
+
self.cache_dir = options.get(
|
|
18
|
+
"cachePath", os.path.join(self.dataloop_path, "cache", name)
|
|
19
|
+
)
|
|
20
|
+
self.cache = Cache(directory=self.cache_dir)
|
|
21
|
+
self.cache.stats(enable=enable_stats)
|
|
22
|
+
|
|
23
|
+
self.conn = sqlite3.connect(os.path.join(self.cache_dir, 'cache.db'), check_same_thread=False)
|
|
24
|
+
self.cursor = self.conn.cursor()
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def dataloop_path(self):
|
|
28
|
+
return os.environ['DATALOOP_PATH'] if 'DATALOOP_PATH' in os.environ \
|
|
29
|
+
else os.path.join(os.path.expanduser('~'), '.dataloop')
|
|
30
|
+
|
|
31
|
+
def set(self, key, value):
|
|
32
|
+
"""
|
|
33
|
+
set or add a key and value to the cache
|
|
34
|
+
:param key: str or int type of key
|
|
35
|
+
:param value: pickled value
|
|
36
|
+
:return:
|
|
37
|
+
"""
|
|
38
|
+
if not isinstance(key, str) and not isinstance(key, int):
|
|
39
|
+
raise ValueError("key must be string or int")
|
|
40
|
+
with Cache(self.cache.directory) as reference:
|
|
41
|
+
reference.set(key=key, value=value, expire=self.ttl)
|
|
42
|
+
|
|
43
|
+
def _key_fix(self, key):
|
|
44
|
+
if '**' in key:
|
|
45
|
+
key = key.replace('**', '%')
|
|
46
|
+
if '*' in key:
|
|
47
|
+
key = key.replace('*', '%')
|
|
48
|
+
return key
|
|
49
|
+
|
|
50
|
+
def list(self, pattern):
|
|
51
|
+
"""
|
|
52
|
+
list the keys py pattern from the cache
|
|
53
|
+
|
|
54
|
+
:param pattern: str or int type of key
|
|
55
|
+
:return: the value of the key
|
|
56
|
+
"""
|
|
57
|
+
self.cache.close()
|
|
58
|
+
|
|
59
|
+
key = self._key_fix(pattern)
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
self.cursor.execute("SELECT key FROM Cache WHERE key LIKE '{}'".format(key))
|
|
63
|
+
|
|
64
|
+
rows = self.cursor.fetchall()
|
|
65
|
+
for row in rows:
|
|
66
|
+
for key in row:
|
|
67
|
+
yield key
|
|
68
|
+
except:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
def ping(self):
|
|
72
|
+
"""
|
|
73
|
+
Cache ping check if connection is working
|
|
74
|
+
"""
|
|
75
|
+
if os.path.exists(os.path.join(self.cache_dir, 'cache.db')):
|
|
76
|
+
return True
|
|
77
|
+
else:
|
|
78
|
+
raise Exception('cache db not fond')
|
|
79
|
+
|
|
80
|
+
def get(self, key):
|
|
81
|
+
"""
|
|
82
|
+
get the value of the key from the cache
|
|
83
|
+
:param key: str or int type of key
|
|
84
|
+
:return: the value of the key
|
|
85
|
+
"""
|
|
86
|
+
self.cache.close()
|
|
87
|
+
res = self.cache.get(key=key)
|
|
88
|
+
if res is not None:
|
|
89
|
+
try:
|
|
90
|
+
return json.loads(res)
|
|
91
|
+
except:
|
|
92
|
+
return res
|
|
93
|
+
|
|
94
|
+
def delete(self, key):
|
|
95
|
+
"""
|
|
96
|
+
delete the element from the cache
|
|
97
|
+
:param key: str or int type of key
|
|
98
|
+
:return:
|
|
99
|
+
"""
|
|
100
|
+
self.cache.close()
|
|
101
|
+
self.cache.delete(key=key)
|
|
102
|
+
|
|
103
|
+
def add(self, key, value):
|
|
104
|
+
"""
|
|
105
|
+
add the element to the cache if the key is not already present.
|
|
106
|
+
:param key: str or int type of key
|
|
107
|
+
:param value: pickled value
|
|
108
|
+
:return: bool: True if add False if not
|
|
109
|
+
"""
|
|
110
|
+
if not isinstance(key, str) and not isinstance(key, int):
|
|
111
|
+
raise ValueError("key must be string or int")
|
|
112
|
+
self.cache.close()
|
|
113
|
+
return self.cache.add(key=key, value=value, expire=self.ttl)
|
|
114
|
+
|
|
115
|
+
def push(self, value):
|
|
116
|
+
"""
|
|
117
|
+
push the element to the cache
|
|
118
|
+
:param value: pickled value
|
|
119
|
+
:return: bool: True if add False if not
|
|
120
|
+
"""
|
|
121
|
+
self.cache.close()
|
|
122
|
+
return self.cache.push(value=value, expire=self.ttl)
|
|
123
|
+
|
|
124
|
+
def incr(self, key, value=1):
|
|
125
|
+
"""
|
|
126
|
+
incremented the value of this key
|
|
127
|
+
:param key: str or int type of key
|
|
128
|
+
:param value: the amount of incremented
|
|
129
|
+
:return:
|
|
130
|
+
"""
|
|
131
|
+
self.cache.incr(key=key, delta=value)
|
|
132
|
+
|
|
133
|
+
def decr(self, key, value=1):
|
|
134
|
+
"""
|
|
135
|
+
decremented the value of this key
|
|
136
|
+
:param key: str or int type of key
|
|
137
|
+
:param value: the amount of decremented
|
|
138
|
+
:return:
|
|
139
|
+
"""
|
|
140
|
+
self.cache.decr(key=key, delta=value)
|
|
141
|
+
|
|
142
|
+
def pop(self, key):
|
|
143
|
+
"""
|
|
144
|
+
delete the element from the cache and return it
|
|
145
|
+
:param key: str or int type of key
|
|
146
|
+
:return: the deleted element
|
|
147
|
+
"""
|
|
148
|
+
self.cache.close()
|
|
149
|
+
return self.cache.pop(key)
|
|
150
|
+
|
|
151
|
+
def volume(self):
|
|
152
|
+
"""
|
|
153
|
+
returns the estimated total size in bytes of the cache directory on disk.
|
|
154
|
+
:return: size in bytes
|
|
155
|
+
"""
|
|
156
|
+
return self.cache.volume()
|
|
157
|
+
|
|
158
|
+
def clear(self):
|
|
159
|
+
"""
|
|
160
|
+
simply removes all items from the cache.
|
|
161
|
+
:return: number of the items
|
|
162
|
+
"""
|
|
163
|
+
return self.cache.clear()
|
|
164
|
+
|
|
165
|
+
def stats(self):
|
|
166
|
+
"""
|
|
167
|
+
returns cache hits and misses.
|
|
168
|
+
:return: tuple (hits, misses)
|
|
169
|
+
"""
|
|
170
|
+
hits, misses = self.cache.stats(enable=False, reset=False)
|
|
171
|
+
self.cache.stats(enable=True)
|
|
172
|
+
return hits, misses
|
|
173
|
+
|
|
174
|
+
def reset_stats(self):
|
|
175
|
+
"""
|
|
176
|
+
reset cache hits and misses.
|
|
177
|
+
:return:
|
|
178
|
+
"""
|
|
179
|
+
self.cache.stats(enable=False, reset=True)
|
|
180
|
+
self.cache.stats(enable=True)
|
|
181
|
+
|
|
182
|
+
def keys(self):
|
|
183
|
+
"""
|
|
184
|
+
return all the cache keys
|
|
185
|
+
:return: list of the keys
|
|
186
|
+
"""
|
|
187
|
+
for output in list(self.cache.iterkeys()):
|
|
188
|
+
if output is not None:
|
|
189
|
+
yield output
|
|
190
|
+
|
|
191
|
+
def delete_cache(self):
|
|
192
|
+
"""
|
|
193
|
+
Delete the cache folder
|
|
194
|
+
"""
|
|
195
|
+
self.cache.close()
|
|
196
|
+
import shutil
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
shutil.rmtree(self.cache.directory)
|
|
200
|
+
except OSError: # Windows wonkiness
|
|
201
|
+
pass
|
dtlpy/caches/filesystem_cache.py
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import json
|
|
3
|
-
import glob
|
|
4
|
-
import shutil
|
|
5
|
-
|
|
6
|
-
from .base_cache import BaseCache
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class FileSystemCache(BaseCache):
|
|
10
|
-
def __init__(self, options=None, size=1000, ttl=1000):
|
|
11
|
-
"""
|
|
12
|
-
docs
|
|
13
|
-
"""
|
|
14
|
-
if options is None:
|
|
15
|
-
options = {}
|
|
16
|
-
root_dir = options.get('rootDir', os.environ['DEFAULT_CACHE_PATH'])
|
|
17
|
-
if not os.path.isdir(root_dir):
|
|
18
|
-
os.makedirs(root_dir, exist_ok=True)
|
|
19
|
-
self.root_dir = root_dir
|
|
20
|
-
self.ttl = ttl
|
|
21
|
-
self.size = size
|
|
22
|
-
|
|
23
|
-
def set(self, key, value):
|
|
24
|
-
"""
|
|
25
|
-
set or add a key and value to the cache
|
|
26
|
-
:param key: str or int type of key
|
|
27
|
-
:param value: pickled value
|
|
28
|
-
:return:
|
|
29
|
-
"""
|
|
30
|
-
if not isinstance(key, str):
|
|
31
|
-
raise ValueError("key must be string")
|
|
32
|
-
filepath = os.path.join(self.root_dir, key + '.json')
|
|
33
|
-
if not os.path.isdir(os.path.dirname(filepath)):
|
|
34
|
-
os.makedirs(os.path.dirname(filepath), exist_ok=True)
|
|
35
|
-
|
|
36
|
-
with open(filepath, 'w') as f:
|
|
37
|
-
json.dump(value, f, indent=4)
|
|
38
|
-
|
|
39
|
-
def list(self, key):
|
|
40
|
-
"""
|
|
41
|
-
get the value of the key from the cache
|
|
42
|
-
:param key: str or int type of key
|
|
43
|
-
:return: the value of the key
|
|
44
|
-
"""
|
|
45
|
-
if self.root_dir not in key:
|
|
46
|
-
filepath = os.path.join(self.root_dir, key)
|
|
47
|
-
else:
|
|
48
|
-
filepath = key
|
|
49
|
-
files_list = set(glob.glob(filepath + '.*', recursive=True))
|
|
50
|
-
output_values = []
|
|
51
|
-
for file in files_list:
|
|
52
|
-
with open(file) as file_out:
|
|
53
|
-
output_values.append(json.load(file_out))
|
|
54
|
-
return output_values
|
|
55
|
-
|
|
56
|
-
def get(self, key):
|
|
57
|
-
"""
|
|
58
|
-
get the value of the key from the cache
|
|
59
|
-
:param key: str or int type of key
|
|
60
|
-
:return: the value of the key
|
|
61
|
-
"""
|
|
62
|
-
if self.root_dir not in key:
|
|
63
|
-
filepath = os.path.join(self.root_dir, key)
|
|
64
|
-
else:
|
|
65
|
-
filepath = key
|
|
66
|
-
|
|
67
|
-
res = None
|
|
68
|
-
if os.path.isfile(filepath):
|
|
69
|
-
with open(filepath) as file_out:
|
|
70
|
-
res = (json.load(file_out))
|
|
71
|
-
return res
|
|
72
|
-
|
|
73
|
-
def delete(self, key):
|
|
74
|
-
"""
|
|
75
|
-
delete the element from the cache
|
|
76
|
-
:param key: str or int type of key
|
|
77
|
-
:return:
|
|
78
|
-
"""
|
|
79
|
-
if self.root_dir not in key:
|
|
80
|
-
filepath = os.path.join(self.root_dir, os.path.dirname(key))
|
|
81
|
-
else:
|
|
82
|
-
filepath = os.path.dirname(key)
|
|
83
|
-
files_list = set(glob.glob(filepath, recursive=True))
|
|
84
|
-
for file in files_list:
|
|
85
|
-
if os.path.isdir(file):
|
|
86
|
-
try:
|
|
87
|
-
shutil.rmtree(file)
|
|
88
|
-
except OSError as e:
|
|
89
|
-
print("Error: %s - %s." % (e.filename, e.strerror))
|
|
1
|
+
import os
|
|
2
|
+
import json
|
|
3
|
+
import glob
|
|
4
|
+
import shutil
|
|
5
|
+
|
|
6
|
+
from .base_cache import BaseCache
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class FileSystemCache(BaseCache):
|
|
10
|
+
def __init__(self, options=None, size=1000, ttl=1000):
|
|
11
|
+
"""
|
|
12
|
+
docs
|
|
13
|
+
"""
|
|
14
|
+
if options is None:
|
|
15
|
+
options = {}
|
|
16
|
+
root_dir = options.get('rootDir', os.environ['DEFAULT_CACHE_PATH'])
|
|
17
|
+
if not os.path.isdir(root_dir):
|
|
18
|
+
os.makedirs(root_dir, exist_ok=True)
|
|
19
|
+
self.root_dir = root_dir
|
|
20
|
+
self.ttl = ttl
|
|
21
|
+
self.size = size
|
|
22
|
+
|
|
23
|
+
def set(self, key, value):
|
|
24
|
+
"""
|
|
25
|
+
set or add a key and value to the cache
|
|
26
|
+
:param key: str or int type of key
|
|
27
|
+
:param value: pickled value
|
|
28
|
+
:return:
|
|
29
|
+
"""
|
|
30
|
+
if not isinstance(key, str):
|
|
31
|
+
raise ValueError("key must be string")
|
|
32
|
+
filepath = os.path.join(self.root_dir, key + '.json')
|
|
33
|
+
if not os.path.isdir(os.path.dirname(filepath)):
|
|
34
|
+
os.makedirs(os.path.dirname(filepath), exist_ok=True)
|
|
35
|
+
|
|
36
|
+
with open(filepath, 'w') as f:
|
|
37
|
+
json.dump(value, f, indent=4)
|
|
38
|
+
|
|
39
|
+
def list(self, key):
|
|
40
|
+
"""
|
|
41
|
+
get the value of the key from the cache
|
|
42
|
+
:param key: str or int type of key
|
|
43
|
+
:return: the value of the key
|
|
44
|
+
"""
|
|
45
|
+
if self.root_dir not in key:
|
|
46
|
+
filepath = os.path.join(self.root_dir, key)
|
|
47
|
+
else:
|
|
48
|
+
filepath = key
|
|
49
|
+
files_list = set(glob.glob(filepath + '.*', recursive=True))
|
|
50
|
+
output_values = []
|
|
51
|
+
for file in files_list:
|
|
52
|
+
with open(file) as file_out:
|
|
53
|
+
output_values.append(json.load(file_out))
|
|
54
|
+
return output_values
|
|
55
|
+
|
|
56
|
+
def get(self, key):
|
|
57
|
+
"""
|
|
58
|
+
get the value of the key from the cache
|
|
59
|
+
:param key: str or int type of key
|
|
60
|
+
:return: the value of the key
|
|
61
|
+
"""
|
|
62
|
+
if self.root_dir not in key:
|
|
63
|
+
filepath = os.path.join(self.root_dir, key)
|
|
64
|
+
else:
|
|
65
|
+
filepath = key
|
|
66
|
+
|
|
67
|
+
res = None
|
|
68
|
+
if os.path.isfile(filepath):
|
|
69
|
+
with open(filepath) as file_out:
|
|
70
|
+
res = (json.load(file_out))
|
|
71
|
+
return res
|
|
72
|
+
|
|
73
|
+
def delete(self, key):
|
|
74
|
+
"""
|
|
75
|
+
delete the element from the cache
|
|
76
|
+
:param key: str or int type of key
|
|
77
|
+
:return:
|
|
78
|
+
"""
|
|
79
|
+
if self.root_dir not in key:
|
|
80
|
+
filepath = os.path.join(self.root_dir, os.path.dirname(key))
|
|
81
|
+
else:
|
|
82
|
+
filepath = os.path.dirname(key)
|
|
83
|
+
files_list = set(glob.glob(filepath, recursive=True))
|
|
84
|
+
for file in files_list:
|
|
85
|
+
if os.path.isdir(file):
|
|
86
|
+
try:
|
|
87
|
+
shutil.rmtree(file)
|
|
88
|
+
except OSError as e:
|
|
89
|
+
print("Error: %s - %s." % (e.filename, e.strerror))
|