Source code for spinn_utilities.package_loader
# Copyright (c) 2017-2018 The University of Manchester
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
import os
import sys
import traceback
[docs]def all_modules(directory, prefix, remove_pyc_files=False):
""" List all the python files found in this directory giving then the\
prefix.
Any file that ends in either ``.py`` or ``.pyc`` is assume a python module\
and added to the result set.
:param directory: path to check for python files
:param prefix: package prefix top add to the file name
:return: set of python package names
"""
results = set()
for module in os.listdir(directory):
if module == "__init__.py":
results.add(prefix)
elif module == "__init__.pyc":
results.add(prefix)
if remove_pyc_files: # pragma: no cover
full_path = os.path.join(directory, module)
print("Deleting: " + full_path)
os.remove(full_path)
elif module[-3:] == ".py":
results.add(prefix + "." + module[:-3])
elif module[-4:] == ".pyc":
results.add(prefix + "." + module[:-4])
if remove_pyc_files: # pragma: no cover
full_path = os.path.join(directory, module)
print("Deleting: " + full_path)
os.remove(full_path)
elif module != "__pycache__":
full_path = os.path.join(directory, module)
if os.path.isdir(full_path):
results.update(all_modules(full_path, prefix + "." + module,
remove_pyc_files))
return results
[docs]def load_modules(
directory, prefix, remove_pyc_files=False, exclusions=None,
gather_errors=True):
""" Loads all the python files found in this directory, giving them the\
specified prefix
Any file that ends in either ``.py`` or ``.pyc`` is assume a python module\
and added to the result set.
:param directory: path to check for python files
:param prefix: package prefix top add to the file name
:param remove_pyc_files: True if ``.pyc`` files should be deleted
:param exclusions: a list of modules to exclude
:param gather_errors:\
True if errors should be gathered, False to report on first error
:return: None
"""
if exclusions is None:
exclusions = []
modules = all_modules(directory, prefix, remove_pyc_files)
errors = list()
for module in modules:
if module in exclusions:
print("SKIPPING " + module)
continue
print(module)
try:
__import__(module)
except Exception: # pylint: disable=broad-except
if gather_errors:
errors.append((module, sys.exc_info()))
else:
raise
for module, (exc_type, exc_value, exc_traceback) in errors:
print("Error importing {}:".format(module))
for line in traceback.format_exception(
exc_type, exc_value, exc_traceback):
for line_line in line.split("\n"):
if line_line:
print(" ", line_line.rstrip())
if errors:
raise Exception("Error when importing, starting at {}".format(prefix))
[docs]def load_module(
name, remove_pyc_files=False, exclusions=None, gather_errors=True):
""" Loads this modules and all its children.
:param name: name of the modules
:param remove_pyc_files: True if ``.pyc`` files should be deleted
:param exclusions: a list of modules to exclude
:param gather_errors:\
True if errors should be gathered, False to report on first error
:return: None
"""
if exclusions is None:
exclusions = []
module = __import__(name)
path = module.__file__
directory = os.path.dirname(path)
load_modules(directory, name, remove_pyc_files, exclusions, gather_errors)
if __name__ == '__main__': # pragma: no cover
load_module("spinn_utilities", True)