diff options
| author | shimizukawa <shimizukawa@gmail.com> | 2014-01-15 05:25:56 +0000 |
|---|---|---|
| committer | shimizukawa <shimizukawa@gmail.com> | 2014-01-15 05:25:56 +0000 |
| commit | f458a7f06e8f18d446fc0bf7cb397b777cf1ef1d (patch) | |
| tree | b436c36a949d036d656363ad0e24b91ca8a39a4d /sphinx/ext | |
| parent | 8b375619a7a91d26f07f1ba944757700ae82827f (diff) | |
| parent | cbe7cad734728bdeee093066005c36e1598fa37e (diff) | |
| download | sphinx-f458a7f06e8f18d446fc0bf7cb397b777cf1ef1d.tar.gz | |
merge heads
Diffstat (limited to 'sphinx/ext')
| -rw-r--r-- | sphinx/ext/autodoc.py | 22 | ||||
| -rw-r--r-- | sphinx/ext/autosummary/__init__.py | 3 | ||||
| -rw-r--r-- | sphinx/ext/autosummary/generate.py | 17 | ||||
| -rw-r--r-- | sphinx/ext/mathbase.py | 6 | ||||
| -rw-r--r-- | sphinx/ext/pngmath.py | 17 | ||||
| -rw-r--r-- | sphinx/ext/todo.py | 1 |
6 files changed, 46 insertions, 20 deletions
diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index 5ea64bf3..571f36cb 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -450,9 +450,10 @@ class Documenter(object): # into lines if isinstance(docstring, unicode): return [prepare_docstring(docstring, ignore)] - elif docstring: + elif isinstance(docstring, str): # this will not trigger on Py3 return [prepare_docstring(force_decode(docstring, encoding), ignore)] + # ... else it is something strange, let's ignore it return [] def process_doc(self, docstrings): @@ -1052,7 +1053,7 @@ class ClassDocumenter(ModuleLevelDocumenter): # add inheritance info, if wanted if not self.doc_as_attr and self.options.show_inheritance: self.add_line(u'', '<autodoc>') - if len(self.object.__bases__): + if hasattr(self.object, '__bases__') and len(self.object.__bases__): bases = [b.__module__ == '__builtin__' and u':class:`%s`' % b.__name__ or u':class:`%s.%s`' % (b.__module__, b.__name__) @@ -1084,7 +1085,8 @@ class ClassDocumenter(ModuleLevelDocumenter): initdocstring = self.get_attr( self.get_attr(self.object, '__init__', None), '__doc__') # for new-style classes, no __init__ means default __init__ - if initdocstring == object.__init__.__doc__: + if (initdocstring == object.__init__.__doc__ or # for pypy + initdocstring.strip() == object.__init__.__doc__): #for !pypy initdocstring = None if initdocstring: if content == 'init': @@ -1243,7 +1245,8 @@ class AttributeDocumenter(ClassLevelDocumenter): def can_document_member(cls, member, membername, isattr, parent): isdatadesc = isdescriptor(member) and not \ isinstance(member, cls.method_types) and not \ - type(member).__name__ in ("type", "method_descriptor") + type(member).__name__ in ("type", "method_descriptor", + "instancemethod") return isdatadesc or (not isinstance(parent, ModuleDocumenter) and not inspect.isroutine(member) and not isinstance(member, class_types)) @@ -1383,8 +1386,15 @@ class AutoDirective(Directive): not negated: self.options[flag] = None # process the options with the selected documenter's option_spec - self.genopt = Options(assemble_option_dict( - self.options.items(), doc_class.option_spec)) + try: + self.genopt = Options(assemble_option_dict( + self.options.items(), doc_class.option_spec)) + except (KeyError, ValueError, TypeError), err: + # an option is either unknown or has a wrong type + msg = self.reporter.error('An option to %s is either unknown or ' + 'has an invalid value: %s' % (self.name, err), + line=self.lineno) + return [msg] # generate the output documenter = doc_class(self, self.arguments[0]) documenter.generate(more_content=self.content) diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py index a73e79f5..af0fa65c 100644 --- a/sphinx/ext/autosummary/__init__.py +++ b/sphinx/ext/autosummary/__init__.py @@ -199,7 +199,6 @@ class Autosummary(Directive): nodes = self.get_table(items) if 'toctree' in self.options: - suffix = env.config.source_suffix dirname = posixpath.dirname(env.docname) tree_prefix = self.options['toctree'].strip() @@ -276,7 +275,7 @@ class Autosummary(Directive): while doc and not doc[0].strip(): doc.pop(0) - m = re.search(r"^([A-Z][^A-Z]*?\.\s)", " ".join(doc).strip()) + m = re.search(r"^([A-Z].*?\.)(?:\s|$)", " ".join(doc).strip()) if m: summary = m.group(1).strip() elif doc: diff --git a/sphinx/ext/autosummary/generate.py b/sphinx/ext/autosummary/generate.py index 0640a332..f45aa085 100644 --- a/sphinx/ext/autosummary/generate.py +++ b/sphinx/ext/autosummary/generate.py @@ -33,6 +33,21 @@ from sphinx.jinja2glue import BuiltinTemplateLoader from sphinx.util.osutil import ensuredir from sphinx.util.inspect import safe_getattr +# Add documenters to AutoDirective registry +from sphinx.ext.autodoc import add_documenter, \ + ModuleDocumenter, ClassDocumenter, ExceptionDocumenter, DataDocumenter, \ + FunctionDocumenter, MethodDocumenter, AttributeDocumenter, \ + InstanceAttributeDocumenter +add_documenter(ModuleDocumenter) +add_documenter(ClassDocumenter) +add_documenter(ExceptionDocumenter) +add_documenter(DataDocumenter) +add_documenter(FunctionDocumenter) +add_documenter(MethodDocumenter) +add_documenter(AttributeDocumenter) +add_documenter(InstanceAttributeDocumenter) + + def main(argv=sys.argv): usage = """%prog [OPTIONS] SOURCEFILE ...""" p = optparse.OptionParser(usage.strip()) @@ -101,7 +116,7 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', new_files = [] # write - for name, path, template_name in sorted(items): + for name, path, template_name in sorted(items, key=str): if path is None: # The corresponding autosummary:: directive did not have # a :toctree: option diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index 3955e4bc..0c5eaf8b 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -30,11 +30,15 @@ def wrap_displaymath(math, label): parts = math.split('\n\n') ret = [] for i, part in enumerate(parts): + if not part.strip(): + continue if label is not None and i == 0: ret.append('\\begin{split}%s\\end{split}' % part + (label and '\\label{'+label+'}' or '')) else: ret.append('\\begin{split}%s\\end{split}\\notag' % part) + if not ret: + return '' return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}' @@ -84,7 +88,7 @@ class MathDirective(Directive): def latex_visit_math(self, node): - self.body.append('$' + node['latex'] + '$') + self.body.append('\\(' + node['latex'] + '\\)') raise nodes.SkipNode def latex_visit_displaymath(self, node): diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py index 3938dab1..e23bbd06 100644 --- a/sphinx/ext/pngmath.py +++ b/sphinx/ext/pngmath.py @@ -26,7 +26,7 @@ from docutils import nodes from sphinx.errors import SphinxError from sphinx.util.png import read_png_depth, write_png_depth from sphinx.util.osutil import ensuredir, ENOENT -from sphinx.util.pycompat import b +from sphinx.util.pycompat import b, sys_encoding from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath class MathExtError(SphinxError): @@ -34,9 +34,9 @@ class MathExtError(SphinxError): def __init__(self, msg, stderr=None, stdout=None): if stderr: - msg += '\n[stderr]\n' + stderr + msg += '\n[stderr]\n' + stderr.decode(sys_encoding, 'replace') if stdout: - msg += '\n[stdout]\n' + stdout + msg += '\n[stdout]\n' + stdout.decode(sys_encoding, 'replace') SphinxError.__init__(self, msg) @@ -82,8 +82,10 @@ def render_math(self, math): may not fail since that indicates a problem in the math source. """ use_preview = self.builder.config.pngmath_use_preview + latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble + latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math - shasum = "%s.png" % sha(math.encode('utf-8')).hexdigest() + shasum = "%s.png" % sha(latex.encode('utf-8')).hexdigest() relfn = posixpath.join(self.builder.imgpath, 'math', shasum) outfn = path.join(self.builder.outdir, '_images', 'math', shasum) if path.isfile(outfn): @@ -95,9 +97,6 @@ def render_math(self, math): hasattr(self.builder, '_mathpng_warned_dvipng'): return None, None - latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble - latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math - # use only one tempdir per build -- the use of a directory is cleaner # than using temporary files, since we can clean up everything at once # just removing the whole directory (see cleanup_tempdir) @@ -192,11 +191,11 @@ def html_visit_math(self, node): try: fname, depth = render_math(self, '$'+node['latex']+'$') except MathExtError, exc: - msg = unicode(str(exc), 'utf-8', 'replace') + msg = unicode(exc) sm = nodes.system_message(msg, type='WARNING', level=2, backrefs=[], source=node['latex']) sm.walkabout(self) - self.builder.warn('display latex %r: ' % node['latex'] + str(exc)) + self.builder.warn('display latex %r: ' % node['latex'] + msg) raise nodes.SkipNode if fname is None: # something failed -- use text-only as a bad substitute diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index de5d2b9f..253ae07d 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -171,4 +171,3 @@ def setup(app): app.connect('doctree-read', process_todos) app.connect('doctree-resolved', process_todo_nodes) app.connect('env-purge-doc', purge_todos) - |
