util: Move module loader functions to a new dynload module.
This commit is contained in:
parent
f56571219b
commit
e249049fc1
5 changed files with 35 additions and 35 deletions
2
CODE.rst
2
CODE.rst
|
@ -73,7 +73,7 @@ import2ledger finds importers by looking at all ``.py`` files in the ``importers
|
||||||
|
|
||||||
Hooks follow the same pattern, searching the ``hooks/`` directory and looking for things named ``*Hook``.
|
Hooks follow the same pattern, searching the ``hooks/`` directory and looking for things named ``*Hook``.
|
||||||
|
|
||||||
Technically this is done by ``importers.load_all()`` and ``hooks.load_all()`` functions, but most of the code to do this is in the ``util`` module.
|
Technically this is done by ``importers.load_all()`` and ``hooks.load_all()`` functions, but most of the code to do this is in the ``dynload`` module.
|
||||||
|
|
||||||
Main loop
|
Main loop
|
||||||
---------
|
---------
|
||||||
|
|
30
import2ledger/dynload.py
Normal file
30
import2ledger/dynload.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import importlib
|
||||||
|
import logging
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
logger = logging.getLogger('import2ledger')
|
||||||
|
|
||||||
|
def load_modules(src_dir_path):
|
||||||
|
rel_path = src_dir_path.relative_to(pathlib.Path(__file__).parent)
|
||||||
|
import_prefix = 'import2ledger.{}.'.format('.'.join(rel_path.parts))
|
||||||
|
for py_path in src_dir_path.glob('*.py'):
|
||||||
|
mod_name = py_path.name[:-3]
|
||||||
|
if mod_name.startswith(('.', '_')):
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
module = importlib.import_module(import_prefix + mod_name)
|
||||||
|
except ImportError as error:
|
||||||
|
logger.info("failed to import %s: %s", py_path, error,
|
||||||
|
exc_info=logger.isEnabledFor(logging.DEBUG))
|
||||||
|
else:
|
||||||
|
yield module
|
||||||
|
|
||||||
|
def module_contents(module):
|
||||||
|
for name in dir(module):
|
||||||
|
yield name, getattr(module, name)
|
||||||
|
|
||||||
|
def submodule_items_named(file_path, name_test):
|
||||||
|
for module in load_modules(pathlib.Path(file_path).parent):
|
||||||
|
for name, item in module_contents(module):
|
||||||
|
if name_test(name):
|
||||||
|
yield item
|
|
@ -1,6 +1,6 @@
|
||||||
import operator
|
import operator
|
||||||
|
|
||||||
from .. import util
|
from .. import dynload
|
||||||
|
|
||||||
def load_all():
|
def load_all():
|
||||||
return util.submodule_items_named(__file__, operator.methodcaller('endswith', 'Hook'))
|
return dynload.submodule_items_named(__file__, operator.methodcaller('endswith', 'Hook'))
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import operator
|
import operator
|
||||||
|
|
||||||
from .. import util
|
from .. import dynload
|
||||||
|
|
||||||
def load_all():
|
def load_all():
|
||||||
return util.submodule_items_named(__file__, operator.methodcaller('endswith', 'Importer'))
|
return dynload.submodule_items_named(__file__, operator.methodcaller('endswith', 'Importer'))
|
||||||
|
|
|
@ -1,34 +1,4 @@
|
||||||
import datetime
|
import datetime
|
||||||
import importlib
|
|
||||||
import logging
|
|
||||||
import pathlib
|
|
||||||
|
|
||||||
logger = logging.getLogger('import2ledger')
|
|
||||||
|
|
||||||
def load_modules(src_dir_path):
|
|
||||||
rel_path = src_dir_path.relative_to(pathlib.Path(__file__).parent)
|
|
||||||
import_prefix = 'import2ledger.{}.'.format('.'.join(rel_path.parts))
|
|
||||||
for py_path in src_dir_path.glob('*.py'):
|
|
||||||
mod_name = py_path.name[:-3]
|
|
||||||
if mod_name.startswith(('.', '_')):
|
|
||||||
continue
|
|
||||||
try:
|
|
||||||
module = importlib.import_module(import_prefix + mod_name)
|
|
||||||
except ImportError as error:
|
|
||||||
logger.info("failed to import %s: %s", py_path, error,
|
|
||||||
exc_info=logger.isEnabledFor(logging.DEBUG))
|
|
||||||
else:
|
|
||||||
yield module
|
|
||||||
|
|
||||||
def module_contents(module):
|
|
||||||
for name in dir(module):
|
|
||||||
yield name, getattr(module, name)
|
|
||||||
|
|
||||||
def submodule_items_named(file_path, name_test):
|
|
||||||
for module in load_modules(pathlib.Path(file_path).parent):
|
|
||||||
for name, item in module_contents(module):
|
|
||||||
if name_test(name):
|
|
||||||
yield item
|
|
||||||
|
|
||||||
def strpdate(date_s, date_fmt):
|
def strpdate(date_s, date_fmt):
|
||||||
return datetime.datetime.strptime(date_s, date_fmt).date()
|
return datetime.datetime.strptime(date_s, date_fmt).date()
|
||||||
|
|
Loading…
Reference in a new issue