core.common: move away import related stuff to my.core.utils.imports
moving without backward compatibility, since it's extremely unlikely they are used for any external modules in fact, unclear if these methods still have much value at all, but keeping for now just in case
This commit is contained in:
parent
66c08a6c80
commit
770dba5506
7 changed files with 44 additions and 43 deletions
|
@ -34,37 +34,6 @@ from .compat import deprecated
|
||||||
# some helper functions
|
# some helper functions
|
||||||
PathIsh = Union[Path, str]
|
PathIsh = Union[Path, str]
|
||||||
|
|
||||||
# TODO only used in tests? not sure if useful at all.
|
|
||||||
def import_file(p: PathIsh, name: Optional[str] = None) -> types.ModuleType:
|
|
||||||
p = Path(p)
|
|
||||||
if name is None:
|
|
||||||
name = p.stem
|
|
||||||
import importlib.util
|
|
||||||
spec = importlib.util.spec_from_file_location(name, p)
|
|
||||||
assert spec is not None, f"Fatal error; Could not create module spec from {name} {p}"
|
|
||||||
foo = importlib.util.module_from_spec(spec)
|
|
||||||
loader = spec.loader; assert loader is not None
|
|
||||||
loader.exec_module(foo)
|
|
||||||
return foo
|
|
||||||
|
|
||||||
|
|
||||||
def import_from(path: PathIsh, name: str) -> types.ModuleType:
|
|
||||||
path = str(path)
|
|
||||||
try:
|
|
||||||
sys.path.append(path)
|
|
||||||
import importlib
|
|
||||||
return importlib.import_module(name)
|
|
||||||
finally:
|
|
||||||
sys.path.remove(path)
|
|
||||||
|
|
||||||
|
|
||||||
def import_dir(path: PathIsh, extra: str='') -> types.ModuleType:
|
|
||||||
p = Path(path)
|
|
||||||
if p.parts[0] == '~':
|
|
||||||
p = p.expanduser() # TODO eh. not sure about this..
|
|
||||||
return import_from(p.parent, p.name + extra)
|
|
||||||
|
|
||||||
|
|
||||||
from .logging import setup_logger, LazyLogger
|
from .logging import setup_logger, LazyLogger
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -131,12 +131,6 @@ else:
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info[:2] >= (3, 11):
|
if sys.version_info[:2] >= (3, 11):
|
||||||
from typing import assert_never
|
from typing import assert_never, assert_type, Never
|
||||||
else:
|
else:
|
||||||
from typing_extensions import assert_never
|
from typing_extensions import assert_never, assert_type, Never
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info[:2] >= (3, 11):
|
|
||||||
from typing import Never
|
|
||||||
else:
|
|
||||||
from typing_extensions import Never
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ Please install {' '.join(requires)} as PIP packages (see the corresponding READM
|
||||||
def _get_dal(cfg, module_name: str):
|
def _get_dal(cfg, module_name: str):
|
||||||
mpath = getattr(cfg, module_name, None)
|
mpath = getattr(cfg, module_name, None)
|
||||||
if mpath is not None:
|
if mpath is not None:
|
||||||
from .common import import_dir
|
from .utils.imports import import_dir
|
||||||
|
|
||||||
return import_dir(mpath, '.dal')
|
return import_dir(mpath, '.dal')
|
||||||
else:
|
else:
|
||||||
|
|
37
my/core/utils/imports.py
Normal file
37
my/core/utils/imports.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import importlib
|
||||||
|
import importlib.util
|
||||||
|
from pathlib import Path
|
||||||
|
import sys
|
||||||
|
from typing import Optional
|
||||||
|
from types import ModuleType
|
||||||
|
|
||||||
|
from ..common import PathIsh
|
||||||
|
|
||||||
|
|
||||||
|
# TODO only used in tests? not sure if useful at all.
|
||||||
|
def import_file(p: PathIsh, name: Optional[str] = None) -> ModuleType:
|
||||||
|
p = Path(p)
|
||||||
|
if name is None:
|
||||||
|
name = p.stem
|
||||||
|
spec = importlib.util.spec_from_file_location(name, p)
|
||||||
|
assert spec is not None, f"Fatal error; Could not create module spec from {name} {p}"
|
||||||
|
foo = importlib.util.module_from_spec(spec)
|
||||||
|
loader = spec.loader; assert loader is not None
|
||||||
|
loader.exec_module(foo)
|
||||||
|
return foo
|
||||||
|
|
||||||
|
|
||||||
|
def import_from(path: PathIsh, name: str) -> ModuleType:
|
||||||
|
path = str(path)
|
||||||
|
sys.path.append(path)
|
||||||
|
try:
|
||||||
|
return importlib.import_module(name)
|
||||||
|
finally:
|
||||||
|
sys.path.remove(path)
|
||||||
|
|
||||||
|
|
||||||
|
def import_dir(path: PathIsh, extra: str = '') -> ModuleType:
|
||||||
|
p = Path(path)
|
||||||
|
if p.parts[0] == '~':
|
||||||
|
p = p.expanduser() # TODO eh. not sure about this..
|
||||||
|
return import_from(p.parent, p.name + extra)
|
|
@ -105,12 +105,13 @@ else:
|
||||||
|
|
||||||
|
|
||||||
def test_listify() -> None:
|
def test_listify() -> None:
|
||||||
|
from ..compat import assert_type
|
||||||
|
|
||||||
@listify
|
@listify
|
||||||
def it() -> Iterator[int]:
|
def it() -> Iterator[int]:
|
||||||
yield 1
|
yield 1
|
||||||
yield 2
|
yield 2
|
||||||
|
|
||||||
res = it()
|
res = it()
|
||||||
from typing_extensions import assert_type # TODO move to compat?
|
|
||||||
assert_type(res, List[int])
|
assert_type(res, List[int])
|
||||||
assert res == [1, 2]
|
assert res == [1, 2]
|
||||||
|
|
|
@ -23,7 +23,7 @@ class demo(user_config):
|
||||||
def external_module(self):
|
def external_module(self):
|
||||||
rpath = self.external
|
rpath = self.external
|
||||||
if rpath is not None:
|
if rpath is not None:
|
||||||
from .core.common import import_dir
|
from .core.utils.imports import import_dir
|
||||||
return import_dir(rpath)
|
return import_dir(rpath)
|
||||||
|
|
||||||
import my.config.repos.external as m # type: ignore
|
import my.config.repos.external as m # type: ignore
|
||||||
|
|
|
@ -15,7 +15,7 @@ def test_hpi(prepare: str) -> None:
|
||||||
assert len(list(get_entries())) > 1
|
assert len(list(get_entries())) > 1
|
||||||
|
|
||||||
def test_orger(prepare: str, tmp_path: Path) -> None:
|
def test_orger(prepare: str, tmp_path: Path) -> None:
|
||||||
from my.core.common import import_from, import_file
|
from my.core.utils.imports import import_from, import_file
|
||||||
om = import_file(ROOT / 'orger/modules/polar.py')
|
om = import_file(ROOT / 'orger/modules/polar.py')
|
||||||
# reload(om)
|
# reload(om)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue