Import upstream snapshot 80e710700aac9573a2230f74f7ce9e094833a0bc
Upstream: https://github.com/Rhoban/onshape-to-robot Upstream-Commit: 80e710700aac9573a2230f74f7ce9e094833a0bc Upstream-Branch: master
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
import os
|
||||
import inspect
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
import pickle
|
||||
|
||||
|
||||
def get_cache_path() -> Path:
|
||||
"""
|
||||
Return the path to the user cache.
|
||||
"""
|
||||
path = Path.home() / ".cache" / "onshape-to-robot"
|
||||
path.mkdir(parents=True, exist_ok=True)
|
||||
return path
|
||||
|
||||
|
||||
def can_cache(method, *args, **kwargs) -> bool:
|
||||
"""
|
||||
Check if the cache can be used.
|
||||
When using wmv=w, the current workspace is used, which make it impossible to cache.
|
||||
"""
|
||||
signature = inspect.signature(method)
|
||||
wmv = None
|
||||
if "wmv" in signature.parameters:
|
||||
wmv = signature.parameters["wmv"].default
|
||||
if "wmv" in kwargs:
|
||||
wmv = kwargs["wmv"]
|
||||
return wmv != "w"
|
||||
|
||||
|
||||
def cache_response(method):
|
||||
"""
|
||||
Decorator that caches the response of a method.
|
||||
"""
|
||||
|
||||
def cached_call(*args, **kwargs):
|
||||
# Checking if the method can be cached
|
||||
if not can_cache(method, *args, **kwargs):
|
||||
return method(*args, **kwargs)
|
||||
|
||||
# Building filename that is unique for method/args combination
|
||||
method_name = method.__qualname__
|
||||
arguments = {"args": args, "kwargs": kwargs}
|
||||
arguments_hash = hashlib.sha1(pickle.dumps(arguments)).hexdigest()
|
||||
filename = f"{get_cache_path()}/{method_name}_{arguments_hash}.pkl"
|
||||
|
||||
if not os.path.exists(filename):
|
||||
result = method(*args, **kwargs)
|
||||
with open(filename, "wb") as f:
|
||||
pickle.dump(result, f)
|
||||
|
||||
return pickle.load(open(filename, "rb"))
|
||||
|
||||
return cached_call
|
||||
Reference in New Issue
Block a user