summaryrefslogtreecommitdiff
path: root/docs/sphinx
diff options
context:
space:
mode:
authorBen Reynwar2012-04-30 21:39:44 -0700
committerBen Reynwar2012-04-30 21:39:44 -0700
commit141d2ec0a0c3d9c234622444b1f2a5e21fa08ae8 (patch)
tree2cc9106672100532d901c250b95671c958fb1c4d /docs/sphinx
parent2817cf14147d6da2e7ef051fbbbf8228fd1c07ba (diff)
downloadgnuradio-141d2ec0a0c3d9c234622444b1f2a5e21fa08ae8.tar.gz
gnuradio-141d2ec0a0c3d9c234622444b1f2a5e21fa08ae8.tar.bz2
gnuradio-141d2ec0a0c3d9c234622444b1f2a5e21fa08ae8.zip
Adding sphinx documentation.
Diffstat (limited to 'docs/sphinx')
-rw-r--r--docs/sphinx/Makefile130
-rw-r--r--docs/sphinx/gnuradio_sphinx.py151
-rw-r--r--docs/sphinx/hieroglyph/LICENSE.txt26
-rw-r--r--docs/sphinx/hieroglyph/README.txt10
-rw-r--r--docs/sphinx/hieroglyph/__init__.py6
-rw-r--r--docs/sphinx/hieroglyph/errors.py10
-rw-r--r--docs/sphinx/hieroglyph/hieroglyph.py404
-rw-r--r--docs/sphinx/hieroglyph/nodes.py267
-rw-r--r--docs/sphinx/hieroglyph/test/__init__.py2
-rw-r--r--docs/sphinx/hieroglyph/test/test_comments.py586
-rw-r--r--docs/sphinx/hieroglyph/test/test_hierglyph.py264
-rw-r--r--docs/sphinx/hieroglyph/test/test_nodes.py386
-rw-r--r--docs/sphinx/hieroglyph/version.py3
-rw-r--r--docs/sphinx/source/atsc/blks.rst20
-rw-r--r--docs/sphinx/source/atsc/index.rst62
-rw-r--r--docs/sphinx/source/audio/index.rst7
-rw-r--r--docs/sphinx/source/blks2/blks.rst31
-rw-r--r--docs/sphinx/source/blks2/index.rst47
-rw-r--r--docs/sphinx/source/blks2/utilities.rst4
-rw-r--r--docs/sphinx/source/conf.py216
-rw-r--r--docs/sphinx/source/digital/blocks.rst51
-rw-r--r--docs/sphinx/source/digital/constellations.rst13
-rw-r--r--docs/sphinx/source/digital/index.rst133
-rw-r--r--docs/sphinx/source/digital/ofdm.rst14
-rw-r--r--docs/sphinx/source/digital/pkt_utils.rst18
-rw-r--r--docs/sphinx/source/digital/utilities.rst12
-rw-r--r--docs/sphinx/source/eng_notation/index.rst8
-rw-r--r--docs/sphinx/source/eng_option/index.rst6
-rw-r--r--docs/sphinx/source/gr/coding_blk.rst11
-rw-r--r--docs/sphinx/source/gr/converter_blk.rst32
-rw-r--r--docs/sphinx/source/gr/demodulation_blk.rst4
-rw-r--r--docs/sphinx/source/gr/dft_blk.rst6
-rw-r--r--docs/sphinx/source/gr/filter_blk.rst46
-rw-r--r--docs/sphinx/source/gr/filter_design.rst7
-rw-r--r--docs/sphinx/source/gr/index.rst380
-rw-r--r--docs/sphinx/source/gr/internal.rst7
-rw-r--r--docs/sphinx/source/gr/level_blk.rst26
-rw-r--r--docs/sphinx/source/gr/math_blk.rst59
-rw-r--r--docs/sphinx/source/gr/misc.rst12
-rw-r--r--docs/sphinx/source/gr/misc_blk.rst12
-rw-r--r--docs/sphinx/source/gr/modulation_blk.rst6
-rw-r--r--docs/sphinx/source/gr/sink_blk.rst25
-rw-r--r--docs/sphinx/source/gr/slicedice_blk.rst14
-rw-r--r--docs/sphinx/source/gr/source_blk.rst26
-rw-r--r--docs/sphinx/source/gr/sync_blk.rst9
-rw-r--r--docs/sphinx/source/gr/top_block.rst7
-rw-r--r--docs/sphinx/source/gr_unittest/index.rst7
-rw-r--r--docs/sphinx/source/index.rst75
-rw-r--r--docs/sphinx/source/noaa.rst8
-rw-r--r--docs/sphinx/source/optfir/detail.rst14
-rw-r--r--docs/sphinx/source/optfir/index.rst19
-rw-r--r--docs/sphinx/source/pager/blks.rst9
-rw-r--r--docs/sphinx/source/pager/index.rst23
-rw-r--r--docs/sphinx/source/plot_data.rst6
-rw-r--r--docs/sphinx/source/pyqt_filter.rst6
-rw-r--r--docs/sphinx/source/pyqt_plot.rst6
-rw-r--r--docs/sphinx/source/qtgui/index.rst9
-rw-r--r--docs/sphinx/source/trellis/blks.rst62
-rw-r--r--docs/sphinx/source/trellis/index.rst90
-rw-r--r--docs/sphinx/source/trellis/objs.rst5
-rw-r--r--docs/sphinx/source/video_sdl.rst7
-rw-r--r--docs/sphinx/source/vocoder/blks.rst19
-rw-r--r--docs/sphinx/source/vocoder/index.rst26
-rw-r--r--docs/sphinx/source/wavelet.rst8
-rw-r--r--docs/sphinx/source/window/detail.rst20
-rw-r--r--docs/sphinx/source/window/index.rst25
-rw-r--r--docs/sphinx/source/wxgui/blks.rst13
-rw-r--r--docs/sphinx/source/wxgui/index.rst18
68 files changed, 4051 insertions, 0 deletions
diff --git a/docs/sphinx/Makefile b/docs/sphinx/Makefile
new file mode 100644
index 000000000..3fcbff238
--- /dev/null
+++ b/docs/sphinx/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/GNURadio.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/GNURadio.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/GNURadio"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/GNURadio"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ make -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/docs/sphinx/gnuradio_sphinx.py b/docs/sphinx/gnuradio_sphinx.py
new file mode 100644
index 000000000..6f35a6fce
--- /dev/null
+++ b/docs/sphinx/gnuradio_sphinx.py
@@ -0,0 +1,151 @@
+"""
+Customizations of sphinx for gnuradio use.
+"""
+
+from sphinx.ext.autodoc import py_ext_sig_re
+from sphinx.ext.autodoc import ClassDocumenter, FunctionDocumenter, members_option
+from sphinx.ext.autodoc import bool_option, members_set_option, identity
+from sphinx.ext.autodoc import ALL
+
+# A dictionary of the number of lines to delete from the beginning of docstrings
+lines_to_delete = {}
+
+def setup(sp):
+ # Fix line-breaks in signature.
+ sp.connect('autodoc-process-signature', fix_signature)
+ sp.connect('autodoc-process-docstring', remove_lines)
+ # Add node to autodocument signal-processing blocks.
+ sp.add_autodocumenter(BlockDocumenter)
+ sp.add_autodocumenter(PyBlockDocumenter)
+
+def remove_lines(app, what, name, obj, options, lines):
+ del_lines = lines_to_delete.get(name, 0)
+ # Don't delete any lines if this is called again.
+ lines_to_delete[name] = 0
+ lines[:] = lines[del_lines:]
+
+def fix_signature(app, what, name, obj, options, signature, return_annotation):
+ """
+ SWIG produces signature at the top of docstrings of the form
+ 'blah(int arg1, float arg2) -> return_type'
+ and if the string is long it breaks it over multiple lines.
+
+ Sphinx gets confused if it is broken over multiple lines.
+ fix_signature and remove_lines get around this problem.
+ """
+ if return_annotation is not None:
+ return
+
+ if hasattr(obj, '__doc__'):
+ docs = obj.__doc__
+ else:
+ docs = None
+ if not docs:
+ return None
+ doclines = docs.split('\n')
+ del_lines = remove_linebreaks_in_signature(doclines)
+ # match first line of docstring against signature RE
+ match = py_ext_sig_re.match(doclines[0])
+ if not match:
+ return None
+ exmod, path, base, args, retann = match.groups()
+ # ok, now jump over remaining empty lines and set the remaining
+ # lines as the new doclines
+ i = 1
+ while i < len(doclines) and not doclines[i].strip():
+ i += 1
+ lines_to_delete[name] = i - 1 + del_lines
+ # format args
+ signature = "({0})".format(args)
+ return signature, retann
+
+def remove_linebreaks_in_signature(lines):
+ alllines = '\n'.join(lines)
+ alllines = alllines.lstrip()
+ bits = alllines.split('->')
+ if len(bits) == 1:
+ return 0
+ after = '->'.join(bits[1:])
+ after_lines = after.split('\n')
+ ending = None
+ remainder = []
+ for line in after_lines:
+ if line and ending is None:
+ ending = line
+ elif ending is not None:
+ remainder.append(line)
+ first_line = ' '.join([a.strip() for a in bits[0].split('\n') if a.strip()]) + ' -> ' + ending.strip()
+ match = py_ext_sig_re.match(first_line)
+ # If it is a signature, make the change to lines.
+ if match:
+ new_lines = [first_line] + remainder
+ lines[:] = new_lines
+ return len(bits[0].split('\n'))
+ else:
+ return 0
+
+# These methods are not displayed in the documentation of blocks to
+# avoid redundancy.
+common_block_members =[
+ 'check_topology',
+ 'detail',
+ 'history',
+ 'input_signature',
+ 'name',
+ 'nitems_read',
+ 'nitems_written',
+ 'nthreads',
+ 'output_multiple',
+ 'output_signature',
+ 'relative_rate',
+ 'set_detail',
+ 'set_nthreads',
+ 'start',
+ 'stop',
+ 'thisown',
+ 'to_basic_block',
+ 'unique_id',
+ ]
+
+class BlockDocumenter(FunctionDocumenter):
+ """
+ Specialized Documenter subclass for gnuradio blocks.
+
+ It merges together the documentation for the generator function (e.g. gr.head)
+ with the wrapped sptr (e.g. gr.gr_head_sptr) to keep the documentation
+ tidier.
+ """
+ objtype = 'block'
+ directivetype = 'function'
+ # Don't want to use this for generic functions for give low priority.
+ priority = -10
+
+ def __init__(self, *args, **kwargs):
+ super(BlockDocumenter, self).__init__(*args, **kwargs)
+ # Get class name
+ bits = self.name.split('.')
+ if len(bits) != 3 or bits[0] != 'gnuradio':
+ raise ValueError("expected name to be of form gnuradio.x.y but it is {0}".format(self.name))
+ sptr_name = 'gnuradio.{0}.{0}_{1}_sptr'.format(bits[1], bits[2])
+ # Create a Class Documenter to create documentation for the classes members.
+ self.classdoccer = ClassDocumenter(self.directive, sptr_name, indent=self.content_indent)
+ self.classdoccer.real_modname = self.classdoccer.get_real_modname()
+ self.classdoccer.options.members = ALL
+ self.classdoccer.options.exclude_members = common_block_members
+ self.classdoccer.parse_name()
+ self.classdoccer.import_object()
+
+ def document_members(self, *args, **kwargs):
+ return self.classdoccer.document_members(*args, **kwargs)
+
+class PyBlockDocumenter(ClassDocumenter):
+ """
+ Specialized Documenter subclass for hierarchical python gnuradio blocks.
+ """
+ objtype = 'pyblock'
+ directivetype = 'class'
+
+ def __init__(self, *args, **kwargs):
+ super(PyBlockDocumenter, self).__init__(*args, **kwargs)
+ self.options.members = ALL
+ self.options.exclude_members = common_block_members
diff --git a/docs/sphinx/hieroglyph/LICENSE.txt b/docs/sphinx/hieroglyph/LICENSE.txt
new file mode 100644
index 000000000..3f7a63830
--- /dev/null
+++ b/docs/sphinx/hieroglyph/LICENSE.txt
@@ -0,0 +1,26 @@
+Copyright (c) 2011, Robert Smallshire
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Robert Smallshire nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/sphinx/hieroglyph/README.txt b/docs/sphinx/hieroglyph/README.txt
new file mode 100644
index 000000000..c26409d89
--- /dev/null
+++ b/docs/sphinx/hieroglyph/README.txt
@@ -0,0 +1,10 @@
+Sphinx is a popular tool for documenting Python APIs which uses reStructuredText
+as a its lightweight markup language. Sphinx extends restructured text with
+semantic markup elements for documenting Python APIs but once these are used the
+ratio of markup to content becomes too high and readability is compromised
+enough that the docstring becomes unsuitable for use with standard Python
+introspection mechanisms like help() or IDEs.
+
+Hieroglyph is an a Sphinx extension which automatically converts a highly
+readable docstring format suitable for use with help() and IDEs to the
+reStructuredText hieroglyphics required by Sphinx. \ No newline at end of file
diff --git a/docs/sphinx/hieroglyph/__init__.py b/docs/sphinx/hieroglyph/__init__.py
new file mode 100644
index 000000000..25dea27fb
--- /dev/null
+++ b/docs/sphinx/hieroglyph/__init__.py
@@ -0,0 +1,6 @@
+# We only need to expose the setup function to Sphinx
+
+from .hieroglyph import setup
+from .version import __version__
+
+__author__ = 'Robert Smallshire' \ No newline at end of file
diff --git a/docs/sphinx/hieroglyph/errors.py b/docs/sphinx/hieroglyph/errors.py
new file mode 100644
index 000000000..334b097d8
--- /dev/null
+++ b/docs/sphinx/hieroglyph/errors.py
@@ -0,0 +1,10 @@
+
+from sphinx.errors import ExtensionError
+
+__author__ = 'rjs'
+
+class HieroglyphError(ExtensionError):
+ '''
+ An exception type specific to the Hieroglyph Sphinx extension.
+ '''
+ pass \ No newline at end of file
diff --git a/docs/sphinx/hieroglyph/hieroglyph.py b/docs/sphinx/hieroglyph/hieroglyph.py
new file mode 100644
index 000000000..0056d9ab8
--- /dev/null
+++ b/docs/sphinx/hieroglyph/hieroglyph.py
@@ -0,0 +1,404 @@
+from __future__ import print_function
+
+import re
+
+from errors import HieroglyphError
+from nodes import (Node, Raises, Except, Note, Warning, Returns, Arg,
+ ensure_terminal_blank)
+
+__author__ = 'Robert Smallshire'
+
+def parse_hieroglyph_text(lines):
+ '''Parse text in hieroglyph format and return a reStructuredText equivalent
+
+ Args:
+ lines: A sequence of strings representing the lines of a single
+ docstring as read from the source by Sphinx. This string should be
+ in a format that can be parsed by hieroglyph.
+
+ Returns:
+ A list of lines containing the transformed docstring as
+ reStructuredText as produced by hieroglyph.
+
+ Raises:
+ RuntimeError: If the docstring cannot be parsed.
+ '''
+ indent_lines = unindent(lines)
+ indent_lines = pad_blank_lines(indent_lines)
+ indent_lines = first_paragraph_indent(indent_lines)
+ indent_paragraphs = gather_lines(indent_lines)
+ parse_tree = group_paragraphs(indent_paragraphs)
+ syntax_tree = extract_structure(parse_tree)
+ result = syntax_tree.render_rst()
+ ensure_terminal_blank(result)
+ return result
+
+
+def unindent(lines):
+ '''Convert an iterable of indented lines into a sequence of tuples.
+
+ The first element of each tuple is the indent in number of characters, and
+ the second element is the unindented string.
+
+ Args:
+ lines: A sequence of strings representing the lines of text in a docstring.
+
+ Returns:
+ A list of tuples where each tuple corresponds to one line of the input
+ list. Each tuple has two entries - the first is an integer giving the
+ size of the indent in characters, the second is the unindented text.
+ '''
+ unindented_lines = []
+ for line in lines:
+ unindented_line = line.lstrip()
+ indent = len(line) - len(unindented_line)
+ unindented_lines.append((indent, unindented_line))
+ return unindented_lines
+
+
+def pad_blank_lines(indent_texts):
+ '''Give blank (empty) lines the same indent level as the preceding line.
+
+ Args:
+ indent_texts: An iterable of tuples each containing an integer in the
+ first element and a string in the second element.
+
+ Returns:
+ A list of tuples each containing an integer in the first element and a
+ string in the second element.
+ '''
+ current_indent = 0
+ result = []
+ for indent, text in indent_texts:
+ if len(text) > 0:
+ current_indent = indent
+ result.append((current_indent, text))
+ return result
+
+
+def extract_structure(parse_tree):
+ '''Create an Abstract Syntax Tree representing the semantics of a parse tree.
+
+ Args:
+ parse_tree: TODO
+
+ Returns:
+ A Node with is the result of an Abstract Syntax Tree representing the
+ docstring.
+
+ Raises:
+ HieroglyphError: In the event that the parse tree cannot be understood.
+ '''
+ return convert_node(parse_tree)
+
+
+def convert_node(node):
+ if node.indent == 0 and len(node.lines) == 0:
+ return convert_children(node)
+ if node.lines[0].startswith('Args:'):
+ return convert_args(node)
+ if node.lines[0].startswith('Returns:'):
+ return convert_returns(node)
+ if node.lines[0].startswith('Raises:'):
+ return convert_raises(node)
+ if node.lines[0].startswith('Note:'):
+ return convert_note(node)
+ if node.lines[0].startswith('Warning:'):
+ return convert_warning(node)
+ result = convert_children(node)
+ result.lines = node.lines
+ result.indent = node.indent
+ return result
+
+
+def convert_children(node):
+ converted_children = [convert_node(child) for child in node.children]
+ result = Node()
+ result.children = converted_children
+ return result
+
+
+ARG_REGEX = re.compile(r'(\*{0,2}\w+)(\s+\((\w+)\))?\s*:\s*(.*)')
+
+def append_child_to_args_group_node(child, group_node, indent):
+ arg = None
+ non_empty_lines = (line for line in child.lines if line)
+ for line in non_empty_lines:
+ m = ARG_REGEX.match(line)
+ if m is None:
+ raise HieroglyphError("Invalid hieroglyph argument syntax: {0}".format(line))
+ param_name = m.group(1)
+ param_type = m.group(3)
+ param_text = m.group(4)
+
+ arg = Arg(indent, child.indent, param_name)
+ group_node.children.append(arg)
+ arg.type = param_type
+
+ if param_text is not None:
+ arg.children.append(Node(indent, [param_text], arg))
+ if arg is not None:
+ last_child = arg.children[-1] if len(arg.children) != 0 else arg
+ for grandchild in child.children:
+ last_child.children.append(grandchild)
+
+
+def convert_args(node):
+ assert node.lines[0].startswith('Args:')
+ group_node = Node()
+ for child in node.children:
+ append_child_to_args_group_node(child, group_node, node.indent)
+ return group_node
+
+
+def convert_returns(node):
+ assert node.lines[0].startswith('Returns:')
+ returns = Returns(node.indent)
+ returns.line = node.lines[0][8:].strip()
+ returns.children = node.children
+ return returns
+
+
+def convert_note(node):
+ assert node.lines[0].startswith('Note:')
+ note = Note(node.indent)
+ note.line = node.lines[0][5:].strip()
+ note.children = node.children
+ return note
+
+
+def convert_warning(node):
+ assert node.lines[0].startswith('Warning:')
+ warning = Warning(node.indent)
+ warning.line = node.lines[0][8:].strip()
+ warning.children = node.children
+ return warning
+
+
+def convert_raises(node):
+ assert node.lines[0].startswith('Raises:')
+ group_node = Raises(node.indent)
+ for child in node.children:
+ append_child_to_raise_node(child, group_node)
+ return group_node
+
+
+RAISE_REGEX = re.compile(r'(\w+)\s*:\s*(.*)')
+
+def extract_exception_type_and_text(line):
+ m = RAISE_REGEX.match(line)
+ if m is None:
+ raise HieroglyphError("Invalid hieroglyph exception syntax: {0}".format(line))
+ return (m.group(2), m.group(1))
+
+
+def append_child_to_raise_node(child, group_node):
+ exception = None
+ non_empty_lines = (line for line in child.lines if line)
+ for line in non_empty_lines:
+ exception_text, exception_type = extract_exception_type_and_text(line)
+
+ exception = Except(child.indent, exception_type)
+ group_node.children.append(exception) # TODO: Could use parent here.
+
+ if exception_text is not None:
+ exception.children.append( Node(child.indent,
+ [exception_text], exception))
+ if exception is not None:
+ last_child = exception.children[-1] if len(exception.children) != 0 else exception
+ for grandchild in child.children:
+ last_child.children.append(grandchild)
+
+
+def group_paragraphs(indent_paragraphs):
+ '''
+ Group paragraphs so that more indented paragraphs become children of less
+ indented paragraphs.
+ '''
+ # The tree consists of tuples of the form (indent, [children]) where the
+ # children may be strings or other tuples
+
+ root = Node(0, [], None)
+ current_node = root
+
+ previous_indent = -1
+ for indent, lines in indent_paragraphs:
+ if indent > previous_indent:
+ current_node = create_child_node(current_node, indent, lines)
+ elif indent == previous_indent:
+ current_node = create_sibling_node(current_node, indent, lines)
+ elif indent < previous_indent:
+ current_node = create_uncle_node(current_node, indent, lines)
+ previous_indent = indent
+ return root
+
+
+def create_sibling_node(current_node, indent, lines):
+ sibling = Node(indent, lines, current_node.parent)
+ current_node.parent.add_child(sibling)
+ current_node = sibling
+ return current_node
+
+
+def create_child_node(current_node, indent, lines):
+ child = Node(indent, lines, current_node)
+ current_node.add_child(child)
+ current_node = child
+ return current_node
+
+
+def create_uncle_node(current_node, indent, lines):
+ ancestor = current_node
+ while ancestor.indent >= indent:
+ if ancestor.parent is None:
+ break
+ ancestor = ancestor.parent
+ uncle = Node(indent, lines, ancestor)
+ ancestor.add_child(uncle)
+ current_node = uncle
+ return current_node
+
+
+def gather_lines(indent_lines):
+ '''Split the list of (int, str) tuples into a list of (int, [str]) tuples
+ to group the lines into paragraphs of consistent indent.
+ '''
+ return remove_empty_paragraphs(split_separated_lines(gather_lines_by_indent(indent_lines)))
+
+def gather_lines_by_indent(indent_lines):
+ result = []
+ previous_indent = -1
+ for indent, line in indent_lines:
+ if indent != previous_indent:
+ paragraph = (indent, [])
+ result.append(paragraph)
+ else:
+ paragraph = result[-1]
+ paragraph[1].append(line)
+ previous_indent = indent
+ return result
+
+def split_separated_lines(indent_paragraphs):
+ result = []
+ for indent, paragraph in indent_paragraphs:
+ result.append((indent, []))
+
+ if len(paragraph) > 0:
+ result[-1][1].append(paragraph[0])
+
+ if len(paragraph) > 2:
+ for line in paragraph[1: -1]:
+ result[-1][1].append(line)
+ if len(line) == 0:
+ result.append((indent, []))
+
+ if len(paragraph) > 1:
+ result[-1][1].append(paragraph[-1])
+
+ return result
+
+def remove_empty_paragraphs(indent_paragraphs):
+ return [(indent, paragraph) for indent, paragraph in indent_paragraphs if len(paragraph)]
+
+def first_paragraph_indent(indent_texts):
+ '''Fix the indentation on the first paragraph.
+
+ This occurs because the first line of a multi-line docstring following the
+ opening quote usually has no indent.
+
+ Args:
+ indent_texts: The lines of the docstring as an iterable over 2-tuples
+ each containing an integer indent level as the first element and
+ the text as the second element.
+
+ Return:
+ A list of 2-tuples, each containing an integer indent level as the
+ first element and the text as the second element.
+ '''
+ opening_indent = determine_opening_indent(indent_texts)
+
+ result = []
+ input = iter(indent_texts)
+ for indent, text in input:
+ if indent == 0:
+ result.append((opening_indent, text))
+ else:
+ result.append((indent, text))
+ break
+
+ for indent, text in input:
+ result.append((indent, text))
+
+ return result
+
+
+def determine_opening_indent(indent_texts):
+ '''Determine the opening indent level for a docstring.
+
+ The opening indent level is the indent level is the first non-zero indent
+ level of a non-empty line in the docstring.
+
+ Args:
+ indent_texts: The lines of the docstring as an iterable over 2-tuples
+ each containing an integer indent level as the first element and
+ the text as the second element.
+
+ Returns:
+ The opening indent level as an integer.
+ '''
+ num_lines = len(indent_texts)
+
+ if num_lines < 1:
+ return 0
+
+ assert num_lines >= 1
+
+ first_line_indent = indent_texts[0][0]
+
+ if num_lines == 1:
+ return first_line_indent
+
+ assert num_lines >= 2
+
+ second_line_indent = indent_texts[1][0]
+ second_line_text = indent_texts[1][1]
+
+ if len(second_line_text) == 0:
+ return first_line_indent
+
+ return second_line_indent
+
+
+
+def rewrite_autodoc(app, what, name, obj, options, lines):
+ '''Convert lines from Hieroglyph to Sphinx format.
+
+ The function to be called by the Sphinx autodoc extension when autodoc
+ has read and processed a docstring. This function modified its
+ ``lines`` argument *in place* replacing Hieroglyph syntax input into
+ Sphinx reStructuredText output.
+
+ Args:
+ apps: The Sphinx application object.
+
+ what: The type of object which the docstring belongs to. One of
+ 'module', 'class', 'exception', 'function', 'method', 'attribute'
+
+ name: The fully qualified name of the object.
+
+ obj: The object itself.
+
+ options: The options given to the directive. An object with attributes
+ ``inherited_members``, ``undoc_members``, ``show_inheritance`` and
+ ``noindex`` that are ``True`` if the flag option of the same name
+ was given to the auto directive.
+
+ lines: The lines of the docstring. Will be modified *in place*.
+ '''
+ lines[:] = parse_hieroglyph_text(lines)
+
+
+def setup(app):
+ app.connect('autodoc-process-docstring', rewrite_autodoc)
+
+
diff --git a/docs/sphinx/hieroglyph/nodes.py b/docs/sphinx/hieroglyph/nodes.py
new file mode 100644
index 000000000..e583ce04d
--- /dev/null
+++ b/docs/sphinx/hieroglyph/nodes.py
@@ -0,0 +1,267 @@
+__author__ = 'Robert Smallshire'
+
+class Node(object):
+
+ def __init__(self, indent=None, lines=None, parent=None):
+ if indent is not None:
+ self.indent = indent
+ else:
+ self.indent = 0
+
+ if lines is not None:
+ self.lines = lines
+ else:
+ self.lines = []
+
+ self._parent = parent
+
+ self.children = []
+
+ parent = property(lambda self: self._parent)
+
+ def add_child(self, child):
+ assert(child.parent is self)
+ self.children.append(child)
+
+
+ def __repr__(self):
+ return "Node(" + repr(self.indent) + ", " + repr(self.lines) + ", children=" + repr(self.children) + ")"
+
+
+ def render_rst(self, *args, **kwargs):
+ result = []
+ prefix = ' ' * self.indent
+ result.extend(prefix + line for line in self.lines)
+ for child in self.children:
+ result.extend(child.render_rst())
+ return result
+
+
+
+class Arg(Node):
+
+ def __init__(self, indent, child_indent, name):
+ super(Arg, self).__init__(indent)
+ self.child_indent = child_indent
+ self.name = name
+ self.type = None
+
+
+ def __repr__(self):
+ return "Arg(" + repr(self.name) + ", " + repr(self.type) + ", children=" + repr(self.children) + ")"
+
+
+ def render_rst(self, *args, **kwargs):
+ result = []
+ indent = ' ' * self.indent
+
+ # Render the param description
+ description = []
+ for child in self.children:
+ child_lines = child.render_rst()
+ description.extend(child_lines)
+
+ dedent = self.child_indent - self.indent
+
+ name = self.name.replace('*', r'\*')
+
+ first_description = description[0].lstrip() if len(description) else ''
+ if not first_description:
+ # TODO: Emit a warning about a missing argument description
+ pass
+
+ result.append("{indent}:param {name}: {first_description}".format(indent=indent, name=name,
+ first_description=first_description))
+
+ dedented_body = [line[dedent:] for line in description[1:]]
+
+ result.extend(dedented_body)
+
+ # If a type was specified render the type
+ if self.type is not None:
+ result.append("{indent}:type {name}: {type}".format(indent=indent, name=self.name, type=self.type))
+ result.append('')
+
+ ensure_terminal_blank(result)
+
+ return result
+
+
+
+class Raises(Node):
+
+ def __init__(self, indent=None):
+ super(Raises, self).__init__(indent=indent)
+
+ def __repr__(self):
+ return "Raises(" + repr(self.indent) + ", children=" + repr(self.children) + ")"
+
+
+ def render_rst(self, *args, **kwargs):
+ result = []
+ indent = ' ' * self.indent
+ result.append(indent + ':raises:')
+ for child in self.children:
+ result.extend(child.render_rst(only_child=len(self.children) == 1))
+
+ ensure_terminal_blank(result)
+
+ return result
+
+
+class Except(Node):
+
+ def __init__(self, indent, type):
+ super(Except, self).__init__(indent=indent)
+ #self.child_indent = child_indent
+ self.type = type
+
+
+ def __repr__(self):
+ return "Except(" + repr(self.type) + ", children=" + repr(self.children) + ")"
+
+
+ def render_rst(self, only_child=False, *args, **kwargs):
+ result = []
+ indent = ' ' * self.indent
+
+ # Render the param description
+ description = []
+ for child in self.children:
+ child_lines = child.render_rst()
+ description.extend(child_lines)
+
+ #dedent = self.child_indent - self.indent
+ bullet = '* ' if not only_child else ''
+
+ first_description = description[0].lstrip() if len(description) else ''
+ result.append("{indent}{bullet}{type} - {first_description}".format(indent=indent,
+ bullet=bullet, type=self.type,
+ first_description=first_description))
+
+ #dedented_body = [' ' * len(bullet) + line[dedent:] for line in description[1:]]
+ #result.extend(dedented_body)
+ result.extend(description[1:])
+ ensure_terminal_blank(result)
+
+ return result
+
+
+
+class Returns(Node):
+
+ def __init__(self, indent):
+ super(Returns, self).__init__(indent=indent)
+ self.title = 'Returns'
+ self.line = ''
+
+
+ def __repr__(self):
+ return "Returns(" + str(self.indent) + ", children=" + str(self.children) + ")"
+
+
+ def render_rst(self, *args, **kwargs):
+ result = []
+ indent = ' ' * self.indent
+
+ # Render the param description
+ description = [self.line] if self.line else []
+ for child in self.children:
+ child_lines = child.render_rst()
+ description.extend(child_lines)
+
+ self.render_title(description, indent, result)
+
+ result.extend(description[1:])
+
+ ensure_terminal_blank(result)
+ return result
+
+
+ def render_title(self, description, indent, result):
+ result.append(
+ "{indent}:returns: {first_description}".format(indent=indent,
+ first_description=description[0].lstrip()))
+
+
+
+class Warning(Node):
+
+ def __init__(self, indent):
+ super(Warning, self).__init__(indent=indent)
+
+ def __repr__(self):
+ return "Warning(" + repr(self.indent) + ", children=" + str(self.children) + ")"
+
+ def render_rst(self, *args, **kwargs):
+ # TODO: Factor out the commonality between this and Note below
+ result = []
+ indent = ' ' * self.indent
+
+ # Render the param description
+ description = [self.line] if self.line else []
+ for child in self.children:
+ child_lines = child.render_rst()
+ description.extend(child_lines)
+
+ # Fix the indent on the first line
+ if len(description) > 1 and len(description[1].strip()) != 0:
+ body_indent = len(description[1]) - len(description[1].strip())
+ else:
+ body_indent = self.indent + 4
+
+ if len(description) > 0:
+ description[0] = ' ' * body_indent + description[0]
+
+ result.append(indent + ".. warning::")
+ result.append(indent + '')
+ result.extend(description)
+
+ ensure_terminal_blank(result)
+ return result
+
+
+class Note(Node):
+
+ def __init__(self, indent):
+ super(Note, self).__init__(indent=indent)
+ self.line = ''
+
+
+ def __repr__(self):
+ return "Note(" + repr(self.indent) + ", children=" + str(self.children) + ")"
+
+
+ def render_rst(self, *args, **kwargs):
+ # TODO: Factor out the commonality between this and Warning above
+ result = []
+ indent = ' ' * self.indent
+
+ # Render the param description
+ description = [self.line] if self.line else []
+ for child in self.children:
+ child_lines = child.render_rst()
+ description.extend(child_lines)
+
+ # Fix the indent on the first line
+ if len(description) > 1 and len(description[1].strip()) != 0:
+ body_indent = len(description[1]) - len(description[1].strip())
+ else:
+ body_indent = self.indent + 4
+
+ if len(description) > 0:
+ description[0] = ' ' * body_indent + description[0]
+
+ result.append(indent + ".. note::")
+ result.append(indent + '')
+ result.extend(description)
+
+ ensure_terminal_blank(result)
+ return result
+
+
+def ensure_terminal_blank(result):
+ '''If the description didn't end with a blank line add one here.'''
+ if len(result) > 0:
+ if len(result[-1].strip()) != 0:
+ result.append('')
diff --git a/docs/sphinx/hieroglyph/test/__init__.py b/docs/sphinx/hieroglyph/test/__init__.py
new file mode 100644
index 000000000..fd249423f
--- /dev/null
+++ b/docs/sphinx/hieroglyph/test/__init__.py
@@ -0,0 +1,2 @@
+__author__ = 'rjs'
+ \ No newline at end of file
diff --git a/docs/sphinx/hieroglyph/test/test_comments.py b/docs/sphinx/hieroglyph/test/test_comments.py
new file mode 100644
index 000000000..d1a1453ee
--- /dev/null
+++ b/docs/sphinx/hieroglyph/test/test_comments.py
@@ -0,0 +1,586 @@
+import unittest
+
+from hieroglyph.hieroglyph import parse_hieroglyph_text
+from hieroglyph.errors import HieroglyphError
+
+class CommentTests(unittest.TestCase):
+
+ def test_comment1(self):
+ source = """Fetches rows from a Bigtable.
+ This is a continuation of the opening paragraph.
+
+ Retrieves rows pertaining to the given keys from the Table instance
+ represented by big_table. Silly things may happen if
+ other_silly_variable is not None.
+
+ Args:
+ big_table: An open Bigtable Table instance.
+ keys: A sequence of strings representing the key of each table row
+ to fetch.
+ other_silly_variable (str): Another optional variable, that has a much
+ longer name than the other args, and which does nothing.
+
+ Returns:
+ A dict mapping keys to the corresponding table row data
+ fetched. Each row is represented as a tuple of strings. For
+ example:
+
+ {'Serak': ('Rigel VII', 'Preparer'),
+ 'Zim': ('Irk', 'Invader'),
+ 'Lrrr': ('Omicron Persei 8', 'Emperor')}
+
+ If a key from the keys argument is missing from the dictionary,
+ then that row was not found in the table.
+
+ Raises:
+ IOError: An error occurred accessing the bigtable.Table object.
+ """
+
+ expected = """ Fetches rows from a Bigtable.
+ This is a continuation of the opening paragraph.
+
+ Retrieves rows pertaining to the given keys from the Table instance
+ represented by big_table. Silly things may happen if
+ other_silly_variable is not None.
+
+ :param big_table: An open Bigtable Table instance.
+
+ :param keys: A sequence of strings representing the key of each table row
+ to fetch.
+
+ :param other_silly_variable: Another optional variable, that has a much
+ longer name than the other args, and which does nothing.
+
+ :type other_silly_variable: str
+
+ :returns: A dict mapping keys to the corresponding table row data
+ fetched. Each row is represented as a tuple of strings. For
+ example:
+
+ {'Serak': ('Rigel VII', 'Preparer'),
+ 'Zim': ('Irk', 'Invader'),
+ 'Lrrr': ('Omicron Persei 8', 'Emperor')}
+
+ If a key from the keys argument is missing from the dictionary,
+ then that row was not found in the table.
+
+ :raises:
+ IOError - An error occurred accessing the bigtable.Table object.
+ """
+ source_lines = source.splitlines()
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment2(self):
+ source = """Determine if all elements in the source sequence satisfy a condition.
+
+ All of the source sequence will be consumed.
+
+ Note: This method uses immediate execution.
+
+ Args:
+ predicate: An optional single argument function used to test each
+ elements. If omitted, the bool() function is used resulting in
+ the elements being tested directly.
+
+ Returns:
+ True if all elements in the sequence meet the predicate condition,
+ otherwise False.
+
+ Raises:
+ ValueError: If the Queryable is closed()
+ TypeError: If predicate is not callable.
+ """
+
+ expected = """Determine if all elements in the source sequence satisfy a condition.
+
+ All of the source sequence will be consumed.
+
+ .. note::
+
+ This method uses immediate execution.
+
+ :param predicate: An optional single argument function used to test each
+ elements. If omitted, the bool() function is used resulting in
+ the elements being tested directly.
+
+ :returns: True if all elements in the sequence meet the predicate condition,
+ otherwise False.
+
+ :raises:
+ * ValueError - If the Queryable is closed()
+
+ * TypeError - If predicate is not callable.
+ """
+ source_lines = source.splitlines()
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment3(self):
+ source = """Determine if all elements in the source sequence satisfy a condition.
+
+ All of the source sequence will be consumed.
+
+ Note: This method uses immediate execution.
+
+ Args:
+ predicate: An optional single argument function used to test each
+ elements. If omitted, the bool() function is used resulting in
+ the elements being tested directly.
+
+ Returns:
+ True if all elements in the sequence meet the predicate condition,
+ otherwise False.
+
+ Raises:
+ ValueError: If the Queryable is closed()
+ TypeError: If predicate is not callable.
+ """
+
+ expected = """Determine if all elements in the source sequence satisfy a condition.
+
+ All of the source sequence will be consumed.
+
+ .. note::
+
+ This method uses immediate execution.
+
+ :param predicate: An optional single argument function used to test each
+ elements. If omitted, the bool() function is used resulting in
+ the elements being tested directly.
+
+ :returns: True if all elements in the sequence meet the predicate condition,
+ otherwise False.
+
+ :raises:
+ * ValueError - If the Queryable is closed()
+
+ * TypeError - If predicate is not callable.
+ """
+ source_lines = source.splitlines()
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment4(self):
+ source_lines = [u'Determine if all elements in the source sequence satisfy a condition.',
+ u'',
+ u'All of the source sequence will be consumed.',
+ u'',
+ u'Note: This method uses immediate execution.',
+ u'',
+ u'Args:',
+ u' predicate: An optional single argument function used to test each',
+ u' elements. If omitted, the bool() function is used resulting in',
+ u' the elements being tested directly.',
+ u'',
+ u'Returns:',
+ u' True if all elements in the sequence meet the predicate condition,',
+ u' otherwise False.',
+ u'',
+ u'Raises:',
+ u' ValueError: If the Queryable is closed()',
+ u' TypeError: If predicate is not callable.',
+ u'']
+
+ expected = """Determine if all elements in the source sequence satisfy a condition.
+
+All of the source sequence will be consumed.
+
+.. note::
+
+ This method uses immediate execution.
+
+:param predicate: An optional single argument function used to test each
+ elements. If omitted, the bool() function is used resulting in
+ the elements being tested directly.
+
+:returns: True if all elements in the sequence meet the predicate condition,
+ otherwise False.
+
+:raises:
+ * ValueError - If the Queryable is closed()
+
+ * TypeError - If predicate is not callable.
+
+"""
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment5(self):
+ source_lines = [u'An empty Queryable.',
+ u'',
+ u'Note: The same empty instance will be returned each time.',
+ u'',
+ u'Returns: A Queryable over an empty sequence.',
+ u'']
+
+ expected = """An empty Queryable.
+
+.. note::
+
+ The same empty instance will be returned each time.
+
+:returns: A Queryable over an empty sequence.
+
+"""
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment6(self):
+ source_lines = [u'A convenience factory for creating Records.',
+ u'',
+ u'Args:',
+ u' **kwargs: Each keyword argument will be used to initialise an',
+ u' attribute with the same name as the argument and the given',
+ u' value.',
+ u'',
+ u'Returns:',
+ u' A Record which has a named attribute for each of the keyword arguments.',
+ u'']
+
+ expected = """A convenience factory for creating Records.
+
+:param \*\*kwargs: Each keyword argument will be used to initialise an
+ attribute with the same name as the argument and the given
+ value.
+
+:returns: A Record which has a named attribute for each of the keyword arguments.
+
+"""
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment7(self):
+ source = """Projects each element of a sequence to an intermediate new sequence,
+ flattens the resulting sequences into one sequence and optionally
+ transforms the flattened sequence using a selector function.
+
+ Note: This method uses deferred execution.
+
+ Args:
+ collection_selector: A unary function mapping each element of the
+ source iterable into an intermediate sequence. The single
+ argument of the collection_selector is the value of an element
+ from the source sequence. The return value should be an
+ iterable derived from that element value. The default
+ collection_selector, which is the identity function, assumes
+ that each element of the source sequence is itself iterable.
+
+ result_selector: An optional unary function mapping the elements in
+ the flattened intermediate sequence to corresponding elements
+ of the result sequence. The single argument of the
+ result_selector is the value of an element from the flattened
+ intermediate sequence. The return value should be the
+ corresponding value in the result sequence. The default
+ result_selector is the identity function.
+
+ Returns:
+ A Queryable over a generated sequence whose elements are the result
+ of applying the one-to-many collection_selector to each element of
+ the source sequence, concatenating the results into an intermediate
+ sequence, and then mapping each of those elements through the
+ result_selector into the result sequence.
+
+ Raises:
+ ValueError: If this Queryable has been closed.
+ TypeError: If either collection_selector or result_selector are not
+ callable.
+ """
+
+ expected = """ Projects each element of a sequence to an intermediate new sequence,
+ flattens the resulting sequences into one sequence and optionally
+ transforms the flattened sequence using a selector function.
+
+ .. note::
+
+ This method uses deferred execution.
+
+ :param collection_selector: A unary function mapping each element of the
+ source iterable into an intermediate sequence. The single
+ argument of the collection_selector is the value of an element
+ from the source sequence. The return value should be an
+ iterable derived from that element value. The default
+ collection_selector, which is the identity function, assumes
+ that each element of the source sequence is itself iterable.
+
+ :param result_selector: An optional unary function mapping the elements in
+ the flattened intermediate sequence to corresponding elements
+ of the result sequence. The single argument of the
+ result_selector is the value of an element from the flattened
+ intermediate sequence. The return value should be the
+ corresponding value in the result sequence. The default
+ result_selector is the identity function.
+
+ :returns: A Queryable over a generated sequence whose elements are the result
+ of applying the one-to-many collection_selector to each element of
+ the source sequence, concatenating the results into an intermediate
+ sequence, and then mapping each of those elements through the
+ result_selector into the result sequence.
+
+ :raises:
+ * ValueError - If this Queryable has been closed.
+
+ * TypeError - If either collection_selector or result_selector are not
+ callable.
+ """
+ source_lines = source.splitlines()
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment8(self):
+ source = """A convenience factory for creating Records.
+
+ Args:
+ **kwargs: Each keyword argument will be used to initialise an
+ attribute with the same name as the argument and the given
+ value.
+
+ Returns:
+ A Record which has a named attribute for each of the keyword arguments.
+ """
+
+ expected = """A convenience factory for creating Records.
+
+ :param \*\*kwargs: Each keyword argument will be used to initialise an
+ attribute with the same name as the argument and the given
+ value.
+
+ :returns: A Record which has a named attribute for each of the keyword arguments.
+
+"""
+ source_lines = source.splitlines()
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment9(self):
+ source_lines = [u'Parse a single line of a tree to determine depth and node.',
+ u'',
+ u'Args:',
+ u' This line is missing an argument name.',
+ u' ',
+ u'Returns:',
+ u' A 2-tuple containing the tree 0 based tree depth as the first',
+ u' element and the node description as the second element.',
+ u'',
+ u'Raises:',
+ u' ValueError: If line does not have the expected form.',
+ u'']
+
+ self.assertRaises(HieroglyphError, lambda: parse_hieroglyph_text(source_lines))
+
+ def test_comment10(self):
+ source = """
+ Execute the command described by concatenating the string function arguments
+ with the p4 -s global scripting flag and return the results in a dictionary.
+
+ For example, to run the command::
+
+ p4 -s fstat -T depotFile foo.h
+
+ call::
+
+ p4('fstat', '-T', 'depotFile', 'foo.h')
+
+ Args:
+ args: The arguments to the p4 command as a list of objects which will
+ be converted to strings.
+
+ Returns:
+ A dictionary of lists where each key in the dictionary is the field name
+ from the command output, and each value is a list of output lines in
+ order.
+
+ Raises:
+ PerforceError: If the command could not be run or if the command
+ reported an error.
+ """
+
+ expected = """
+ Execute the command described by concatenating the string function arguments
+ with the p4 -s global scripting flag and return the results in a dictionary.
+
+ For example, to run the command::
+
+ p4 -s fstat -T depotFile foo.h
+
+ call::
+
+ p4('fstat', '-T', 'depotFile', 'foo.h')
+
+ :param args: The arguments to the p4 command as a list of objects which will
+ be converted to strings.
+
+ :returns: A dictionary of lists where each key in the dictionary is the field name
+ from the command output, and each value is a list of output lines in
+ order.
+
+ :raises:
+ PerforceError - If the command could not be run or if the command
+ reported an error.
+
+"""
+
+ source_lines = source.splitlines()
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment11(self):
+ source = """Projects each element of a sequence to an intermediate new sequence,
+ flattens the resulting sequences into one sequence and optionally
+ transforms the flattened sequence using a selector function.
+
+ Warning: This method may explode at short notice.
+
+ Args:
+ collection_selector: A unary function mapping each element of the
+ source iterable into an intermediate sequence. The single
+ argument of the collection_selector is the value of an element
+ from the source sequence. The return value should be an
+ iterable derived from that element value. The default
+ collection_selector, which is the identity function, assumes
+ that each element of the source sequence is itself iterable.
+
+ result_selector: An optional unary function mapping the elements in
+ the flattened intermediate sequence to corresponding elements
+ of the result sequence. The single argument of the
+ result_selector is the value of an element from the flattened
+ intermediate sequence. The return value should be the
+ corresponding value in the result sequence. The default
+ result_selector is the identity function.
+
+ Returns:
+ A Queryable over a generated sequence whose elements are the result
+ of applying the one-to-many collection_selector to each element of
+ the source sequence, concatenating the results into an intermediate
+ sequence, and then mapping each of those elements through the
+ result_selector into the result sequence.
+
+ Raises:
+ ValueError: If this Queryable has been closed.
+ TypeError: If either collection_selector or result_selector are not
+ callable.
+ """
+
+ expected = """ Projects each element of a sequence to an intermediate new sequence,
+ flattens the resulting sequences into one sequence and optionally
+ transforms the flattened sequence using a selector function.
+
+ .. warning::
+
+ This method may explode at short notice.
+
+ :param collection_selector: A unary function mapping each element of the
+ source iterable into an intermediate sequence. The single
+ argument of the collection_selector is the value of an element
+ from the source sequence. The return value should be an
+ iterable derived from that element value. The default
+ collection_selector, which is the identity function, assumes
+ that each element of the source sequence is itself iterable.
+
+ :param result_selector: An optional unary function mapping the elements in
+ the flattened intermediate sequence to corresponding elements
+ of the result sequence. The single argument of the
+ result_selector is the value of an element from the flattened
+ intermediate sequence. The return value should be the
+ corresponding value in the result sequence. The default
+ result_selector is the identity function.
+
+ :returns: A Queryable over a generated sequence whose elements are the result
+ of applying the one-to-many collection_selector to each element of
+ the source sequence, concatenating the results into an intermediate
+ sequence, and then mapping each of those elements through the
+ result_selector into the result sequence.
+
+ :raises:
+ * ValueError - If this Queryable has been closed.
+
+ * TypeError - If either collection_selector or result_selector are not
+ callable.
+ """
+ source_lines = source.splitlines()
+ actual_lines = parse_hieroglyph_text(source_lines)
+ expected_lines = expected.splitlines()
+ self.assertEqual(len(actual_lines), len(expected_lines))
+ for actual_line, result_line in zip(actual_lines, expected_lines):
+ if len(actual_line.strip()) == 0:
+ self.assertTrue(len(result_line.strip()) == 0)
+ else:
+ self.assertEqual(actual_line, result_line)
+
+ def test_comment12(self):
+ source = """Determine if all elements in the source sequence satisfy a condition.
+
+ All of the source sequence will be consumed.
+
+ Note: This method uses immediate execution.
+
+ Args:
+ predicate: An optional single argument function used to test each
+ elements. If omitted, the bool() function is used resulting in
+ the elements being tested directly.
+
+ Returns:
+ True if all elements in the sequence meet the predicate condition,
+ otherwise False.
+
+ Raises:
+ This is not a proper exception description
+ """
+
+ source_lines = source.splitlines()
+ self.assertRaises(HieroglyphError, lambda: parse_hieroglyph_text(source_lines))
+
diff --git a/docs/sphinx/hieroglyph/test/test_hierglyph.py b/docs/sphinx/hieroglyph/test/test_hierglyph.py
new file mode 100644
index 000000000..42947cb0c
--- /dev/null
+++ b/docs/sphinx/hieroglyph/test/test_hierglyph.py
@@ -0,0 +1,264 @@
+import unittest
+from hieroglyph.hieroglyph import first_paragraph_indent, gather_lines, unindent
+
+__author__ = 'Robert Smallshire'
+
+class UnindentTests(unittest.TestCase):
+
+ def test_zero_lines(self):
+ source = []
+ expected = []
+ actual = unindent(source)
+ self.assertEqual(actual, expected)
+
+ def test_one_zero_indent_line(self):
+ source = ["First line"]
+ expected = [(0, "First line")]
+ actual = unindent(source)
+ self.assertEqual(actual, expected)
+
+ def test_two_zero_indent_lines(self):
+ source = ["First line",
+ "Second line"]
+ expected = [(0, "First line"),
+ (0, "Second line")]
+ actual = unindent(source)
+ self.assertEqual(actual, expected)
+
+ def test_two_indented_lines(self):
+ source = [" First line",
+ " Second line"]
+ expected = [(4, "First line"),
+ (6, "Second line")]
+ actual = unindent(source)
+ self.assertEqual(actual, expected)
+
+ def test_whitespace_line(self):
+ source = [" "]
+ expected = [(4, "")]
+ actual = unindent(source)
+ self.assertEqual(actual, expected)
+
+ def test_tab_line(self):
+ source = ["\tHello"]
+ expected = [(1, "Hello")]
+ actual = unindent(source)
+ self.assertEqual(actual, expected)
+
+
+class FirstParagraphIndentTests(unittest.TestCase):
+
+ def test_zero_lines(self):
+ source = []
+ expected = []
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_single_line_non_indented_comment(self):
+ source = [(0, "A single line comment")]
+ expected = [(0, "A single line comment")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_single_line_indented_comment(self):
+ source = [(4, "A single line comment")]
+ expected = [(4, "A single line comment")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_double_line_non_indented_comment(self):
+ source = [(0, "The first line"),
+ (0, "The second line")]
+ expected = [(0, "The first line"),
+ (0, "The second line")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_double_line_indented_comment(self):
+ source = [(4, "The first line"),
+ (4, "The second line")]
+ expected = [(4, "The first line"),
+ (4, "The second line")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_first_line_indent(self):
+ source = [(4, "The first line"),
+ (0, "The second line")]
+ expected = [(4, "The first line"),
+ (0, "The second line")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_first_line_non_indent(self):
+ source = [(0, "The first line"),
+ (4, "The second line")]
+ expected = [(4, "The first line"),
+ (4, "The second line")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_increasing_indent(self):
+ source = [(0, "The first line"),
+ (4, "The second line"),
+ (8, "The third line")]
+ expected = [(4, "The first line"),
+ (4, "The second line"),
+ (8, "The third line")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_separate_paragraphs(self):
+ source = [(0, "This is the first paragraph"),
+ (0, ""),
+ (4, "This is the second paragraph")]
+ expected = [(0, "This is the first paragraph"),
+ (0, ""),
+ (4, "This is the second paragraph")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_separate_paragraphs_indented(self):
+ source = [(4, "This is the first paragraph"),
+ (4, ""),
+ (8, "This is the second paragraph")]
+ expected = [(4, "This is the first paragraph"),
+ (4, ""),
+ (8, "This is the second paragraph")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_separated_lines_first_line_non_indented(self):
+ source = [(0, "The first line"),
+ (0, ""),
+ (4, "The third line")]
+ expected = [(0, "The first line"),
+ (0, ""),
+ (4, "The third line")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+ def test_separated_lines_first_line_indented(self):
+ source = [(4, "The first line"),
+ (4, ""),
+ (4, "The third line")]
+ expected = [(4, "The first line"),
+ (4, ""),
+ (4, "The third line")]
+ actual = first_paragraph_indent(source)
+ self.assertEqual(actual, expected)
+
+class GatherLinesTests(unittest.TestCase):
+
+ def test_empty(self):
+ source = []
+ expected = []
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_one_liner(self):
+ source = [(0, 'One liner')]
+ expected = [(0, ['One liner'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_two_liner(self):
+ source = [(0, 'First line'),
+ (0, 'Second line')]
+ expected = [(0, ['First line',
+ 'Second line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_separated_lines(self):
+ source = [(0, 'First line'),
+ (0, ''),
+ (0, 'Third line')]
+ expected = [(0, ['First line',
+ '']),
+ (0, ['Third line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_separated_multi_lines(self):
+ source = [(0, 'First line'),
+ (0, 'Second line'),
+ (0, ''),
+ (0, 'Fourth line'),
+ (0, 'Fifth line')]
+ expected = [(0, ['First line',
+ 'Second line',
+ '']),
+ (0, ['Fourth line',
+ 'Fifth line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+
+ def test_indented_lines(self):
+ source = [(0, 'First line'),
+ (4, 'Second line')]
+ expected = [(0, ['First line']),
+ (4, ['Second line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_dedented_lines(self):
+ source = [(4, 'First line'),
+ (0, 'Second line')]
+ expected = [(4, ['First line']),
+ (0, ['Second line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_indented_multi_lines(self):
+ source = [(0, 'First line'),
+ (0, 'Second line'),
+ (4, 'Third line'),
+ (4, 'Fourth line')]
+ expected = [(0, ['First line',
+ 'Second line']),
+ (4, ['Third line',
+ 'Fourth line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_dedented_multi_lines(self):
+ source = [(4, 'First line'),
+ (4, 'Second line'),
+ (0, 'Third line'),
+ (0, 'Fourth line')]
+ expected = [(4, ['First line',
+ 'Second line']),
+ (0, ['Third line',
+ 'Fourth line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_indented_separated_multi_lines(self):
+ source = [(0, 'First line'),
+ (0, 'Second line'),
+ (0, ''),
+ (4, 'Fourth line'),
+ (4, 'Fifth line')]
+ expected = [(0, ['First line',
+ 'Second line',
+ '']),
+ (4, ['Fourth line',
+ 'Fifth line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
+
+ def test_dedented_separated_multi_lines(self):
+ source = [(4, 'First line'),
+ (4, 'Second line'),
+ (4, ''),
+ (0, 'Fourth line'),
+ (0, 'Fifth line')]
+ expected = [(4, ['First line',
+ 'Second line',
+ '']),
+ (0, ['Fourth line',
+ 'Fifth line'])]
+ actual = gather_lines(source)
+ self.assertEqual(actual, expected)
diff --git a/docs/sphinx/hieroglyph/test/test_nodes.py b/docs/sphinx/hieroglyph/test/test_nodes.py
new file mode 100644
index 000000000..4cc17b477
--- /dev/null
+++ b/docs/sphinx/hieroglyph/test/test_nodes.py
@@ -0,0 +1,386 @@
+import unittest
+from hieroglyph.nodes import Node, Arg, Raises, Except, Returns, Warning, Note
+
+__author__ = 'Robert Smallshire'
+
+class NodeTests(unittest.TestCase):
+
+ def test_create_default_node(self):
+ node = Node()
+ self.assertEqual(node.indent, 0)
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_create_with_indent(self):
+ node = Node(indent=4)
+ self.assertEqual(node.indent, 4)
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_create_with_lines(self):
+ node = Node(lines= ['First', 'Second', 'Third'])
+ self.assertEqual(node.indent, 0)
+ self.assertEqual(node.lines, ['First', 'Second', 'Third'])
+ self.assertIsNone(node.parent)
+
+ def test_repr(self):
+ node = Node(5, ['One', 'Two', 'Three'])
+ actual = repr(node)
+ expected = "Node(5, ['One', 'Two', 'Three'], children=[])"
+ self.assertEqual(expected, actual)
+
+ def test_add_one_child(self):
+ node = Node()
+ child = Node(parent=node)
+ node.add_child(child)
+ self.assertIs(node.children[0], child)
+
+ def test_add_two_children(self):
+ node = Node()
+ child0 = Node(parent=node)
+ child1 = Node(parent=node)
+ node.add_child(child0)
+ node.add_child(child1)
+ self.assertIs(node.children[0], child0)
+ self.assertIs(node.children[1], child1)
+
+ def test_render_rst_empty(self):
+ node = Node()
+ rst = node.render_rst()
+ self.assertEqual(len(rst), 0)
+
+ def test_render_rst_indent(self):
+ node = Node(indent=4)
+ rst = node.render_rst()
+ self.assertEqual(len(rst), 0)
+
+ def test_render_rst_lines(self):
+ node = Node(lines= ['First',
+ 'Second',
+ 'Third'])
+ rst = node.render_rst()
+ self.assertEqual(rst, ['First',
+ 'Second',
+ 'Third'])
+
+ def test_render_rst_indented_lines(self):
+ node = Node(indent=3, lines= ['First',
+ 'Second',
+ 'Third'])
+ rst = node.render_rst()
+ self.assertEqual(rst, [' First',
+ ' Second',
+ ' Third'])
+
+ def test_render_rst_with_child(self):
+ node = Node(indent=4, lines=["Parent"])
+ child = Node(indent=8, lines=["Child"], parent=node)
+ node.add_child(child)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' Parent',
+ ' Child'])
+
+ def test_render_rst_with_children(self):
+ node = Node(indent=4, lines=["Parent"])
+ child_a = Node(indent=8, lines=["ChildA"], parent=node)
+ node.add_child(child_a)
+ child_b = Node(indent=6, lines=["ChildB"], parent=node)
+ node.add_child(child_b)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' Parent',
+ ' ChildA',
+ ' ChildB'])
+
+
+class ArgTests(unittest.TestCase):
+
+ def test_create(self):
+ node = Arg(5, 10, 'foo')
+ self.assertEqual(node.indent, 5)
+ self.assertEqual(node.child_indent, 10)
+ self.assertEqual(node.name, 'foo')
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_set_type(self):
+ node = Arg(5, 10, 'foo')
+ node.type = 'str'
+ self.assertEqual(node.type, 'str')
+
+ def test_add_one_child(self):
+ node = Arg(5, 10, 'foo')
+ child = Node(parent=node)
+ node.add_child(child)
+ self.assertIs(node.children[0], child)
+
+ def test_add_two_children(self):
+ node = Arg(5, 10, 'foo')
+ child0 = Node(parent=node)
+ child1 = Node(parent=node)
+ node.add_child(child0)
+ node.add_child(child1)
+ self.assertIs(node.children[0], child0)
+ self.assertIs(node.children[1], child1)
+
+ def test_repr(self):
+ node = Arg(5, 10, 'foo')
+ actual = repr(node)
+ expected = "Arg('foo', None, children=[])"
+ self.assertEqual(expected, actual)
+
+ def test_render_rst_empty(self):
+ node = Arg(5, 10, 'bar')
+ rst = node.render_rst()
+ self.assertEqual(rst, [' :param bar: ',
+ ''])
+
+ def test_render_rst_with_child(self):
+ node = Arg(5, 10, 'bar')
+ child = Node(indent=10, lines=["Description"], parent=node)
+ node.add_child(child)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' :param bar: Description',
+ ''])
+
+ def test_render_rst_with_children(self):
+ node = Arg(5, 10, 'bar')
+ child_a = Node(indent=10, lines=["ChildA"], parent=node)
+ node.add_child(child_a)
+ child_b = Node(indent=10, lines=["ChildB"], parent=node)
+ node.add_child(child_b)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' :param bar: ChildA',
+ ' ChildB',
+ ''])
+
+ def test_render_rst_with_type(self):
+ node = Arg(5, 10, 'bar')
+ node.type = 'str'
+ rst = node.render_rst()
+ self.assertEqual(rst, [' :param bar: ',
+ ' :type bar: str',
+ ''])
+
+
+class RaisesTests(unittest.TestCase):
+
+ def test_create_default_node(self):
+ node = Raises()
+ self.assertEqual(node.indent, 0)
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_create_with_indent(self):
+ node = Raises(indent=4)
+ self.assertEqual(node.indent, 4)
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_repr(self):
+ node = Raises(5)
+ actual = repr(node)
+ expected = "Raises(5, children=[])"
+ self.assertEqual(expected, actual)
+
+ def test_add_one_child(self):
+ node = Raises()
+ child = Node(parent=node)
+ node.add_child(child)
+ self.assertIs(node.children[0], child)
+
+ def test_add_two_children(self):
+ node = Raises()
+ child0 = Node(parent=node)
+ child1 = Node(parent=node)
+ node.add_child(child0)
+ node.add_child(child1)
+ self.assertIs(node.children[0], child0)
+ self.assertIs(node.children[1], child1)
+
+ def test_render_rst_empty(self):
+ node = Raises()
+ rst = node.render_rst()
+ self.assertEqual(rst, [':raises:',
+ ''])
+
+ def test_render_rst_indent(self):
+ node = Raises(indent=5)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' :raises:',
+ ''])
+
+ def test_render_rst_with_child(self):
+ node = Raises(5)
+ child = Node(indent=10, lines=["Description"], parent=node)
+ node.add_child(child)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' :raises:',
+ ' Description',
+ ''])
+
+ def test_render_rst_with_children(self):
+ node = Raises(5)
+ child_a = Node(indent=10, lines=["ChildA"], parent=node)
+ node.add_child(child_a)
+ child_b = Node(indent=10, lines=["ChildB"], parent=node)
+ node.add_child(child_b)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' :raises:',
+ ' ChildA',
+ ' ChildB',
+ ''])
+
+
+class ExceptTests(unittest.TestCase):
+
+ def test_create(self):
+ node = Except(5, 'FooError')
+ self.assertEqual(node.indent, 5)
+ self.assertEqual(node.type, 'FooError')
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_add_one_child(self):
+ node = Except(5, 'FooError')
+ child = Node(parent=node)
+ node.add_child(child)
+ self.assertIs(node.children[0], child)
+
+ def test_add_two_children(self):
+ node = Except(5, 'FooError')
+ child0 = Node(parent=node)
+ child1 = Node(parent=node)
+ node.add_child(child0)
+ node.add_child(child1)
+ self.assertIs(node.children[0], child0)
+ self.assertIs(node.children[1], child1)
+
+ def test_repr(self):
+ node = Except(5,'FooError')
+ actual = repr(node)
+ expected = "Except('FooError', children=[])"
+ self.assertEqual(expected, actual)
+
+ def test_render_rst_empty(self):
+ node = Except(5, 'FooError')
+ rst = node.render_rst()
+ self.assertEqual(rst, [' * FooError - ',
+ ''])
+
+ def test_render_rst_indent(self):
+ node = Except(5, 'FooError')
+ rst = node.render_rst()
+ self.assertEqual(rst, [' * FooError - ',
+ ''])
+
+ def test_render_rst_with_child(self):
+ node = Except(5, 'FooError')
+ child = Node(indent=10, lines=["Description"], parent=node)
+ node.add_child(child)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' * FooError - Description',
+ ''])
+
+ def test_render_rst_with_children(self):
+ node = Except(5, 'FooError')
+ child_a = Node(indent=10, lines=["ChildA"], parent=node)
+ node.add_child(child_a)
+ child_b = Node(indent=10, lines=["ChildB"], parent=node)
+ node.add_child(child_b)
+ rst = node.render_rst()
+ self.assertEqual(rst, [' * FooError - ChildA',
+ ' ChildB',
+ ''])
+
+class ReturnsTests(unittest.TestCase):
+
+ def test_create(self):
+ node = Returns(5)
+ self.assertEqual(node.indent, 5)
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_add_one_child(self):
+ node = Returns(5)
+ child = Node(parent=node)
+ node.add_child(child)
+ self.assertIs(node.children[0], child)
+
+ def test_add_two_children(self):
+ node = Returns(5)
+ child0 = Node(parent=node)
+ child1 = Node(parent=node)
+ node.add_child(child0)
+ node.add_child(child1)
+ self.assertIs(node.children[0], child0)
+ self.assertIs(node.children[1], child1)
+
+ def test_repr(self):
+ node = Returns(5)
+ actual = repr(node)
+ expected = "Returns(5, children=[])"
+ self.assertEqual(expected, actual)
+
+ # TODO test_render_rst
+
+class WarningTests(unittest.TestCase):
+
+ def test_create(self):
+ node = Warning(5)
+ self.assertEqual(node.indent, 5)
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_add_one_child(self):
+ node = Warning(5)
+ child = Node(parent=node)
+ node.add_child(child)
+ self.assertIs(node.children[0], child)
+
+ def test_add_two_children(self):
+ node = Warning(5)
+ child0 = Node(parent=node)
+ child1 = Node(parent=node)
+ node.add_child(child0)
+ node.add_child(child1)
+ self.assertIs(node.children[0], child0)
+ self.assertIs(node.children[1], child1)
+
+ def test_repr(self):
+ node = Warning(5)
+ actual = repr(node)
+ expected = "Warning(5, children=[])"
+ self.assertEqual(expected, actual)
+
+ # TODO test_render_rst
+
+class NoteTests(unittest.TestCase):
+
+ def test_create(self):
+ node = Note(5)
+ self.assertEqual(node.indent, 5)
+ self.assertEqual(node.lines, [])
+ self.assertIsNone(node.parent)
+
+ def test_add_one_child(self):
+ node = Note(5)
+ child = Node(parent=node)
+ node.add_child(child)
+ self.assertIs(node.children[0], child)
+
+ def test_add_two_children(self):
+ node = Note(5)
+ child0 = Node(parent=node)
+ child1 = Node(parent=node)
+ node.add_child(child0)
+ node.add_child(child1)
+ self.assertIs(node.children[0], child0)
+ self.assertIs(node.children[1], child1)
+
+ def test_repr(self):
+ node = Note(5)
+ actual = repr(node)
+ expected = "Note(5, children=[])"
+ self.assertEqual(expected, actual)
+
+ # TODO test_render_rst
diff --git a/docs/sphinx/hieroglyph/version.py b/docs/sphinx/hieroglyph/version.py
new file mode 100644
index 000000000..d060125c0
--- /dev/null
+++ b/docs/sphinx/hieroglyph/version.py
@@ -0,0 +1,3 @@
+'''Specification of the hieroglyph version'''
+
+__version__ = '0.6'
diff --git a/docs/sphinx/source/atsc/blks.rst b/docs/sphinx/source/atsc/blks.rst
new file mode 100644
index 000000000..ce26f095b
--- /dev/null
+++ b/docs/sphinx/source/atsc/blks.rst
@@ -0,0 +1,20 @@
+gnuradio.atsc: Signal Processing Blocks
+=======================================
+
+.. autoblock:: gnuradio.atsc.bit_timing_loop
+.. autoblock:: gnuradio.atsc.deinterleaver
+.. autoblock:: gnuradio.atsc.depad
+.. autoblock:: gnuradio.atsc.derandomizer
+.. autoblock:: gnuradio.atsc.ds_to_softds
+.. autoblock:: gnuradio.atsc.equalizer
+.. autoblock:: gnuradio.atsc.field_sync_demux
+.. autoblock:: gnuradio.atsc.field_sync_mux
+.. autoblock:: gnuradio.atsc.fpll
+.. autoblock:: gnuradio.atsc.fs_checker
+.. autoblock:: gnuradio.atsc.interleaver
+.. autoblock:: gnuradio.atsc.pad
+.. autoblock:: gnuradio.atsc.randomizer
+.. autoblock:: gnuradio.atsc.rs_decoder
+.. autoblock:: gnuradio.atsc.rs_encoder
+.. autoblock:: gnuradio.atsc.trellis_encoder
+.. autoblock:: gnuradio.atsc.viterbi_decoder
diff --git a/docs/sphinx/source/atsc/index.rst b/docs/sphinx/source/atsc/index.rst
new file mode 100644
index 000000000..2371f2456
--- /dev/null
+++ b/docs/sphinx/source/atsc/index.rst
@@ -0,0 +1,62 @@
+gnuradio.atsc
+=============
+
+.. automodule:: gnuradio.atsc
+
+Signal Processing Blocks
+------------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.atsc.bit_timing_loop
+ gnuradio.atsc.deinterleaver
+ gnuradio.atsc.depad
+ gnuradio.atsc.derandomizer
+ gnuradio.atsc.ds_to_softds
+ gnuradio.atsc.equalizer
+ gnuradio.atsc.field_sync_demux
+ gnuradio.atsc.field_sync_mux
+ gnuradio.atsc.fpll
+ gnuradio.atsc.fs_checker
+ gnuradio.atsc.interleaver
+ gnuradio.atsc.pad
+ gnuradio.atsc.randomizer
+ gnuradio.atsc.rs_decoder
+ gnuradio.atsc.rs_encoder
+ gnuradio.atsc.trellis_encoder
+ gnuradio.atsc.viterbi_decoder
+
+Constants
+---------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.atsc.ATSC_DATA_SEGMENT_LENGTH
+ gnuradio.atsc.ATSC_DATA_SEGMENT_RATE
+ gnuradio.atsc.ATSC_DSEGS_PER_FIELD
+ gnuradio.atsc.ATSC_MPEG_DATA_LENGTH
+ gnuradio.atsc.ATSC_MPEG_PKT_LENGTH
+ gnuradio.atsc.ATSC_MPEG_RS_ENCODED_LENGTH
+ gnuradio.atsc.ATSC_SYMBOL_RATE
+ gnuradio.atsc.MPEG_SYNC_BYTE
+ gnuradio.atsc.MPEG_TRANSPORT_ERROR_BIT
+
+Sizes
+---------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.atsc.sizeof_atsc_data_segment
+ gnuradio.atsc.sizeof_atsc_data_segment_pad
+ gnuradio.atsc.sizeof_atsc_mpeg_packet
+ gnuradio.atsc.sizeof_atsc_mpeg_packet_no_sync
+ gnuradio.atsc.sizeof_atsc_mpeg_packet_no_sync_pad
+ gnuradio.atsc.sizeof_atsc_mpeg_packet_pad
+ gnuradio.atsc.sizeof_atsc_mpeg_packet_rs_encoded
+ gnuradio.atsc.sizeof_atsc_mpeg_packet_rs_encoded_pad
+ gnuradio.atsc.sizeof_atsc_soft_data_segment
+ gnuradio.atsc.sizeof_atsc_soft_data_segment_pad
+
diff --git a/docs/sphinx/source/audio/index.rst b/docs/sphinx/source/audio/index.rst
new file mode 100644
index 000000000..31d53567b
--- /dev/null
+++ b/docs/sphinx/source/audio/index.rst
@@ -0,0 +1,7 @@
+gnuradio.audio
+==============
+
+.. automodule:: gnuradio.audio
+
+.. autoblock:: gnuradio.audio.source
+.. autoblock:: gnuradio.audio.sink
diff --git a/docs/sphinx/source/blks2/blks.rst b/docs/sphinx/source/blks2/blks.rst
new file mode 100644
index 000000000..c28c7af0f
--- /dev/null
+++ b/docs/sphinx/source/blks2/blks.rst
@@ -0,0 +1,31 @@
+gnuradio.blks2: Signal Processing Blocks
+========================================
+
+.. autopyblock:: gnuradio.blks2.am_demod_cf
+.. autopyblock:: gnuradio.blks2.ctcss_gen_f
+.. autopyblock:: gnuradio.blks2.demod_10k0a3e_cf
+.. autopyblock:: gnuradio.blks2.demod_200kf3e_cf
+.. autopyblock:: gnuradio.blks2.demod_20k0f3e_cf
+.. autopyblock:: gnuradio.blks2.fm_demod_cf
+.. autopyblock:: gnuradio.blks2.logpwrfft_c
+.. autopyblock:: gnuradio.blks2.logpwrfft_f
+.. autopyblock:: gnuradio.blks2.pfb_arb_resampler_ccf
+.. autopyblock:: gnuradio.blks2.pfb_arb_resampler_fff
+.. autopyblock:: gnuradio.blks2.pfb_channelizer_ccf
+.. autopyblock:: gnuradio.blks2.pfb_decimator_ccf
+.. autopyblock:: gnuradio.blks2.pfb_interpolator_ccf
+.. autopyblock:: gnuradio.blks2.rational_resampler_ccc
+.. autopyblock:: gnuradio.blks2.rational_resampler_ccf
+.. autopyblock:: gnuradio.blks2.rational_resampler_fff
+.. autopyblock:: gnuradio.blks2.analysis_filterbank
+.. autopyblock:: gnuradio.blks2.fm_deemph
+.. autopyblock:: gnuradio.blks2.fm_preemph
+.. autopyblock:: gnuradio.blks2.nbfm_rx
+.. autopyblock:: gnuradio.blks2.nbfm_tx
+.. autopyblock:: gnuradio.blks2.stream_to_vector_decimator
+.. autopyblock:: gnuradio.blks2.standard_squelch
+.. autopyblock:: gnuradio.blks2.synthesis_filterbank
+.. autopyblock:: gnuradio.blks2.wfm_rcv
+.. autopyblock:: gnuradio.blks2.wfm_rcv_fmdet
+.. autopyblock:: gnuradio.blks2.wfm_rcv_pll
+.. autopyblock:: gnuradio.blks2.wfm_tx
diff --git a/docs/sphinx/source/blks2/index.rst b/docs/sphinx/source/blks2/index.rst
new file mode 100644
index 000000000..4df8e5a79
--- /dev/null
+++ b/docs/sphinx/source/blks2/index.rst
@@ -0,0 +1,47 @@
+gnuradio.blks2
+==============
+
+.. automodule:: gnuradio.blks2
+
+Signal Processing Blocks
+------------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.blks2.am_demod_cf
+ gnuradio.blks2.ctcss_gen_f
+ gnuradio.blks2.demod_10k0a3e_cf
+ gnuradio.blks2.demod_200kf3e_cf
+ gnuradio.blks2.demod_20k0f3e_cf
+ gnuradio.blks2.fm_demod_cf
+ gnuradio.blks2.logpwrfft_c
+ gnuradio.blks2.logpwrfft_f
+ gnuradio.blks2.pfb_arb_resampler_ccf
+ gnuradio.blks2.pfb_arb_resampler_fff
+ gnuradio.blks2.pfb_channelizer_ccf
+ gnuradio.blks2.pfb_decimator_ccf
+ gnuradio.blks2.pfb_interpolator_ccf
+ gnuradio.blks2.rational_resampler_ccc
+ gnuradio.blks2.rational_resampler_ccf
+ gnuradio.blks2.rational_resampler_fff
+ gnuradio.blks2.analysis_filterbank
+ gnuradio.blks2.fm_deemph
+ gnuradio.blks2.fm_preemph
+ gnuradio.blks2.nbfm_rx
+ gnuradio.blks2.nbfm_tx
+ gnuradio.blks2.stream_to_vector_decimator
+ gnuradio.blks2.standard_squelch
+ gnuradio.blks2.synthesis_filterbank
+ gnuradio.blks2.wfm_rcv
+ gnuradio.blks2.wfm_rcv_fmdet
+ gnuradio.blks2.wfm_rcv_pll
+ gnuradio.blks2.wfm_tx
+
+Utility Functions
+-----------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.blks2.design_filter
diff --git a/docs/sphinx/source/blks2/utilities.rst b/docs/sphinx/source/blks2/utilities.rst
new file mode 100644
index 000000000..3ce068fb4
--- /dev/null
+++ b/docs/sphinx/source/blks2/utilities.rst
@@ -0,0 +1,4 @@
+gnuradio.blks2: Utility Functions
+=================================
+
+.. autoclass:: gnuradio.blks2.design_filter
diff --git a/docs/sphinx/source/conf.py b/docs/sphinx/source/conf.py
new file mode 100644
index 000000000..f5422ee41
--- /dev/null
+++ b/docs/sphinx/source/conf.py
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+#
+# GNU Radio documentation build configuration file, created by
+# sphinx-quickstart on Sun Oct 16 22:27:51 2011.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+sys.path.insert(0, os.path.abspath('..'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.autosummary', 'gnuradio_sphinx', 'hieroglyph']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'GNU Radio (Unofficial Documentation)'
+copyright = u'2011, Gnu Radio Developers'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = 'blah.blah'
+# The full version, including alpha/beta/rc tags.
+release = 'blah.blah.blah'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'GNURadiodoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+ ('index', 'GNURadio.tex', u'GNU Radio Documentation',
+ u'Gnu Radio Developers', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'gnuradio', u'GNU Radio Documentation',
+ [u'Gnu Radio Developers'], 1)
+]
diff --git a/docs/sphinx/source/digital/blocks.rst b/docs/sphinx/source/digital/blocks.rst
new file mode 100644
index 000000000..2ac228d4e
--- /dev/null
+++ b/docs/sphinx/source/digital/blocks.rst
@@ -0,0 +1,51 @@
+gnuradio.digital: Signal Processing Blocks
+==========================================
+
+.. autoblock:: gnuradio.digital.fll_band_edge_cc
+.. autoblock:: gnuradio.digital.kurtotic_equalizer_cc
+.. autoblock:: gnuradio.digital.lms_dd_equalizer_cc
+.. autoblock:: gnuradio.digital.mpsk_receiver_cc
+.. autoblock:: gnuradio.digital.mpsk_snr_est_cc
+.. autoblock:: gnuradio.digital.clock_recovery_mm_cc
+.. autoblock:: gnuradio.digital.clock_recovery_mm_ff
+.. autoblock:: gnuradio.digital.constellation_decoder_cb
+.. autoblock:: gnuradio.digital.constellation_receiver_cb
+.. autoblock:: gnuradio.digital.correlate_access_code_bb
+.. autoblock:: gnuradio.digital.costas_loop_cc
+.. autoblock:: gnuradio.digital.cma_equalizer_cc
+.. autoblock:: gnuradio.digital.binary_slicer_fb
+.. autoblock:: gnuradio.digital.gmskmod_bc
+.. autoblock:: gnuradio.digital.probe_mpsk_snr_est_c
+.. autoblock:: gnuradio.digital.cpmmod_bc
+.. autopyblock:: gnuradio.digital.generic_demod
+.. autopyblock:: gnuradio.digital.generic_mod
+.. autopyblock:: gnuradio.digital.bpsk.dbpsk_demod
+.. autopyblock:: gnuradio.digital.bpsk.dbpsk_mod
+.. autopyblock:: gnuradio.digital.qpsk.dqpsk_demod
+.. autopyblock:: gnuradio.digital.qpsk.dqpsk_mod
+.. autopyblock:: gnuradio.digital.gmsk.gmsk_demod
+.. autopyblock:: gnuradio.digital.gmsk.gmsk_mod
+.. autopyblock:: gnuradio.digital.bpsk.bpsk_demod
+.. autopyblock:: gnuradio.digital.bpsk.bpsk_mod
+.. autopyblock:: gnuradio.digital.psk.psk_demod
+.. autopyblock:: gnuradio.digital.psk.psk_mod
+.. autopyblock:: gnuradio.digital.qam.qam_demod
+.. autopyblock:: gnuradio.digital.qam.qam_mod
+.. autopyblock:: gnuradio.digital.qpsk.qpsk_demod
+.. autopyblock:: gnuradio.digital.qpsk.qpsk_mod
+.. autopyblock:: gnuradio.digital.cpm.cpm_mod
+.. autopyblock:: gnuradio.digital.pkt.mod_pkts
+.. autopyblock:: gnuradio.digital.pkt.demod_pkts
+.. autopyblock:: gnuradio.digital.ofdm_cyclic_prefixer
+.. autopyblock:: gnuradio.digital.ofdm_frame_acquisition
+.. autopyblock:: gnuradio.digital.ofdm_frame_sink
+.. autopyblock:: gnuradio.digital.ofdm_insert_preamble
+.. autopyblock:: gnuradio.digital.ofdm_mapper_bcv
+.. autopyblock:: gnuradio.digital.ofdm_mod
+.. autopyblock:: gnuradio.digital.ofdm_demod
+.. autopyblock:: gnuradio.digital.ofdm_receiver
+.. autopyblock:: gnuradio.digital.ofdm_sampler
+.. autopyblock:: gnuradio.digital.ofdm_sync_fixed
+.. autopyblock:: gnuradio.digital.ofdm_sync_ml
+.. autopyblock:: gnuradio.digital.ofdm_sync_pn
+.. autopyblock:: gnuradio.digital.ofdm_sync_pnac
diff --git a/docs/sphinx/source/digital/constellations.rst b/docs/sphinx/source/digital/constellations.rst
new file mode 100644
index 000000000..3fa02613a
--- /dev/null
+++ b/docs/sphinx/source/digital/constellations.rst
@@ -0,0 +1,13 @@
+gnuradio.digital: Constellations
+================================
+
+.. autofunction:: gnuradio.digital.constellation_8psk
+.. autofunction:: gnuradio.digital.constellation_bpsk
+.. autofunction:: gnuradio.digital.constellation_calcdist
+.. autofunction:: gnuradio.digital.constellation_dqpsk
+.. autofunction:: gnuradio.digital.constellation_psk
+.. autofunction:: gnuradio.digital.constellation_qpsk
+.. autofunction:: gnuradio.digital.constellation_rect
+.. autofunction:: gnuradio.digital.qpsk.qpsk_constellation
+.. autofunction:: gnuradio.digital.psk.psk_constellation
+.. autofunction:: gnuradio.digital.qam.qam_constellation
diff --git a/docs/sphinx/source/digital/index.rst b/docs/sphinx/source/digital/index.rst
new file mode 100644
index 000000000..da5227e45
--- /dev/null
+++ b/docs/sphinx/source/digital/index.rst
@@ -0,0 +1,133 @@
+gnuradio.digital
+================
+
+.. automodule:: gnuradio.digital
+
+Signal Processing Blocks
+------------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.digital.fll_band_edge_cc
+ gnuradio.digital.kurtotic_equalizer_cc
+ gnuradio.digital.lms_dd_equalizer_cc
+ gnuradio.digital.mpsk_receiver_cc
+ gnuradio.digital.mpsk_snr_est_cc
+ gnuradio.digital.clock_recovery_mm_cc
+ gnuradio.digital.clock_recovery_mm_ff
+ gnuradio.digital.constellation_decoder_cb
+ gnuradio.digital.constellation_receiver_cb
+ gnuradio.digital.correlate_access_code_bb
+ gnuradio.digital.costas_loop_cc
+ gnuradio.digital.cma_equalizer_cc
+ gnuradio.digital.binary_slicer_fb
+ gnuradio.digital.gmskmod_bc
+ gnuradio.digital.probe_mpsk_snr_est_c
+ gnuradio.digital.cpmmod_bc
+ gnuradio.digital.generic_demod
+ gnuradio.digital.generic_mod
+ gnuradio.digital.bpsk.dbpsk_demod
+ gnuradio.digital.bpsk.dbpsk_mod
+ gnuradio.digital.qpsk.dqpsk_demod
+ gnuradio.digital.qpsk.dqpsk_mod
+ gnuradio.digital.gmsk.gmsk_demod
+ gnuradio.digital.gmsk.gmsk_mod
+ gnuradio.digital.bpsk.bpsk_demod
+ gnuradio.digital.bpsk.bpsk_mod
+ gnuradio.digital.psk.psk_demod
+ gnuradio.digital.psk.psk_mod
+ gnuradio.digital.qam.qam_demod
+ gnuradio.digital.qam.qam_mod
+ gnuradio.digital.qpsk.qpsk_demod
+ gnuradio.digital.qpsk.qpsk_mod
+ gnuradio.digital.cpm.cpm_mod
+ gnuradio.digital.pkt.mod_pkts
+ gnuradio.digital.pkt.demod_pkts
+ gnuradio.digital.ofdm_cyclic_prefixer
+ gnuradio.digital.ofdm_frame_acquisition
+ gnuradio.digital.ofdm_frame_sink
+ gnuradio.digital.ofdm_insert_preamble
+ gnuradio.digital.ofdm_mapper_bcv
+ gnuradio.digital.ofdm_mod
+ gnuradio.digital.ofdm_demod
+ gnuradio.digital.ofdm_receiver
+ gnuradio.digital.ofdm_sampler
+ gnuradio.digital.ofdm_sync_fixed
+ gnuradio.digital.ofdm_sync_ml
+ gnuradio.digital.ofdm_sync_pn
+ gnuradio.digital.ofdm_sync_pnac
+
+Constellations
+--------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.digital.constellation_8psk
+ gnuradio.digital.constellation_bpsk
+ gnuradio.digital.constellation_calcdist
+ gnuradio.digital.constellation_dqpsk
+ gnuradio.digital.constellation_psk
+ gnuradio.digital.constellation_qpsk
+ gnuradio.digital.constellation_qpsk
+ gnuradio.digital.constellation_rect
+ gnuradio.digital.qpsk.qpsk_constellation
+ gnuradio.digital.psk.psk_constellation
+ gnuradio.digital.qam.qam_constellation
+
+Modulation Utilties
+-------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.digital.utils.gray_code.gray_code
+ gnuradio.digital.utils.mod_codes.GRAY_CODE
+ gnuradio.digital.utils.mod_codes.NO_CODE
+ gnuradio.digital.modulation_utils.add_type_1_constellation
+ gnuradio.digital.modulation_utils.add_type_1_demod
+ gnuradio.digital.modulation_utils.add_type_1_mod
+ gnuradio.digital.modulation_utils.type_1_constellations
+ gnuradio.digital.modulation_utils.type_1_demods
+ gnuradio.digital.modulation_utils.type_1_mods
+
+Packet Utilities
+----------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.digital.packet_utils.conv_1_0_string_to_packed_binary_string
+ gnuradio.digital.packet_utils.conv_packed_binary_string_to_1_0_string
+ gnuradio.digital.packet_utils.default_access_code
+ gnuradio.digital.packet_utils.dewhiten
+ gnuradio.digital.packet_utils.is_1_0_string
+ gnuradio.digital.packet_utils.make_header
+ gnuradio.digital.packet_utils.make_packet
+ gnuradio.digital.packet_utils.preamble
+ gnuradio.digital.packet_utils.random_mask_tuple
+ gnuradio.digital.packet_utils.random_mask_vec8
+ gnuradio.digital.packet_utils.string_to_hex_list
+ gnuradio.digital.packet_utils.unmake_packet
+ gnuradio.digital.packet_utils.whiten
+ gnuradio.digital.crc.check_crc32
+ gnuradio.digital.crc.gen_and_append_crc32
+
+OFDM Packet Utilities
+---------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.digital.ofdm_packet_utils.conv_1_0_string_to_packed_binary_string
+ gnuradio.digital.ofdm_packet_utils.conv_packed_binary_string_to_1_0_string
+ gnuradio.digital.ofdm_packet_utils.dewhiten
+ gnuradio.digital.ofdm_packet_utils.is_1_0_string
+ gnuradio.digital.ofdm_packet_utils.make_header
+ gnuradio.digital.ofdm_packet_utils.make_packet
+ gnuradio.digital.ofdm_packet_utils.random_mask_tuple
+ gnuradio.digital.ofdm_packet_utils.random_mask_vec8
+ gnuradio.digital.ofdm_packet_utils.string_to_hex_list
+ gnuradio.digital.ofdm_packet_utils.unmake_packet
+ gnuradio.digital.ofdm_packet_utils.whiten
diff --git a/docs/sphinx/source/digital/ofdm.rst b/docs/sphinx/source/digital/ofdm.rst
new file mode 100644
index 000000000..8680503f2
--- /dev/null
+++ b/docs/sphinx/source/digital/ofdm.rst
@@ -0,0 +1,14 @@
+gnuradio.digital: OFDM Packet Utilities
+=======================================
+
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.conv_1_0_string_to_packed_binary_string
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.conv_packed_binary_string_to_1_0_string
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.dewhiten
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.is_1_0_string
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.make_header
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.make_packet
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.random_mask_tuple
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.random_mask_vec8
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.string_to_hex_list
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.unmake_packet
+.. autofunction:: gnuradio.digital.ofdm_packet_utils.whiten
diff --git a/docs/sphinx/source/digital/pkt_utils.rst b/docs/sphinx/source/digital/pkt_utils.rst
new file mode 100644
index 000000000..112e103a2
--- /dev/null
+++ b/docs/sphinx/source/digital/pkt_utils.rst
@@ -0,0 +1,18 @@
+gnuradio.digital: Packet Utilities
+==================================
+
+.. autofunction:: gnuradio.digital.packet_utils.conv_1_0_string_to_packed_binary_string
+.. autofunction:: gnuradio.digital.packet_utils.conv_packed_binary_string_to_1_0_string
+.. data:: gnuradio.digital.packet_utils.default_access_code
+.. autofunction:: gnuradio.digital.packet_utils.dewhiten
+.. autofunction:: gnuradio.digital.packet_utils.is_1_0_string
+.. autofunction:: gnuradio.digital.packet_utils.make_header
+.. autofunction:: gnuradio.digital.packet_utils.make_packet
+.. data:: gnuradio.digital.packet_utils.preamble
+.. autofunction:: gnuradio.digital.packet_utils.random_mask_tuple
+.. autofunction:: gnuradio.digital.packet_utils.random_mask_vec8
+.. autofunction:: gnuradio.digital.packet_utils.string_to_hex_list
+.. autofunction:: gnuradio.digital.packet_utils.unmake_packet
+.. autofunction:: gnuradio.digital.packet_utils.whiten
+.. autofunction:: gnuradio.digital.crc.check_crc32
+.. autofunction:: gnuradio.digital.crc.gen_and_append_crc32
diff --git a/docs/sphinx/source/digital/utilities.rst b/docs/sphinx/source/digital/utilities.rst
new file mode 100644
index 000000000..7a08725a5
--- /dev/null
+++ b/docs/sphinx/source/digital/utilities.rst
@@ -0,0 +1,12 @@
+gnuradio.digital: Modulation Utilities
+======================================
+
+.. autofunction:: gnuradio.digital.utils.gray_code.gray_code
+.. data:: gnuradio.digital.utils.mod_codes.GRAY_CODE
+.. data:: gnuradio.digital.utils.mod_codes.NO_CODE
+.. autofunction:: gnuradio.digital.modulation_utils.add_type_1_constellation
+.. autofunction:: gnuradio.digital.modulation_utils.add_type_1_demod
+.. autofunction:: gnuradio.digital.modulation_utils.add_type_1_mod
+.. data:: gnuradio.digital.modulation_utils.type_1_constellations
+.. data:: gnuradio.digital.modulation_utils.type_1_demods
+.. data:: gnuradio.digital.modulation_utils.type_1_mods
diff --git a/docs/sphinx/source/eng_notation/index.rst b/docs/sphinx/source/eng_notation/index.rst
new file mode 100644
index 000000000..f457754ac
--- /dev/null
+++ b/docs/sphinx/source/eng_notation/index.rst
@@ -0,0 +1,8 @@
+gnuradio.eng_notation
+=====================
+
+.. automodule:: gnuradio.eng_notation
+
+.. autofunction:: gnuradio.eng_notation.num_to_str
+.. autofunction:: gnuradio.eng_notation.str_to_num
+
diff --git a/docs/sphinx/source/eng_option/index.rst b/docs/sphinx/source/eng_option/index.rst
new file mode 100644
index 000000000..b9119ee69
--- /dev/null
+++ b/docs/sphinx/source/eng_option/index.rst
@@ -0,0 +1,6 @@
+gnuradio.eng_option
+===================
+
+.. automodule:: gnuradio.eng_option
+
+.. autoclass:: gnuradio.eng_option.eng_option
diff --git a/docs/sphinx/source/gr/coding_blk.rst b/docs/sphinx/source/gr/coding_blk.rst
new file mode 100644
index 000000000..87196a5ae
--- /dev/null
+++ b/docs/sphinx/source/gr/coding_blk.rst
@@ -0,0 +1,11 @@
+gnuradio.gr: Information Coding and Decoding
+============================================
+
+.. autoblock:: gnuradio.gr.additive_scrambler_bb
+.. autoblock:: gnuradio.gr.descrambler_bb
+.. autoblock:: gnuradio.gr.diff_decoder_bb
+.. autoblock:: gnuradio.gr.diff_encoder_bb
+.. autoblock:: gnuradio.gr.fake_channel_encoder_pp
+.. autoblock:: gnuradio.gr.fake_channel_decoder_pp
+.. autoblock:: gnuradio.gr.map_bb
+.. autoblock:: gnuradio.gr.scrambler_bb
diff --git a/docs/sphinx/source/gr/converter_blk.rst b/docs/sphinx/source/gr/converter_blk.rst
new file mode 100644
index 000000000..b0ddd1d8a
--- /dev/null
+++ b/docs/sphinx/source/gr/converter_blk.rst
@@ -0,0 +1,32 @@
+gnuradio.gr: Type Conversions
+=============================
+
+.. autoblock:: gnuradio.gr.bytes_to_syms
+.. autoblock:: gnuradio.gr.char_to_float
+.. autoblock:: gnuradio.gr.complex_to_interleaved_short
+.. autoblock:: gnuradio.gr.complex_to_float
+.. autoblock:: gnuradio.gr.complex_to_real
+.. autoblock:: gnuradio.gr.complex_to_imag
+.. autoblock:: gnuradio.gr.complex_to_mag
+.. autoblock:: gnuradio.gr.complex_to_mag_squared
+.. autoblock:: gnuradio.gr.complex_to_arg
+.. autoblock:: gnuradio.gr.float_to_char
+.. autoblock:: gnuradio.gr.float_to_complex
+.. autoblock:: gnuradio.gr.float_to_short
+.. autoblock:: gnuradio.gr.float_to_uchar
+.. autoblock:: gnuradio.gr.interleaved_short_to_complex
+.. autoblock:: gnuradio.gr.short_to_float
+.. autoblock:: gnuradio.gr.uchar_to_float
+.. autoblock:: gnuradio.gr.unpack_k_bits_bb
+.. autoblock:: gnuradio.gr.chunks_to_symbols_bc
+.. autoblock:: gnuradio.gr.chunks_to_symbols_bf
+.. autoblock:: gnuradio.gr.chunks_to_symbols_ic
+.. autoblock:: gnuradio.gr.chunks_to_symbols_if
+.. autoblock:: gnuradio.gr.chunks_to_symbols_sc
+.. autoblock:: gnuradio.gr.chunks_to_symbols_sf
+.. autoblock:: gnuradio.gr.packed_to_unpacked_bb
+.. autoblock:: gnuradio.gr.packed_to_unpacked_ii
+.. autoblock:: gnuradio.gr.packed_to_unpacked_ss
+.. autoblock:: gnuradio.gr.unpacked_to_packed_bb
+.. autoblock:: gnuradio.gr.unpacked_to_packed_ii
+.. autoblock:: gnuradio.gr.unpacked_to_packed_ss
diff --git a/docs/sphinx/source/gr/demodulation_blk.rst b/docs/sphinx/source/gr/demodulation_blk.rst
new file mode 100644
index 000000000..e5a935434
--- /dev/null
+++ b/docs/sphinx/source/gr/demodulation_blk.rst
@@ -0,0 +1,4 @@
+gnuradio.gr: Demodulation
+=========================
+
+.. autoblock:: gnuradio.gr.quadrature_demod_cf
diff --git a/docs/sphinx/source/gr/dft_blk.rst b/docs/sphinx/source/gr/dft_blk.rst
new file mode 100644
index 000000000..a93119969
--- /dev/null
+++ b/docs/sphinx/source/gr/dft_blk.rst
@@ -0,0 +1,6 @@
+gnuradio.gr: Fourier Transform
+==============================
+
+.. autoblock:: gnuradio.gr.goertzel_fc
+.. autoblock:: gnuradio.gr.fft_vcc
+.. autoblock:: gnuradio.gr.fft_vfc
diff --git a/docs/sphinx/source/gr/filter_blk.rst b/docs/sphinx/source/gr/filter_blk.rst
new file mode 100644
index 000000000..767ee4b74
--- /dev/null
+++ b/docs/sphinx/source/gr/filter_blk.rst
@@ -0,0 +1,46 @@
+gnuradio.gr: Filters
+====================
+
+.. autoblock:: gnuradio.gr.fft_filter_ccc
+.. autoblock:: gnuradio.gr.fft_filter_fff
+.. autoblock:: gnuradio.gr.filter_delay_fc
+.. autoblock:: gnuradio.gr.fir_filter_ccc
+.. autoblock:: gnuradio.gr.fir_filter_ccf
+.. autoblock:: gnuradio.gr.fir_filter_fcc
+.. autoblock:: gnuradio.gr.fir_filter_fff
+.. autoblock:: gnuradio.gr.fir_filter_fsf
+.. autoblock:: gnuradio.gr.fir_filter_scc
+.. autoblock:: gnuradio.gr.fractional_interpolator_cc
+.. autoblock:: gnuradio.gr.fractional_interpolator_ff
+.. autoblock:: gnuradio.gr.freq_xlating_fir_filter_ccc
+.. autoblock:: gnuradio.gr.freq_xlating_fir_filter_ccf
+.. autoblock:: gnuradio.gr.freq_xlating_fir_filter_fcc
+.. autoblock:: gnuradio.gr.freq_xlating_fir_filter_fcf
+.. autoblock:: gnuradio.gr.freq_xlating_fir_filter_scc
+.. autoblock:: gnuradio.gr.freq_xlating_fir_filter_scf
+.. autoblock:: gnuradio.gr.hilbert_fc
+.. autoblock:: gnuradio.gr.iir_filter_ffd
+.. autoblock:: gnuradio.gr.interp_fir_filter_ccc
+.. autoblock:: gnuradio.gr.interp_fir_filter_ccf
+.. autoblock:: gnuradio.gr.interp_fir_filter_fcc
+.. autoblock:: gnuradio.gr.interp_fir_filter_fff
+.. autoblock:: gnuradio.gr.interp_fir_filter_fsf
+.. autoblock:: gnuradio.gr.interp_fir_filter_scc
+.. autoblock:: gnuradio.gr.rational_resampler_base_ccc
+.. autoblock:: gnuradio.gr.rational_resampler_base_ccf
+.. autoblock:: gnuradio.gr.rational_resampler_base_fcc
+.. autoblock:: gnuradio.gr.rational_resampler_base_fff
+.. autoblock:: gnuradio.gr.rational_resampler_base_fsf
+.. autoblock:: gnuradio.gr.rational_resampler_base_scc
+.. autoblock:: gnuradio.gr.single_pole_iir_filter_cc
+.. autoblock:: gnuradio.gr.single_pole_iir_filter_ff
+.. autoblock:: gnuradio.gr.moving_average_cc
+.. autoblock:: gnuradio.gr.moving_average_ff
+.. autoblock:: gnuradio.gr.moving_average_ii
+.. autoblock:: gnuradio.gr.moving_average_ss
+.. autoblock:: gnuradio.gr.pfb_arb_resampler_ccf
+.. autoblock:: gnuradio.gr.pfb_channelizer_ccf
+.. autoblock:: gnuradio.gr.pfb_clock_sync_ccf
+.. autoblock:: gnuradio.gr.pfb_clock_sync_fff
+.. autoblock:: gnuradio.gr.pfb_decimator_ccf
+.. autoblock:: gnuradio.gr.pfb_interpolator_ccf
diff --git a/docs/sphinx/source/gr/filter_design.rst b/docs/sphinx/source/gr/filter_design.rst
new file mode 100644
index 000000000..6ab23c50b
--- /dev/null
+++ b/docs/sphinx/source/gr/filter_design.rst
@@ -0,0 +1,7 @@
+gnuradio.gr: Digital Filter Design
+==================================
+
+.. autoclass:: gnuradio.gr.firdes
+ :members:
+
+.. autofunction:: gnuradio.gr.remez
diff --git a/docs/sphinx/source/gr/index.rst b/docs/sphinx/source/gr/index.rst
new file mode 100644
index 000000000..3d32599f1
--- /dev/null
+++ b/docs/sphinx/source/gr/index.rst
@@ -0,0 +1,380 @@
+gnuradio.gr
+===========
+
+.. automodule:: gnuradio.gr
+
+Signal Processing Blocks
+------------------------
+
+Top Block and Hierarchical Block Base Classes
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.top_block
+ gnuradio.gr.hier_block2
+
+Signal Sources
+^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.glfsr_source_b
+ gnuradio.gr.glfsr_source_f
+ gnuradio.gr.lfsr_32k_source_s
+ gnuradio.gr.null_source
+ gnuradio.gr.noise_source_c
+ gnuradio.gr.noise_source_f
+ gnuradio.gr.noise_source_i
+ gnuradio.gr.noise_source_s
+ gnuradio.gr.sig_source_c
+ gnuradio.gr.sig_source_f
+ gnuradio.gr.sig_source_i
+ gnuradio.gr.sig_source_s
+ gnuradio.gr.vector_source_b
+ gnuradio.gr.vector_source_c
+ gnuradio.gr.vector_source_f
+ gnuradio.gr.vector_source_i
+ gnuradio.gr.vector_source_s
+ gnuradio.gr.file_descriptor_source
+ gnuradio.gr.file_source
+ gnuradio.gr.message_source
+ gnuradio.gr.udp_source
+ gnuradio.gr.wavfile_source
+
+Signal Sinks
+^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.bin_statistics_f
+ gnuradio.gr.check_counting_s
+ gnuradio.gr.check_lfsr_32k_s
+ gnuradio.gr.framer_sink_1
+ gnuradio.gr.null_sink
+ gnuradio.gr.packet_sink
+ gnuradio.gr.probe_avg_mag_sqrd_c
+ gnuradio.gr.probe_avg_mag_sqrd_cf
+ gnuradio.gr.probe_avg_mag_sqrd_f
+ gnuradio.gr.probe_signal_f
+ gnuradio.gr.vector_sink_b
+ gnuradio.gr.vector_sink_c
+ gnuradio.gr.vector_sink_f
+ gnuradio.gr.vector_sink_i
+ gnuradio.gr.vector_sink_s
+ gnuradio.gr.file_descriptor_sink
+ gnuradio.gr.file_sink
+ gnuradio.gr.histo_sink_f
+ gnuradio.gr.message_sink
+ gnuradio.gr.oscope_sink_f
+ gnuradio.gr.udp_sink
+ gnuradio.gr.wavfile_sink
+
+Filters
+^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.fft_filter_ccc
+ gnuradio.gr.fft_filter_fff
+ gnuradio.gr.filter_delay_fc
+ gnuradio.gr.fir_filter_ccc
+ gnuradio.gr.fir_filter_ccf
+ gnuradio.gr.fir_filter_fcc
+ gnuradio.gr.fir_filter_fff
+ gnuradio.gr.fir_filter_fsf
+ gnuradio.gr.fir_filter_scc
+ gnuradio.gr.fractional_interpolator_cc
+ gnuradio.gr.fractional_interpolator_ff
+ gnuradio.gr.freq_xlating_fir_filter_ccc
+ gnuradio.gr.freq_xlating_fir_filter_ccf
+ gnuradio.gr.freq_xlating_fir_filter_fcc
+ gnuradio.gr.freq_xlating_fir_filter_fcf
+ gnuradio.gr.freq_xlating_fir_filter_scc
+ gnuradio.gr.freq_xlating_fir_filter_scf
+ gnuradio.gr.hilbert_fc
+ gnuradio.gr.iir_filter_ffd
+ gnuradio.gr.interp_fir_filter_ccc
+ gnuradio.gr.interp_fir_filter_ccf
+ gnuradio.gr.interp_fir_filter_fcc
+ gnuradio.gr.interp_fir_filter_fff
+ gnuradio.gr.interp_fir_filter_fsf
+ gnuradio.gr.interp_fir_filter_scc
+ gnuradio.gr.rational_resampler_base_ccc
+ gnuradio.gr.rational_resampler_base_ccf
+ gnuradio.gr.rational_resampler_base_fcc
+ gnuradio.gr.rational_resampler_base_fff
+ gnuradio.gr.rational_resampler_base_fsf
+ gnuradio.gr.rational_resampler_base_scc
+ gnuradio.gr.single_pole_iir_filter_cc
+ gnuradio.gr.single_pole_iir_filter_ff
+ gnuradio.gr.moving_average_cc
+ gnuradio.gr.moving_average_ff
+ gnuradio.gr.moving_average_ii
+ gnuradio.gr.moving_average_ss
+ gnuradio.gr.pfb_arb_resampler_ccf
+ gnuradio.gr.pfb_channelizer_ccf
+ gnuradio.gr.pfb_clock_sync_ccf
+ gnuradio.gr.pfb_clock_sync_fff
+ gnuradio.gr.pfb_decimator_ccf
+ gnuradio.gr.pfb_interpolator_ccf
+
+Mathematics
+^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.conjugate_cc
+ gnuradio.gr.nlog10_ff
+ gnuradio.gr.rms_cf
+ gnuradio.gr.rms_ff
+ gnuradio.gr.add_cc
+ gnuradio.gr.add_const_cc
+ gnuradio.gr.add_const_ff
+ gnuradio.gr.add_const_ii
+ gnuradio.gr.add_const_sf
+ gnuradio.gr.add_const_ss
+ gnuradio.gr.add_const_vcc
+ gnuradio.gr.add_const_vff
+ gnuradio.gr.add_const_vii
+ gnuradio.gr.add_const_vss
+ gnuradio.gr.add_ff
+ gnuradio.gr.add_ii
+ gnuradio.gr.add_ss
+ gnuradio.gr.and_bb
+ gnuradio.gr.and_const_bb
+ gnuradio.gr.and_const_ii
+ gnuradio.gr.and_const_ss
+ gnuradio.gr.and_ii
+ gnuradio.gr.and_ss
+ gnuradio.gr.divide_cc
+ gnuradio.gr.divide_ff
+ gnuradio.gr.divide_ii
+ gnuradio.gr.divide_ss
+ gnuradio.gr.integrate_cc
+ gnuradio.gr.integrate_ff
+ gnuradio.gr.integrate_ii
+ gnuradio.gr.integrate_ss
+ gnuradio.gr.multiply_cc
+ gnuradio.gr.multiply_const_cc
+ gnuradio.gr.multiply_const_ff
+ gnuradio.gr.multiply_const_ii
+ gnuradio.gr.multiply_const_ss
+ gnuradio.gr.multiply_const_vcc
+ gnuradio.gr.multiply_const_vff
+ gnuradio.gr.multiply_const_vii
+ gnuradio.gr.multiply_const_vss
+ gnuradio.gr.multiply_ff
+ gnuradio.gr.multiply_ii
+ gnuradio.gr.multiply_ss
+ gnuradio.gr.not_bb
+ gnuradio.gr.not_ii
+ gnuradio.gr.not_ss
+ gnuradio.gr.or_bb
+ gnuradio.gr.or_ii
+ gnuradio.gr.or_ss
+ gnuradio.gr.sub_cc
+ gnuradio.gr.sub_ff
+ gnuradio.gr.sub_ii
+ gnuradio.gr.sub_ss
+ gnuradio.gr.xor_bb
+ gnuradio.gr.xor_ii
+ gnuradio.gr.xor_ss
+
+Modulation
+^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.cpfsk_bc
+ gnuradio.gr.frequency_modulator_fc
+ gnuradio.gr.phase_modulator_fc
+
+Demodulation
+^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.quadrature_demod_cf
+
+Information Coding and Decoding
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.additive_scrambler_bb
+ gnuradio.gr.descrambler_bb
+ gnuradio.gr.diff_decoder_bb
+ gnuradio.gr.diff_encoder_bb
+ gnuradio.gr.fake_channel_encoder_pp
+ gnuradio.gr.fake_channel_decoder_pp
+ gnuradio.gr.map_bb
+ gnuradio.gr.scrambler_bb
+
+Synchronization
+^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.pll_carriertracking_cc
+ gnuradio.gr.pll_freqdet_cf
+ gnuradio.gr.pll_refout_cc
+ gnuradio.gr.pn_correlator_cc
+ gnuradio.gr.simple_correlator
+ gnuradio.gr.simple_framer
+
+Type Conversions
+^^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.bytes_to_syms
+ gnuradio.gr.char_to_float
+ gnuradio.gr.complex_to_interleaved_short
+ gnuradio.gr.complex_to_float
+ gnuradio.gr.complex_to_real
+ gnuradio.gr.complex_to_imag
+ gnuradio.gr.complex_to_mag
+ gnuradio.gr.complex_to_mag_squared
+ gnuradio.gr.complex_to_arg
+ gnuradio.gr.float_to_char
+ gnuradio.gr.float_to_complex
+ gnuradio.gr.float_to_short
+ gnuradio.gr.float_to_uchar
+ gnuradio.gr.interleaved_short_to_complex
+ gnuradio.gr.short_to_float
+ gnuradio.gr.uchar_to_float
+ gnuradio.gr.unpack_k_bits_bb
+ gnuradio.gr.chunks_to_symbols_bc
+ gnuradio.gr.chunks_to_symbols_bf
+ gnuradio.gr.chunks_to_symbols_ic
+ gnuradio.gr.chunks_to_symbols_if
+ gnuradio.gr.chunks_to_symbols_sc
+ gnuradio.gr.chunks_to_symbols_sf
+ gnuradio.gr.packed_to_unpacked_bb
+ gnuradio.gr.packed_to_unpacked_ii
+ gnuradio.gr.packed_to_unpacked_ss
+ gnuradio.gr.unpacked_to_packed_bb
+ gnuradio.gr.unpacked_to_packed_ii
+ gnuradio.gr.unpacked_to_packed_ss
+
+Signal Level Control (AGC)
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.agc2_cc
+ gnuradio.gr.agc2_ff
+ gnuradio.gr.agc_cc
+ gnuradio.gr.agc_ff
+ gnuradio.gr.ctcss_squelch_ff
+ gnuradio.gr.dpll_bb
+ gnuradio.gr.feedforward_agc_cc
+ gnuradio.gr.peak_detector2_fb
+ gnuradio.gr.pwr_squelch_cc
+ gnuradio.gr.pwr_squelch_ff
+ gnuradio.gr.regenerate_bb
+ gnuradio.gr.simple_squelch_cc
+ gnuradio.gr.mute_cc
+ gnuradio.gr.mute_ff
+ gnuradio.gr.mute_ii
+ gnuradio.gr.mute_ss
+ gnuradio.gr.peak_detector_fb
+ gnuradio.gr.peak_detector_ib
+ gnuradio.gr.peak_detector_sb
+ gnuradio.gr.sample_and_hold_bb
+ gnuradio.gr.sample_and_hold_ff
+ gnuradio.gr.sample_and_hold_ii
+ gnuradio.gr.sample_and_hold_ss
+
+Fourier Transform
+^^^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.goertzel_fc
+ gnuradio.gr.fft_vcc
+ gnuradio.gr.fft_vfc
+
+Miscellaneous Blocks
+^^^^^^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.copy
+ gnuradio.gr.delay
+ gnuradio.gr.kludge_copy
+ gnuradio.gr.nop
+ gnuradio.gr.pa_2x2_phase_combiner
+ gnuradio.gr.repeat
+ gnuradio.gr.threshold_ff
+ gnuradio.gr.throttle
+ gnuradio.gr.channel_model
+
+Slicing and Dicing Streams
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.deinterleave
+ gnuradio.gr.head
+ gnuradio.gr.interleave
+ gnuradio.gr.keep_one_in_n
+ gnuradio.gr.skiphead
+ gnuradio.gr.stream_to_streams
+ gnuradio.gr.stream_to_vector
+ gnuradio.gr.streams_to_stream
+ gnuradio.gr.streams_to_vector
+ gnuradio.gr.vector_to_stream
+ gnuradio.gr.vector_to_streams
+
+Digital Filter Design
+---------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.firdes
+ gnuradio.gr.remez
+
+Miscellaneous
+-------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.feval_dd
+ gnuradio.gr.feval_cc
+ gnuradio.gr.feval_ll
+ gnuradio.gr.feval
+ gnuradio.gr.prefs
+ gnuradio.gr.test
+ gnuradio.gr.message
+ gnuradio.gr.msg_queue
+ gnuradio.gr.enable_realtime_scheduling
+
+Implementation Details
+----------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr.block_detail
+ gnuradio.gr.buffer
+ gnuradio.gr.dispatcher
+ gnuradio.gr.single_threaded_scheduler
+
diff --git a/docs/sphinx/source/gr/internal.rst b/docs/sphinx/source/gr/internal.rst
new file mode 100644
index 000000000..4948b38d4
--- /dev/null
+++ b/docs/sphinx/source/gr/internal.rst
@@ -0,0 +1,7 @@
+gnuradio.gr: Implementation Details
+===================================
+
+.. autofunction:: gnuradio.gr.block_detail
+.. autofunction:: gnuradio.gr.buffer
+.. autofunction:: gnuradio.gr.dispatcher
+.. autofunction:: gnuradio.gr.single_threaded_scheduler
diff --git a/docs/sphinx/source/gr/level_blk.rst b/docs/sphinx/source/gr/level_blk.rst
new file mode 100644
index 000000000..77ba2270d
--- /dev/null
+++ b/docs/sphinx/source/gr/level_blk.rst
@@ -0,0 +1,26 @@
+gnuradio.gr: Signal Level Control (AGC)
+=======================================
+
+.. autoblock:: gnuradio.gr.agc2_cc
+.. autoblock:: gnuradio.gr.agc2_ff
+.. autoblock:: gnuradio.gr.agc_cc
+.. autoblock:: gnuradio.gr.agc_ff
+.. autoblock:: gnuradio.gr.ctcss_squelch_ff
+.. autoblock:: gnuradio.gr.dpll_bb
+.. autoblock:: gnuradio.gr.feedforward_agc_cc
+.. autoblock:: gnuradio.gr.peak_detector2_fb
+.. autoblock:: gnuradio.gr.pwr_squelch_cc
+.. autoblock:: gnuradio.gr.pwr_squelch_ff
+.. autoblock:: gnuradio.gr.regenerate_bb
+.. autoblock:: gnuradio.gr.simple_squelch_cc
+.. autoblock:: gnuradio.gr.mute_cc
+.. autoblock:: gnuradio.gr.mute_ff
+.. autoblock:: gnuradio.gr.mute_ii
+.. autoblock:: gnuradio.gr.mute_ss
+.. autoblock:: gnuradio.gr.peak_detector_fb
+.. autoblock:: gnuradio.gr.peak_detector_ib
+.. autoblock:: gnuradio.gr.peak_detector_sb
+.. autoblock:: gnuradio.gr.sample_and_hold_bb
+.. autoblock:: gnuradio.gr.sample_and_hold_ff
+.. autoblock:: gnuradio.gr.sample_and_hold_ii
+.. autoblock:: gnuradio.gr.sample_and_hold_ss
diff --git a/docs/sphinx/source/gr/math_blk.rst b/docs/sphinx/source/gr/math_blk.rst
new file mode 100644
index 000000000..a2ef51922
--- /dev/null
+++ b/docs/sphinx/source/gr/math_blk.rst
@@ -0,0 +1,59 @@
+gnuradio.gr: Mathematics
+========================
+
+.. autoblock:: gnuradio.gr.conjugate_cc
+.. autoblock:: gnuradio.gr.nlog10_ff
+.. autoblock:: gnuradio.gr.rms_cf
+.. autoblock:: gnuradio.gr.rms_ff
+.. autoblock:: gnuradio.gr.add_cc
+.. autoblock:: gnuradio.gr.add_const_cc
+.. autoblock:: gnuradio.gr.add_const_ff
+.. autoblock:: gnuradio.gr.add_const_ii
+.. autoblock:: gnuradio.gr.add_const_sf
+.. autoblock:: gnuradio.gr.add_const_ss
+.. autoblock:: gnuradio.gr.add_const_vcc
+.. autoblock:: gnuradio.gr.add_const_vff
+.. autoblock:: gnuradio.gr.add_const_vii
+.. autoblock:: gnuradio.gr.add_const_vss
+.. autoblock:: gnuradio.gr.add_ff
+.. autoblock:: gnuradio.gr.add_ii
+.. autoblock:: gnuradio.gr.add_ss
+.. autoblock:: gnuradio.gr.and_bb
+.. autoblock:: gnuradio.gr.and_const_bb
+.. autoblock:: gnuradio.gr.and_const_ii
+.. autoblock:: gnuradio.gr.and_const_ss
+.. autoblock:: gnuradio.gr.and_ii
+.. autoblock:: gnuradio.gr.and_ss
+.. autoblock:: gnuradio.gr.divide_cc
+.. autoblock:: gnuradio.gr.divide_ff
+.. autoblock:: gnuradio.gr.divide_ii
+.. autoblock:: gnuradio.gr.divide_ss
+.. autoblock:: gnuradio.gr.integrate_cc
+.. autoblock:: gnuradio.gr.integrate_ff
+.. autoblock:: gnuradio.gr.integrate_ii
+.. autoblock:: gnuradio.gr.integrate_ss
+.. autoblock:: gnuradio.gr.multiply_cc
+.. autoblock:: gnuradio.gr.multiply_const_cc
+.. autoblock:: gnuradio.gr.multiply_const_ff
+.. autoblock:: gnuradio.gr.multiply_const_ii
+.. autoblock:: gnuradio.gr.multiply_const_ss
+.. autoblock:: gnuradio.gr.multiply_const_vcc
+.. autoblock:: gnuradio.gr.multiply_const_vff
+.. autoblock:: gnuradio.gr.multiply_const_vii
+.. autoblock:: gnuradio.gr.multiply_const_vss
+.. autoblock:: gnuradio.gr.multiply_ff
+.. autoblock:: gnuradio.gr.multiply_ii
+.. autoblock:: gnuradio.gr.multiply_ss
+.. autoblock:: gnuradio.gr.not_bb
+.. autoblock:: gnuradio.gr.not_ii
+.. autoblock:: gnuradio.gr.not_ss
+.. autoblock:: gnuradio.gr.or_bb
+.. autoblock:: gnuradio.gr.or_ii
+.. autoblock:: gnuradio.gr.or_ss
+.. autoblock:: gnuradio.gr.sub_cc
+.. autoblock:: gnuradio.gr.sub_ff
+.. autoblock:: gnuradio.gr.sub_ii
+.. autoblock:: gnuradio.gr.sub_ss
+.. autoblock:: gnuradio.gr.xor_bb
+.. autoblock:: gnuradio.gr.xor_ii
+.. autoblock:: gnuradio.gr.xor_ss
diff --git a/docs/sphinx/source/gr/misc.rst b/docs/sphinx/source/gr/misc.rst
new file mode 100644
index 000000000..b0a3f3ba1
--- /dev/null
+++ b/docs/sphinx/source/gr/misc.rst
@@ -0,0 +1,12 @@
+gnuradio.gr: Miscellaneous
+==========================
+
+.. autofunction:: gnuradio.gr.feval_dd
+.. autofunction:: gnuradio.gr.feval_cc
+.. autofunction:: gnuradio.gr.feval_ll
+.. autofunction:: gnuradio.gr.feval
+.. autofunction:: gnuradio.gr.prefs
+.. autofunction:: gnuradio.gr.test
+.. autofunction:: gnuradio.gr.message
+.. autofunction:: gnuradio.gr.msg_queue
+.. autofunction:: gnuradio.gr.enable_realtime_scheduling
diff --git a/docs/sphinx/source/gr/misc_blk.rst b/docs/sphinx/source/gr/misc_blk.rst
new file mode 100644
index 000000000..f3bd2d943
--- /dev/null
+++ b/docs/sphinx/source/gr/misc_blk.rst
@@ -0,0 +1,12 @@
+gnuradio.gr: Miscellaneous Blocks
+=================================
+
+.. autoblock:: gnuradio.gr.copy
+.. autoblock:: gnuradio.gr.delay
+.. autoblock:: gnuradio.gr.kludge_copy
+.. autoblock:: gnuradio.gr.nop
+.. autoblock:: gnuradio.gr.pa_2x2_phase_combiner
+.. autoblock:: gnuradio.gr.repeat
+.. autoblock:: gnuradio.gr.threshold_ff
+.. autoblock:: gnuradio.gr.throttle
+.. autoblock:: gnuradio.gr.channel_model
diff --git a/docs/sphinx/source/gr/modulation_blk.rst b/docs/sphinx/source/gr/modulation_blk.rst
new file mode 100644
index 000000000..7cc54d9dc
--- /dev/null
+++ b/docs/sphinx/source/gr/modulation_blk.rst
@@ -0,0 +1,6 @@
+gnuradio.gr: Modulation
+=======================
+
+.. autoblock:: gnuradio.gr.cpfsk_bc
+.. autoblock:: gnuradio.gr.frequency_modulator_fc
+.. autoblock:: gnuradio.gr.phase_modulator_fc
diff --git a/docs/sphinx/source/gr/sink_blk.rst b/docs/sphinx/source/gr/sink_blk.rst
new file mode 100644
index 000000000..8e5c7a403
--- /dev/null
+++ b/docs/sphinx/source/gr/sink_blk.rst
@@ -0,0 +1,25 @@
+gnuradio.gr: Signal Sinks
+=========================
+
+.. autoblock:: gnuradio.gr.bin_statistics_f
+.. autoblock:: gnuradio.gr.check_counting_s
+.. autoblock:: gnuradio.gr.check_lfsr_32k_s
+.. autoblock:: gnuradio.gr.framer_sink_1
+.. autoblock:: gnuradio.gr.null_sink
+.. autoblock:: gnuradio.gr.packet_sink
+.. autoblock:: gnuradio.gr.probe_avg_mag_sqrd_c
+.. autoblock:: gnuradio.gr.probe_avg_mag_sqrd_cf
+.. autoblock:: gnuradio.gr.probe_avg_mag_sqrd_f
+.. autoblock:: gnuradio.gr.probe_signal_f
+.. autoblock:: gnuradio.gr.vector_sink_b
+.. autoblock:: gnuradio.gr.vector_sink_c
+.. autoblock:: gnuradio.gr.vector_sink_f
+.. autoblock:: gnuradio.gr.vector_sink_i
+.. autoblock:: gnuradio.gr.vector_sink_s
+.. autoblock:: gnuradio.gr.file_descriptor_sink
+.. autoblock:: gnuradio.gr.file_sink
+.. autoblock:: gnuradio.gr.histo_sink_f
+.. autoblock:: gnuradio.gr.message_sink
+.. autoblock:: gnuradio.gr.oscope_sink_f
+.. autoblock:: gnuradio.gr.udp_sink
+.. autoblock:: gnuradio.gr.wavfile_sink
diff --git a/docs/sphinx/source/gr/slicedice_blk.rst b/docs/sphinx/source/gr/slicedice_blk.rst
new file mode 100644
index 000000000..0bb5719ea
--- /dev/null
+++ b/docs/sphinx/source/gr/slicedice_blk.rst
@@ -0,0 +1,14 @@
+gnuradio.gr: Slicing and Dicing Streams
+=======================================
+
+.. autoblock:: gnuradio.gr.deinterleave
+.. autoblock:: gnuradio.gr.head
+.. autoblock:: gnuradio.gr.interleave
+.. autoblock:: gnuradio.gr.keep_one_in_n
+.. autoblock:: gnuradio.gr.skiphead
+.. autoblock:: gnuradio.gr.stream_to_streams
+.. autoblock:: gnuradio.gr.stream_to_vector
+.. autoblock:: gnuradio.gr.streams_to_stream
+.. autoblock:: gnuradio.gr.streams_to_vector
+.. autoblock:: gnuradio.gr.vector_to_stream
+.. autoblock:: gnuradio.gr.vector_to_streams
diff --git a/docs/sphinx/source/gr/source_blk.rst b/docs/sphinx/source/gr/source_blk.rst
new file mode 100644
index 000000000..e6e24e1b5
--- /dev/null
+++ b/docs/sphinx/source/gr/source_blk.rst
@@ -0,0 +1,26 @@
+gnuradio.gr: Signal Sources
+===========================
+
+.. autoblock:: gnuradio.gr.glfsr_source_b
+.. autoblock:: gnuradio.gr.glfsr_source_f
+.. autoblock:: gnuradio.gr.lfsr_32k_source_s
+.. autoblock:: gnuradio.gr.null_source
+.. autoblock:: gnuradio.gr.noise_source_c
+.. autoblock:: gnuradio.gr.noise_source_f
+.. autoblock:: gnuradio.gr.noise_source_i
+.. autoblock:: gnuradio.gr.noise_source_s
+.. autoblock:: gnuradio.gr.sig_source_c
+.. autoblock:: gnuradio.gr.sig_source_f
+.. autoblock:: gnuradio.gr.sig_source_i
+.. autoblock:: gnuradio.gr.sig_source_s
+.. autoblock:: gnuradio.gr.vector_source_b
+.. autoblock:: gnuradio.gr.vector_source_c
+.. autoblock:: gnuradio.gr.vector_source_f
+.. autoblock:: gnuradio.gr.vector_source_i
+.. autoblock:: gnuradio.gr.vector_source_s
+.. autoblock:: gnuradio.gr.file_descriptor_source
+.. autoblock:: gnuradio.gr.file_source
+.. autoblock:: gnuradio.gr.message_source
+.. autoblock:: gnuradio.gr.udp_source
+.. autoblock:: gnuradio.gr.wavfile_source
+
diff --git a/docs/sphinx/source/gr/sync_blk.rst b/docs/sphinx/source/gr/sync_blk.rst
new file mode 100644
index 000000000..bb2b83974
--- /dev/null
+++ b/docs/sphinx/source/gr/sync_blk.rst
@@ -0,0 +1,9 @@
+gnuradio.gr: Synchronization
+============================
+
+.. autoblock:: gnuradio.gr.pll_carriertracking_cc
+.. autoblock:: gnuradio.gr.pll_freqdet_cf
+.. autoblock:: gnuradio.gr.pll_refout_cc
+.. autoblock:: gnuradio.gr.pn_correlator_cc
+.. autoblock:: gnuradio.gr.simple_correlator
+.. autoblock:: gnuradio.gr.simple_framer
diff --git a/docs/sphinx/source/gr/top_block.rst b/docs/sphinx/source/gr/top_block.rst
new file mode 100644
index 000000000..3d4e9ef3d
--- /dev/null
+++ b/docs/sphinx/source/gr/top_block.rst
@@ -0,0 +1,7 @@
+gnuradio.gr: Top Block and Hierarchical Block Base Classes
+==========================================================
+
+.. autoclass:: gnuradio.gr.top_block
+
+.. autoclass:: gnuradio.gr.hier_block2
+
diff --git a/docs/sphinx/source/gr_unittest/index.rst b/docs/sphinx/source/gr_unittest/index.rst
new file mode 100644
index 000000000..2169a7da4
--- /dev/null
+++ b/docs/sphinx/source/gr_unittest/index.rst
@@ -0,0 +1,7 @@
+gnuradio.gr_unittest
+====================
+
+.. automodule:: gnuradio.gr_unittest
+
+.. autoclass:: gnuradio.gr_unittest.TestCase
+.. autofunction:: gnuradio.gr_unittest.run
diff --git a/docs/sphinx/source/index.rst b/docs/sphinx/source/index.rst
new file mode 100644
index 000000000..d931a0dcb
--- /dev/null
+++ b/docs/sphinx/source/index.rst
@@ -0,0 +1,75 @@
+gnuradio
+========
+
+.. automodule:: gnuradio
+
+Core Framework
+--------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.gr
+ gnuradio.digital
+ gnuradio.blks2
+ gnuradio.audio
+ gnuradio.trellis
+ gnuradio.wavelet
+ gnuradio.window
+ gnuradio.optfir
+ gnuradio.gr_unittest
+ gnuradio.qtgui
+ gnuradio.wxgui
+
+.. toctree::
+ :hidden:
+
+ gnuradio.gr <gr/index>
+ gnuradio.digital <digital/index>
+ gnuradio.blks2 <blks2/index>
+ gnuradio.audio <audio/index>
+ gnuradio.gr_unittest <gr_unittest/index>
+ gnuradio.optfir <optfir/index>
+ gnuradio.trellis <trellis/index>
+ gnuradio.wavelet <wavelet>
+ gnuradio.window <window/index>
+ gnuradio.qtgui <qtgui/index>
+ gnuradio.wxgui <wxgui/index>
+
+Utilities
+---------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.plot_data
+ gnuradio.eng_notation
+ gnuradio.eng_option
+
+.. toctree::
+ :hidden:
+
+ gnuradio.plot_data <plot_data>
+ gnuradio.eng_notation <eng_notation/index>
+ gnuradio.eng_option <eng_option/index>
+
+Framework Extensions
+--------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.atsc
+ gnuradio.noaa
+ gnuradio.pager
+ gnuradio.video_sdl
+ gnuradio.vocoder
+
+.. toctree::
+ :hidden:
+
+ gnuradio.atsc <atsc/index>
+ gnuradio.noaa <noaa>
+ gnuradio.pager <pager/index>
+ gnuradio.video_sdl <video_sdl>
+ gnuradio.vocoder <vocoder/index>
diff --git a/docs/sphinx/source/noaa.rst b/docs/sphinx/source/noaa.rst
new file mode 100644
index 000000000..06c707813
--- /dev/null
+++ b/docs/sphinx/source/noaa.rst
@@ -0,0 +1,8 @@
+gnuradio.noaa
+==============
+
+.. automodule:: gnuradio.noaa
+
+.. autoblock:: gnuradio.noaa.hrpt_decoder
+.. autoblock:: gnuradio.noaa.hrpt_deframer
+.. autoblock:: gnuradio.noaa.hrpt_pll_cf
diff --git a/docs/sphinx/source/optfir/detail.rst b/docs/sphinx/source/optfir/detail.rst
new file mode 100644
index 000000000..78807bee0
--- /dev/null
+++ b/docs/sphinx/source/optfir/detail.rst
@@ -0,0 +1,14 @@
+gnuradio.optfir
+===============
+
+.. autofunction:: gnuradio.optfir.band_pass
+.. autofunction:: gnuradio.optfir.band_reject
+.. autofunction:: gnuradio.optfir.bporder
+.. autofunction:: gnuradio.optfir.complex_band_pass
+.. autofunction:: gnuradio.optfir.high_pass
+.. autofunction:: gnuradio.optfir.low_pass
+.. autofunction:: gnuradio.optfir.lporder
+.. autofunction:: gnuradio.optfir.passband_ripple_to_dev
+.. autofunction:: gnuradio.optfir.remez
+.. autofunction:: gnuradio.optfir.remezord
+.. autofunction:: gnuradio.optfir.stopband_atten_to_dev
diff --git a/docs/sphinx/source/optfir/index.rst b/docs/sphinx/source/optfir/index.rst
new file mode 100644
index 000000000..f49b01a1f
--- /dev/null
+++ b/docs/sphinx/source/optfir/index.rst
@@ -0,0 +1,19 @@
+gnuradio.optfir
+===============
+
+.. automodule:: gnuradio.optfir
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.optfir.band_pass
+ gnuradio.optfir.band_reject
+ gnuradio.optfir.bporder
+ gnuradio.optfir.complex_band_pass
+ gnuradio.optfir.high_pass
+ gnuradio.optfir.low_pass
+ gnuradio.optfir.lporder
+ gnuradio.optfir.passband_ripple_to_dev
+ gnuradio.optfir.remez
+ gnuradio.optfir.remezord
+ gnuradio.optfir.stopband_atten_to_dev
diff --git a/docs/sphinx/source/pager/blks.rst b/docs/sphinx/source/pager/blks.rst
new file mode 100644
index 000000000..9b5a2ca70
--- /dev/null
+++ b/docs/sphinx/source/pager/blks.rst
@@ -0,0 +1,9 @@
+gnuradio.pager: Signal Processing Blocks
+========================================
+
+.. autoblock:: gnuradio.pager.flex_deinterleave
+.. autopyblock:: gnuradio.pager.flex_demod
+.. autoblock:: gnuradio.pager.flex_frame
+.. autoblock:: gnuradio.pager.flex_parse
+.. autoblock:: gnuradio.pager.flex_sync
+.. autoblock:: gnuradio.pager.slicer_fb
diff --git a/docs/sphinx/source/pager/index.rst b/docs/sphinx/source/pager/index.rst
new file mode 100644
index 000000000..36df48451
--- /dev/null
+++ b/docs/sphinx/source/pager/index.rst
@@ -0,0 +1,23 @@
+gnuradio.pager
+==============
+
+.. automodule:: gnuradio.pager
+
+Signal Processing Blocks
+------------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.pager.flex_deinterleave
+ gnuradio.pager.flex_demod
+ gnuradio.pager.flex_frame
+ gnuradio.pager.flex_parse
+ gnuradio.pager.flex_sync
+ gnuradio.pager.pager_flex_frame
+ gnuradio.pager.slicer_fb
+
+Utility Functions
+-----------------
+
+.. autofunction:: gnuradio.pager.queue_runner
diff --git a/docs/sphinx/source/plot_data.rst b/docs/sphinx/source/plot_data.rst
new file mode 100644
index 000000000..1b52a083c
--- /dev/null
+++ b/docs/sphinx/source/plot_data.rst
@@ -0,0 +1,6 @@
+gnuradio.plot_data
+==================
+
+.. automodule:: gnuradio.plot_data
+
+.. autoclass:: gnuradio.plot_data.plot_data
diff --git a/docs/sphinx/source/pyqt_filter.rst b/docs/sphinx/source/pyqt_filter.rst
new file mode 100644
index 000000000..cc52abfa7
--- /dev/null
+++ b/docs/sphinx/source/pyqt_filter.rst
@@ -0,0 +1,6 @@
+gnuradio.pyqt_filter
+====================
+
+.. automodule:: gnuradio.pyqt_filter
+
+.. autoclass:: gnuradio.pyqt_filter.Ui_MainWindow
diff --git a/docs/sphinx/source/pyqt_plot.rst b/docs/sphinx/source/pyqt_plot.rst
new file mode 100644
index 000000000..3537a080b
--- /dev/null
+++ b/docs/sphinx/source/pyqt_plot.rst
@@ -0,0 +1,6 @@
+gnuradio.pyqt_plot
+==================
+
+.. automodule:: gnuradio.pyqt_plot
+
+.. autoclass:: gnuradio.pyqt_plot.Ui_MainWindow
diff --git a/docs/sphinx/source/qtgui/index.rst b/docs/sphinx/source/qtgui/index.rst
new file mode 100644
index 000000000..c6311d381
--- /dev/null
+++ b/docs/sphinx/source/qtgui/index.rst
@@ -0,0 +1,9 @@
+gnuradio.qtgui
+==============
+
+.. automodule:: gnuradio.qtgui
+
+.. autoblock:: gnuradio.qtgui.sink_c
+.. autoblock:: gnuradio.qtgui.sink_f
+.. autoblock:: gnuradio.qtgui.time_sink_c
+.. autoblock:: gnuradio.qtgui.time_sink_f
diff --git a/docs/sphinx/source/trellis/blks.rst b/docs/sphinx/source/trellis/blks.rst
new file mode 100644
index 000000000..a2eda07d6
--- /dev/null
+++ b/docs/sphinx/source/trellis/blks.rst
@@ -0,0 +1,62 @@
+gnuradio.trellis: Signal Processing Blocks
+==========================================
+
+.. autoblock:: gnuradio.trellis.constellation_metrics_cf
+.. autoblock:: gnuradio.trellis.encoder_bb
+.. autoblock:: gnuradio.trellis.encoder_bi
+.. autoblock:: gnuradio.trellis.encoder_bs
+.. autoblock:: gnuradio.trellis.encoder_ii
+.. autoblock:: gnuradio.trellis.encoder_si
+.. autoblock:: gnuradio.trellis.encoder_ss
+.. autoblock:: gnuradio.trellis.metrics_c
+.. autoblock:: gnuradio.trellis.metrics_f
+.. autoblock:: gnuradio.trellis.metrics_i
+.. autoblock:: gnuradio.trellis.metrics_s
+.. autoblock:: gnuradio.trellis.pccc_decoder_b
+.. autoblock:: gnuradio.trellis.pccc_decoder_combined_cb
+.. autoblock:: gnuradio.trellis.pccc_decoder_combined_ci
+.. autoblock:: gnuradio.trellis.pccc_decoder_combined_cs
+.. autoblock:: gnuradio.trellis.pccc_decoder_combined_fb
+.. autoblock:: gnuradio.trellis.pccc_decoder_combined_fi
+.. autoblock:: gnuradio.trellis.pccc_decoder_combined_fs
+.. autoblock:: gnuradio.trellis.pccc_decoder_i
+.. autoblock:: gnuradio.trellis.pccc_decoder_s
+.. autoblock:: gnuradio.trellis.pccc_encoder_bb
+.. autoblock:: gnuradio.trellis.pccc_encoder_bi
+.. autoblock:: gnuradio.trellis.pccc_encoder_bs
+.. autoblock:: gnuradio.trellis.pccc_encoder_ii
+.. autoblock:: gnuradio.trellis.pccc_encoder_si
+.. autoblock:: gnuradio.trellis.pccc_encoder_ss
+.. autoblock:: gnuradio.trellis.permutation
+.. autoblock:: gnuradio.trellis.sccc_decoder_b
+.. autoblock:: gnuradio.trellis.sccc_decoder_combined_cb
+.. autoblock:: gnuradio.trellis.sccc_decoder_combined_ci
+.. autoblock:: gnuradio.trellis.sccc_decoder_combined_cs
+.. autoblock:: gnuradio.trellis.sccc_decoder_combined_fb
+.. autoblock:: gnuradio.trellis.sccc_decoder_combined_fi
+.. autoblock:: gnuradio.trellis.sccc_decoder_combined_fs
+.. autoblock:: gnuradio.trellis.sccc_decoder_i
+.. autoblock:: gnuradio.trellis.sccc_decoder_s
+.. autoblock:: gnuradio.trellis.sccc_encoder_bb
+.. autoblock:: gnuradio.trellis.sccc_encoder_bi
+.. autoblock:: gnuradio.trellis.sccc_encoder_bs
+.. autoblock:: gnuradio.trellis.sccc_encoder_ii
+.. autoblock:: gnuradio.trellis.sccc_encoder_si
+.. autoblock:: gnuradio.trellis.sccc_encoder_ss
+.. autoblock:: gnuradio.trellis.siso_combined_f
+.. autoblock:: gnuradio.trellis.siso_f
+.. autoblock:: gnuradio.trellis.viterbi_b
+.. autoblock:: gnuradio.trellis.viterbi_combined_cb
+.. autoblock:: gnuradio.trellis.viterbi_combined_ci
+.. autoblock:: gnuradio.trellis.viterbi_combined_cs
+.. autoblock:: gnuradio.trellis.viterbi_combined_fb
+.. autoblock:: gnuradio.trellis.viterbi_combined_fi
+.. autoblock:: gnuradio.trellis.viterbi_combined_fs
+.. autoblock:: gnuradio.trellis.viterbi_combined_ib
+.. autoblock:: gnuradio.trellis.viterbi_combined_ii
+.. autoblock:: gnuradio.trellis.viterbi_combined_is
+.. autoblock:: gnuradio.trellis.viterbi_combined_sb
+.. autoblock:: gnuradio.trellis.viterbi_combined_si
+.. autoblock:: gnuradio.trellis.viterbi_combined_ss
+.. autoblock:: gnuradio.trellis.viterbi_i
+.. autoblock:: gnuradio.trellis.viterbi_s
diff --git a/docs/sphinx/source/trellis/index.rst b/docs/sphinx/source/trellis/index.rst
new file mode 100644
index 000000000..8a451a913
--- /dev/null
+++ b/docs/sphinx/source/trellis/index.rst
@@ -0,0 +1,90 @@
+gnuradio.trellis
+================
+
+.. automodule:: gnuradio.trellis
+
+Object Classes
+--------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.trellis.fsm
+ gnuradio.trellis.interleaver
+
+Signal Processing Blocks
+------------------------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.trellis.constellation_metrics_cf
+ gnuradio.trellis.encoder_bb
+ gnuradio.trellis.encoder_bi
+ gnuradio.trellis.encoder_bs
+ gnuradio.trellis.encoder_ii
+ gnuradio.trellis.encoder_si
+ gnuradio.trellis.encoder_ss
+ gnuradio.trellis.metrics_c
+ gnuradio.trellis.metrics_f
+ gnuradio.trellis.metrics_i
+ gnuradio.trellis.metrics_s
+ gnuradio.trellis.pccc_decoder_b
+ gnuradio.trellis.pccc_decoder_combined_cb
+ gnuradio.trellis.pccc_decoder_combined_ci
+ gnuradio.trellis.pccc_decoder_combined_cs
+ gnuradio.trellis.pccc_decoder_combined_fb
+ gnuradio.trellis.pccc_decoder_combined_fi
+ gnuradio.trellis.pccc_decoder_combined_fs
+ gnuradio.trellis.pccc_decoder_i
+ gnuradio.trellis.pccc_decoder_s
+ gnuradio.trellis.pccc_encoder_bb
+ gnuradio.trellis.pccc_encoder_bi
+ gnuradio.trellis.pccc_encoder_bs
+ gnuradio.trellis.pccc_encoder_ii
+ gnuradio.trellis.pccc_encoder_si
+ gnuradio.trellis.pccc_encoder_ss
+ gnuradio.trellis.permutation
+ gnuradio.trellis.sccc_decoder_b
+ gnuradio.trellis.sccc_decoder_combined_cb
+ gnuradio.trellis.sccc_decoder_combined_ci
+ gnuradio.trellis.sccc_decoder_combined_cs
+ gnuradio.trellis.sccc_decoder_combined_fb
+ gnuradio.trellis.sccc_decoder_combined_fi
+ gnuradio.trellis.sccc_decoder_combined_fs
+ gnuradio.trellis.sccc_decoder_i
+ gnuradio.trellis.sccc_decoder_s
+ gnuradio.trellis.sccc_encoder_bb
+ gnuradio.trellis.sccc_encoder_bi
+ gnuradio.trellis.sccc_encoder_bs
+ gnuradio.trellis.sccc_encoder_ii
+ gnuradio.trellis.sccc_encoder_si
+ gnuradio.trellis.sccc_encoder_ss
+ gnuradio.trellis.siso_combined_f
+ gnuradio.trellis.siso_f
+ gnuradio.trellis.viterbi_b
+ gnuradio.trellis.viterbi_combined_cb
+ gnuradio.trellis.viterbi_combined_ci
+ gnuradio.trellis.viterbi_combined_cs
+ gnuradio.trellis.viterbi_combined_fb
+ gnuradio.trellis.viterbi_combined_fi
+ gnuradio.trellis.viterbi_combined_fs
+ gnuradio.trellis.viterbi_combined_ib
+ gnuradio.trellis.viterbi_combined_ii
+ gnuradio.trellis.viterbi_combined_is
+ gnuradio.trellis.viterbi_combined_sb
+ gnuradio.trellis.viterbi_combined_si
+ gnuradio.trellis.viterbi_combined_ss
+ gnuradio.trellis.viterbi_i
+ gnuradio.trellis.viterbi_s
+
+Constants
+---------
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.trellis.TRELLIS_MIN_SUM
+ gnuradio.trellis.TRELLIS_SUM_PRODUCT
+
+
diff --git a/docs/sphinx/source/trellis/objs.rst b/docs/sphinx/source/trellis/objs.rst
new file mode 100644
index 000000000..b3a4b7a4a
--- /dev/null
+++ b/docs/sphinx/source/trellis/objs.rst
@@ -0,0 +1,5 @@
+gnuradio.trellis: Object Classes
+--------------------------------
+
+.. autoclass:: gnuradio.trellis.fsm
+.. autoclass:: gnuradio.trellis.interleaver
diff --git a/docs/sphinx/source/video_sdl.rst b/docs/sphinx/source/video_sdl.rst
new file mode 100644
index 000000000..e4fc5acac
--- /dev/null
+++ b/docs/sphinx/source/video_sdl.rst
@@ -0,0 +1,7 @@
+gnuradio.video_sdl
+==================
+
+.. automodule:: gnuradio.video_sdl
+
+.. autoblock:: gnuradio.video_sdl.sink_s
+.. autoblock:: gnuradio.video_sdl.sink_uc
diff --git a/docs/sphinx/source/vocoder/blks.rst b/docs/sphinx/source/vocoder/blks.rst
new file mode 100644
index 000000000..ea20bc44b
--- /dev/null
+++ b/docs/sphinx/source/vocoder/blks.rst
@@ -0,0 +1,19 @@
+gnuradio.vocoder
+================
+
+.. autoblock:: gnuradio.vocoder.alaw_decode_bs
+.. autoblock:: gnuradio.vocoder.alaw_encode_sb
+.. autoblock:: gnuradio.vocoder.codec2_decode_ps
+.. autoblock:: gnuradio.vocoder.codec2_encode_sp
+.. autoblock:: gnuradio.vocoder.cvsd_decode_bs
+.. autoblock:: gnuradio.vocoder.cvsd_encode_sb
+.. autoblock:: gnuradio.vocoder.g721_decode_bs
+.. autoblock:: gnuradio.vocoder.g721_encode_sb
+.. autoblock:: gnuradio.vocoder.g723_24_decode_bs
+.. autoblock:: gnuradio.vocoder.g723_24_encode_sb
+.. autoblock:: gnuradio.vocoder.g723_40_decode_bs
+.. autoblock:: gnuradio.vocoder.g723_40_encode_sb
+.. autoblock:: gnuradio.vocoder.gsm_fr_decode_ps
+.. autoblock:: gnuradio.vocoder.gsm_fr_encode_sp
+.. autoblock:: gnuradio.vocoder.ulaw_decode_bs
+.. autoblock:: gnuradio.vocoder.ulaw_encode_sb
diff --git a/docs/sphinx/source/vocoder/index.rst b/docs/sphinx/source/vocoder/index.rst
new file mode 100644
index 000000000..2e3180995
--- /dev/null
+++ b/docs/sphinx/source/vocoder/index.rst
@@ -0,0 +1,26 @@
+gnuradio.vocoder
+================
+
+.. automodule:: gnuradio.vocoder
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.vocoder.alaw_decode_bs
+ gnuradio.vocoder.alaw_encode_sb
+ gnuradio.vocoder.codec2_decode_ps
+ gnuradio.vocoder.codec2_encode_sp
+ gnuradio.vocoder.cvsd_decode_bf
+ gnuradio.vocoder.cvsd_decode_bs
+ gnuradio.vocoder.cvsd_encode_fb
+ gnuradio.vocoder.cvsd_encode_sb
+ gnuradio.vocoder.g721_decode_bs
+ gnuradio.vocoder.g721_encode_sb
+ gnuradio.vocoder.g723_24_decode_bs
+ gnuradio.vocoder.g723_24_encode_sb
+ gnuradio.vocoder.g723_40_decode_bs
+ gnuradio.vocoder.g723_40_encode_sb
+ gnuradio.vocoder.gsm_fr_decode_ps
+ gnuradio.vocoder.gsm_fr_encode_sp
+ gnuradio.vocoder.ulaw_decode_bs
+ gnuradio.vocoder.ulaw_encode_sb
diff --git a/docs/sphinx/source/wavelet.rst b/docs/sphinx/source/wavelet.rst
new file mode 100644
index 000000000..679bab70c
--- /dev/null
+++ b/docs/sphinx/source/wavelet.rst
@@ -0,0 +1,8 @@
+gnuradio.wavelet
+================
+
+.. automodule:: gnuradio.wavelet
+
+.. autoblock:: gnuradio.wavelet.squash_ff
+.. autoblock:: gnuradio.wavelet.wavelet_ff
+.. autoblock:: gnuradio.wavelet.wvps_ff
diff --git a/docs/sphinx/source/window/detail.rst b/docs/sphinx/source/window/detail.rst
new file mode 100644
index 000000000..7222a0cb4
--- /dev/null
+++ b/docs/sphinx/source/window/detail.rst
@@ -0,0 +1,20 @@
+gnuradio.window
+===============
+
+.. autofunction:: gnuradio.window.bartlett
+.. autofunction:: gnuradio.window.blackman2
+.. autofunction:: gnuradio.window.blackman3
+.. autofunction:: gnuradio.window.blackman4
+.. autofunction:: gnuradio.window.blackmanharris
+.. autofunction:: gnuradio.window.coswindow
+.. autofunction:: gnuradio.window.exponential
+.. autofunction:: gnuradio.window.flattop
+.. autofunction:: gnuradio.window.hamming
+.. autofunction:: gnuradio.window.hanning
+.. autofunction:: gnuradio.window.kaiser
+.. autofunction:: gnuradio.window.nuttall
+.. autofunction:: gnuradio.window.nuttall_cfd
+.. autofunction:: gnuradio.window.parzen
+.. autofunction:: gnuradio.window.rectangular
+.. autofunction:: gnuradio.window.riemann
+.. autofunction:: gnuradio.window.welch
diff --git a/docs/sphinx/source/window/index.rst b/docs/sphinx/source/window/index.rst
new file mode 100644
index 000000000..6ecfea0e9
--- /dev/null
+++ b/docs/sphinx/source/window/index.rst
@@ -0,0 +1,25 @@
+gnuradio.window
+===============
+
+.. automodule:: gnuradio.window
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.window.bartlett
+ gnuradio.window.blackman2
+ gnuradio.window.blackman3
+ gnuradio.window.blackman4
+ gnuradio.window.blackmanharris
+ gnuradio.window.coswindow
+ gnuradio.window.exponential
+ gnuradio.window.flattop
+ gnuradio.window.hamming
+ gnuradio.window.hanning
+ gnuradio.window.kaiser
+ gnuradio.window.nuttall
+ gnuradio.window.nuttall_cfd
+ gnuradio.window.parzen
+ gnuradio.window.rectangular
+ gnuradio.window.riemann
+ gnuradio.window.welch
diff --git a/docs/sphinx/source/wxgui/blks.rst b/docs/sphinx/source/wxgui/blks.rst
new file mode 100644
index 000000000..c304ea0a8
--- /dev/null
+++ b/docs/sphinx/source/wxgui/blks.rst
@@ -0,0 +1,13 @@
+gnuradio.wxgui
+=====================
+
+.. autopyblock:: gnuradio.wxgui.constsink_gl.const_sink_c
+.. autopyblock:: gnuradio.wxgui.fftsink2.fft_sink_c
+.. autopyblock:: gnuradio.wxgui.fftsink2.fft_sink_f
+.. autopyblock:: gnuradio.wxgui.histosink_gl.histo_sink_f
+.. autopyblock:: gnuradio.wxgui.numbersink2.number_sink_c
+.. autopyblock:: gnuradio.wxgui.numbersink2.number_sink_f
+.. autopyblock:: gnuradio.wxgui.scopesink2.scope_sink_c
+.. autopyblock:: gnuradio.wxgui.scopesink2.scope_sink_f
+.. autopyblock:: gnuradio.wxgui.waterfallsink2.waterfall_sink_c
+.. autopyblock:: gnuradio.wxgui.waterfallsink2.waterfall_sink_f
diff --git a/docs/sphinx/source/wxgui/index.rst b/docs/sphinx/source/wxgui/index.rst
new file mode 100644
index 000000000..f3fa4f337
--- /dev/null
+++ b/docs/sphinx/source/wxgui/index.rst
@@ -0,0 +1,18 @@
+gnuradio.wxgui
+==============
+
+.. automodule:: gnuradio.wxgui
+
+.. autosummary::
+ :nosignatures:
+
+ gnuradio.wxgui.common.const_sink_c
+ gnuradio.wxgui.fftsink2.fft_sink_c
+ gnuradio.wxgui.fftsink2.fft_sink_f
+ gnuradio.wxgui.histosink_gl.histosink_f
+ gnuradio.wxgui.numbersink2.number_sink_c
+ gnuradio.wxgui.numbersink2.number_sink_f
+ gnuradio.wxgui.scopesink2.scope_sink_c
+ gnuradio.wxgui.scopesink2.scope_sink_f
+ gnuradio.wxgui.waterfallsink2.waterfall_sink_c
+ gnuradio.wxgui.waterfallsink2.waterfall_sink_f