summaryrefslogtreecommitdiff
path: root/bin/reportlab/test/test_docstrings.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/reportlab/test/test_docstrings.py')
-rw-r--r--bin/reportlab/test/test_docstrings.py175
1 files changed, 175 insertions, 0 deletions
diff --git a/bin/reportlab/test/test_docstrings.py b/bin/reportlab/test/test_docstrings.py
new file mode 100644
index 00000000000..db1f2d56e6f
--- /dev/null
+++ b/bin/reportlab/test/test_docstrings.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python
+#Copyright ReportLab Europe Ltd. 2000-2004
+#see license.txt for license details
+#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/test/test_docstrings.py
+
+"""This is a test on a package level that find all modules,
+classes, methods and functions that do not have a doc string
+and lists them in individual log files.
+
+Currently, methods with leading and trailing double underscores
+are skipped.
+"""
+
+import os, sys, glob, string, re
+from types import ModuleType, ClassType, MethodType, FunctionType
+
+import reportlab
+from reportlab.test import unittest
+from reportlab.test.utils import SecureTestCase, GlobDirectoryWalker, outputfile, printLocation
+
+
+RL_HOME = os.path.dirname(reportlab.__file__)
+
+def getModuleObjects(folder, rootName, typ, pattern='*.py'):
+ "Get a list of all objects defined *somewhere* in a package."
+
+ # Define some abbreviations.
+ find = string.find
+ split = string.split
+ replace = string.replace
+
+ objects = []
+ lookup = {}
+ for file in GlobDirectoryWalker(folder, pattern):
+ folder = os.path.dirname(file)
+
+ if os.path.basename(file) == '__init__.py':
+ continue
+
+## if os.path.exists(os.path.join(folder, '__init__.py')):
+#### print 'skipping', os.path.join(folder, '__init__.py')
+## continue
+
+ sys.path.insert(0, folder)
+ cwd = os.getcwd()
+ os.chdir(folder)
+
+ modName = os.path.splitext(os.path.basename(file))[0]
+ prefix = folder[find(folder, rootName):]
+ prefix = replace(prefix, os.sep, '.')
+ mName = prefix + '.' + modName
+
+ try:
+ module = __import__(mName)
+ except ImportError:
+ # Restore sys.path and working directory.
+ os.chdir(cwd)
+ del sys.path[0]
+ continue
+
+ # Get the 'real' (leaf) module
+ # (__import__ loads only the top-level one).
+ if find(mName, '.') != -1:
+ for part in split(mName, '.')[1:]:
+ module = getattr(module, part)
+
+ # Find the objects in the module's content.
+ modContentNames = dir(module)
+
+ # Handle modules.
+ if typ == ModuleType:
+ if find(module.__name__, 'reportlab') > -1:
+ objects.append((mName, module))
+ continue
+
+ for n in modContentNames:
+ obj = eval(mName + '.' + n)
+ # Handle functions and classes.
+ if typ in (FunctionType, ClassType):
+ if type(obj) == typ and not lookup.has_key(obj):
+ if typ == ClassType:
+ if find(obj.__module__, rootName) != 0:
+ continue
+ objects.append((mName, obj))
+ lookup[obj] = 1
+ # Handle methods.
+ elif typ == MethodType:
+ if type(obj) == ClassType:
+ for m in dir(obj):
+ a = getattr(obj, m)
+ if type(a) == typ and not lookup.has_key(a):
+ if find(a.im_class.__module__, rootName) != 0:
+ continue
+ cName = obj.__name__
+ objects.append((mName, a))
+ lookup[a] = 1
+
+ # Restore sys.path and working directory.
+ os.chdir(cwd)
+ del sys.path[0]
+ return objects
+
+class DocstringTestCase(SecureTestCase):
+ "Testing if objects in the ReportLab package have docstrings."
+
+ def _writeLogFile(self, objType):
+ "Write log file for different kind of documentable objects."
+
+ cwd = os.getcwd()
+ objects = getModuleObjects(RL_HOME, 'reportlab', objType)
+ objects.sort()
+ os.chdir(cwd)
+
+ expl = {FunctionType:'functions',
+ ClassType:'classes',
+ MethodType:'methods',
+ ModuleType:'modules'}[objType]
+
+ path = outputfile("test_docstrings-%s.log" % expl)
+ file = open(path, 'w')
+ file.write('No doc strings found for the following %s below.\n\n' % expl)
+ p = re.compile('__.+__')
+
+ lines = []
+ for name, obj in objects:
+ if objType == MethodType:
+ n = obj.__name__
+ # Skip names with leading and trailing double underscores.
+ if p.match(n):
+ continue
+
+ if objType == FunctionType:
+ if not obj.__doc__ or len(obj.__doc__) == 0:
+ lines.append("%s.%s\n" % (name, obj.__name__))
+ else:
+ if not obj.__doc__ or len(obj.__doc__) == 0:
+ if objType == ClassType:
+ lines.append("%s.%s\n" % (obj.__module__, obj.__name__))
+ elif objType == MethodType:
+ lines.append("%s.%s\n" % (obj.im_class, obj.__name__))
+ else:
+ lines.append("%s\n" % (obj.__name__))
+
+ lines.sort()
+ for line in lines:
+ file.write(line)
+
+ file.close()
+
+ def test0(self):
+ "Test if functions have a doc string."
+ self._writeLogFile(FunctionType)
+
+ def test1(self):
+ "Test if classes have a doc string."
+ self._writeLogFile(ClassType)
+
+ def test2(self):
+ "Test if methods have a doc string."
+ self._writeLogFile(MethodType)
+
+ def test3(self):
+ "Test if modules have a doc string."
+ self._writeLogFile(ModuleType)
+
+def makeSuite():
+ suite = unittest.TestSuite()
+ loader = unittest.TestLoader()
+ if sys.platform[:4] != 'java': suite.addTest(loader.loadTestsFromTestCase(DocstringTestCase))
+ return suite
+
+#noruntests
+if __name__ == "__main__":
+ unittest.TextTestRunner().run(makeSuite())
+ printLocation()