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) return defer.ensureDeferred(*args, **kwargs)
@util.memoized(expire=5000) @util.memoized(expire="60s")
def requests_session(): def requests_session():
return AsyncSession(n=5) return AsyncSession(n=5)
@util.memoized() @util.memoized(expire="60s")
def get_core_fullpath(): def get_core_fullpath():
return where_is_program( return where_is_program(
"platformio" + (".exe" if "windows" in util.get_systype() else "")) "platformio" + (".exe" if "windows" in util.get_systype() else ""))
@util.memoized(expire=10000) @util.memoized(expire="10s")
def is_twitter_blocked(): def is_twitter_blocked():
ip = "104.244.42.1" ip = "104.244.42.1"
timeout = 2 timeout = 2

View File

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

View File

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

View File

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

View File

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

View File

@ -50,7 +50,12 @@ class cd(object):
class memoized(object): class memoized(object):
def __init__(self, expire=0): 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 = {} self.cache = {}
def __call__(self, func): def __call__(self, func):
@ -68,7 +73,7 @@ class memoized(object):
return wrapper return wrapper
def _reset(self): def _reset(self):
self.cache = {} self.cache.clear()
class throttle(object): class throttle(object):
@ -296,7 +301,7 @@ def get_request_defheaders():
return {"User-Agent": "PlatformIO/%s CI/%d %s" % data} return {"User-Agent": "PlatformIO/%s CI/%d %s" % data}
@memoized(expire=10000) @memoized(expire="60s")
def _api_request_session(): def _api_request_session():
return requests.Session() return requests.Session()
@ -394,7 +399,7 @@ PING_INTERNET_IPS = [
] ]
@memoized(expire=5000) @memoized(expire="5s")
def _internet_on(): def _internet_on():
timeout = 2 timeout = 2
socket.setdefaulttimeout(timeout) socket.setdefaulttimeout(timeout)