Пример #1
0
class PKGModuleReflection(Mix,BaseReflection):

    def __init__(self, package_name):
        self.package_name = package_name
        self.class_tree = TreeDict()
        self.package = self.import_module(self.package_name)
        self.modules = self.get_modules()
        self.import_all(self.package)
        self.get_all_classes(self.package)
    
    def import_module(self, module_name):
        try:
            return __import__(module_name)
        except:
            print "import Error %s" % (module_name)
            return None
    
    def import_all(self, module, depth = 0):
        for imp, name, ispkg in self.get_modules(module):
            if ispkg: 
                package = self.import_module(module.__name__ + '.' + name)
                if hasattr(module, name):
                    self.import_all(getattr(module,name), depth + 1)
            else: 
                self.import_module(module.__name__ + '.' + name)
        
    def get_all_classes(self, module, depth = 0):
        modules = self.get_modules(module)
        if modules:
            for imp, name, ispkg in modules:
                if ispkg:
                    if hasattr(module, name):
                        self.get_all_classes(getattr(module,name), depth + 1)
                else:
                    if hasattr(module, name):
                        for name, value in self.get_classes(getattr(module,name)):
                            self.add_class(name,value)
        for name, value in self.get_classes(module):
            self.add_class(name,value)

    def add_class(self, name, value, depth = 0):
        flag = True
        for parent in value.__bases__:
            flag = False
            self.add_class(parent.__name__,parent, depth + 1)
            self.class_tree.add_node(ClassNode(name, value),ClassNode(parent.__name__,parent))
        if flag:
            self.class_tree.add_node(ClassNode(name, value))
    
    def get_classes(self, module = None):
        module = module or self.package
        return [(a,b) for a,b in inspect.getmembers(module, inspect.isclass)]

    def get_modules(self, module = None):
        module = module or self.package
        if hasattr(module,'__path__'):
            return [(imp, name, ispkg) for (imp, name, ispkg) in pkgutil.iter_modules(module.__path__)]
        else: return []