Upstream Snapshot bb87928bce Import upstream snapshot 80e710700aac9573a2230f74f7ce9e094833a0bc
Upstream: https://github.com/Rhoban/onshape-to-robot
Upstream-Commit: 80e710700aac9573a2230f74f7ce9e094833a0bc
Upstream-Branch: master
2026-08-28 15:42:31 +08:00

55 lines
1.5 KiB
Python

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