Compare commits
No commits in common. "symcache_polishin" and "main" have entirely different histories.
symcache_p
...
main
|
|
@ -29,7 +29,6 @@ from contextlib import (
|
||||||
)
|
)
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pprint import pformat
|
from pprint import pformat
|
||||||
import time
|
|
||||||
from typing import (
|
from typing import (
|
||||||
Any,
|
Any,
|
||||||
Callable,
|
Callable,
|
||||||
|
|
@ -49,10 +48,7 @@ except ModuleNotFoundError:
|
||||||
import tomli as tomllib
|
import tomli as tomllib
|
||||||
from msgspec import field
|
from msgspec import field
|
||||||
|
|
||||||
from piker.log import (
|
from piker.log import get_logger
|
||||||
get_console_log,
|
|
||||||
get_logger,
|
|
||||||
)
|
|
||||||
from piker import config
|
from piker import config
|
||||||
from piker.types import Struct
|
from piker.types import Struct
|
||||||
from piker.brokers import (
|
from piker.brokers import (
|
||||||
|
|
@ -360,35 +356,24 @@ def mk_cachefile(
|
||||||
) -> Path:
|
) -> Path:
|
||||||
cachedir: Path = config.get_conf_dir() / '_cache'
|
cachedir: Path = config.get_conf_dir() / '_cache'
|
||||||
if not cachedir.is_dir():
|
if not cachedir.is_dir():
|
||||||
log.info(
|
log.info(f'Creating `nativedb` director: {cachedir}')
|
||||||
f'Creating symbology-cache subdir\n'
|
|
||||||
f'{cachedir}'
|
|
||||||
)
|
|
||||||
cachedir.mkdir()
|
cachedir.mkdir()
|
||||||
|
|
||||||
cachefile: Path = cachedir / f'{str(provider)}.symcache.toml'
|
cachefile: Path = cachedir / f'{str(provider)}.symcache.toml'
|
||||||
cachefile.touch()
|
cachefile.touch()
|
||||||
|
|
||||||
return cachefile
|
return cachefile
|
||||||
|
|
||||||
|
|
||||||
@acm
|
@acm
|
||||||
async def open_symcache(
|
async def open_symcache(
|
||||||
mod_or_name: ModuleType|str,
|
mod_or_name: ModuleType | str,
|
||||||
|
|
||||||
reload: bool = False,
|
reload: bool = False,
|
||||||
only_from_memcache: bool = False, # no API req
|
only_from_memcache: bool = False, # no API req
|
||||||
_no_symcache: bool = False, # no backend support
|
_no_symcache: bool = False, # no backend support
|
||||||
|
|
||||||
loglevel: str = 'info',
|
|
||||||
|
|
||||||
) -> SymbologyCache:
|
) -> SymbologyCache:
|
||||||
|
|
||||||
log = get_console_log(
|
|
||||||
level=loglevel,
|
|
||||||
name=__name__,
|
|
||||||
)
|
|
||||||
|
|
||||||
if isinstance(mod_or_name, str):
|
if isinstance(mod_or_name, str):
|
||||||
mod = get_brokermod(mod_or_name)
|
mod = get_brokermod(mod_or_name)
|
||||||
else:
|
else:
|
||||||
|
|
@ -403,8 +388,7 @@ async def open_symcache(
|
||||||
# the backend pkg-module is annotated appropriately.
|
# the backend pkg-module is annotated appropriately.
|
||||||
if (
|
if (
|
||||||
getattr(mod, '_no_symcache', False)
|
getattr(mod, '_no_symcache', False)
|
||||||
or
|
or _no_symcache
|
||||||
_no_symcache
|
|
||||||
):
|
):
|
||||||
yield SymbologyCache(
|
yield SymbologyCache(
|
||||||
mod=mod,
|
mod=mod,
|
||||||
|
|
@ -416,75 +400,60 @@ async def open_symcache(
|
||||||
# actor-level cache-cache XD
|
# actor-level cache-cache XD
|
||||||
global _caches
|
global _caches
|
||||||
if not reload:
|
if not reload:
|
||||||
symcache: SymbologyCache|None = _caches.get(provider)
|
try:
|
||||||
if symcache:
|
yield _caches[provider]
|
||||||
yield symcache
|
except KeyError:
|
||||||
else:
|
|
||||||
msg: str = (
|
msg: str = (
|
||||||
f'No in-mem symcache found for {provider!r}\n'
|
f'No asset info cache exists yet for `{provider}`'
|
||||||
f'Loading..'
|
|
||||||
)
|
)
|
||||||
if only_from_memcache:
|
if only_from_memcache:
|
||||||
raise RuntimeError(msg)
|
raise RuntimeError(msg)
|
||||||
else:
|
else:
|
||||||
log.info(msg)
|
log.warning(msg)
|
||||||
|
|
||||||
# if no cache exists or an explicit reload is requested, load
|
# if no cache exists or an explicit reload is requested, load
|
||||||
# the provider API and call appropriate endpoints to populate
|
# the provider API and call appropriate endpoints to populate
|
||||||
# the mkt and asset tables.
|
# the mkt and asset tables.
|
||||||
if (
|
if (
|
||||||
reload
|
reload
|
||||||
or
|
or not cachefile.is_file()
|
||||||
not cachefile.is_file()
|
|
||||||
):
|
):
|
||||||
log.info(
|
cache = await SymbologyCache.from_scratch(
|
||||||
f'Generating NEW symbology-cache for {provider!r}..\n'
|
|
||||||
f'>[{cachefile}'
|
|
||||||
)
|
|
||||||
symcache: SymbologyCache = await SymbologyCache.from_scratch(
|
|
||||||
mod=mod,
|
mod=mod,
|
||||||
fp=cachefile,
|
fp=cachefile,
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
log.info(
|
log.info(
|
||||||
f'Loading EXISTING symbology-cache for {provider!r}..\n'
|
f'Loading EXISTING `{mod.name}` symbology cache:\n'
|
||||||
f'[>{cachefile}'
|
f'> {cachefile}'
|
||||||
)
|
)
|
||||||
now: float = time.time()
|
import time
|
||||||
|
now = time.time()
|
||||||
with cachefile.open('rb') as existing_fp:
|
with cachefile.open('rb') as existing_fp:
|
||||||
data: dict[str, dict] = tomllib.load(existing_fp)
|
data: dict[str, dict] = tomllib.load(existing_fp)
|
||||||
log.runtime(
|
log.runtime(f'SYMCACHE TOML LOAD TIME: {time.time() - now}')
|
||||||
f'Symcache loaded!\n'
|
|
||||||
f'load-latency: {time.time() - now}\n'
|
|
||||||
)
|
|
||||||
|
|
||||||
# if there's an empty file for some reason we need
|
# if there's an empty file for some reason we need
|
||||||
# to do a full reload as well!
|
# to do a full reload as well!
|
||||||
if not data:
|
if not data:
|
||||||
from_msg: str = 'NEW request to provider'
|
cache = await SymbologyCache.from_scratch(
|
||||||
symcache = await SymbologyCache.from_scratch(
|
|
||||||
mod=mod,
|
mod=mod,
|
||||||
fp=cachefile,
|
fp=cachefile,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
from_msg: str = f'{cachefile}'
|
cache = SymbologyCache.from_dict(
|
||||||
symcache = SymbologyCache.from_dict(
|
|
||||||
data,
|
data,
|
||||||
mod=mod,
|
mod=mod,
|
||||||
fp=cachefile,
|
fp=cachefile,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# TODO: use a real profiling sys..
|
# TODO: use a real profiling sys..
|
||||||
# https://github.com/pikers/piker/issues/337
|
# https://github.com/pikers/piker/issues/337
|
||||||
log.info(
|
log.info(f'SYMCACHE LOAD TIME: {time.time() - now}')
|
||||||
f'Symcache data loaded from {from_msg} !\n'
|
|
||||||
f'load-latency: {time.time() - now}s\n'
|
|
||||||
f'cachefile: {cachefile}\n'
|
|
||||||
)
|
|
||||||
|
|
||||||
_caches[provider] = symcache
|
yield cache
|
||||||
yield symcache
|
|
||||||
|
|
||||||
# TODO: write only when changes detected? but that should
|
# TODO: write only when changes detected? but that should
|
||||||
# never happen right except on reload?
|
# never happen right except on reload?
|
||||||
|
|
@ -507,6 +476,7 @@ def get_symcache(
|
||||||
async with (
|
async with (
|
||||||
# only for runtime's debug mode
|
# only for runtime's debug mode
|
||||||
tractor.open_nursery(debug_mode=True),
|
tractor.open_nursery(debug_mode=True),
|
||||||
|
|
||||||
open_symcache(
|
open_symcache(
|
||||||
get_brokermod(provider),
|
get_brokermod(provider),
|
||||||
reload=force_reload,
|
reload=force_reload,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue