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 []