diff --git a/src/hio/base/__init__.py b/src/hio/base/__init__.py index f27d2b05..95fd1b69 100644 --- a/src/hio/base/__init__.py +++ b/src/hio/base/__init__.py @@ -3,85 +3,17 @@ hio.base Package """ -import importlib +import sys + +IS_PYODIDE = "emscripten" in sys.platform from .tyming import Tymist, Tymee, Tymer from .doing import Doist, doize, doify, Doer, DoDoer from .filing import openFiler, Filer, FilerDoer from .webduring import WebSubDb, WebDuror, openWebDuror +from .subering import (Duror, SuberBase, Suber, IoSuber, IoSetSuber, + DomSuberBase, DomSuber, DomIoSuber, DomIoSetSuber, Subery) -__all__ = ( - "Tymist", - "Tymee", - "Tymer", - "Doist", - "doize", - "doify", - "Doer", - "DoDoer", - "openFiler", - "Filer", - "FilerDoer", - "WebSubDb", - "WebDuror", - "openWebDuror", - "Duror", - "openDuror", - "SuberBase", - "Suber", - "IoSuber", - "IoSetSuber", - "DomSuberBase", - "DomSuber", - "DomIoSuber", - "DomIoSetSuber", - "Subery", - "Bosser", - "Crewer", - "TagDex", -) - - -_DURING_EXPORTS = ( - "Duror", - "openDuror", - "SuberBase", - "Suber", - "IoSuber", - "IoSetSuber", - "DomSuberBase", - "DomSuber", - "DomIoSuber", - "DomIoSetSuber", - "Subery", -) - -_MULTIDOING_EXPORTS = ( - "Bosser", - "Crewer", - "TagDex", -) - -# When during or multidoing is imported, import it at runtime so lmdb is not -# loaded when running in wasm. This imports the module/function, caches it, -# and returns it. -def __getattr__(name): - if name == "during" or name in _DURING_EXPORTS: - module = importlib.import_module(".during", __name__) - globals()["during"] = module - if name == "during": - return module - value = getattr(module, name) - globals()[name] = value - return value - - if name == "multidoing" or name in _MULTIDOING_EXPORTS: - module = importlib.import_module(".multidoing", __name__) - globals()["multidoing"] = module - if name == "multidoing": - return module - value = getattr(module, name) - globals()[name] = value - return value - - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") +if not IS_PYODIDE: + from .during import openDuror + from .multidoing import Bosser, Crewer, TagDex diff --git a/src/hio/base/hier/canning.py b/src/hio/base/hier/canning.py index e54ffa86..751c6fdb 100644 --- a/src/hio/base/hier/canning.py +++ b/src/hio/base/hier/canning.py @@ -7,14 +7,12 @@ from __future__ import annotations # so type hints of classes get resolved later from collections.abc import Mapping -from typing import Any, Type, ClassVar, TYPE_CHECKING +from typing import Any, Type, ClassVar from dataclasses import dataclass, astuple, asdict, field, fields, InitVar from ...help import NonStringIterable, namify, registerify, TymeDom from ...hioing import HierError - -if TYPE_CHECKING: - from ..during import DomSuber +from ..subering import DomSuber @namify diff --git a/src/hio/base/subering.py b/src/hio/base/subering.py index 1deb0e2e..44849cac 100644 --- a/src/hio/base/subering.py +++ b/src/hio/base/subering.py @@ -5,8 +5,7 @@ """ import sys - -from ordered_set import OrderedSet as oset +from collections.abc import Iterable from hio import HierError from ..help import isNonStringIterable, RegDom, IceRegDom @@ -30,7 +29,7 @@ class SuberBase(): Sep (str): default separator to convert keys iterator to key bytes for db key Attributes: - db (dbing.LMDBer): base LMDB db + db (Duror): base LMDB db sdb (lmdb._Database): instance of lmdb named sub db for this Suber sep (str): separator for combining keys tuple of strs into key bytes verify (bool): True means reverify when ._des from db when applicable @@ -45,7 +44,7 @@ def __init__(self, db: Duror, *, verify: bool=False, **kwa): """Parameters: - db (dbing.LMDBer): base db + db (Duror): base db subkey (str): LMDB sub database key dupsort (bool): True means enable duplicates at each key False (default) means do not enable duplicates at @@ -267,7 +266,7 @@ def __init__(self, db: Duror, *, dupsort: bool=False, **kwa): """ Inherited Parameters: - db (dbing.LMDBer): base db + db (Duror): base db subkey (str): LMDB sub database key dupsort (bool): True means enable duplicates at each key False (default) means do not enable duplicates at @@ -278,7 +277,7 @@ def __init__(self, db: Duror, *, False means do not reverify. Default False Parameters: - db (dbing.LMDBer): base db + db (Duror): base db subkey (str): LMDB sub database key """ super(Suber, self).__init__(db=db, subkey=subkey, dupsort=False, **kwa) @@ -367,14 +366,14 @@ class IoSuber(SuberBase): """ IonSep = '.' # separator for suffixing insertion order ordinal number - def __init__(self, db: dbing.LMDBer, *, + def __init__(self, db: Duror, *, subkey: str='docs.', dupsort: bool=False, ionsep: str=None, **kwa): """Initialize instance Inherited Parameters: - db (dbing.LMDBer): base db + db (Duror): base db subkey (str): LMDB sub database key dupsort (bool): True means enable duplicates at each key False (default) means do not enable duplicates at @@ -617,14 +616,14 @@ class IoSetSuber(SuberBase): """ IonSep = '.' # separator for suffixing insertion order ordinal number - def __init__(self, db: dbing.LMDBer, *, + def __init__(self, db: Duror, *, subkey: str='docs.', dupsort: bool=False, ionsep: str=None, **kwa): """Initialize instance Inherited Parameters: - db (dbing.LMDBer): base db + db (Duror): base db subkey (str): LMDB sub database key dupsort (bool): True means enable duplicates at each key False (default) means do not enable duplicates at @@ -1024,6 +1023,7 @@ class Subery(Duror): """Subery subclass of Duror for managing subdbs of Duror for durable storage of action data """ + def __init__(self, **kwa): """ Setup named sub databases. @@ -1032,24 +1032,43 @@ def __init__(self, **kwa): """ super(Subery, self).__init__(**kwa) - - def reopen(self, **kwa): - """Open sub databases - - Attributes: - cans (Suber): subdb whose values are serialized Can instances - Can is a durable Bag - drqs (IoSetSub): subdb whose values are serialized RegDom instances - Interfaced via a Durq which is a durable queue (FIFO) - dsqs (IoSetSub): subdb whose values are serialized RegDom instances - Interfaced via a Dusq which is durable set queue (FIFO deduped) - - """ - super(Subery, self).reopen(**kwa) - - self.cans = DomSuber(db=self, subkey='cans.') - self.drqs = DomIoSuber(db=self, subkey="drqs.") # durable queue - self.dsqs = DomIoSetSuber(db=self, subkey="dsqs.") # durable set queue - - return self.env - + if PYODIDE: + async def reopen(self, **kwa): + """Open sub databases + + Attributes: + cans (Suber): subdb whose values are serialized Can instances + Can is a durable Bag + drqs (IoSetSub): subdb whose values are serialized RegDom instances + Interfaced via a Durq which is a durable queue (FIFO) + dsqs (IoSetSub): subdb whose values are serialized RegDom instances + Interfaced via a Dusq which is durable set queue (FIFO deduped) + + """ + kwa.pop("stores", None) + await super(Subery, self).reopen(stores=("cans.", "drqs.", "dsqs."), **kwa) + self.cans = DomSuber(db=self, subkey='cans.') + self.drqs = DomIoSuber(db=self, subkey="drqs.") # durable queue + self.dsqs = DomIoSetSuber(db=self, subkey="dsqs.") # durable set queue + + return self.env + + else: + def reopen(self, **kwa): + """Open sub databases + + Attributes: + cans (Suber): subdb whose values are serialized Can instances + Can is a durable Bag + drqs (IoSetSub): subdb whose values are serialized RegDom instances + Interfaced via a Durq which is a durable queue (FIFO) + dsqs (IoSetSub): subdb whose values are serialized RegDom instances + Interfaced via a Dusq which is durable set queue (FIFO deduped) + + """ + super(Subery, self).reopen(**kwa) + self.cans = DomSuber(db=self, subkey='cans.') + self.drqs = DomIoSuber(db=self, subkey="drqs.") # durable queue + self.dsqs = DomIoSetSuber(db=self, subkey="dsqs.") # durable set queue + + return self.env