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``.
|
||||
|
||||
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
|
||||
---------
|
||||
|
|
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
|
||||
|
||||
from .. import util
|
||||
from .. import dynload
|
||||
|
||||
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
|
||||
|
||||
from .. import util
|
||||
from .. import dynload
|
||||
|
||||
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 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):
|
||||
return datetime.datetime.strptime(date_s, date_fmt).date()
|
||||
|
|
Loading…
Reference in a new issue