cachier 3.1.0__py3-none-any.whl → 3.1.2__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.
- cachier/__init__.py +4 -0
- cachier/config.py +4 -3
- cachier/core.py +3 -3
- cachier/cores/base.py +5 -1
- cachier/cores/memory.py +11 -3
- cachier/cores/mongo.py +6 -4
- cachier/cores/pickle.py +84 -51
- cachier/version.info +1 -1
- {cachier-3.1.0.dist-info → cachier-3.1.2.dist-info}/METADATA +3 -3
- cachier-3.1.2.dist-info/RECORD +19 -0
- cachier-3.1.0.dist-info/RECORD +0 -19
- {cachier-3.1.0.dist-info → cachier-3.1.2.dist-info}/LICENSE +0 -0
- {cachier-3.1.0.dist-info → cachier-3.1.2.dist-info}/WHEEL +0 -0
- {cachier-3.1.0.dist-info → cachier-3.1.2.dist-info}/entry_points.txt +0 -0
- {cachier-3.1.0.dist-info → cachier-3.1.2.dist-info}/top_level.txt +0 -0
cachier/__init__.py
CHANGED
@@ -2,13 +2,17 @@ from ._version import * # noqa: F403
|
|
2
2
|
from .config import (
|
3
3
|
disable_caching,
|
4
4
|
enable_caching,
|
5
|
+
get_default_params,
|
5
6
|
get_global_params,
|
7
|
+
set_default_params,
|
6
8
|
set_global_params,
|
7
9
|
)
|
8
10
|
from .core import cachier
|
9
11
|
|
10
12
|
__all__ = [
|
11
13
|
"cachier",
|
14
|
+
"set_default_params",
|
15
|
+
"get_default_params",
|
12
16
|
"set_global_params",
|
13
17
|
"get_global_params",
|
14
18
|
"enable_caching",
|
cachier/config.py
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
import datetime
|
2
1
|
import hashlib
|
3
2
|
import os
|
4
3
|
import pickle
|
5
4
|
import threading
|
6
5
|
from collections.abc import Mapping
|
7
6
|
from dataclasses import dataclass, replace
|
7
|
+
from datetime import datetime, timedelta
|
8
8
|
from typing import Any, Optional, Union
|
9
9
|
|
10
10
|
from ._types import Backend, HashFunc, Mongetter
|
@@ -27,7 +27,7 @@ class Params:
|
|
27
27
|
hash_func: HashFunc = _default_hash_func
|
28
28
|
backend: Backend = "pickle"
|
29
29
|
mongetter: Optional[Mongetter] = None
|
30
|
-
stale_after:
|
30
|
+
stale_after: timedelta = timedelta.max
|
31
31
|
next_time: bool = False
|
32
32
|
cache_dir: Union[str, os.PathLike] = "~/.cachier/"
|
33
33
|
pickle_reload: bool = True
|
@@ -100,7 +100,8 @@ def set_global_params(**params: Mapping) -> None:
|
|
100
100
|
if hasattr(cachier.config._global_params, k)
|
101
101
|
}
|
102
102
|
cachier.config._global_params = replace(
|
103
|
-
cachier.config._global_params,
|
103
|
+
cachier.config._global_params,
|
104
|
+
**valid_params, # type: ignore[arg-type]
|
104
105
|
)
|
105
106
|
|
106
107
|
|
cachier/core.py
CHANGED
@@ -7,12 +7,12 @@
|
|
7
7
|
# http://www.opensource.org/licenses/MIT-license
|
8
8
|
# Copyright (c) 2016, Shay Palachy <shaypal5@gmail.com>
|
9
9
|
|
10
|
-
import datetime
|
11
10
|
import inspect
|
12
11
|
import os
|
13
12
|
import warnings
|
14
13
|
from collections import OrderedDict
|
15
14
|
from concurrent.futures import ThreadPoolExecutor
|
15
|
+
from datetime import datetime, timedelta
|
16
16
|
from functools import wraps
|
17
17
|
from typing import Any, Optional, Union
|
18
18
|
from warnings import warn
|
@@ -107,7 +107,7 @@ def cachier(
|
|
107
107
|
hash_params: Optional[HashFunc] = None,
|
108
108
|
backend: Optional[Backend] = None,
|
109
109
|
mongetter: Optional[Mongetter] = None,
|
110
|
-
stale_after: Optional[
|
110
|
+
stale_after: Optional[timedelta] = None,
|
111
111
|
next_time: Optional[bool] = None,
|
112
112
|
cache_dir: Optional[Union[str, os.PathLike]] = None,
|
113
113
|
pickle_reload: Optional[bool] = None,
|
@@ -259,7 +259,7 @@ def cachier(
|
|
259
259
|
_print("Entry found.")
|
260
260
|
if _allow_none or entry.value is not None:
|
261
261
|
_print("Cached result found.")
|
262
|
-
now = datetime.
|
262
|
+
now = datetime.now()
|
263
263
|
if now - entry.time <= _stale_after:
|
264
264
|
_print("And it is fresh!")
|
265
265
|
return entry.value
|
cachier/cores/base.py
CHANGED
@@ -28,7 +28,11 @@ def _get_func_str(func: Callable) -> str:
|
|
28
28
|
class _BaseCore:
|
29
29
|
__metaclass__ = abc.ABCMeta
|
30
30
|
|
31
|
-
def __init__(
|
31
|
+
def __init__(
|
32
|
+
self,
|
33
|
+
hash_func: Optional[HashFunc],
|
34
|
+
wait_for_calc_timeout: Optional[int],
|
35
|
+
):
|
32
36
|
self.hash_func = _update_with_defaults(hash_func, "hash_func")
|
33
37
|
self.wait_for_calc_timeout = wait_for_calc_timeout
|
34
38
|
self.lock = threading.RLock()
|
cachier/cores/memory.py
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
import threading
|
4
4
|
from datetime import datetime
|
5
|
-
from typing import Any, Optional, Tuple
|
5
|
+
from typing import Any, Dict, Optional, Tuple
|
6
6
|
|
7
7
|
from .._types import HashFunc
|
8
8
|
from ..config import CacheEntry
|
@@ -12,9 +12,13 @@ from .base import _BaseCore, _get_func_str
|
|
12
12
|
class _MemoryCore(_BaseCore):
|
13
13
|
"""The memory core class for cachier."""
|
14
14
|
|
15
|
-
def __init__(
|
15
|
+
def __init__(
|
16
|
+
self,
|
17
|
+
hash_func: Optional[HashFunc],
|
18
|
+
wait_for_calc_timeout: Optional[int],
|
19
|
+
):
|
16
20
|
super().__init__(hash_func, wait_for_calc_timeout)
|
17
|
-
self.cache = {}
|
21
|
+
self.cache: Dict[str, CacheEntry] = {}
|
18
22
|
|
19
23
|
def _hash_func_key(self, key: str) -> str:
|
20
24
|
return f"{_get_func_str(self.func)}:{key}"
|
@@ -79,8 +83,12 @@ class _MemoryCore(_BaseCore):
|
|
79
83
|
hash_key = self._hash_func_key(key)
|
80
84
|
with self.lock: # pragma: no cover
|
81
85
|
entry = self.cache[hash_key]
|
86
|
+
if entry is None:
|
87
|
+
return None
|
82
88
|
if not entry._processing:
|
83
89
|
return entry.value
|
90
|
+
if entry._condition is None:
|
91
|
+
raise RuntimeError("No condition set for entry")
|
84
92
|
entry._condition.acquire()
|
85
93
|
entry._condition.wait()
|
86
94
|
entry._condition.release()
|
cachier/cores/mongo.py
CHANGED
@@ -37,9 +37,9 @@ class _MongoCore(_BaseCore):
|
|
37
37
|
|
38
38
|
def __init__(
|
39
39
|
self,
|
40
|
-
hash_func: HashFunc,
|
41
|
-
mongetter: Mongetter,
|
42
|
-
wait_for_calc_timeout: int,
|
40
|
+
hash_func: Optional[HashFunc],
|
41
|
+
mongetter: Optional[Mongetter],
|
42
|
+
wait_for_calc_timeout: Optional[int],
|
43
43
|
):
|
44
44
|
if "pymongo" not in sys.modules:
|
45
45
|
warnings.warn(
|
@@ -48,7 +48,9 @@ class _MongoCore(_BaseCore):
|
|
48
48
|
stacklevel=2,
|
49
49
|
) # pragma: no cover
|
50
50
|
|
51
|
-
super().__init__(
|
51
|
+
super().__init__(
|
52
|
+
hash_func=hash_func, wait_for_calc_timeout=wait_for_calc_timeout
|
53
|
+
)
|
52
54
|
if mongetter is None:
|
53
55
|
raise MissingMongetter(
|
54
56
|
"must specify ``mongetter`` when using the mongo core"
|
cachier/cores/pickle.py
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
import os
|
10
10
|
import pickle # for local caching
|
11
11
|
from datetime import datetime
|
12
|
-
from typing import Any, Dict, Optional, Tuple
|
12
|
+
from typing import Any, Dict, Optional, Tuple, Union
|
13
13
|
|
14
14
|
import portalocker # to lock on pickle cache IO
|
15
15
|
from watchdog.events import PatternMatchingEventHandler
|
@@ -54,7 +54,7 @@ class _PickleCore(_BaseCore):
|
|
54
54
|
self.observer.stop()
|
55
55
|
# else:
|
56
56
|
# print('NOT stopping observer... :(')
|
57
|
-
except
|
57
|
+
except AttributeError: # catching entry being None
|
58
58
|
self.value = None
|
59
59
|
self.observer.stop()
|
60
60
|
|
@@ -68,14 +68,14 @@ class _PickleCore(_BaseCore):
|
|
68
68
|
|
69
69
|
def __init__(
|
70
70
|
self,
|
71
|
-
hash_func: HashFunc,
|
72
|
-
pickle_reload: bool,
|
73
|
-
cache_dir: str,
|
74
|
-
separate_files: bool,
|
75
|
-
wait_for_calc_timeout: int,
|
71
|
+
hash_func: Optional[HashFunc],
|
72
|
+
pickle_reload: Optional[bool],
|
73
|
+
cache_dir: Optional[Union[str, os.PathLike]],
|
74
|
+
separate_files: Optional[bool],
|
75
|
+
wait_for_calc_timeout: Optional[int],
|
76
76
|
):
|
77
77
|
super().__init__(hash_func, wait_for_calc_timeout)
|
78
|
-
self.
|
78
|
+
self._cache_dict: Dict[str, CacheEntry] = {}
|
79
79
|
self.reload = _update_with_defaults(pickle_reload, "pickle_reload")
|
80
80
|
self.cache_dir = os.path.expanduser(
|
81
81
|
_update_with_defaults(cache_dir, "cache_dir")
|
@@ -83,6 +83,7 @@ class _PickleCore(_BaseCore):
|
|
83
83
|
self.separate_files = _update_with_defaults(
|
84
84
|
separate_files, "separate_files"
|
85
85
|
)
|
86
|
+
self._cache_used_fpath = ""
|
86
87
|
|
87
88
|
@property
|
88
89
|
def cache_fname(self) -> str:
|
@@ -96,28 +97,52 @@ class _PickleCore(_BaseCore):
|
|
96
97
|
os.path.join(os.path.realpath(self.cache_dir), self.cache_fname)
|
97
98
|
)
|
98
99
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
100
|
+
@staticmethod
|
101
|
+
def _convert_legacy_cache_entry(
|
102
|
+
entry: Union[dict, CacheEntry],
|
103
|
+
) -> CacheEntry:
|
104
|
+
if isinstance(entry, CacheEntry):
|
105
|
+
return entry
|
106
|
+
return CacheEntry(
|
107
|
+
value=entry["value"],
|
108
|
+
time=entry["time"],
|
109
|
+
stale=entry["stale"],
|
110
|
+
_processing=entry["being_calculated"],
|
111
|
+
_condition=entry.get("condition", None),
|
112
|
+
)
|
106
113
|
|
107
|
-
def
|
114
|
+
def _load_cache_dict(self) -> Dict[str, CacheEntry]:
|
115
|
+
try:
|
116
|
+
with portalocker.Lock(self.cache_fpath, mode="rb") as cf:
|
117
|
+
cache = pickle.load(cf) # noqa: S301
|
118
|
+
self._cache_used_fpath = str(self.cache_fpath)
|
119
|
+
except (FileNotFoundError, EOFError):
|
120
|
+
cache = {}
|
121
|
+
return {
|
122
|
+
k: _PickleCore._convert_legacy_cache_entry(v)
|
123
|
+
for k, v in cache.items()
|
124
|
+
}
|
125
|
+
|
126
|
+
def get_cache_dict(self, reload: bool = False) -> Dict[str, CacheEntry]:
|
127
|
+
if self._cache_used_fpath != self.cache_fpath:
|
128
|
+
# force reload if the cache file has changed
|
129
|
+
# this change is dies to using different wrapped function
|
130
|
+
reload = True
|
131
|
+
if self._cache_dict and not (self.reload or reload):
|
132
|
+
return self._cache_dict
|
108
133
|
with self.lock:
|
109
|
-
|
110
|
-
|
111
|
-
return self.cache
|
134
|
+
self._cache_dict = self._load_cache_dict()
|
135
|
+
return self._cache_dict
|
112
136
|
|
113
|
-
def
|
137
|
+
def _load_cache_by_key(
|
114
138
|
self, key=None, hash_str=None
|
115
|
-
) -> Optional[
|
139
|
+
) -> Optional[CacheEntry]:
|
116
140
|
fpath = self.cache_fpath
|
117
141
|
fpath += f"_{hash_str or key}"
|
118
142
|
try:
|
119
143
|
with portalocker.Lock(fpath, mode="rb") as cache_file:
|
120
|
-
|
144
|
+
entry = pickle.load(cache_file) # noqa: S301
|
145
|
+
return _PickleCore._convert_legacy_cache_entry(entry)
|
121
146
|
except (FileNotFoundError, EOFError):
|
122
147
|
return None
|
123
148
|
|
@@ -131,35 +156,42 @@ class _PickleCore(_BaseCore):
|
|
131
156
|
path, name = os.path.split(self.cache_fpath)
|
132
157
|
for subpath in os.listdir(path):
|
133
158
|
if subpath.startswith(name):
|
134
|
-
entry = self.
|
159
|
+
entry = self._load_cache_by_key(
|
160
|
+
hash_str=subpath.split("_")[-1]
|
161
|
+
)
|
135
162
|
if entry is not None:
|
136
|
-
entry.
|
163
|
+
entry._processing = False
|
137
164
|
self._save_cache(entry, hash_str=subpath.split("_")[-1])
|
138
165
|
|
139
166
|
def _save_cache(
|
140
|
-
self,
|
167
|
+
self,
|
168
|
+
cache: Union[Dict[str, CacheEntry], CacheEntry],
|
169
|
+
separate_file_key: Optional[str] = None,
|
170
|
+
hash_str: Optional[str] = None,
|
141
171
|
) -> None:
|
172
|
+
if separate_file_key and not isinstance(cache, CacheEntry):
|
173
|
+
raise ValueError(
|
174
|
+
"`separate_file_key` should only be used with a CacheEntry"
|
175
|
+
)
|
142
176
|
fpath = self.cache_fpath
|
143
|
-
if
|
144
|
-
fpath += f"_{
|
177
|
+
if separate_file_key is not None:
|
178
|
+
fpath += f"_{separate_file_key}"
|
145
179
|
elif hash_str is not None:
|
146
180
|
fpath += f"_{hash_str}"
|
147
181
|
with self.lock:
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
if
|
152
|
-
self.
|
182
|
+
with portalocker.Lock(fpath, mode="wb") as cf:
|
183
|
+
pickle.dump(cache, cf, protocol=4)
|
184
|
+
# the same as check for separate_file, but changed for typing
|
185
|
+
if isinstance(cache, dict):
|
186
|
+
self._cache_dict = cache
|
187
|
+
self._cache_used_fpath = str(self.cache_fpath)
|
153
188
|
|
154
189
|
def get_entry_by_key(
|
155
190
|
self, key: str, reload: bool = False
|
156
|
-
) -> Tuple[str, CacheEntry]:
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
if self.reload or reload:
|
161
|
-
self._reload_cache()
|
162
|
-
return key, self._get_cache().get(key, None)
|
191
|
+
) -> Tuple[str, Optional[CacheEntry]]:
|
192
|
+
if self.separate_files:
|
193
|
+
return key, self._load_cache_by_key(key)
|
194
|
+
return key, self.get_cache_dict(reload).get(key)
|
163
195
|
|
164
196
|
def set_entry(self, key: str, func_res: Any) -> None:
|
165
197
|
key_data = CacheEntry(
|
@@ -174,7 +206,7 @@ class _PickleCore(_BaseCore):
|
|
174
206
|
return # pragma: no cover
|
175
207
|
|
176
208
|
with self.lock:
|
177
|
-
cache = self.
|
209
|
+
cache = self.get_cache_dict()
|
178
210
|
cache[key] = key_data
|
179
211
|
self._save_cache(cache)
|
180
212
|
|
@@ -186,13 +218,15 @@ class _PickleCore(_BaseCore):
|
|
186
218
|
stale=False,
|
187
219
|
_processing=True,
|
188
220
|
),
|
189
|
-
|
221
|
+
separate_file_key=key,
|
190
222
|
)
|
191
223
|
|
192
|
-
def
|
224
|
+
def _mark_entry_not_calculated_separate_files(self, key: str) -> None:
|
193
225
|
_, entry = self.get_entry_by_key(key)
|
226
|
+
if entry is None:
|
227
|
+
return # that's ok, we don't need an entry in that case
|
194
228
|
entry._processing = False
|
195
|
-
self._save_cache(entry,
|
229
|
+
self._save_cache(entry, separate_file_key=key)
|
196
230
|
|
197
231
|
def mark_entry_being_calculated(self, key: str) -> None:
|
198
232
|
if self.separate_files:
|
@@ -200,7 +234,7 @@ class _PickleCore(_BaseCore):
|
|
200
234
|
return # pragma: no cover
|
201
235
|
|
202
236
|
with self.lock:
|
203
|
-
cache = self.
|
237
|
+
cache = self.get_cache_dict()
|
204
238
|
if key in cache:
|
205
239
|
cache[key]._processing = True
|
206
240
|
else:
|
@@ -214,9 +248,9 @@ class _PickleCore(_BaseCore):
|
|
214
248
|
|
215
249
|
def mark_entry_not_calculated(self, key: str) -> None:
|
216
250
|
if self.separate_files:
|
217
|
-
self.
|
251
|
+
self._mark_entry_not_calculated_separate_files(key)
|
218
252
|
with self.lock:
|
219
|
-
cache = self.
|
253
|
+
cache = self.get_cache_dict()
|
220
254
|
# that's ok, we don't need an entry in that case
|
221
255
|
if isinstance(cache, dict) and key in cache:
|
222
256
|
cache[key]._processing = False
|
@@ -224,14 +258,13 @@ class _PickleCore(_BaseCore):
|
|
224
258
|
|
225
259
|
def wait_on_entry_calc(self, key: str) -> Any:
|
226
260
|
if self.separate_files:
|
227
|
-
entry = self.
|
261
|
+
entry = self._load_cache_by_key(key)
|
228
262
|
filename = f"{self.cache_fname}_{key}"
|
229
263
|
else:
|
230
264
|
with self.lock:
|
231
|
-
self.
|
232
|
-
entry = self._get_cache()[key]
|
265
|
+
entry = self.get_cache_dict()[key]
|
233
266
|
filename = self.cache_fname
|
234
|
-
if not entry._processing:
|
267
|
+
if entry and not entry._processing:
|
235
268
|
return entry.value
|
236
269
|
event_handler = _PickleCore.CacheChangeHandler(
|
237
270
|
filename=filename, core=self, key=key
|
@@ -259,7 +292,7 @@ class _PickleCore(_BaseCore):
|
|
259
292
|
return # pragma: no cover
|
260
293
|
|
261
294
|
with self.lock:
|
262
|
-
cache = self.
|
295
|
+
cache = self.get_cache_dict()
|
263
296
|
for key in cache:
|
264
297
|
cache[key]._processing = False
|
265
298
|
self._save_cache(cache)
|
cachier/version.info
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.2
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: cachier
|
3
|
-
Version: 3.1.
|
3
|
+
Version: 3.1.2
|
4
4
|
Summary: Persistent, stale-free, local and cross-machine caching for Python functions.
|
5
5
|
Author-email: Shay Palachy Affek <shay.palachy@gmail.com>
|
6
6
|
License: MIT License
|
@@ -317,7 +317,7 @@ Cachier Cores
|
|
317
317
|
Pickle Core
|
318
318
|
-----------
|
319
319
|
|
320
|
-
The default core for Cachier is pickle based, meaning each function will store its cache
|
320
|
+
The default core for Cachier is pickle based, meaning each function will store its cache in a separate pickle file in the ``~/.cachier`` directory. Naturally, this kind of cache is both machine-specific and user-specific.
|
321
321
|
|
322
322
|
You can configure ``cachier`` to use another directory by providing the ``cache_dir`` parameter with the path to that directory:
|
323
323
|
|
@@ -394,7 +394,7 @@ Note, however, that ``cachier``'s in-memory core is simple, and has no monitorin
|
|
394
394
|
Contributing
|
395
395
|
============
|
396
396
|
|
397
|
-
Current maintainers are Shay Palachy Affek (`shay.palachy@gmail.com <mailto:shay.palachy@gmail.com>`_, `@shaypal5 <https://github.com/shaypal5>`_) and
|
397
|
+
Current maintainers are Shay Palachy Affek (`shay.palachy@gmail.com <mailto:shay.palachy@gmail.com>`_, `@shaypal5 <https://github.com/shaypal5>`_) and `Jirka Borovec <https://github.com/Borda>`_ (`@Borda <https://github.com/Borda>`_ on GitHub); You are more than welcome to approach them for help. Contributions are very welcomed! :)
|
398
398
|
|
399
399
|
Installing for development
|
400
400
|
--------------------------
|
@@ -0,0 +1,19 @@
|
|
1
|
+
cachier/__init__.py,sha256=GZeDebG0EgWIYBmRgPhO19dMiiaam8f9Pu7cWLv3ywY,400
|
2
|
+
cachier/__main__.py,sha256=upg-TlHs1vngKYvkjoPpl3Pvl6xOx4ut-M1mElMiAo0,443
|
3
|
+
cachier/_types.py,sha256=EGJMiw-oCIC_cDLyzw7YC40lfo8jnD3zMmoJpA9Y8Iw,238
|
4
|
+
cachier/_version.py,sha256=yE6UYwvdoIRpw3HmNifiGwV3fqVea5PwZj_EvyosiZ8,1079
|
5
|
+
cachier/config.py,sha256=zp5AfhDIYsYmfQCrlQP-Jg-m6r_xIsk5tK3vPmQEhTA,3882
|
6
|
+
cachier/core.py,sha256=x2uHH7twqNPpO09bUf5-Vfzx-G95qggmGTHPw1xkYo8,13156
|
7
|
+
cachier/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
+
cachier/version.info,sha256=kFNgkh5j9BnWoRHdMha_KEAvNnq5qmlETYDpdBlgDYA,6
|
9
|
+
cachier/cores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
+
cachier/cores/base.py,sha256=q2QXw35UduQEFseNdwbBv1ZKPl1U25NKIX1NbC2i1U4,3682
|
11
|
+
cachier/cores/memory.py,sha256=fsvqq9rwwmAaMBvYo-oUNAxB6UOyfBpuf8ACW_XTaU0,3572
|
12
|
+
cachier/cores/mongo.py,sha256=tM1TJUA4UjknwOfcXF4l0DLDZb1ucUpL-dD75h7VgTA,4971
|
13
|
+
cachier/cores/pickle.py,sha256=FgfvZWAFdWQPOo3G-L57iEV2ujEkIDH8TyGzbarsZeE,10678
|
14
|
+
cachier-3.1.2.dist-info/LICENSE,sha256=-2WrMJkIa0gVP6YQHXXDT7ws-S3M2NEVEF4XF3K8qrY,1069
|
15
|
+
cachier-3.1.2.dist-info/METADATA,sha256=blJgO_8gOHhLkjmMxcHyX84D_IXXCfUXPTzsZ2IScZU,20136
|
16
|
+
cachier-3.1.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
17
|
+
cachier-3.1.2.dist-info/entry_points.txt,sha256=x4Y7t6Y0Qev_3fgG-Jv7TrsvVdJty3FnGAdkT8-_5mY,49
|
18
|
+
cachier-3.1.2.dist-info/top_level.txt,sha256=_rW_HiJumDCch67YT-WAgzcyvKg5RiYDMZq9d-0ZpaE,8
|
19
|
+
cachier-3.1.2.dist-info/RECORD,,
|
cachier-3.1.0.dist-info/RECORD
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
cachier/__init__.py,sha256=ePVg3SxZQqCXDBSaNVziv5rK8ZjxWsUEAecjvP87-BY,300
|
2
|
-
cachier/__main__.py,sha256=upg-TlHs1vngKYvkjoPpl3Pvl6xOx4ut-M1mElMiAo0,443
|
3
|
-
cachier/_types.py,sha256=EGJMiw-oCIC_cDLyzw7YC40lfo8jnD3zMmoJpA9Y8Iw,238
|
4
|
-
cachier/_version.py,sha256=yE6UYwvdoIRpw3HmNifiGwV3fqVea5PwZj_EvyosiZ8,1079
|
5
|
-
cachier/config.py,sha256=KOGaXkBRgv66BexENrTMtrC_TYCeV1fA5v8l6Vj2CYI,3840
|
6
|
-
cachier/core.py,sha256=qQa_GT8WQYD-VFcTS8a2v-Hys4_A1no-aM-d3lw1AFY,13149
|
7
|
-
cachier/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
-
cachier/version.info,sha256=svRNO24p-LG3PqRzXwBq_8TRmOH9nH1Q5zYVmx72NsY,6
|
9
|
-
cachier/cores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
-
cachier/cores/base.py,sha256=jo69c2RMOXbTzDvqRV0UGa5UvyToipv3f62bICIII1k,3631
|
11
|
-
cachier/cores/memory.py,sha256=SSa7qlSU_54YjNYEWrq9rxXozkMYXr5hadAZ3sz62l4,3336
|
12
|
-
cachier/cores/mongo.py,sha256=eRG6XP55G4IcWnoMl5xtDufM1szf8FVbOIBbDH_r-Po,4887
|
13
|
-
cachier/cores/pickle.py,sha256=20c5pg2CS6wAX1PdefCOjl-orec5w7tqEHVqNbZZv0s,9074
|
14
|
-
cachier-3.1.0.dist-info/LICENSE,sha256=-2WrMJkIa0gVP6YQHXXDT7ws-S3M2NEVEF4XF3K8qrY,1069
|
15
|
-
cachier-3.1.0.dist-info/METADATA,sha256=pDqPoWSFSkwdCHUQ-kvEzf517DippyuSaf9kDWkUtas,20102
|
16
|
-
cachier-3.1.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
17
|
-
cachier-3.1.0.dist-info/entry_points.txt,sha256=x4Y7t6Y0Qev_3fgG-Jv7TrsvVdJty3FnGAdkT8-_5mY,49
|
18
|
-
cachier-3.1.0.dist-info/top_level.txt,sha256=_rW_HiJumDCch67YT-WAgzcyvKg5RiYDMZq9d-0ZpaE,8
|
19
|
-
cachier-3.1.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|