diff -r 000000000000 -r de9c2efb9d02 DocumentationTools/APIGenerator.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DocumentationTools/APIGenerator.py Mon Dec 28 16:03:33 2009 +0000 @@ -0,0 +1,171 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2004 - 2009 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the builtin API generator. + +""" + +import sys + +from QScintilla.Editor import Editor + +class APIGenerator(object): + """ + Class implementing the builtin documentation generator. + """ + def __init__(self, module): + """ + Constructor + + @param module The information of the parsed Python file. + """ + self.module = module + + def genAPI(self, newStyle, basePackage, includePrivate): + """ + Method to generate the source code documentation. + + @param newStyle flag indicating the api generation for QScintilla 1.7 and + newer (boolean) + @param basePackage name of the base package (string) + @param includePrivate flag indicating to include + private methods/functions (boolean) + @return The API information. (string) + """ + self.includePrivate = includePrivate + self.newStyle = newStyle + if self.newStyle: + modulePath = self.module.name.split('.') + if modulePath[-1] == '__init__': + del modulePath[-1] + if basePackage: + modulePath[0] = basePackage + self.moduleName = "%s." % '.'.join(modulePath) + else: + self.moduleName = "" + self.api = [] + self.__addGlobalsAPI() + self.__addClassesAPI() + self.__addFunctionsAPI() + return self.api + + def __isPrivate(self, obj): + """ + Private method to check, if an object is considered private. + + @param obj reference to the object to be checked + @return flag indicating, that object is considered private (boolean) + """ + private = obj.isPrivate() and not self.includePrivate + return private + + def __addGlobalsAPI(self): + """ + Private method to generate the api section for global variables. + """ + if self.newStyle: + moduleNameStr = "%s" % self.moduleName + else: + moduleNameStr = "" + + for globalName in sorted(self.module.globals.keys()): + if not self.__isPrivate(self.module.globals[globalName]): + if self.module.globals[globalName].isPublic(): + id = Editor.AttributeID + elif self.module.globals[globalName].isProtected(): + id = Editor.AttributeProtectedID + else: + id = Editor.AttributePrivateID + self.api.append("%s%s?%d" % (moduleNameStr, globalName, id)) + + def __addClassesAPI(self): + """ + Private method to generate the api section for classes. + """ + classNames = self.module.classes.keys() + classNames.sort() + for className in classNames: + if not self.__isPrivate(self.module.classes[className]): + self.__addClassVariablesAPI(className) + self.__addMethodsAPI(className) + + def __addMethodsAPI(self, className): + """ + Private method to generate the api section for class methods. + + @param classname Name of the class containing the method. (string) + """ + _class = self.module.classes[className] + methods = _class.methods.keys() + methods.sort() + + # first do the constructor + if '__init__' in methods: + methods.remove('__init__') + if _class.isPublic(): + id = Editor.ClassID + elif _class.isProtected(): + id = Editor.ClassProtectedID + else: + id = Editor.ClassPrivateID + self.api.append('%s%s?%d(%s)' % \ + (self.moduleName, _class.name, id, + ', '.join(_class.methods['__init__'].parameters[1:]))) + + if self.newStyle: + classNameStr = "%s%s." % (self.moduleName, className) + else: + classNameStr = "" + for method in methods: + if not self.__isPrivate(_class.methods[method]): + if _class.methods[method].isPublic(): + id = Editor.MethodID + elif _class.methods[method].isProtected(): + id = Editor.MethodProtectedID + else: + id = Editor.MethodPrivateID + self.api.append('%s%s?%d(%s)' % \ + (classNameStr, method, id, + ', '.join(_class.methods[method].parameters[1:]))) + + def __addClassVariablesAPI(self, className): + """ + Private method to generate class api section for class variables. + + @param classname Name of the class containing the class variables. (string) + """ + _class = self.module.classes[className] + if self.newStyle: + classNameStr = "%s%s." % (self.moduleName, className) + else: + classNameStr = "" + for variable in sorted(_class.globals.keys()): + if not self.__isPrivate(_class.globals[variable]): + if _class.globals[variable].isPublic(): + id = Editor.AttributeID + elif _class.globals[variable].isProtected(): + id = Editor.AttributeProtectedID + else: + id = Editor.AttributePrivateID + self.api.append('%s%s?%d' % (classNameStr, variable, id)) + + def __addFunctionsAPI(self): + """ + Private method to generate the api section for functions. + """ + funcNames = self.module.functions.keys() + funcNames.sort() + for funcName in funcNames: + if not self.__isPrivate(self.module.functions[funcName]): + if self.module.functions[funcName].isPublic(): + id = Editor.MethodID + elif self.module.functions[funcName].isProtected(): + id = Editor.MethodProtectedID + else: + id = Editor.MethodPrivateID + self.api.append('%s%s?%d(%s)' % \ + (self.moduleName, self.module.functions[funcName].name, id, + ', '.join(self.module.functions[funcName].parameters)))