Commits

Georg Brandl committed 91ec9be

Add an option for the coverage builder if source-undocumented items are matched.

Comments (0)

Files changed (3)

doc/ext/coverage.rst

 
 .. todo:: Write this section.
 
+
 Several new configuration values can be used to specify what the builder
 should check:
 
 .. confval:: coverage_ignore_c_items
 
 .. confval:: coverage_write_headline
+
+   Set to ``False`` to not write headlines.
+
+   .. versionadded:: 1.1
+
+.. confval:: coverage_skip_undoc_in_source
+
+   Skip objects that are not documented in the source with a docstring.
+   ``False`` by default.
+
+   .. versionadded:: 1.1

sphinx/ext/coverage.py

         output_file = path.join(self.outdir, 'c.txt')
         op = open(output_file, 'w')
         try:
-            write_header(op, 'Undocumented C API elements', '=')
+            if self.config.coverage_write_headline:
+                write_header(op, 'Undocumented C API elements', '=')
             op.write('\n')
 
             for filename, undoc in self.c_undoc.iteritems():
         objects = self.env.domaindata['py']['objects']
         modules = self.env.domaindata['py']['modules']
 
+        skip_undoc = self.config.coverage_skip_undoc_in_source
+
         for mod_name in modules:
             ignore = False
             for exp in self.mod_ignorexps:
                             if exp.match(name):
                                 break
                         else:
+                            if skip_undoc and not obj.__doc__:
+                                continue
                             funcs.append(name)
                 elif inspect.isclass(obj):
                     for exp in self.cls_ignorexps:
                         if exp.match(name):
                             break
                     else:
-                        if full_name not in objects and not obj.__doc__:
+                        if full_name not in objects:
+                            if skip_undoc and not obj.__doc__:
+                                continue
                             # not documented at all
                             classes[name] = []
                             continue
                             if attr_name not in obj.__dict__:
                                 continue
                             attr = getattr(obj, attr_name)
-                            if (not inspect.ismethod(attr)
-                                and not inspect.isfunction(attr)):
+                            if not (inspect.ismethod(attr) or
+                                    inspect.isfunction(attr)):
                                 continue
                             if attr_name[0] == '_':
                                 # starts with an underscore, ignore it
                                 continue
+                            if skip_undoc and not attr.__doc__:
+                                # skip methods without docstring if wished
+                                continue
 
                             full_attr_name = '%s.%s' % (full_name, attr_name)
                             if full_attr_name not in objects:
-                                if len(obj.__doc__) > 0:
-                                    continue
                                 attrs.append(attr_name)
 
                         if attrs:
     app.add_config_value('coverage_c_path', [], False)
     app.add_config_value('coverage_c_regexes', {}, False)
     app.add_config_value('coverage_ignore_c_items', {}, False)
-    app.add_config_value('coverage_write_headline', {}, False)
+    app.add_config_value('coverage_write_headline', True, False)
+    app.add_config_value('coverage_skip_undoc_in_source', False, False)

tests/test_coverage.py

     assert ' * function\n' not in py_undoc  # these two are documented
     assert ' * Class\n' not in py_undoc     # in autodoc.txt
 
+    assert ' * mod -- No module named mod'  # in the "failed import" section
+
     c_undoc = (app.outdir / 'c.txt').text()
     assert c_undoc.startswith('Undocumented C API elements\n'
                               '===========================\n')