Source code for lcc.data_manager.package_reader

import imp
import importlib
import inspect
import os
from lcc.stars_processing.utilities.base_descriptor import BaseDescriptor
from lcc.db_tier.base_query import StarsCatalogue
from lcc.stars_processing.utilities.base_decider import BaseDecider


[docs]class PackageReader(object): """ Class for managing modules and its classes in the package Attributes ----------- MODULE_EXTENSION : iterable Accepted extensions of module files. NAMES : dict Keys are identifiers for path to the package where searched classes are located and base filter which all package classes needs to inherit in order to be accepted. EXCLUDE : iterable File names (first letters of them) which will be excluded. """ MODULE_EXTENSIONS = ('.py',) EXCLUDE = tuple() NAMES = {"descriptors": ("lcc/stars_processing/descriptors", BaseDescriptor), "connectors": ("lcc/db_tier/connectors", StarsCatalogue), "deciders": ("lcc/stars_processing/deciders", BaseDecider), "unsup_deciders": ("lcc/stars_processing/deciders/unsupervised", BaseDecider)} @classmethod
[docs] def getClasses(self, name): """ Get all classes in the package which inherit base classes according to `NAME` attribute Parameters ----------- name : str Key in `NAME` dictionary to package location and parent class Returns -------- list List of all classes in the package which inherit base classes according to `NAME` attribute """ package_name, base_class = self.NAMES.get(name, None) if not package_name: return None contents = self.getPackageContents(package_name) searched_classes = [] for package_module in contents: path = os.path.join( package_name, package_module).replace("/", ".") module_classes = self.getModuleClasses( importlib.import_module(path)) for module_class in module_classes: if issubclass(module_class, base_class): searched_classes.append(module_class) return searched_classes
@classmethod
[docs] def getClassesDict(self, package_name): """ Get dictionary of all classes in the package which inherit base classes according to `NAME` attribute Parameters ----------- package_name : str Key in `NAME` dictionary to package location and parent class Returns -------- dict Dictionary of all classes in the package which inherit base classes according to `NAME` attribute """ searched_classes = self.getClasses(package_name) classes_dict = {} for cls in searched_classes: classes_dict[cls.__name__] = cls return classes_dict
@classmethod
[docs] def getPackageContents(self, package_name): """ Get all modules in the package Parameters ----------- package_name : str Name of the target package specified in `NAMES` attribute Returns ------- set Set of module names in the package """ _, pathname, _ = imp.find_module(package_name) # Use a set because some may be both source and compiled. return set([os.path.splitext(module)[0] for module in os.listdir(pathname) if module.endswith(self.MODULE_EXTENSIONS) and not module.startswith(self.EXCLUDE)])
@classmethod
[docs] def getModuleClasses(self, module): """ Parameters ----------- module : module Module object Returns ------- list List of classes in the module """ def accept(obj): return inspect.isclass(obj) and module.__name__ == obj.__module__ return [class_ for _, class_ in inspect.getmembers(module, accept)]