import sys, os
import importlib
import importlib.util
from omnibelt import get_printer, Registry, Entry_Registry
prt = get_printer(__name__)
# region Source files
_loaded_files = {}
[docs]def include_files(*paths):
'''
Executes all provided paths to python files that have not already been run.
:param paths: paths to python files to be executed (if not already)
:return: None
'''
global _load_counter
for path in paths:
if os.path.isfile(path):
apath = os.path.abspath(path)
if apath not in _loaded_files:
sys.path.insert(1, os.path.dirname(apath))
old = os.getcwd()
os.chdir(os.path.dirname(apath))
prt.debug(f'Loading {apath}')
code_block = compile(open(apath).read(), apath, 'exec')
globs = {'__file__':apath}
exec(code_block, globs)
_loaded_files[apath] = globs
del sys.path[1]
os.chdir(old)
[docs]def include_package(*packages):
'''
Imports packages based on their names
:param packages: list of package names to be imported
:return: None
'''
for pkg in packages:
importlib.import_module(pkg)
# endregion
# region project types
_ptype_registry = Registry()
[docs]def register_project_type(name, cls):
'''
Project types allow users to customize the behavior of project objects
:param name: identifier of this project type
:param cls: project type class
:return: None
'''
_ptype_registry.new(name, cls)
[docs]def get_project_type(name):
'''Gets the project type associated with that name, otherwise returns None'''
if name not in _ptype_registry:
prt.error(f'Project type: {name} not found')
return _ptype_registry.get(name, None)
[docs]def view_project_types():
'''Returns a copy of the full project type registry'''
return _ptype_registry.copy()
# endregion