import os import os.path import string paRootDirectory = '../../' paHtmlDocDirectory = os.path.join( paRootDirectory, "doc", "html" ) ## Script to check documentation status ## this script assumes that html doxygen documentation has been generated ## ## it then walks the entire portaudio source tree and check that ## - every source file (.c,.h,.cpp) has a doxygen comment block containing ## - a @file directive ## - a @brief directive ## - a @ingroup directive ## - it also checks that a corresponding html documentation file has been generated. ## ## This can be used as a first-level check to make sure the documentation is in order. ## ## The idea is to get a list of which files are missing doxygen documentation. ## ## How to run: ## $ cd doc/utils ## $ python checkfiledocs.py def oneOf_a_in_b(a, b): for x in a: if x in b: return True return False # recurse from top and return a list of all with the given # extensions. ignore .svn directories. return absolute paths def recursiveFindFiles( top, extensions, dirBlacklist, includePaths ): result = [] for (dirpath, dirnames, filenames) in os.walk(top): if not oneOf_a_in_b(dirBlacklist, dirpath): for f in filenames: if os.path.splitext(f)[1] in extensions: if includePaths: result.append( os.path.abspath( os.path.join( dirpath, f ) ) ) else: result.append( f ) return result # generate the html file name that doxygen would use for # a particular source file. this is a brittle conversion # which i worked out by trial and error def doxygenHtmlDocFileName( sourceFile ): return sourceFile.replace( '_', '__' ).replace( '.', '_8' ) + '.html' sourceFiles = recursiveFindFiles( os.path.join(paRootDirectory,'src'), [ '.c', '.h', '.cpp' ], ['.svn', 'mingw-include'], True ); sourceFiles += recursiveFindFiles( os.path.join(paRootDirectory,'include'), [ '.c', '.h', '.cpp' ], ['.svn'], True ); docFiles = recursiveFindFiles( paHtmlDocDirectory, [ '.html' ], ['.svn'], False ); currentFile = "" def printError( f, message ): global currentFile if f != currentFile: currentFile = f print f, ":" print "\t!", message for f in sourceFiles: if not doxygenHtmlDocFileName( os.path.basename(f) ) in docFiles: printError( f, "no doxygen generated doc page" ) s = file( f, 'rt' ).read() if not '/**' in s: printError( f, "no doxygen /** block" ) if not '@file' in s: printError( f, "no doxygen @file tag" ) if not '@brief' in s: printError( f, "no doxygen @brief tag" ) if not '@ingroup' in s: printError( f, "no doxygen @ingroup tag" )