Refactor using "@util.memoized"

This commit is contained in:
Ivan Kravets
2019-06-06 00:13:04 +03:00
parent 898d79956d
commit bcff26d4d7
6 changed files with 44 additions and 37 deletions

View File

@ -43,18 +43,18 @@ class AsyncSession(requests.Session):
return defer.ensureDeferred(*args, **kwargs)
@util.memoized(expire=5000)
@util.memoized(expire="60s")
def requests_session():
return AsyncSession(n=5)
@util.memoized()
@util.memoized(expire="60s")
def get_core_fullpath():
return where_is_program(
"platformio" + (".exe" if "windows" in util.get_systype() else ""))
@util.memoized(expire=10000)
@util.memoized(expire="10s")
def is_twitter_blocked():
ip = "104.244.42.1"
timeout = 2

View File

@ -147,6 +147,7 @@ def lib_install( # pylint: disable=too-many-arguments
force=force)
installed_manifests[library] = lm.load_manifest(pkg_dir)
elif storage_dir in storage_libdeps:
builtin_lib_storages = None
for library in storage_libdeps[storage_dir]:
try:
pkg_dir = lm.install(library,
@ -155,7 +156,10 @@ def lib_install( # pylint: disable=too-many-arguments
force=force)
installed_manifests[library] = lm.load_manifest(pkg_dir)
except exception.LibNotFound as e:
if not silent or not is_builtin_lib(library):
if builtin_lib_storages is None:
builtin_lib_storages = get_builtin_libs()
if not silent or not is_builtin_lib(
builtin_lib_storages, library):
click.secho("Warning! %s" % e, fg="yellow")
if not save or not libraries:

View File

@ -361,6 +361,7 @@ class LibraryManager(BasePkgManager):
if not silent:
click.secho("Installing dependencies", fg="yellow")
builtin_lib_storages = None
for filters in self.normalize_dependencies(manifest['dependencies']):
assert "name" in filters
@ -382,7 +383,10 @@ class LibraryManager(BasePkgManager):
try:
lib_id = self.search_lib_id(filters, silent, interactive)
except exception.LibNotFound as e:
if not silent or is_builtin_lib(filters['name']):
if builtin_lib_storages is None:
builtin_lib_storages = get_builtin_libs()
if not silent or is_builtin_lib(builtin_lib_storages,
filters['name']):
click.secho("Warning! %s" % e, fg="yellow")
continue
@ -402,7 +406,6 @@ class LibraryManager(BasePkgManager):
return pkg_dir
@util.memoized()
def get_builtin_libs(storage_names=None):
items = []
storage_names = storage_names or []
@ -421,9 +424,8 @@ def get_builtin_libs(storage_names=None):
return items
@util.memoized()
def is_builtin_lib(name):
for storage in get_builtin_libs():
def is_builtin_lib(storages, name):
for storage in storages or []:
if any(l.get("name") == name for l in storage['items']):
return True
return False

View File

@ -37,8 +37,6 @@ from platformio.vcsclient import VCSClientFactory
class PackageRepoIterator(object):
_MANIFEST_CACHE = {}
def __init__(self, package, repositories):
assert isinstance(repositories, list)
self.package = package
@ -50,27 +48,25 @@ class PackageRepoIterator(object):
def __next__(self):
return self.next()
def next(self):
manifest = {}
repo = next(self.repositories)
if isinstance(repo, dict):
manifest = repo
elif repo in PackageRepoIterator._MANIFEST_CACHE:
manifest = PackageRepoIterator._MANIFEST_CACHE[repo]
else:
r = None
try:
r = requests.get(repo, headers=util.get_request_defheaders())
r.raise_for_status()
manifest = r.json()
except: # pylint: disable=bare-except
pass
finally:
if r:
r.close()
PackageRepoIterator._MANIFEST_CACHE[repo] = manifest
@staticmethod
@util.memoized(expire="60s")
def load_manifest(url):
r = None
try:
r = requests.get(url, headers=util.get_request_defheaders())
r.raise_for_status()
return r.json()
except: # pylint: disable=bare-except
pass
finally:
if r:
r.close()
return None
if self.package in manifest:
def next(self):
repo = next(self.repositories)
manifest = repo if isinstance(repo, dict) else self.load_manifest(repo)
if manifest and self.package in manifest:
return manifest[self.package]
return next(self)
@ -795,6 +791,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
return True
def update(self, package, requirements=None, only_check=False):
self.cache_reset()
if isdir(package) and self.get_package_by_dir(package):
pkg_dir = package
else:

View File

@ -173,7 +173,7 @@ class PlatformManager(BasePkgManager):
self.cache_reset()
return True
@util.memoized(expire=5000)
@util.memoized(expire="5s")
def get_installed_boards(self):
boards = []
for manifest in self.get_installed():
@ -185,7 +185,6 @@ class PlatformManager(BasePkgManager):
return boards
@staticmethod
@util.memoized()
def get_registered_boards():
return util.get_api_result("/boards", cache_valid="7d")

View File

@ -50,7 +50,12 @@ class cd(object):
class memoized(object):
def __init__(self, expire=0):
self.expire = expire / 1000 # milliseconds
expire = str(expire)
if expire.isdigit():
expire = "%ss" % (int(expire) / 1000)
tdmap = {"s": 1, "m": 60, "h": 3600, "d": 86400}
assert expire.endswith(tuple(tdmap))
self.expire = int(tdmap[expire[-1]] * int(expire[:-1]))
self.cache = {}
def __call__(self, func):
@ -68,7 +73,7 @@ class memoized(object):
return wrapper
def _reset(self):
self.cache = {}
self.cache.clear()
class throttle(object):
@ -296,7 +301,7 @@ def get_request_defheaders():
return {"User-Agent": "PlatformIO/%s CI/%d %s" % data}
@memoized(expire=10000)
@memoized(expire="60s")
def _api_request_session():
return requests.Session()
@ -394,7 +399,7 @@ PING_INTERNET_IPS = [
]
@memoized(expire=5000)
@memoized(expire="5s")
def _internet_on():
timeout = 2
socket.setdefaulttimeout(timeout)