[Reproducible-commits] [epydoc] 02/02: add debian dir

Sascha Steinbiss sascha at steinbiss.name
Mon May 30 23:21:05 UTC 2016


This is an automated email from the git hooks/post-receive script.

sascha-guest pushed a commit to branch master
in repository epydoc.

commit 99da0b1d22421e8de041f0235d543fb2acc30a71
Author: Sascha Steinbiss <sascha at steinbiss.name>
Date:   Mon May 30 23:19:03 2016 +0000

    add debian dir
---
 debian/README.Debian                               |  50 +++
 debian/changelog                                   | 493 +++++++++++++++++++++
 debian/compat                                      |   1 +
 debian/control                                     |  47 ++
 debian/copyright                                   |  47 ++
 debian/epydoc-doc.doc-base                         |  10 +
 debian/epydoc-doc.docs                             |   2 +
 debian/patches/build-time.patch                    | 101 +++++
 debian/patches/deterministic-sort.patch            |  50 +++
 debian/patches/handle-docutils-0.6.patch           |  47 ++
 debian/patches/hide-memory-addresses.patch         |  44 ++
 debian/patches/lintian.patch                       |  20 +
 debian/patches/manpages.patch                      | 214 +++++++++
 debian/patches/mention-debian.patch                |  12 +
 debian/patches/python26-tokenizer.patch            |  65 +++
 debian/patches/remove-shebang.patch                |  10 +
 debian/patches/series                              |  12 +
 debian/patches/source-date.patch                   | 117 +++++
 debian/patches/special-latex-entries.patch         |  20 +
 debian/patches/string-exceptions.patch             |  18 +
 debian/python-epydoc.dirs                          |   2 +
 debian/python-epydoc.docs                          |   1 +
 debian/python-epydoc.install                       |   3 +
 debian/python-epydoc.manpages                      |   2 +
 debian/python-epydoc.preinst                       |  14 +
 debian/rules                                       |  22 +
 debian/smoketest                                   |  52 +++
 debian/source/format                               |   1 +
 debian/source/include-binaries                     |   1 +
 debian/tests/control                               |   4 +
 .../data/htmldocs/expected/output/api-objects.txt  |  12 +
 .../data/htmldocs/expected/output/class-tree.html  | 131 ++++++
 .../tests/data/htmldocs/expected/output/crarr.png  | Bin 0 -> 340 bytes
 .../tests/data/htmldocs/expected/output/epydoc.css | 322 ++++++++++++++
 .../tests/data/htmldocs/expected/output/epydoc.js  | 293 ++++++++++++
 .../data/htmldocs/expected/output/frames.html      |  17 +
 .../tests/data/htmldocs/expected/output/help.html  | 278 ++++++++++++
 .../htmldocs/expected/output/identifier-index.html | 224 ++++++++++
 .../tests/data/htmldocs/expected/output/index.html |  17 +
 .../data/htmldocs/expected/output/module-tree.html | 119 +++++
 .../data/htmldocs/expected/output/redirect.html    |  38 ++
 .../expected/output/testpackage-module.html        | 174 ++++++++
 .../expected/output/testpackage-pysrc.html         | 134 ++++++
 .../expected/output/testpackage.util-module.html   | 325 ++++++++++++++
 .../expected/output/testpackage.util-pysrc.html    | 196 ++++++++
 .../output/testpackage.util.FirstClass-class.html  | 313 +++++++++++++
 .../testpackage.util._SecondClass-class.html       | 250 +++++++++++
 .../htmldocs/expected/output/toc-everything.html   |  44 ++
 .../expected/output/toc-testpackage-module.html    |  33 ++
 .../output/toc-testpackage.util-module.html        |  41 ++
 .../tests/data/htmldocs/expected/output/toc.html   |  34 ++
 debian/tests/data/htmldocs/testpackage/__init__.py |  15 +
 debian/tests/data/htmldocs/testpackage/util.py     |  76 ++++
 debian/tests/htmldocs                              |  80 ++++
 debian/watch                                       |   4 +
 55 files changed, 4652 insertions(+)

diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..914d867
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,50 @@
+OPTIONAL PACKAGES
+
+The epydoc command requires the texlive-latex-extra package to use the --dvi
+and --ps options, and also requires the gs-common package to use the --pdf
+option.  The epydocgui command requires the python-tk package.  All of these
+optional packages are Recommended in the package dependencies.  
+
+The other recommended packages are listed because without them, the install
+process doesn't proceed cleanly -- extra old tetex packages get pulled in and I
+get a mixed system with both tetex and texlive dependencies.
+
+The texlive-latex-extra package is huge, and I wish I could Recommend the
+texlive-latex-base package instead.  However, the LaTeX that Epydoc generates
+includes \usepackage directives for packages such as 'multirow', which are
+available only in texlive-latex-extra and *not* texlive-latex-base.
+
+
+OBSOLETE PACKAGES
+
+As of version 2.0-2, all scripts, manpages and Python modules are part of the
+python-epydoc package only.  The python2.1-epydoc, python2.2-epydoc and
+python2.3-eypdoc binary packages (which are no longer even built) can be
+removed from your system at any time.  They existed only to allow for a smooth
+upgrade from earlier packages prior to version 2.0-2.
+
+
+IMPORTING EPYDOC MODULES
+
+The epydoc Python package is installed as a public package by the
+dh_python2 infrastructure.  This means that you can import epydoc
+modules directly from any "current" version of Python (whatever Debian policy
+defines as current, which as of this writing is Python 2.6 and Python 2.7).
+
+
+$PYTHONVER NO LONGER SUPPORTED
+
+Older versions of this Debian package (prior to 2.1-11, when the conversion
+to python-support happened) allowed usage of $PYTHONVER on the command-line to
+specify which version of Python the epydoc code should be executed with.
+Unfortunately, under the new Debian python policy, there is no good way to
+accomplish this any more -- not that the previous way I handled it was all that
+pretty, either.
+
+If you want to run epydoc from the command-line with some version of Python
+other than the default one (/usr/bin/python), then just copy the
+/usr/bin/epydoc script and edit it to your liking.  You'll probably just invoke
+the script with a different interpreter.  Note: this has to be an interpreter
+supported by the Python infrastructure -- it can't be some arbitrary
+interpreter on your system.
+
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..532409f
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,493 @@
+epydoc (3.0.1+dfsg-12) unstable; urgency=medium
+
+  * Rename honour_source_date_epoch.patch to source-date.patch
+  * Adjust build-time.patch so comments are more consistent with other patches.
+  * Adjust source-date.patch so comments are more consistent with other patches.
+  * Add new patch deterministic-sort.patch (closes: #795835).
+    - This is a request from the Reproducible Builds project
+    - This patch makes class and modules ordering predictable
+  * Add new patch hide-memory-addresses.patch (closes: #795826).
+    - This is a request from the Reproducible Builds project
+    - This patch fixes __repr__ so memory addresses don't appear in docs
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon, 17 Aug 2015 21:01:13 -0500
+
+epydoc (3.0.1+dfsg-11) unstable; urgency=medium
+
+  * Remove diffutils from build deps; not necessary because it's essential.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Tue, 11 Aug 2015 18:12:45 -0500
+
+epydoc (3.0.1+dfsg-10) unstable; urgency=medium
+
+  * Add support for the Debian continuous integration environment.
+    - Update debian/control to list Testsuite: autopkgtest
+    - Add debian/tests/control to list tests for CI environment
+    - Update debian/rules to run smoke tests via debian/smoketest
+    - Add build deps on diffutils to support the smoke tests
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Tue, 11 Aug 2015 20:28:07 +0000
+
+epydoc (3.0.1+dfsg-9) unstable; urgency=medium
+
+  * Fix all patches to eliminate the unnecessary leading # character.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Wed, 05 Aug 2015 13:53:49 -0500
+
+epydoc (3.0.1+dfsg-8) unstable; urgency=medium
+
+  * Add patches/honour_source_date_epoch.patch (closes: #790899)
+    - This is a request from the Reproducible Builds project
+    - The new patch adds support for SOURCE_DATE_EPOCH to generate timestamps.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 12 Jul 2015 15:37:33 +0000
+
+epydoc (3.0.1+dfsg-7) unstable; urgency=medium
+
+  * Update Recommends and Suggests for both python-epydoc and epydoc-doc.
+    - epydoc-doc: Recommend the chromium browser rather than iceweasel, since
+      that is the browser I test with day-to-day. 
+    - python-epydoc: move ghostscript and texlive dependencies to Suggests to
+      reduce the minimum install size for typical users (texlive is huge).
+  * Update the Description for python-epydoc.
+    - Update the description to indicate that suggested dependencies must be
+      installed to generate documentation in DVI, PostScript, or PDF format
+      using the LaTeX formatter.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 10 May 2015 16:57:28 +0000
+
+epydoc (3.0.1+dfsg-6) unstable; urgency=medium
+
+  * Bump standards version to 3.9.6.1 (no packaging changes).
+  * Update debian/copyright to list 2015 as the copyright date on my changes.
+  * Add dh-python to Build-Depends, to silence build-time warning.
+  * Add patches/build-time.patch (closes: #783326).
+    - This is a request from the Reproducible Builds project
+    - The new patch adds a new --no-include-build-time command-line option
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Tue, 28 Apr 2015 13:18:13 +0000
+
+epydoc (3.0.1+dfsg-5) unstable; urgency=medium
+
+  * Fix Lintian bug in debian/copyright: empty-short-license-in-dep5-copyright.
+  * Bump standards version to 3.9.6.0 (no packaging changes).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Fri, 03 Oct 2014 19:52:32 +0000
+
+epydoc (3.0.1+dfsg-4) unstable; urgency=low
+
+  * Bump standards version to 3.9.5.0 (no packaging changes).
+  * Fix Lintian warning privacy-breach-logo for doc/index.html.
+    - Add new patch patches/lintian.patch
+    - Remove <IMG src="http://sourceforge.net/sflogo.php?group_id=32455&type=1">
+    - Replace with simple text "SourceForge", with no privacy implications
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 23 Feb 2014 09:39:10 -0600
+
+epydoc (3.0.1+dfsg-3) unstable; urgency=low
+
+  * Convert debian/rules to debhelper7, overriding just a few standard targets.
+  * Update debian/README.debian to use dh_python2 rather than python-support.
+  * Modify debian/python-epydoc.dirs to properly use usr/share/pyshared.
+  * Update debian/copyright to list 2013 as the copyright date on my changes.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Wed, 24 Apr 2013 16:35:13 +0000
+
+epydoc (3.0.1+dfsg-2) unstable; urgency=low
+
+  * Bump standards version to 3.9.4.0; no packaging changes.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon, 31 Dec 2012 18:41:53 +0000
+
+epydoc (3.0.1+dfsg-1) unstable; urgency=low
+
+  * Package a new DFSG-free upstream tarball (closes: #692733).
+    - The new tarball removes non-free doc/pycon-epydoc.html
+    - Remove debian/patches/remove-cc-by-nc-sa.patch; no longer needed
+    - Add opts=dversionmangle in debian/watch per Lintian recommendation
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sat, 10 Nov 2012 16:04:44 +0000
+
+epydoc (3.0.1-13) unstable; urgency=low
+
+  * Update copyright date for Debian package files in debian/copyright.
+  * Remove non-free doc/pycon-epydoc.html from the package (closes: #692733).
+    - Remove reference to doc/pycon-epydoc.html from debian/copyright
+    - Add new patch debian/patches/remove-cc-by-nc-sa.patch
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Thu, 08 Nov 2012 09:35:39 -0600
+
+epydoc (3.0.1-12) unstable; urgency=low
+
+  * Update to machine-readable debian/copyright file format, version 1.0.
+  * Bump standards version to 3.9.3.0; no packaging changes.
+  * Move to debhelper (>= 9) and debian/compat=9, which is the new standard.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon, 12 Mar 2012 12:06:08 -0500
+
+epydoc (3.0.1-11) unstable; urgency=low
+
+  * Stop depending on transitional gs-common package (closes: #649697).
+    - Replace Recommends: gs-common with Recommends: ghostscript 
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Wed, 23 Nov 2011 10:21:01 -0600
+
+epydoc (3.0.1-10) unstable; urgency=low
+
+  * Bump standards version to 3.9.2.0; no packaging changes.
+  * Fix Lintian warning: debian-rules-missing-recommended-target
+    - Restructure build, build-arch, build-indep targets in debian/rules
+  * Transition to dh_python2, since python-support is deprecated for Wheezy.
+    - Replace Build-Depends: python-support with python-all in debian/control
+    - Replace debian/pyversion with X-Python-Version: >= 2.1 in debian/control
+    - Replace call to 'dh_pysupport -d' with 'dh_python2' in debian/rules
+    - Replace python-support with pyshared in debian/cedar-backup2.install
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Fri, 05 Aug 2011 14:41:41 -0500
+
+epydoc (3.0.1-9) unstable; urgency=low
+
+  * Bump standards version to 3.9.1.0 (no packaging changes).
+  * Do a better job of handling special latex entries (closes: #614570).
+    - Apply debian/patches/special-latex-entries.patch
+    - Patch provided by Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Wed, 02 Mar 2011 16:41:50 +0000
+
+epydoc (3.0.1-8) unstable; urgency=low
+
+  * Revise manpages.patch based on better understanding of GROFF hyphens.
+  * Apply python26-tokenizer.patch to fix Epydoc tokenizer (closes: #590112).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 25 Jul 2010 16:04:00 +0000
+
+epydoc (3.0.1-7) unstable; urgency=low
+
+  * Tweak manpage syntax based on advice from Lintian (manpages.patch).
+  * Remove version numbers in Conflicts: to quiet Lintian.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 11 Jul 2010 01:54:23 +0000
+
+epydoc (3.0.1-6) unstable; urgency=low
+
+  * Tweak short description to better match official recommendations.
+  * Bump standards version to 3.9.0.0.
+  * Add Homepage: tag in debian/control.
+  * Convert debian/copyright to new DEP-5 machine-readable format.
+  * Convert to source format "3.0 (quilt)"
+    - Add new file debian/source/format 
+    - Add new patch debian/patches/mention-debian.patch
+    - Add new patch debian/patches/remove-shebang.patch
+    - Add new patch debian/patches/handle-docutils-0.6.patch
+    - Add new patch debian/patches/string-exceptions.patch
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon, 28 Jun 2010 13:27:23 -0500
+
+epydoc (3.0.1-5) unstable; urgency=low
+
+  * Replace deprecated string exception in apidoc.py (closes: #585290).
+  * Bump standards version to 3.8.4 (no packaging changes).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sat, 12 Jun 2010 13:17:07 -0500
+
+epydoc (3.0.1-4) unstable; urgency=low
+
+  * Bump standards version to 3.8.3 (no packaging changes).
+  * Add ${misc:Depends} for all binary packages, per lintian recommendation.
+  * Apply patch to fix problems with docutils 0.6 (closes: #561793).
+    - Thanks to Thomas Hille for research and the initial patch.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Thu, 31 Dec 2009 02:56:36 +0000
+
+epydoc (3.0.1-3) unstable; urgency=low
+
+  * Bump standards version to 3.8.1 (no packaging changes).
+  * Bump debhelper compatibility to 7, per linitian recommendation.
+  * Declare a dependency on debhelper (>= 7.0.1) to match compatibility.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 29 Mar 2009 18:10:30 -0500
+
+epydoc (3.0.1-2) unstable; urgency=low
+
+  * Add Suggests: python-profiler to support call graphs (closes: #506756)
+  * List explicit copyright statement in debian/copyright, to quiet lintian.
+  * Move user manual to Programming section in doc-base configuration.
+  * Bump standards version to 3.8.0 (no packaging changes).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon,  8 Dec 2008 18:56:47 -0600
+
+epydoc (3.0.1-1) unstable; urgency=low
+
+  * New upstream release.
+  * Removed #! from top of epydoc/gui.py
+  * Got rid of version mangling in debian/watch.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun,  3 Feb 2008 13:22:12 -0600
+
+epydoc (3.0~beta1-5) unstable; urgency=low
+
+  * Recommend python-docutils, for reStructuredText markup (closes: #449525).
+  * Use qa.debian.org redirector in debian/watch, so SourceForge URL works.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 18 Nov 2007 18:11:59 -0600
+
+epydoc (3.0~beta1-4) unstable; urgency=low
+
+  * Apply a better fix for #441368 (provided by upstream).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 30 Sep 2007 14:01:07 -0500
+
+epydoc (3.0~beta1-3) unstable; urgency=low
+
+  * Remove debian/watch file, which doesn't work any more (thanks, Sourceforge).
+  * Apply selected changes from upstream's Subversion repository:
+    - Fixes for identifiers containing dashes, svn rev 1606 (closes: #433424)
+    - Fixes for indexed terms, svn rev 1603 (closes: #441368)
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 30 Sep 2007 10:23:46 -0500
+
+epydoc (3.0~beta1-2) unstable; urgency=low
+
+  * Put back several single-character command-line options (closes: #433804).
+    - Patch cli.py to support the -u and -c options (match the manpage)
+    - Patch cli.py, doc/epydoc-man.html and man/epydoc.1 to support the -n option
+    - Submitted patches to upstream in SF bug #1760001
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Tue, 24 Jul 2007 20:07:18 -0500
+
+epydoc (3.0~beta1-1) unstable; urgency=low
+
+  * Package 3.0 beta 1 release (closes: #425193).
+    - Change README.TXT to README.txt in debian/*.docs  
+    - Skip installing apirst2html.py until I understand its purpose better
+    - Remove dh_links call in debian/rules, since it's not really needed
+    - Change debian/control to add Recommends: graphviz (needed for --graph)
+    - Thanks to Cameron Dale for initial package upgrade patch 
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon,  9 Jul 2007 21:00:30 -0500
+
+epydoc (2.1-13) unstable; urgency=low
+
+  * Completely rework previous fix for bug #425077 based on further testing.
+    - texlive-latex-base is not enough; add texlive-latex-extra, 
+      texlive-latex-recommended and texlive-fonts-recommended so
+      everything works and the package gets installed cleanly
+    - Patch latex.py to use fancyhdr, since fancyheadings isn't in texlive
+    - Update README.Debian to reflect changes in recommended dependencies.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun,  3 Jun 2007 18:20:26 -0500
+
+epydoc (2.1-12) unstable; urgency=low
+
+  * Bring Recommends dependencies up to date with lenny (closes: #425077).
+    - Recommend texlive-latex-base rather than obsolete tetex-extra
+    - Recommend gs-common rather than gs-esp | gs, since this is where ps2pdf lives
+    - Recommend iceweasel | www-browser rather than mozilla | www-browser
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun,  3 Jun 2007 14:02:45 -0500
+
+epydoc (2.1-11) unstable; urgency=low
+
+  * Bumped Standards-Version to 3.7.2.
+    - Provide empty binary-arch target in debian/rules to quiet lintian
+  * Update to latest Python policy using python-support method.
+    - Change debian/control to use Build-Depends instead of Build-Depends-Indep
+    - Change debian/control to use Depends: ${python:Depends}
+    - Change debian/control to use Recommends: python-tk, not pythonX.Y-tk
+    - Change debian/rules to build using /usr/bin/python, not /usr/bin/python2.4
+    - Change debian/rules to invoke dh_pysupport -d (for ${python:Depends})
+    - Change debian/rules to stop installing obsolete wrapper scripts
+    - Change debian/rules to use --install-purelib/--install-scripts, not --prefix
+    - Change debian/python-epydoc.dirs to reference usr/share/python-support
+    - Change debian/python-epydoc.install to match new build locations
+    - Change debian/python-epydoc.preinst to remove old package's pyo and pyc files
+    - Remove debian/epydoc.wrapper and debian/epydocgui.wrapper
+    - Remove debian/python-epydoc.postinst and debian/python-epydoc.prerm
+    - Added new debian/pyversions file for use by python-support
+  * Remove support for $PYTHONVER in the epydoc and epydocgui command-line scripts.
+    - This cannot really be done well with the new policy and infrastructure
+    - Removed CHOICE OF PYTHON VERSION section from man/epydoc*.1
+    - Reworked debian/README.Debian to discuss this loss of functionality
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon, 24 Jul 2006 01:11:44 +0000
+
+epydoc (2.1-10) unstable; urgency=low
+
+  * Remove obsolete debian/python2.[123]-epydoc files (leftovers).
+  * Change debian/rules to remove obsolete python2.[123] references.
+  * Remove references to python2.1 and python2.2 and make python2.4 the default
+    - Update documentation in debian/README.Debian
+    - Change Depends and Build-Depends-Indep to use python2.4
+    - Update package descriptions to remove obsolete information
+    - Change debian/python-epydoc.install to reference python2.4
+    - Change python search order in debian/python-epydoc.postinst
+    - Change debian/rules to use python2.4 to build the package
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sat, 15 Apr 2006 10:50:13 -0500
+
+epydoc (2.1-9) unstable; urgency=low
+
+  * Remove pythonX.Y-epydoc packages now that sarge has released.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Fri, 10 Jun 2005 13:10:04 -0500
+
+epydoc (2.1-8) unstable; urgency=low
+
+  * Support Python 2.4 in wrappers and postinst.
+  * Rework postinst so that it works for people who have Python set up to 
+    use alternatives.  I now have to invoke compileall.compile_dir() rather
+    than compileally.py because I can't be sure of the location of
+    compileall.py.  Fix is based on pychecker bug #300922.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Wed, 23 Mar 2005 17:04:44 -0600
+
+epydoc (2.1-7) unstable; urgency=low
+
+  * Fix broken escape of @ decorator in docstring codeblocks (closes: #293571).
+    - Problem is that colorizer.py _COMMENT pattern catches @ and splits it.
+    - Simplistic fix is to change pattern from '(#.*?$)' to '([^&]#.*?$)'.
+    - I've written upstream several times, but have not heard back.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sat, 12 Mar 2005 13:45:00 -0600
+
+epydoc (2.1-6) unstable; urgency=low
+
+  * Rework python-epydoc postinst so that it works even for people who don't
+    have the default python package installed.  The fix is to look for python,
+    python2.3, python2.2 and python2.1 (in that order), and use the first one
+    found to compile the modules (closes: #291292).
+  * Update README.Debian to match new behavior in postinst.
+  * Added notes in executable wrappers to document new behavior in postinst.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Wed, 19 Jan 2005 16:47:04 -0600
+
+epydoc (2.1-5) unstable; urgency=low
+
+  * Recommend 'gs-esp | gs' rather than just 'gs' (closes: #275654).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Thu, 14 Oct 2004 19:50:08 -0500
+
+epydoc (2.1-4) unstable; urgency=low
+
+  * Fix latex output when using --separate-class option (closes: #250775).
+    - Fix is based on patch from Paul van Tilburg
+    - I applied patch from upstream based on Paul's patch
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon, 24 May 2004 18:34:30 -0500
+
+epydoc (2.1-3) unstable; urgency=low
+
+  * Updated debian/watch to fix Sourceforge download URL away from mirror.
+  * Now Recommend mozilla | www-browser for epydoc-doc to shut Lintian up.
+  * Now Recommend tetex-extra and gs for python-epydoc so --ps, --pdf and --dvi work.
+  * Updated debian/README.Debian to clarify optional packages.
+  * Fixed broken error message in epydoc/cli.py, when handling invalid switch.
+  * Fixed generated latex to work with Debian tetex packages (closes: #250256).
+    - Change epydoc/latex.py to use \usepackage[headings]{fullpage}
+    - This is a Debian-specific change after discussion with upstream
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sat, 22 May 2004 12:51:34 -0500
+
+epydoc (2.1-2) unstable; urgency=low
+
+  * Fix TypeError ("Cannot create UID...") bug in uid.py (closes: #242832).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 11 Apr 2004 23:20:00 -0500
+
+epydoc (2.1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 21 Mar 2004 12:16:01 -0600
+
+epydoc (2.0-3) unstable; urgency=low
+
+  * Changed section from doc to python for all but epydoc-doc.
+  * Fixed broken dependencies (closes: #238798).
+    - Dependencies forced install of python2.1 or 2.2 even if 2.3 was available
+    - Change Depends to python2.3 | python2.2-xmlbase | python2.1-xmlbase
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Fri, 19 Mar 2004 22:14:34 -0600
+
+epydoc (2.0-2) unstable; urgency=low
+
+  * Complete reworking of package now that I've taken it over.
+    - Added README.Debian to document some packaging details
+    - Entire package is now debhelper-ized (compat level 4)
+    - Python modules are now installed in site-python
+    - All scripts, Python modules, etc. are now in python-epyoc only
+    - Old pythonX.Y-epydoc packages are obsolete but remain for easy upgrade
+    - Section has been changed from 'extra' to 'optional' to match overrides
+    - Documentation from -doc package is now available via dhelp, doc-central, etc.
+    - Removed epydocX.Y scripts in favor of scripts that work for all python versions
+    - Added Debian-specific sections to manpages, to document new script behavior
+    - Tweaked epydoc/cli.py to give correct Debian script name in -h output
+    - Tweaked epydoc/cli.py usage to remove reference to nonexistent manpage
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Mon, 15 Mar 2004 21:04:16 -0600
+
+epydoc (2.0-1) unstable; urgency=low
+
+  * Hijacking this package (inactive and unresponsive maintainer).
+    See: http://lists.debian.org/debian-devel/2004/debian-devel-200402/msg02048.html
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 29 Feb 2004 15:46:49 -0600
+
+epydoc (2.0-0.2) unstable; urgency=low
+
+  * NMU (inactive maintainer).
+  * Fix Python dependency for python-epydoc package (closes: #216568).
+    - Now depend on python (>= 2.3), python (<< 2.4).
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Sun, 19 Oct 2003 13:07:28 -0500
+
+epydoc (2.0-0.1) unstable; urgency=low
+
+  * NMU under "excessively liberal NMU policy" through 14 Sep 2003.
+  * Upgraded to upstream 2.0 release.
+    - Epydoc GUI now works (closes: #171471)
+    - Epydoc can now handle keyword arguments (closes: #171722)
+    - Epydoc now properly documents static class methods (closes: #204390)
+  * Made package descriptions more verbose (closes: #210087).
+  * Now installable in sid (closes: #178782).
+    - Removed dependency on python2.3-xmlbase.
+  * Default package is now python2.3-epydoc.
+    - python-epydoc now depends on python2.3-epydoc (>= 2.0-0.1)
+    - All defaults (manpages, binaries) are for 2.3 rather than 2.2
+    - Manpages required 2.3 version to replace/conflict with old 2.2 version
+  * Fixed typo in change entry for 1.1-2 (showed #16827 rather than #168271).
+  * Removed (s) from debian/copyright to quiet lintian.
+  * Added debian/watch file.
+  * Tweaked debian rules file as little as possible.
+    - Hardcode list of scripts, so build under CVS works
+    - Make sure to compress Debian changelog in all packages
+    - Changed code to make soft links for Python 2.3 rather than 2.2
+    - Needed to install epydoc/markup and epydoc/test as well
+
+ -- Kenneth J. Pronovici <pronovic at debian.org>  Thu, 11 Sep 2003 14:41:18 -0500
+
+epydoc (1.1-2) unstable; urgency=low
+
+  * Adding Recommends: tkinter (Closes: #171460)
+  * Adding Suggests: epydoc-doc (Closes: #168271)
+
+ -- Moshe Zadka <moshez at debian.org>  Mon,  2 Dec 2002 18:06:31 +0000
+
+epydoc (1.1-1) unstable; urgency=low
+
+  * New upstream version
+  * Uploading to Debian 
+
+ -- Moshe Zadka <moshez at debian.org>  Sat,  2 Nov 2002 08:15:03 +0000
+
+epydoc (1.0-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- Moshe Zadka <moshez at debian.org>  Fri, 27 Sep 2002 04:48:29 +0000
+
+epydoc (0.2-1) unstable; urgency=low
+
+  * First release
+
+ -- Moshe Zadka <moshez at debian.org>  Mon,  9 Sep 2002 01:53:01 +0000
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..2ef4125
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,47 @@
+Source: epydoc
+Section: python
+Priority: optional
+Maintainer: Kenneth J. Pronovici <pronovic at debian.org>
+Homepage: http://epydoc.sourceforge.net/
+Build-Depends: debhelper (>= 9), python-all (>= 2.6.6-3~), dh-python
+Standards-Version: 3.9.6.1
+X-Python-Version: >= 2.1
+Testsuite: autopkgtest
+
+Package: python-epydoc
+Architecture: all
+Depends: ${python:Depends}, ${misc:Depends}
+Recommends: python-tk, python-docutils, graphviz
+Suggests: epydoc-doc, python-profiler, ghostscript, texlive-latex-base, texlive-latex-extra, texlive-latex-recommended, texlive-fonts-recommended
+Conflicts: python2.3-epydoc, python2.2-epydoc, python2.1-epydoc
+Replaces: python2.3-epydoc (<< 2.0-2), python2.2-epydoc (<< 2.0-2), python2.1-epydoc (<< 2.0-2)
+Description: tool for documenting Python modules
+ Epydoc is a tool for generating API documentation for Python modules based on
+ their docstrings.  A lightweight markup language called epytext can be used to
+ format docstrings and to add information about specific fields, such as
+ parameters and instance variables.  Epydoc also understands docstrings written
+ in ReStructuredText, Javadoc, and plaintext. 
+ .
+ This package contains the epydoc and epydocgui commands, their manpages, and
+ their associated Python modules.  
+ .
+ Epydoc supports two output formatters: HTML and LaTeX.  You must install the
+ suggested dependencies in order to generate documentation in DVI, PostScript,
+ or PDF format using the LaTeX formatter.
+
+Package: epydoc-doc
+Section: doc
+Architecture: all
+Depends: ${misc:Depends}
+Recommends: chromium | www-browser
+Description: tool for documenting Python modules (documentation)
+ Epydoc is a tool for generating API documentation for Python modules based on
+ their docstrings.  A lightweight markup language called epytext can be used to
+ format docstrings and to add information about specific fields, such as
+ parameters and instance variables.  Epydoc also understands docstrings written
+ in ReStructuredText, Javadoc, and plaintext.
+ .
+ This package contains the API reference and usage information for Epydoc, all
+ available through the Debian documentation system (dhelp, dwww, doc-central,
+ etc.) in the Devel section.
+
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..bbcbfbe
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,47 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: epydoc
+Upstream-Contact: Edward Loper <edloper at gradient.cis.upenn.edu>
+Source: http://epydoc.sourceforge.net/
+
+Files: *
+Copyright: 2002, 2005 Edward Loper
+License: Expat
+
+Files: epydoc/docwriter/xlink.py scripts/apirst2html.py
+Copyright: 2007 Daniele Varrazzo
+License: Expat
+
+Files: doc/custom.css doc/docutils.css
+Copyright: Public Domain
+License: public-domain
+ This stylesheet has been placed in the public domain.
+
+Files: debian/*
+Copyright: 2002 Moshe Zadka <moshez at debian.org>
+           2003-2015 Kenneth J. Pronovici <pronovic at debian.org>
+License: public-domain
+ Copying and distribution of these files, with or without modification, is
+ permitted in any medium without royalty provided the copyright notice and
+ this notice are preserved.
+
+License: Expat
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and any associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use, copy,
+ modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ . 
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+ . 
+ The software is provided "as is", without warranty of any
+ kind, express or implied, including but not limited to the
+ warranties of merchantability, fitness for a particular purpose
+ and noninfringement. In no event shall the authors or copyright
+ holders be liable for any claim, damages or other liability,
+ whether in an action of contract, tort or otherwise, arising from,
+ out of or in connection with the software or the use or other
+ dealings in the software.
+
diff --git a/debian/epydoc-doc.doc-base b/debian/epydoc-doc.doc-base
new file mode 100644
index 0000000..6fe0c54
--- /dev/null
+++ b/debian/epydoc-doc.doc-base
@@ -0,0 +1,10 @@
+Document: epydoc
+Title: Epydoc User's Manual
+Author: Edward Loper
+Abstract: Epydoc User's Manual
+Section: Programming
+
+Format: HTML
+Index: /usr/share/doc/epydoc-doc/doc/index.html
+Files: /usr/share/doc/epydoc-doc/doc/*
+
diff --git a/debian/epydoc-doc.docs b/debian/epydoc-doc.docs
new file mode 100644
index 0000000..cd62481
--- /dev/null
+++ b/debian/epydoc-doc.docs
@@ -0,0 +1,2 @@
+README.txt
+doc
diff --git a/debian/patches/build-time.patch b/debian/patches/build-time.patch
new file mode 100644
index 0000000..8a3c54c
--- /dev/null
+++ b/debian/patches/build-time.patch
@@ -0,0 +1,101 @@
+Author: Jelmer Vernooij <jelmer at debian.org>, Kenneth J. Pronovici <pronovic at debian.org>
+Description: Add --no-include-build-time option to allow reproducible builds.
+ This patch was contributed by the Debian Reproducible Builds effort [1].
+ [1]: https://wiki.debian.org/ReproducibleBuilds
+Bug: https://sourceforge.net/p/epydoc/bugs/367/
+Bug-Debian: https://bugs.debian.org/783326
+Forwarded: https://sourceforge.net/p/epydoc/bugs/367/
+Last-Update: 2015-04-25
+Index: epydoc-3.0.1+dfsg/epydoc/cli.py
+===================================================================
+--- epydoc-3.0.1+dfsg.orig/epydoc/cli.py
++++ epydoc-3.0.1+dfsg/epydoc/cli.py
+@@ -137,7 +137,7 @@ OPTION_DEFAULTS = dict(
+     include_source_code=True, pstat_files=[], simple_term=False, fail_on=None,
+     exclude=[], exclude_parse=[], exclude_introspect=[],
+     external_api=[], external_api_file=[], external_api_root=[],
+-    redundant_details=False, src_code_tab_width=8)
++    redundant_details=False, src_code_tab_width=8, include_build_time=True)
+ 
+ def parse_arguments():
+     # Construct the option parser.
+@@ -286,6 +286,10 @@ def parse_arguments():
+         action='store_true', dest='include_log',
+         help=("Include a page with the process log (epydoc-log.html)"))
+ 
++    generation_group.add_option('--no-include-build-time',
++        action='store_false', dest='include_build_time',
++        help=("Do not print the build time in the page footer, useful for reproducible builds."))
++
+     generation_group.add_option(
+         '--redundant-details',
+         action='store_true', dest='redundant_details',
+@@ -558,6 +562,8 @@ def parse_configfiles(configfiles, optio
+             options.include_source_code = _str_to_bool(val, optname)
+         elif optname in ('include-log', 'include_log'):
+             options.include_log = _str_to_bool(val, optname)
++        elif optname in ('include-build-time', 'include_build_time'):
++            options.include_build_time = _str_to_bool(val, optname)
+         elif optname in ('redundant-details', 'redundant_details'):
+             options.redundant_details = _str_to_bool(val, optname)
+ 
+Index: epydoc-3.0.1+dfsg/epydoc/docwriter/html.py
+===================================================================
+--- epydoc-3.0.1+dfsg.orig/epydoc/docwriter/html.py
++++ epydoc-3.0.1+dfsg/epydoc/docwriter/html.py
+@@ -291,6 +291,9 @@ class HTMLWriter:
+         @type include_log: C{boolean}
+         @keyword include_log: If true, the the footer will include an
+               href to the page 'epydoc-log.html'.
++        @type include_build_time: C{boolean}
++        @keyword include_build_time: If true, the the footer will
++              include the build time.
+         @type src_code_tab_width: C{int}
+         @keyword src_code_tab_width: Number of spaces to replace each tab
+             with in source code listings.
+@@ -358,6 +361,9 @@ class HTMLWriter:
+         self._include_log = kwargs.get('include_log', False)
+         """Are we generating an HTML log page?"""
+ 
++        self._include_build_time = kwargs.get('include_build_time', True)
++        """Are we including a build time?"""
++
+         self._src_code_tab_width = kwargs.get('src_code_tab_width', 8)
+         """Number of spaces to replace each tab with in source code
+         listings."""
+@@ -1770,10 +1776,14 @@ class HTMLWriter:
+           <tr>
+             <td align="left" class="footer">
+         >>>   if self._include_log:
+-            <a href="epydoc-log.html">Generated by Epydoc
+-            $epydoc.__version__$ on $time.asctime()$</a>
+-        >>>   else:
+-            Generated by Epydoc $epydoc.__version__$ on $time.asctime()$
++            <a href="epydoc-log.html">
++        >>>   #endif
++            Generated by Epydoc $epydoc.__version__$
++        >>>     if self._include_build_time:
++            on $time.asctime()$
++        >>>     #endif
++        >>>   if self._include_log:
++            </a>
+         >>>   #endif
+             </td>
+             <td align="right" class="footer">
+Index: epydoc-3.0.1+dfsg/man/epydoc.1
+===================================================================
+--- epydoc-3.0.1+dfsg.orig/man/epydoc.1
++++ epydoc-3.0.1+dfsg/man/epydoc.1
+@@ -226,6 +226,12 @@ Generate an HTML page
+ .B epydoc\-log.html
+ containing all error and warning messages that are generated by
+ epydoc, and include it in the generated output.
++.TP
++.B \-\-no\-include\-build\-time
++Do not print the build time in the page footer.  This is useful if
++you are trying to generate reproducible builds, where each build
++against a given version of a source tree produces exactly the
++same artifacts.
+ .RE
+ .PP
+ .\"--------------------------------------------------
diff --git a/debian/patches/deterministic-sort.patch b/debian/patches/deterministic-sort.patch
new file mode 100644
index 0000000..4b165ec
--- /dev/null
+++ b/debian/patches/deterministic-sort.patch
@@ -0,0 +1,50 @@
+Author: Val Lorentz <progval at progval.net>
+Description: Make class and module ordering predictable.
+ A lot of Debian packages rely on Epydoc during their build process.  By
+ default, Eypdoc-generated documentation is "unreproducible", meaning that the
+ content of the generated files changes from build to build even if the source
+ tree does not. 
+ .
+ Class trees written by Epydoc list classes in an order that varies across
+ builds.  This patch applies a total order on classes (orders on class name,
+ then module, then package, then parent package, etc.) instead of a partial one
+ (only class name).  It also adds ordering for modules.
+ .
+ This patch was contributed by the Debian Reproducible Builds effort [1].
+ [1]: https://wiki.debian.org/ReproducibleBuilds
+Bug: https://sourceforge.net/p/epydoc/bugs/370/
+Bug-Debian: http://bugs.debian.org/795835
+Forwarded: https://sourceforge.net/p/epydoc/bugs/370/
+Last-Update: 2015-08-17
+diff -u -r epydoc-3.0.1+dfsg.old/epydoc/docwriter/html.py epydoc-3.0.1+dfsg/epydoc/docwriter/html.py
+--- epydoc-3.0.1+dfsg.old/epydoc/docwriter/html.py	2015-08-16 18:57:38.152484836 +0000
++++ epydoc-3.0.1+dfsg/epydoc/docwriter/html.py	2015-08-17 09:59:14.756288022 +0000
+@@ -404,6 +404,7 @@
+             imports=False, packages=False, bases=False, submodules=False, 
+             subclasses=False, private=self._show_private))
+         self.module_list = [d for d in valdocs if isinstance(d, ModuleDoc)]
++        self.module_list.sort(key=lambda x:(x.filename, x.path))
+         """The list of L{ModuleDoc}s for the documented modules."""
+         self.module_set = set(self.module_list)
+         """The set of L{ModuleDoc}s for the documented modules."""
+@@ -1012,7 +1013,8 @@
+                             #class_set.add(base)
+  
+         out('<ul class="nomargin-top">\n')
+-        for doc in sorted(class_set, key=lambda c:c.canonical_name[-1]):
++        sort_key = lambda c:tuple(reversed(c.canonical_name))
++        for doc in sorted(class_set, key=sort_key):
+             if doc.bases != UNKNOWN and len(doc.bases)==0:
+                 self.write_class_tree_item(out, doc, class_set)
+         out('</ul>\n')
+@@ -2817,7 +2819,8 @@
+         >>> # endif
+         >>> if doc.subclasses:
+             <ul>
+-        >>>   for subclass in sorted(set(doc.subclasses), key=lambda c:c.canonical_name[-1]):
++        >>>   sort_key = lambda c:tuple(reversed(c.canonical_name))
++        >>>   for subclass in sorted(set(doc.subclasses), key=sort_key):
+         >>>     if subclass in class_set:
+         >>>       self.write_class_tree_item(out, subclass, class_set)
+         >>>     #endif
+
diff --git a/debian/patches/handle-docutils-0.6.patch b/debian/patches/handle-docutils-0.6.patch
new file mode 100644
index 0000000..473200e
--- /dev/null
+++ b/debian/patches/handle-docutils-0.6.patch
@@ -0,0 +1,47 @@
+Description: Handle problems encountered with docutils 0.6.
+ The problem here is that the child.data element does not always exist any
+ more.  Apparently, the child element is sometimes a string instead.  So, we
+ work around it by only executing the code in question if child.data can be
+ referenced. Thanks to Thomas Hille for research and the initial patch.
+Bug-Debian: http://bugs.debian.org/561793
+Author: Kenneth J. Pronovici <pronovic at debian.org>
+--- a/epydoc/markup/restructuredtext.py
++++ b/epydoc/markup/restructuredtext.py
+@@ -304,13 +304,14 @@ class _SummaryExtractor(NodeVisitor):
+         # Extract the first sentence.
+         for child in node:
+             if isinstance(child, docutils.nodes.Text):
+-                m = self._SUMMARY_RE.match(child.data)
+-                if m:
+-                    summary_pieces.append(docutils.nodes.Text(m.group(1)))
+-                    other = child.data[m.end():]
+-                    if other and not other.isspace():
+-                        self.other_docs = True
+-                    break
++                if hasattr(child, 'data'):
++                    m = self._SUMMARY_RE.match(child.data)
++                    if m:
++                        summary_pieces.append(docutils.nodes.Text(m.group(1)))
++                        other = child.data[m.end():]
++                        if other and not other.isspace():
++                            self.other_docs = True
++                        break
+             summary_pieces.append(child)
+ 
+         summary_doc = self.document.copy() # shallow copy
+@@ -489,10 +490,11 @@ class _SplitFieldsTranslator(NodeVisitor
+             if (len(fbody[0]) > 0 and
+                 isinstance(fbody[0][0], docutils.nodes.Text)):
+                 child = fbody[0][0]
+-                if child.data[:1] in ':-':
+-                    child.data = child.data[1:].lstrip()
+-                elif child.data[:2] in (' -', ' :'):
+-                    child.data = child.data[2:].lstrip()
++                if hasattr(child, 'data'):
++                    if child.data[:1] in ':-':
++                        child.data = child.data[1:].lstrip()
++                    elif child.data[:2] in (' -', ' :'):
++                        child.data = child.data[2:].lstrip()
+ 
+             # Wrap the field body, and add a new field
+             self._add_field(tagname, arg, fbody)
diff --git a/debian/patches/hide-memory-addresses.patch b/debian/patches/hide-memory-addresses.patch
new file mode 100644
index 0000000..680ebf7
--- /dev/null
+++ b/debian/patches/hide-memory-addresses.patch
@@ -0,0 +1,44 @@
+Author: Val Lorentz <progval at progval.net>
+Description: Hide memory references in the output.
+ A lot of Debian packages rely on Epydoc during their build process.  By
+ default, Eypdoc-generated documentation is "unreproducible", meaning that the
+ content of the generated files changes from build to build even if the source
+ tree does not. 
+ .
+ Epydoc uses repr() on objects that don't always override the default one. As a
+ consequence, the documentation shows memory references on the build system,
+ e.g. <module.Foo instance at 0x7f3aff4299e0>.  This patch detects objects with
+ no overriding of __repr__ and provides a fallback that does not show the
+ reference.  It also takes care of not calling default __repr__ on functions. 
+ .
+ This patch was contributed by the Debian Reproducible Builds effort [1].
+ [1]: https://wiki.debian.org/ReproducibleBuilds
+Bug: https://sourceforge.net/p/epydoc/bugs/369/
+Bug-Debian: http://bugs.debian.org/795826
+Forwarded: https://sourceforge.net/p/epydoc/bugs/369/
+Last-Update: 2015-08-17
+diff -u -r epydoc-3.0.1+dfsg.old/epydoc/markup/pyval_repr.py epydoc-3.0.1+dfsg/epydoc/markup/pyval_repr.py
+--- epydoc-3.0.1+dfsg.old/epydoc/markup/pyval_repr.py	2015-08-16 18:57:38.152484836 +0000
++++ epydoc-3.0.1+dfsg/epydoc/markup/pyval_repr.py	2015-08-17 09:31:08.384223756 +0000
+@@ -207,9 +207,18 @@
+             self._colorize_re(pyval, state)
+         else:
+             try:
+-                pyval_repr = repr(pyval)
+-                if not isinstance(pyval_repr, (str, unicode)):
+-                    pyval_repr = unicode(pyval_repr)
++                pyval_class = pyval.__class__
++                if hasattr(pyval, '__repr__') and \
++                        pyval_class.__repr__ is not object.__repr__ and \
++                        pyval_class.__repr__ is not types.FunctionType.__repr__:
++                    pyval_repr = repr(pyval)
++                    if not isinstance(pyval_repr, (str, unicode)):
++                        pyval_repr = unicode(pyval_repr)
++                else:
++                    # pyval has a default repr(), which would leak
++                    # a reference to the object
++                    pyval_repr = '<%s.%s object>' % (
++                            pyval_class.__module__, pyval_class.__name__)
+                 pyval_repr_ok = True
+             except KeyboardInterrupt:
+                 raise
diff --git a/debian/patches/lintian.patch b/debian/patches/lintian.patch
new file mode 100644
index 0000000..d2d9114
--- /dev/null
+++ b/debian/patches/lintian.patch
@@ -0,0 +1,20 @@
+Description: Remove SourceForge logo and replace with "SourceForge".
+ This fixes Lintian warning "privacy-breach-logo".  The IMG URL is considerd
+ a privacy breach by Debian because it associates a user's browser info with
+ use of the package.
+Author: Kenneth J. Pronovici <pronovic at debian.org>
+--- a/doc/index.html
++++ b/doc/index.html
+@@ -170,10 +170,8 @@
+     Epytext</a></td></a>
+   <td align="center" width="20%" class="nav">
+     
+-    <A href="http://sourceforge.net/projects/epydoc"> 
+-    <IMG src="http://sourceforge.net/sflogo.php?group_id=32455&type=1" 
+-    width="88" height="26" border="0" alt="SourceForge"
+-    align="top"/></A></td>
++    <A href="http://sourceforge.net/projects/epydoc">SourceForge</A>
++    </td>
+     </tr>
+ </table>
+ 
diff --git a/debian/patches/manpages.patch b/debian/patches/manpages.patch
new file mode 100644
index 0000000..30d3eda
--- /dev/null
+++ b/debian/patches/manpages.patch
@@ -0,0 +1,214 @@
+Description: Make minor tweaks to manpage syntax.
+Author: Kenneth J. Pronovici <pronovic at debian.org>
+Forwarded: https://sourceforge.net/tracker/?func=detail&aid=3027938&group_id=32455&atid=405620
+--- a/man/epydoc.1
++++ b/man/epydoc.1
+@@ -83,7 +83,7 @@
+ Directory names specify packages, and are expanded to include
+ all sub-modules and sub-packages.  If you wish to exclude
+ certain sub-modules or sub-packages, use the 
+-.B --exclude
++.B \-\-exclude
+ option (described below).
+ .\" --config
+ .TP
+@@ -164,7 +164,7 @@
+ because importing it would cause undesired side-effects.
+ .\" --introspect-only
+ .TP
+-.BI "\-\-introspect-only"
++.BI "\-\-introspect\-only"
+ Gather all information about the documented objects by introspection;
+ in particular, do
+ .I not
+@@ -176,12 +176,12 @@
+ expression pattern.
+ .\" --exclude-introspect=PATTERN
+ .TP
+-.BI "\-\-exclude-introspect " PATTERN
++.BI "\-\-exclude\-introspect " PATTERN
+ Do not use introspection to gather information about any object whose
+ name matches the given regular expression.  
+ .\" --exclude-parse=PATTERN
+ .TP
+-.BI "\-\-exclude-parse " PATTERN
++.BI "\-\-exclude\-parse " PATTERN
+ Do not use Python source code parsing to gather information about any
+ object whose name matches the given regular expression.
+ .\" --inheritance
+@@ -277,12 +277,12 @@
+ .BI "\-\-help\-file " file
+ An alternate help file.
+ .B file
+-should contain the body of an HTML file -- navigation bars will be
++should contain the body of an HTML file \-\- navigation bars will be
+ added to it.
+ .\" --show-frames, --no-frames
+ .TP
+ .B \-\-show\-frames, \-\-no\-frames
+-These options control whether HMTL output will include a frames-base
++These options control whether HMTL output will include a frames-based
+ table of contents page.  By default, the frames-based table of
+ contents is included.
+ .\" --separate-classes
+@@ -319,16 +319,16 @@
+ executable.
+ .\"--graph-font
+ .TP
+-.BI "--graph-font " font
++.BI "\-\-graph\-font " font
+ The name of the font used to generate Graphviz graphs.  (e.g.,
+ helvetica or times).
+ .\"--graph-font-size
+ .TP
+-.BI "--graph-font-size " size
++.BI "\-\-graph\-font\-size " size
+ The size of the font used to generate Graphviz graphs, in points.
+ .\"--pstat
+ .TP
+-.BI "--pstat " file
++.BI "\-\-pstat " file
+ A pstat output file, to be used in generating call graphs.
+ .RE
+ .PP
+@@ -394,10 +394,10 @@
+ .IR module .
+ This page includes links back to the API documentation pages.
+ .TP
+-.B module-tree.html
++.B module\-tree.html
+ The module hierarchy.
+ .TP
+-.B class-tree.html
++.B class\-tree.html
+ The class hierarchy.  This page is only generated if at least one
+ class is documented.
+ .PP
+@@ -405,19 +405,19 @@
+ .B INDICES
+ .RS 4
+ .TP
+-.B identifier-index.html
++.B identifier\-index.html
+ An index of all documented identifiers.  If the identifier index
+ contains more than 3,000 entries, then it will be split into separate
+ pages for each letter, named
+-.BR identifier-index-a.html ,
+-.BR identifier-index-b.html ", etc."
++.BR identifier\-index\-a.html ,
++.BR identifier\-index\-b.html ", etc."
+ .TP
+-.B term-index.html
++.B term\-index.html
+ An index of all explicitly marked definitional terms.  This page is
+ only generated if at least one definition term is marked in a
+ formatted docstring.
+ .TP
+-.B bug-index.html
++.B bug\-index.html
+ An index of all explicitly marked
+ .B @bug
+ fields.  This page is only
+@@ -425,7 +425,7 @@
+ .B @bug
+ field is listed in a formatted docstring.
+ .TP
+-.B todo-index.html
++.B todo\-index.html
+ An index of all explicitly marked
+ .B @todo
+ fields.  This page is only
+@@ -433,7 +433,7 @@
+ .B @todo
+ field is listed in a formatted docstring.
+ .TP
+-.B changed-index.html
++.B changed\-index.html
+ An index of all explicitly marked
+ .B @changed
+ fields.  This page is only
+@@ -441,7 +441,7 @@
+ .B @changed
+ field is listed in a formatted docstring.
+ .TP
+-.B deprecated-index.html
++.B deprecated\-index.html
+ An index of all explicitly marked
+ .B @deprecated
+ fields.  This page is only
+@@ -449,7 +449,7 @@
+ .B @deprecated
+ field is listed in a formatted docstring.
+ .TP
+-.B since-index.html
++.B since\-index.html
+ An index of all explicitly marked
+ .B @since
+ fields.  This page is only
+@@ -509,7 +509,7 @@
+ loading the page
+ .B <redirect.html#epydoc.apidoc.DottedName>
+ will automatically redirect the browser to
+-.BR <epydoc.apidoc-module.html#DottedName> .
++.BR <epydoc.apidoc\-module.html#DottedName> .
+ .TP
+ .B epydoc.css
+ The CSS stylesheet used to display all HTML pages.
+@@ -556,14 +556,14 @@
+ .B \-\-pdf
+ option.
+ .TP
+-.IB module -module.tex
++.IB module \-module.tex
+ The API documentation for a module.
+ .I module
+ is the complete dotted name of the module, such as
+ .B sys or
+ .BR epydoc.epytext .
+ .TP
+-.IB class -class.tex
++.IB class \-class.tex
+ The API documentation for a class, exception, or type.
+ .I class
+ is the complete dotted name of the class, such as
+@@ -651,7 +651,7 @@
+ .B Wrong underline character for heading.
+ The underline character used for this section heading does not
+ indicate an appopriate section level.  The "=" character should be
+-used to underline sections; "-" for subsections; and "~" for
++used to underline sections; "\-" for subsections; and "~" for
+ subsubsections.
+ .TP
+ .B Possible mal-formatted field item.
+--- a/man/epydocgui.1
++++ b/man/epydocgui.1
+@@ -77,7 +77,7 @@
+ .B index.html
+ will redirect the user to the project's top page.
+ .TP
+-.BI m- module .html
++.BI m\-module.html
+ The API documentation for a module.  
+ .I module
+ is the complete dotted name of the module, such as 
+@@ -85,9 +85,9 @@
+ or
+ .BR epydoc.epytext .
+ .TP
+-.BI c- class .html
++.BI c\-class.html
+ The API documentation for a class, exception, or type.
+-.I class
++.I "c"
+ is the complete dotted name of the class, such as
+ .B epydoc.epytext.Token
+ or
+@@ -269,7 +269,7 @@
+ .B Wrong underline character for heading.
+ The underline character used for this section heading does not
+ indicate an appopriate section level.  The "=" character should be
+-used to underline sections; "-" for subsections; and "~" for
++used to underline sections; "\-" for subsections; and "~" for
+ subsubsections.
+ .RE
+ .PP
diff --git a/debian/patches/mention-debian.patch b/debian/patches/mention-debian.patch
new file mode 100644
index 0000000..d56cea3
--- /dev/null
+++ b/debian/patches/mention-debian.patch
@@ -0,0 +1,12 @@
+Description: Mention Debian contributions in the manpage.
+Author: Kenneth J. Pronovici <pronovic at debian.org>
+--- a/man/epydocgui.1
++++ b/man/epydocgui.1
+@@ -406,6 +406,7 @@
+ .SH AUTHOR
+ Epydoc was written by Edward Loper.  This man page was originally
+ written by Moshe Zadka, and is currently maintained by Edward Loper.
++Debian-specific modifications were made by Kenneth J. Pronovici.
+ .\" ================== BUGS ====================
+ .SH BUGS
+ Report bugs to <edloper at gradient.cis.upenn.edu>.
diff --git a/debian/patches/python26-tokenizer.patch b/debian/patches/python26-tokenizer.patch
new file mode 100644
index 0000000..a93b042
--- /dev/null
+++ b/debian/patches/python26-tokenizer.patch
@@ -0,0 +1,65 @@
+Description: Fix the tokenizer so comment docstrings work with Python 2.6.
+Bug: https://sourceforge.net/tracker/index.php?func=detail&aid=2585292&group_id=32455&atid=405618
+Bug-Debian: http://bugs.debian.org/590112
+Origin: https://sourceforge.net/tracker/?func=detail&aid=2872545&group_id=32455&atid=405620
+Author: Andre Malo (ndparker)
+Reviewed-by: Kenneth J. Pronovici <pronovic at debian.org>
+--- a/epydoc/docparser.py
++++ b/epydoc/docparser.py
+@@ -72,6 +72,26 @@
+ from epydoc.compat import *
+ 
+ ######################################################################
++## Tokenizer change in 2.6
++######################################################################
++
++def comment_includes_nl():
++    """ Determine whether comments are parsed as one or two tokens... """
++    readline = iter(u'\n#\n\n'.splitlines(True)).next
++    tokens = [
++        token.tok_name[tup[0]] for tup in tokenize.generate_tokens(readline)
++    ]
++    if tokens == ['NL', 'COMMENT', 'NL', 'ENDMARKER']:
++        return True
++    elif tokens == ['NL', 'COMMENT', 'NL', 'NL', 'ENDMARKER']:
++        return False
++    raise AssertionError(
++        "Tokenizer returns unexexpected tokens: %r" % tokens
++    )
++
++comment_includes_nl = comment_includes_nl()
++
++######################################################################
+ ## Doc Parser
+ ######################################################################
+ 
+@@ -520,6 +540,10 @@
+     # inside that block, not outside it.
+     start_group = None
+ 
++    # If the comment tokens do not include the NL, every comment token
++    # sets this to True in order to swallow the next NL token unprocessed.
++    comment_nl_waiting = False
++
+     # Check if the source file declares an encoding.
+     encoding = get_module_encoding(module_doc.filename)
+ 
+@@ -570,7 +594,9 @@
+         # then discard them: blank lines are not allowed between a
+         # comment block and the thing it describes.
+         elif toktype == tokenize.NL:
+-            if comments and not line_toks:
++            if comment_nl_waiting:
++                comment_nl_waiting = False
++            elif comments and not line_toks:
+                 log.warning('Ignoring docstring comment block followed by '
+                             'a blank line in %r on line %r' %
+                             (module_doc.filename, srow-1))
+@@ -578,6 +604,7 @@
+                 
+         # Comment token: add to comments if appropriate.
+         elif toktype == tokenize.COMMENT:
++            comment_nl_waiting = not comment_includes_nl
+             if toktext.startswith(COMMENT_DOCSTRING_MARKER):
+                 comment_line = toktext[len(COMMENT_DOCSTRING_MARKER):].rstrip()
+                 if comment_line.startswith(" "):
diff --git a/debian/patches/remove-shebang.patch b/debian/patches/remove-shebang.patch
new file mode 100644
index 0000000..8918706
--- /dev/null
+++ b/debian/patches/remove-shebang.patch
@@ -0,0 +1,10 @@
+Description: Remove shebang (#!) from .py files to comply with policy.
+Author: Kenneth J. Pronovici <pronovic at debian.org>
+--- a/epydoc/gui.py
++++ b/epydoc/gui.py
+@@ -1,5 +1,3 @@
+-#!/usr/bin/env python
+-#
+ # objdoc: epydoc command-line interface
+ # Edward Loper
+ #
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..999dddb
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,12 @@
+manpages.patch
+mention-debian.patch
+remove-shebang.patch
+string-exceptions.patch
+handle-docutils-0.6.patch
+python26-tokenizer.patch
+special-latex-entries.patch
+lintian.patch
+build-time.patch
+source-date.patch
+hide-memory-addresses.patch
+deterministic-sort.patch
diff --git a/debian/patches/source-date.patch b/debian/patches/source-date.patch
new file mode 100644
index 0000000..7975df9
--- /dev/null
+++ b/debian/patches/source-date.patch
@@ -0,0 +1,117 @@
+Author: Reiner Herrmann <reiner at reiner-h.de>, Kenneth J. Pronovici <pronovic at debian.org>
+Description: Use SOURCE_DATE_EPOCH, if available, rather than the current date.
+ A lot of Debian packages rely on Epydoc during their build process.  By
+ default, Eypdoc-generated documentation is "unreproducible", meaning that the
+ content of the generated files changes from build to build even if the source
+ tree does not. 
+ .
+ This patch changes Epydoc to use a deterministic date taken from environment
+ variable SOURCE_DATE_EPOCH, instead of using the current date.  This helps
+ make the Epydoc-generated documentation more predictible.
+ .
+ This patch was contributed by the Debian Reproducible Builds effort [1].
+ [1]: https://wiki.debian.org/ReproducibleBuilds/TimestampsProposal
+Bug: https://sourceforge.net/p/epydoc/bugs/368/
+Bug-Debian: http://bugs.debian.org/790899
+Forwarded: https://sourceforge.net/p/epydoc/bugs/368/
+Last-Update: 2015-07-12
+Index: epydoc-3.0.1+dfsg/epydoc/docwriter/html.py
+===================================================================
+--- epydoc-3.0.1+dfsg.orig/epydoc/docwriter/html.py
++++ epydoc-3.0.1+dfsg/epydoc/docwriter/html.py
+@@ -433,6 +433,14 @@ class HTMLWriter:
+                                       and d.container == doc]
+         self.indexed_docs.sort()
+ 
++        # set build time
++        self._build_time = time.gmtime()
++        if os.environ.has_key('SOURCE_DATE_EPOCH'):
++            try:
++                self._build_time = time.gmtime(int(os.environ['SOURCE_DATE_EPOCH']))
++            except ValueError:
++                pass
++
+         # Figure out the url for the top page.
+         self._top_page_url = self._find_top_page(self._top_page)
+ 
+@@ -1780,7 +1788,7 @@ class HTMLWriter:
+         >>>   #endif
+             Generated by Epydoc $epydoc.__version__$
+         >>>     if self._include_build_time:
+-            on $time.asctime()$
++            on $time.asctime(self._build_time)$
+         >>>     #endif
+         >>>   if self._include_log:
+             </a>
+Index: epydoc-3.0.1+dfsg/epydoc/docwriter/latex.py
+===================================================================
+--- epydoc-3.0.1+dfsg.orig/epydoc/docwriter/latex.py
++++ epydoc-3.0.1+dfsg/epydoc/docwriter/latex.py
+@@ -14,7 +14,7 @@ this module is the L{LatexWriter} class.
+ """
+ __docformat__ = 'epytext en'
+ 
+-import os.path, sys, time, re, textwrap, codecs
++import os.path, os, sys, time, re, textwrap, codecs
+ 
+ from epydoc.apidoc import *
+ from epydoc.compat import *
+@@ -1099,6 +1099,12 @@ class LatexWriter:
+     #////////////////////////////////////////////////////////////
+ 
+     def write_header(self, out, where):
++        build_time = time.gmtime()
++        if os.environ.has_key('SOURCE_DATE_EPOCH'):
++            try:
++                build_time = time.gmtime(int(os.environ['SOURCE_DATE_EPOCH']))
++            except ValueError:
++                pass
+         out('%\n% API Documentation')
+         if self._prj_name: out(' for %s' % self._prj_name)
+         if isinstance(where, APIDoc):
+@@ -1106,7 +1112,7 @@ class LatexWriter:
+         else:
+             out('\n%% %s' % where)
+         out('\n%%\n%% Generated by epydoc %s\n' % epydoc.__version__)
+-        out('%% [%s]\n%%\n' % time.asctime(time.localtime(time.time())))
++        out('%% [%s]\n%%\n' % time.asctime(build_time))
+ 
+     def write_start_of(self, out, section_name):
+         out('\n' + 75*'%' + '\n')
+Index: epydoc-3.0.1+dfsg/man/epydoc.1
+===================================================================
+--- epydoc-3.0.1+dfsg.orig/man/epydoc.1
++++ epydoc-3.0.1+dfsg/man/epydoc.1
+@@ -62,6 +62,32 @@ method, and function has a docstring des
+ .B \-\-tests
+ option can be used to specify additional tests to perform.
+ .PP
++.\" ==== REPRODUCIBLE BUILD BEHAVIOR ===============
++.SH REPRODUCIBLE BUILD BEHAVIOR
++.PP
++Using the current date within Epydoc-generated documentation results in
++documentation that is "unreproducible", meaning that the content of the files
++changes from build to build even if the source tree does not.  To make it
++easier to generate reproducible builds, this version of Epydoc supports two
++features: the
++.B \-\-no\-include\-build\-time
++option and the
++.B SOURCE_DATE_EPOCH
++environment variable.
++.PP
++The
++.B \-\-no\-include\-build\-time
++option can be used when you know up-front that you do not need build timestamps
++in your generated documentation.  The
++.B SOURCE_DATE_EPOCH
++environment variable is intended for use by packaging systems, such as the Debian
++build process.  Packaging systems will set
++.B SOURCE_DATE_EPOCH
++to a sensible timestamp that is somehow related to the state of the source
++tree, and that timestamp will be used by Eypdoc rather than the current
++timestamp.  Builds using
++.B SOURCE_DATE_EPOCH
++will thus be reproducible.
+ .\" ================== OPTIONS ====================
+ .SH OPTIONS
+ Epydoc's options are divided into six categories: basic options,
diff --git a/debian/patches/special-latex-entries.patch b/debian/patches/special-latex-entries.patch
new file mode 100644
index 0000000..ef102b0
--- /dev/null
+++ b/debian/patches/special-latex-entries.patch
@@ -0,0 +1,20 @@
+Description: Do a better job of handling latex special entities.
+ Mike's original problem was handling special << >> quote characters, i.e.
+ from a French keyboard.  He solved this problem by adding the fontenc
+ package.  In testing, I found that this change caused a HUGE slowdown for
+ PostScript and PDF output, i.e. on the order of several minutes for dvips
+ to render the result.  After digging around on Google, I added the lmodern
+ package and that seems to have solved the problems I observed.
+Bug-Debian: http://bugs.debian.org/614570
+Author: Kenneth J. Pronovici <pronovic at debian.org>, Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
+--- a/epydoc/docwriter/latex.py
++++ b/epydoc/docwriter/latex.py
+@@ -29,6 +29,8 @@
+         "\\documentclass{article}",
+         "\\usepackage{alltt, parskip, fancyhdr, boxedminipage}",
+         "\\usepackage{makeidx, multirow, longtable, tocbibind, amssymb}",
++        "\\usepackage[T1]{fontenc}",
++        "\\usepackage{lmodern}",
+         "\\usepackage{fullpage}",
+         "\\usepackage[usenames]{color}",
+         # Fix the heading position -- without this, the headings generated
diff --git a/debian/patches/string-exceptions.patch b/debian/patches/string-exceptions.patch
new file mode 100644
index 0000000..dcdab90
--- /dev/null
+++ b/debian/patches/string-exceptions.patch
@@ -0,0 +1,18 @@
+Description: Get rid of string exceptions.
+ One of the changes brought by Python 2.6 is the removal of string
+ exceptions.  A mass bug filing identified Epydoc as having potential
+ problems.  I later spot-checked all of the exceptions in the code, and I
+ believe this is the only one that we have to worry about.
+Bug-Debian: http://bugs.debian.org/585290
+Author: Kenneth J. Pronovici <pronovic at debian.org>
+--- a/epydoc/apidoc.py
++++ b/epydoc/apidoc.py
+@@ -1352,7 +1352,7 @@ class ClassDoc(NamespaceDoc):
+               nothead=[s for s in nonemptyseqs if cand in s[1:]]
+               if nothead: cand=None #reject candidate
+               else: break
+-          if not cand: raise "Inconsistent hierarchy"
++          if not cand: raise TypeError("Inconsistent hierarchy")
+           res.append(cand)
+           for seq in nonemptyseqs: # remove cand
+               if seq[0] == cand: del seq[0]
diff --git a/debian/python-epydoc.dirs b/debian/python-epydoc.dirs
new file mode 100644
index 0000000..8d581de
--- /dev/null
+++ b/debian/python-epydoc.dirs
@@ -0,0 +1,2 @@
+usr/bin
+usr/share/pyshared
diff --git a/debian/python-epydoc.docs b/debian/python-epydoc.docs
new file mode 100644
index 0000000..71dfd5b
--- /dev/null
+++ b/debian/python-epydoc.docs
@@ -0,0 +1 @@
+README.txt
diff --git a/debian/python-epydoc.install b/debian/python-epydoc.install
new file mode 100644
index 0000000..1b437f3
--- /dev/null
+++ b/debian/python-epydoc.install
@@ -0,0 +1,3 @@
+lib/epydoc/*    usr/share/pyshared
+bin/epydoc      usr/bin
+bin/epydocgui   usr/bin
diff --git a/debian/python-epydoc.manpages b/debian/python-epydoc.manpages
new file mode 100644
index 0000000..790a1c5
--- /dev/null
+++ b/debian/python-epydoc.manpages
@@ -0,0 +1,2 @@
+man/epydoc.1
+man/epydocgui.1
diff --git a/debian/python-epydoc.preinst b/debian/python-epydoc.preinst
new file mode 100644
index 0000000..1529d73
--- /dev/null
+++ b/debian/python-epydoc.preinst
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+# Remove old files left behind by previous versions of package
+rm -f /usr/lib/site-python/epydoc/*.pyc
+rm -f /usr/lib/site-python/epydoc/markup/*.pyc
+rm -f /usr/lib/site-python/epydoc/test/*.pyc
+rm -f /usr/lib/site-python/epydoc/*.pyo
+rm -f /usr/lib/site-python/epydoc/markup/*.pyo
+rm -f /usr/lib/site-python/epydoc/test/*.pyo
+
+#DEBHELPER#
+
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..9233eab
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,22 @@
+#!/usr/bin/make -f
+
+# Set to enable verbose output from debhelper
+#export DH_VERBOSE=1
+
+%:
+	dh $@ --with python2 --buildsystem=python_distutils
+
+override_dh_install:
+	dh_install -Xapirst2html.py --fail-missing
+
+override_dh_compress:
+	dh_compress -X.py
+
+override_dh_auto_install:
+	dh_auto_install -- --install-purelib lib/epydoc --install-scripts bin
+
+override_dh_auto_test:
+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+	sh debian/smoketest
+endif
+
diff --git a/debian/smoketest b/debian/smoketest
new file mode 100644
index 0000000..1376748
--- /dev/null
+++ b/debian/smoketest
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Configure the tests to run 
+TESTS="htmldocs"
+
+# Run portions of the autopkgtest suite, with an autopkgtest-like environment
+RESULT="succeeded"
+for TEST in ${TESTS}; do
+
+   # Create the $ADTTMP directory like autopkgtest
+   export ADTTMP=`mktemp -d`
+   if [ $? != 0 ]; then
+      echo "${TEST} failed: failed to create \$ADTTMP"
+      exit 1
+   elif [ ! -d "${ADTTMP}" ]; then
+      echo "${TEST} failed: could not create \$ADTTMP"
+      exit 1
+   fi
+
+   # Create the $ADT_ARTIFACTS directory like autopkgtest
+   export ADT_ARTIFACTS=`mktemp -d`
+   if [ $? != 0 ]; then
+      echo "${TEST} failed: failed to create \$ADT_ARTIFACTS"
+      exit 1
+   elif [ ! -d "${ADT_ARTIFACTS}" ]; then
+      echo "${TEST} failed: could not create \$ADT_ARTIFACTS"
+      exit 1
+   fi
+
+   # Execute the testcase
+   TESTCASE="debian/tests/${TEST}"
+   if [ ! -f "${TESTCASE}" ]; then
+      echo "${TEST} failed: testcase does not exist"
+      RESULT="failed"
+   else
+      sh ${TESTCASE} -r   # -r to run in "debian/rules" mode
+      if [ $? != 0 ]; then
+         echo "${TEST} failed: non-zero exit status"
+         RESULT="failed"
+      fi
+   fi
+
+   # Remove the temporary directories
+   rm -rf ${ADTTMP}
+   rm -rf ${ADT_ARTIFACTS}
+done
+
+# Exit with non-zero upon failure, to kill the build
+if [ "${RESULT}" = "failed" ]; then
+   exit 1
+fi
+
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/source/include-binaries b/debian/source/include-binaries
new file mode 100644
index 0000000..9010651
--- /dev/null
+++ b/debian/source/include-binaries
@@ -0,0 +1 @@
+debian/tests/data/htmldocs/expected/output/crarr.png
diff --git a/debian/tests/control b/debian/tests/control
new file mode 100644
index 0000000..b6e5a90
--- /dev/null
+++ b/debian/tests/control
@@ -0,0 +1,4 @@
+# Build Epydoc documentation for a sample Python module
+Tests: htmldocs
+Depends: @, diffutils
+
diff --git a/debian/tests/data/htmldocs/expected/output/api-objects.txt b/debian/tests/data/htmldocs/expected/output/api-objects.txt
new file mode 100644
index 0000000..af694d1
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/api-objects.txt
@@ -0,0 +1,12 @@
+testpackage	testpackage-module.html
+testpackage.__package__	testpackage-module.html#__package__
+testpackage.util	testpackage.util-module.html
+testpackage.util.method2	testpackage.util-module.html#method2
+testpackage.util.CONSTANT_TWO	testpackage.util-module.html#CONSTANT_TWO
+testpackage.util.__package__	testpackage.util-module.html#__package__
+testpackage.util.methodOne	testpackage.util-module.html#methodOne
+testpackage.util.CONSTANT_ONE	testpackage.util-module.html#CONSTANT_ONE
+testpackage.util.FirstClass	testpackage.util.FirstClass-class.html
+testpackage.util.FirstClass.__eq__	testpackage.util.FirstClass-class.html#__eq__
+testpackage.util._SecondClass	testpackage.util._SecondClass-class.html
+testpackage.util._SecondClass.__init__	testpackage.util._SecondClass-class.html#__init__
diff --git a/debian/tests/data/htmldocs/expected/output/class-tree.html b/debian/tests/data/htmldocs/expected/output/class-tree.html
new file mode 100644
index 0000000..e47e118
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/class-tree.html
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>Class Hierarchy</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Trees   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%"> </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="class-tree.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<center><b>
+ [ <a href="module-tree.html">Module Hierarchy</a>
+ | <a href="class-tree.html">Class Hierarchy</a> ]
+</b></center><br />
+<h1 class="epydoc">Class Hierarchy</h1>
+<ul class="nomargin-top">
+    <li> <strong class="uidlink">object</strong>:
+      <em class="summary">The most base type</em>
+    <ul>
+    <li> <strong class="uidlink"><a href="testpackage.util._SecondClass-class.html" onclick="show_private();">testpackage.util._SecondClass</a></strong>:
+      <em class="summary">Represents something else that I forgot just now.</em>
+    </li>
+    <li> <strong class="uidlink">list</strong>:
+      <em class="summary">list() -> new empty list list(iterable) -> new list 
+        initialized from iterable's items</em>
+    <ul>
+    <li> <strong class="uidlink"><a href="testpackage.util.FirstClass-class.html">testpackage.util.FirstClass</a></strong>:
+      <em class="summary">Special list class.</em>
+    </li>
+    </ul>
+    </li>
+    </ul>
+    </li>
+</ul>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Trees   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/crarr.png b/debian/tests/data/htmldocs/expected/output/crarr.png
new file mode 100644
index 0000000..26b43c5
Binary files /dev/null and b/debian/tests/data/htmldocs/expected/output/crarr.png differ
diff --git a/debian/tests/data/htmldocs/expected/output/epydoc.css b/debian/tests/data/htmldocs/expected/output/epydoc.css
new file mode 100644
index 0000000..86d4170
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/epydoc.css
@@ -0,0 +1,322 @@
+
+
+/* Epydoc CSS Stylesheet
+ *
+ * This stylesheet can be used to customize the appearance of epydoc's
+ * HTML output.
+ *
+ */
+
+/* Default Colors & Styles
+ *   - Set the default foreground & background color with 'body'; and 
+ *     link colors with 'a:link' and 'a:visited'.
+ *   - Use bold for decision list terms.
+ *   - The heading styles defined here are used for headings *within*
+ *     docstring descriptions.  All headings used by epydoc itself use
+ *     either class='epydoc' or class='toc' (CSS styles for both
+ *     defined below).
+ */
+body                        { background: #ffffff; color: #000000; }
+p                           { margin-top: 0.5em; margin-bottom: 0.5em; }
+a:link                      { color: #0000ff; }
+a:visited                   { color: #204080; }
+dt                          { font-weight: bold; }
+h1                          { font-size: +140%; font-style: italic;
+                              font-weight: bold; }
+h2                          { font-size: +125%; font-style: italic;
+                              font-weight: bold; }
+h3                          { font-size: +110%; font-style: italic;
+                              font-weight: normal; }
+code                        { font-size: 100%; }
+/* N.B.: class, not pseudoclass */
+a.link                      { font-family: monospace; }
+ 
+/* Page Header & Footer
+ *   - The standard page header consists of a navigation bar (with
+ *     pointers to standard pages such as 'home' and 'trees'); a
+ *     breadcrumbs list, which can be used to navigate to containing
+ *     classes or modules; options links, to show/hide private
+ *     variables and to show/hide frames; and a page title (using
+ *     <h1>).  The page title may be followed by a link to the
+ *     corresponding source code (using 'span.codelink').
+ *   - The footer consists of a navigation bar, a timestamp, and a
+ *     pointer to epydoc's homepage.
+ */ 
+h1.epydoc                   { margin: 0; font-size: +140%; font-weight: bold; }
+h2.epydoc                   { font-size: +130%; font-weight: bold; }
+h3.epydoc                   { font-size: +115%; font-weight: bold;
+                              margin-top: 0.2em; }
+td h3.epydoc                { font-size: +115%; font-weight: bold;
+                              margin-bottom: 0; }
+table.navbar                { background: #a0c0ff; color: #000000;
+                              border: 2px groove #c0d0d0; }
+table.navbar table          { color: #000000; }
+th.navbar-select            { background: #70b0ff;
+                              color: #000000; } 
+table.navbar a              { text-decoration: none; }  
+table.navbar a:link         { color: #0000ff; }
+table.navbar a:visited      { color: #204080; }
+span.breadcrumbs            { font-size: 85%; font-weight: bold; }
+span.options                { font-size: 70%; }
+span.codelink               { font-size: 85%; }
+td.footer                   { font-size: 85%; }
+
+/* Table Headers
+ *   - Each summary table and details section begins with a 'header'
+ *     row.  This row contains a section title (marked by
+ *     'span.table-header') as well as a show/hide private link
+ *     (marked by 'span.options', defined above).
+ *   - Summary tables that contain user-defined groups mark those
+ *     groups using 'group header' rows.
+ */
+td.table-header             { background: #70b0ff; color: #000000;
+                              border: 1px solid #608090; }
+td.table-header table       { color: #000000; }
+td.table-header table a:link      { color: #0000ff; }
+td.table-header table a:visited   { color: #204080; }
+span.table-header           { font-size: 120%; font-weight: bold; }
+th.group-header             { background: #c0e0f8; color: #000000;
+                              text-align: left; font-style: italic; 
+                              font-size: 115%; 
+                              border: 1px solid #608090; }
+
+/* Summary Tables (functions, variables, etc)
+ *   - Each object is described by a single row of the table with
+ *     two cells.  The left cell gives the object's type, and is
+ *     marked with 'code.summary-type'.  The right cell gives the
+ *     object's name and a summary description.
+ *   - CSS styles for the table's header and group headers are
+ *     defined above, under 'Table Headers'
+ */
+table.summary               { border-collapse: collapse;
+                              background: #e8f0f8; color: #000000;
+                              border: 1px solid #608090;
+                              margin-bottom: 0.5em; }
+td.summary                  { border: 1px solid #608090; }
+code.summary-type           { font-size: 85%; }
+table.summary a:link        { color: #0000ff; }
+table.summary a:visited     { color: #204080; }
+
+
+/* Details Tables (functions, variables, etc)
+ *   - Each object is described in its own div.
+ *   - A single-row summary table w/ table-header is used as
+ *     a header for each details section (CSS style for table-header
+ *     is defined above, under 'Table Headers').
+ */
+table.details               { border-collapse: collapse;
+                              background: #e8f0f8; color: #000000;
+                              border: 1px solid #608090;
+                              margin: .2em 0 0 0; }
+table.details table         { color: #000000; }
+table.details a:link        { color: #0000ff; }
+table.details a:visited     { color: #204080; }
+
+/* Fields */
+dl.fields                   { margin-left: 2em; margin-top: 1em;
+                              margin-bottom: 1em; }
+dl.fields dd ul             { margin-left: 0em; padding-left: 0em; }
+dl.fields dd ul li ul       { margin-left: 2em; padding-left: 0em; }
+div.fields                  { margin-left: 2em; }
+div.fields p                { margin-bottom: 0.5em; }
+
+/* Index tables (identifier index, term index, etc)
+ *   - link-index is used for indices containing lists of links
+ *     (namely, the identifier index & term index).
+ *   - index-where is used in link indices for the text indicating
+ *     the container/source for each link.
+ *   - metadata-index is used for indices containing metadata
+ *     extracted from fields (namely, the bug index & todo index).
+ */
+table.link-index            { border-collapse: collapse;
+                              background: #e8f0f8; color: #000000;
+                              border: 1px solid #608090; }
+td.link-index               { border-width: 0px; }
+table.link-index a:link     { color: #0000ff; }
+table.link-index a:visited  { color: #204080; }
+span.index-where            { font-size: 70%; }
+table.metadata-index        { border-collapse: collapse;
+                              background: #e8f0f8; color: #000000;
+                              border: 1px solid #608090; 
+                              margin: .2em 0 0 0; }
+td.metadata-index           { border-width: 1px; border-style: solid; }
+table.metadata-index a:link { color: #0000ff; }
+table.metadata-index a:visited  { color: #204080; }
+
+/* Function signatures
+ *   - sig* is used for the signature in the details section.
+ *   - .summary-sig* is used for the signature in the summary 
+ *     table, and when listing property accessor functions.
+ * */
+.sig-name                   { color: #006080; }
+.sig-arg                    { color: #008060; }
+.sig-default                { color: #602000; }
+.summary-sig                { font-family: monospace; }
+.summary-sig-name           { color: #006080; font-weight: bold; }
+table.summary a.summary-sig-name:link
+                            { color: #006080; font-weight: bold; }
+table.summary a.summary-sig-name:visited
+                            { color: #006080; font-weight: bold; }
+.summary-sig-arg            { color: #006040; }
+.summary-sig-default        { color: #501800; }
+
+/* Subclass list
+ */
+ul.subclass-list { display: inline; }
+ul.subclass-list li { display: inline; }
+
+/* To render variables, classes etc. like functions */
+table.summary .summary-name { color: #006080; font-weight: bold;
+                              font-family: monospace; }
+table.summary
+     a.summary-name:link    { color: #006080; font-weight: bold;
+                              font-family: monospace; }
+table.summary
+    a.summary-name:visited  { color: #006080; font-weight: bold;
+                              font-family: monospace; }
+
+/* Variable values
+ *   - In the 'variable details' sections, each varaible's value is
+ *     listed in a 'pre.variable' box.  The width of this box is
+ *     restricted to 80 chars; if the value's repr is longer than
+ *     this it will be wrapped, using a backslash marked with
+ *     class 'variable-linewrap'.  If the value's repr is longer
+ *     than 3 lines, the rest will be ellided; and an ellipsis
+ *     marker ('...' marked with 'variable-ellipsis') will be used.
+ *   - If the value is a string, its quote marks will be marked
+ *     with 'variable-quote'.
+ *   - If the variable is a regexp, it is syntax-highlighted using
+ *     the re* CSS classes.
+ */
+pre.variable                { padding: .5em; margin: 0;
+                              background: #dce4ec; color: #000000;
+                              border: 1px solid #708890; }
+.variable-linewrap          { color: #604000; font-weight: bold; }
+.variable-ellipsis          { color: #604000; font-weight: bold; }
+.variable-quote             { color: #604000; font-weight: bold; }
+.variable-group             { color: #008000; font-weight: bold; }
+.variable-op                { color: #604000; font-weight: bold; }
+.variable-string            { color: #006030; }
+.variable-unknown           { color: #a00000; font-weight: bold; }
+.re                         { color: #000000; }
+.re-char                    { color: #006030; }
+.re-op                      { color: #600000; }
+.re-group                   { color: #003060; }
+.re-ref                     { color: #404040; }
+
+/* Base tree
+ *   - Used by class pages to display the base class hierarchy.
+ */
+pre.base-tree               { font-size: 80%; margin: 0; }
+
+/* Frames-based table of contents headers
+ *   - Consists of two frames: one for selecting modules; and
+ *     the other listing the contents of the selected module.
+ *   - h1.toc is used for each frame's heading
+ *   - h2.toc is used for subheadings within each frame.
+ */
+h1.toc                      { text-align: center; font-size: 105%;
+                              margin: 0; font-weight: bold;
+                              padding: 0; }
+h2.toc                      { font-size: 100%; font-weight: bold; 
+                              margin: 0.5em 0 0 -0.3em; }
+
+/* Syntax Highlighting for Source Code
+ *   - doctest examples are displayed in a 'pre.py-doctest' block.
+ *     If the example is in a details table entry, then it will use
+ *     the colors specified by the 'table pre.py-doctest' line.
+ *   - Source code listings are displayed in a 'pre.py-src' block.
+ *     Each line is marked with 'span.py-line' (used to draw a line
+ *     down the left margin, separating the code from the line
+ *     numbers).  Line numbers are displayed with 'span.py-lineno'.
+ *     The expand/collapse block toggle button is displayed with
+ *     'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not
+ *     modify the font size of the text.)
+ *   - If a source code page is opened with an anchor, then the
+ *     corresponding code block will be highlighted.  The code
+ *     block's header is highlighted with 'py-highlight-hdr'; and
+ *     the code block's body is highlighted with 'py-highlight'.
+ *   - The remaining py-* classes are used to perform syntax
+ *     highlighting (py-string for string literals, py-name for names,
+ *     etc.)
+ */
+pre.py-doctest              { padding: .5em; margin: 1em;
+                              background: #e8f0f8; color: #000000;
+                              border: 1px solid #708890; }
+table pre.py-doctest        { background: #dce4ec;
+                              color: #000000; }
+pre.py-src                  { border: 2px solid #000000; 
+                              background: #f0f0f0; color: #000000; }
+.py-line                    { border-left: 2px solid #000000; 
+                              margin-left: .2em; padding-left: .4em; }
+.py-lineno                  { font-style: italic; font-size: 90%;
+                              padding-left: .5em; }
+a.py-toggle                 { text-decoration: none; }
+div.py-highlight-hdr        { border-top: 2px solid #000000;
+                              border-bottom: 2px solid #000000;
+                              background: #d8e8e8; }
+div.py-highlight            { border-bottom: 2px solid #000000;
+                              background: #d0e0e0; }
+.py-prompt                  { color: #005050; font-weight: bold;}
+.py-more                    { color: #005050; font-weight: bold;}
+.py-string                  { color: #006030; }
+.py-comment                 { color: #003060; }
+.py-keyword                 { color: #600000; }
+.py-output                  { color: #404040; }
+.py-name                    { color: #000050; }
+.py-name:link               { color: #000050 !important; }
+.py-name:visited            { color: #000050 !important; }
+.py-number                  { color: #005000; }
+.py-defname                 { color: #000060; font-weight: bold; }
+.py-def-name                { color: #000060; font-weight: bold; }
+.py-base-class              { color: #000060; }
+.py-param                   { color: #000060; }
+.py-docstring               { color: #006030; }
+.py-decorator               { color: #804020; }
+/* Use this if you don't want links to names underlined: */
+/*a.py-name                   { text-decoration: none; }*/
+
+/* Graphs & Diagrams
+ *   - These CSS styles are used for graphs & diagrams generated using
+ *     Graphviz dot.  'img.graph-without-title' is used for bare
+ *     diagrams (to remove the border created by making the image
+ *     clickable).
+ */
+img.graph-without-title     { border: none; }
+img.graph-with-title        { border: 1px solid #000000; }
+span.graph-title            { font-weight: bold; }
+span.graph-caption          { }
+
+/* General-purpose classes
+ *   - 'p.indent-wrapped-lines' defines a paragraph whose first line
+ *     is not indented, but whose subsequent lines are.
+ *   - The 'nomargin-top' class is used to remove the top margin (e.g.
+ *     from lists).  The 'nomargin' class is used to remove both the
+ *     top and bottom margin (but not the left or right margin --
+ *     for lists, that would cause the bullets to disappear.)
+ */
+p.indent-wrapped-lines      { padding: 0 0 0 7em; text-indent: -7em; 
+                              margin: 0; }
+.nomargin-top               { margin-top: 0; }
+.nomargin                   { margin-top: 0; margin-bottom: 0; }
+
+/* HTML Log */
+div.log-block               { padding: 0; margin: .5em 0 .5em 0;
+                              background: #e8f0f8; color: #000000;
+                              border: 1px solid #000000; }
+div.log-error               { padding: .1em .3em .1em .3em; margin: 4px;
+                              background: #ffb0b0; color: #000000;
+                              border: 1px solid #000000; }
+div.log-warning             { padding: .1em .3em .1em .3em; margin: 4px;
+                              background: #ffffb0; color: #000000;
+                              border: 1px solid #000000; }
+div.log-info               { padding: .1em .3em .1em .3em; margin: 4px;
+                              background: #b0ffb0; color: #000000;
+                              border: 1px solid #000000; }
+h2.log-hdr                  { background: #70b0ff; color: #000000;
+                              margin: 0; padding: 0em 0.5em 0em 0.5em;
+                              border-bottom: 1px solid #000000; font-size: 110%; }
+p.log                       { font-weight: bold; margin: .5em 0 .5em 0; }
+tr.opt-changed              { color: #000000; font-weight: bold; }
+tr.opt-default              { color: #606060; }
+pre.log                     { margin: 0; padding: 0; padding-left: 1em; }
diff --git a/debian/tests/data/htmldocs/expected/output/epydoc.js b/debian/tests/data/htmldocs/expected/output/epydoc.js
new file mode 100644
index 0000000..e787dbc
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/epydoc.js
@@ -0,0 +1,293 @@
+function toggle_private() {
+        // Search for any private/public links on this page.  Store
+        // their old text in "cmd," so we will know what action to
+        // take; and change their text to the opposite action.
+        var cmd = "?";
+        var elts = document.getElementsByTagName("a");
+        for(var i=0; i<elts.length; i++) {
+          if (elts[i].className == "privatelink") {
+            cmd = elts[i].innerHTML;
+            elts[i].innerHTML = ((cmd && cmd.substr(0,4)=="show")?
+                                    "hide private":"show private");
+          }
+        }
+        // Update all DIVs containing private objects.
+        var elts = document.getElementsByTagName("div");
+        for(var i=0; i<elts.length; i++) {
+          if (elts[i].className == "private") {
+            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
+          }
+          else if (elts[i].className == "public") {
+            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"block":"none");
+          }
+        }
+        // Update all table rows containing private objects.  Note, we
+        // use "" instead of "block" becaue IE & firefox disagree on what
+        // this should be (block vs table-row), and "" just gives the
+        // default for both browsers.
+        var elts = document.getElementsByTagName("tr");
+        for(var i=0; i<elts.length; i++) {
+          if (elts[i].className == "private") {
+            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"");
+          }
+        }
+        // Update all list items containing private objects.
+        var elts = document.getElementsByTagName("li");
+        for(var i=0; i<elts.length; i++) {
+          if (elts[i].className == "private") {
+            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?
+                                        "none":"");
+          }
+        }
+        // Update all list items containing private objects.
+        var elts = document.getElementsByTagName("ul");
+        for(var i=0; i<elts.length; i++) {
+          if (elts[i].className == "private") {
+            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
+          }
+        }
+        // Set a cookie to remember the current option.
+        document.cookie = "EpydocPrivate="+cmd;
+      }
+function show_private() {
+        var elts = document.getElementsByTagName("a");
+        for(var i=0; i<elts.length; i++) {
+          if (elts[i].className == "privatelink") {
+            cmd = elts[i].innerHTML;
+            if (cmd && cmd.substr(0,4)=="show")
+                toggle_private();
+          }
+        }
+      }
+function getCookie(name) {
+        var dc = document.cookie;
+        var prefix = name + "=";
+        var begin = dc.indexOf("; " + prefix);
+        if (begin == -1) {
+          begin = dc.indexOf(prefix);
+          if (begin != 0) return null;
+        } else
+        { begin += 2; }
+        var end = document.cookie.indexOf(";", begin);
+        if (end == -1)
+        { end = dc.length; }
+        return unescape(dc.substring(begin + prefix.length, end));
+      }
+function setFrame(url1, url2) {
+          parent.frames[1].location.href = url1;
+          parent.frames[2].location.href = url2;
+      }
+function checkCookie() {
+        var cmd=getCookie("EpydocPrivate");
+        if (cmd && cmd.substr(0,4)!="show" && location.href.indexOf("#_") < 0)
+            toggle_private();
+      }
+function toggleCallGraph(id) {
+        var elt = document.getElementById(id);
+        if (elt.style.display == "none")
+            elt.style.display = "block";
+        else
+            elt.style.display = "none";
+      }
+function expand(id) {
+  var elt = document.getElementById(id+"-expanded");
+  if (elt) elt.style.display = "block";
+  var elt = document.getElementById(id+"-expanded-linenums");
+  if (elt) elt.style.display = "block";
+  var elt = document.getElementById(id+"-collapsed");
+  if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
+  var elt = document.getElementById(id+"-collapsed-linenums");
+  if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
+  var elt = document.getElementById(id+"-toggle");
+  if (elt) { elt.innerHTML = "-"; }
+}
+
+function collapse(id) {
+  var elt = document.getElementById(id+"-expanded");
+  if (elt) elt.style.display = "none";
+  var elt = document.getElementById(id+"-expanded-linenums");
+  if (elt) elt.style.display = "none";
+  var elt = document.getElementById(id+"-collapsed-linenums");
+  if (elt) { elt.innerHTML = "<br />"; elt.style.display="block"; }
+  var elt = document.getElementById(id+"-toggle");
+  if (elt) { elt.innerHTML = "+"; }
+  var elt = document.getElementById(id+"-collapsed");
+  if (elt) {
+    elt.style.display = "block";
+    
+    var indent = elt.getAttribute("indent");
+    var pad = elt.getAttribute("pad");
+    var s = "<tt class='py-lineno'>";
+    for (var i=0; i<pad.length; i++) { s += " " }
+    s += "</tt>";
+    s += "  <tt class='py-line'>";
+    for (var i=0; i<indent.length; i++) { s += " " }
+    s += "<a href='#' onclick='expand(\"" + id;
+    s += "\");return false'>...</a></tt><br />";
+    elt.innerHTML = s;
+  }
+}
+
+function toggle(id) {
+  elt = document.getElementById(id+"-toggle");
+  if (elt.innerHTML == "-")
+      collapse(id); 
+  else
+      expand(id);
+  return false;
+}
+
+function highlight(id) {
+  var elt = document.getElementById(id+"-def");
+  if (elt) elt.className = "py-highlight-hdr";
+  var elt = document.getElementById(id+"-expanded");
+  if (elt) elt.className = "py-highlight";
+  var elt = document.getElementById(id+"-collapsed");
+  if (elt) elt.className = "py-highlight";
+}
+
+function num_lines(s) {
+  var n = 1;
+  var pos = s.indexOf("\n");
+  while ( pos > 0) {
+    n += 1;
+    pos = s.indexOf("\n", pos+1);
+  }
+  return n;
+}
+
+// Collapse all blocks that mave more than `min_lines` lines.
+function collapse_all(min_lines) {
+  var elts = document.getElementsByTagName("div");
+  for (var i=0; i<elts.length; i++) {
+    var elt = elts[i];
+    var split = elt.id.indexOf("-");
+    if (split > 0)
+      if (elt.id.substring(split, elt.id.length) == "-expanded")
+        if (num_lines(elt.innerHTML) > min_lines)
+          collapse(elt.id.substring(0, split));
+  }
+}
+
+function expandto(href) {
+  var start = href.indexOf("#")+1;
+  if (start != 0 && start != href.length) {
+    if (href.substring(start, href.length) != "-") {
+      collapse_all(4);
+      pos = href.indexOf(".", start);
+      while (pos != -1) {
+        var id = href.substring(start, pos);
+        expand(id);
+        pos = href.indexOf(".", pos+1);
+      }
+      var id = href.substring(start, href.length);
+      expand(id);
+      highlight(id);
+    }
+  }
+}
+
+function kill_doclink(id) {
+  var parent = document.getElementById(id);
+  parent.removeChild(parent.childNodes.item(0));
+}
+function auto_kill_doclink(ev) {
+  if (!ev) var ev = window.event;
+  if (!this.contains(ev.toElement)) {
+    var parent = document.getElementById(this.parentID);
+    parent.removeChild(parent.childNodes.item(0));
+  }
+}
+
+function doclink(id, name, targets_id) {
+  var elt = document.getElementById(id);
+
+  // If we already opened the box, then destroy it.
+  // (This case should never occur, but leave it in just in case.)
+  if (elt.childNodes.length > 1) {
+    elt.removeChild(elt.childNodes.item(0));
+  }
+  else {
+    // The outer box: relative + inline positioning.
+    var box1 = document.createElement("div");
+    box1.style.position = "relative";
+    box1.style.display = "inline";
+    box1.style.top = 0;
+    box1.style.left = 0;
+  
+    // A shadow for fun
+    var shadow = document.createElement("div");
+    shadow.style.position = "absolute";
+    shadow.style.left = "-1.3em";
+    shadow.style.top = "-1.3em";
+    shadow.style.background = "#404040";
+    
+    // The inner box: absolute positioning.
+    var box2 = document.createElement("div");
+    box2.style.position = "relative";
+    box2.style.border = "1px solid #a0a0a0";
+    box2.style.left = "-.2em";
+    box2.style.top = "-.2em";
+    box2.style.background = "white";
+    box2.style.padding = ".3em .4em .3em .4em";
+    box2.style.fontStyle = "normal";
+    box2.onmouseout=auto_kill_doclink;
+    box2.parentID = id;
+
+    // Get the targets
+    var targets_elt = document.getElementById(targets_id);
+    var targets = targets_elt.getAttribute("targets");
+    var links = "";
+    target_list = targets.split(",");
+    for (var i=0; i<target_list.length; i++) {
+        var target = target_list[i].split("=");
+        links += "<li><a href='" + target[1] + 
+               "' style='text-decoration:none'>" +
+               target[0] + "</a></li>";
+    }
+  
+    // Put it all together.
+    elt.insertBefore(box1, elt.childNodes.item(0));
+    //box1.appendChild(box2);
+    box1.appendChild(shadow);
+    shadow.appendChild(box2);
+    box2.innerHTML =
+        "Which <b>"+name+"</b> do you want to see documentation for?" +
+        "<ul style='margin-bottom: 0;'>" +
+        links + 
+        "<li><a href='#' style='text-decoration:none' " +
+        "onclick='kill_doclink(\""+id+"\");return false;'>"+
+        "<i>None of the above</i></a></li></ul>";
+  }
+  return false;
+}
+
+function get_anchor() {
+          var href = location.href;
+          var start = href.indexOf("#")+1;
+          if ((start != 0) && (start != href.length))
+              return href.substring(start, href.length);
+      }
+function redirect_url(dottedName) {
+          // Scan through each element of the "pages" list, and check
+          // if "name" matches with any of them.
+          for (var i=0; i<pages.length; i++) {
+
+              // Each page has the form "<pagename>-m" or "<pagename>-c";
+              // extract the <pagename> portion & compare it to dottedName.
+              var pagename = pages[i].substring(0, pages[i].length-2);
+              if (pagename == dottedName.substring(0,pagename.length)) {
+
+                  // We've found a page that matches `dottedName`;
+                  // construct its URL, using leftover `dottedName`
+                  // content to form an anchor.
+                  var pagetype = pages[i].charAt(pages[i].length-1);
+                  var url = pagename + ((pagetype=="m")?"-module.html":
+                                                        "-class.html");
+                  if (dottedName.length > pagename.length)
+                      url += "#" + dottedName.substring(pagename.length+1,
+                                                        dottedName.length);
+                  return url;
+              }
+          }
+      }
diff --git a/debian/tests/data/htmldocs/expected/output/frames.html b/debian/tests/data/htmldocs/expected/output/frames.html
new file mode 100644
index 0000000..b87dbb4
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/frames.html
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+          "DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title> Super Duper Special Project </title>
+</head>
+<frameset cols="20%,80%">
+  <frameset rows="30%,70%">
+    <frame src="toc.html" name="moduleListFrame"
+           id="moduleListFrame" />
+    <frame src="toc-everything.html" name="moduleFrame"
+           id="moduleFrame" />
+  </frameset>
+  <frame src="testpackage-module.html" name="mainFrame" id="mainFrame" />
+</frameset>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/help.html b/debian/tests/data/htmldocs/expected/output/help.html
new file mode 100644
index 0000000..97f6ed0
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/help.html
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>Help</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Help   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%"> </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="help.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+
+<h1 class="epydoc"> API Documentation </h1>
+
+<p> This document contains the API (Application Programming Interface)
+documentation for Super Duper Special Project.  Documentation for the Python
+objects defined by the project is divided into separate pages for each
+package, module, and class.  The API documentation also includes two
+pages containing information about the project as a whole: a trees
+page, and an index page.  </p>
+
+<h2> Object Documentation </h2>
+
+  <p>Each <strong>Package Documentation</strong> page contains: </p>
+  <ul>
+    <li> A description of the package. </li>
+    <li> A list of the modules and sub-packages contained by the
+    package.  </li>
+    <li> A summary of the classes defined by the package. </li>
+    <li> A summary of the functions defined by the package. </li>
+    <li> A summary of the variables defined by the package. </li>
+    <li> A detailed description of each function defined by the
+    package. </li>
+    <li> A detailed description of each variable defined by the
+    package. </li>
+  </ul>
+  
+  <p>Each <strong>Module Documentation</strong> page contains:</p>
+  <ul>
+    <li> A description of the module. </li>
+    <li> A summary of the classes defined by the module. </li>
+    <li> A summary of the functions defined by the module. </li>
+    <li> A summary of the variables defined by the module. </li>
+    <li> A detailed description of each function defined by the
+    module. </li>
+    <li> A detailed description of each variable defined by the
+    module. </li>
+  </ul>
+  
+  <p>Each <strong>Class Documentation</strong> page contains: </p>
+  <ul>
+    <li> A class inheritance diagram. </li>
+    <li> A list of known subclasses. </li>
+    <li> A description of the class. </li>
+    <li> A summary of the methods defined by the class. </li>
+    <li> A summary of the instance variables defined by the class. </li>
+    <li> A summary of the class (static) variables defined by the
+    class. </li> 
+    <li> A detailed description of each method defined by the
+    class. </li>
+    <li> A detailed description of each instance variable defined by the
+    class. </li> 
+    <li> A detailed description of each class (static) variable defined
+    by the class. </li> 
+  </ul>
+
+<h2> Project Documentation </h2>
+
+  <p> The <strong>Trees</strong> page contains the module and class hierarchies: </p>
+  <ul>
+    <li> The <em>module hierarchy</em> lists every package and module, with
+    modules grouped into packages.  At the top level, and within each
+    package, modules and sub-packages are listed alphabetically. </li>
+    <li> The <em>class hierarchy</em> lists every class, grouped by base
+    class.  If a class has more than one base class, then it will be
+    listed under each base class.  At the top level, and under each base
+    class, classes are listed alphabetically. </li>
+  </ul>
+  
+  <p> The <strong>Index</strong> page contains indices of terms and
+  identifiers: </p>
+  <ul>
+    <li> The <em>term index</em> lists every term indexed by any object's
+    documentation.  For each term, the index provides links to each
+    place where the term is indexed. </li>
+    <li> The <em>identifier index</em> lists the (short) name of every package,
+    module, class, method, function, variable, and parameter.  For each
+    identifier, the index provides a short description, and a link to
+    its documentation. </li>
+  </ul>
+
+<h2> The Table of Contents </h2>
+
+<p> The table of contents occupies the two frames on the left side of
+the window.  The upper-left frame displays the <em>project
+contents</em>, and the lower-left frame displays the <em>module
+contents</em>: </p>
+
+<table class="help summary" border="1" cellspacing="0" cellpadding="3">
+  <tr style="height: 30%">
+    <td align="center" style="font-size: small">
+       Project<br />Contents<hr />...</td>
+    <td align="center" style="font-size: small" rowspan="2" width="70%">
+      API<br />Documentation<br />Frame<br /><br /><br />
+    </td>
+  </tr>
+  <tr>
+    <td align="center" style="font-size: small">
+      Module<br />Contents<hr /> <br />...<br /> 
+    </td>
+  </tr>
+</table><br />
+
+<p> The <strong>project contents frame</strong> contains a list of all packages
+and modules that are defined by the project.  Clicking on an entry
+will display its contents in the module contents frame.  Clicking on a
+special entry, labeled "Everything," will display the contents of
+the entire project. </p>
+
+<p> The <strong>module contents frame</strong> contains a list of every
+submodule, class, type, exception, function, and variable defined by a
+module or package.  Clicking on an entry will display its
+documentation in the API documentation frame.  Clicking on the name of
+the module, at the top of the frame, will display the documentation
+for the module itself. </p>
+
+<p> The "<strong>frames</strong>" and "<strong>no frames</strong>" buttons below the top
+navigation bar can be used to control whether the table of contents is
+displayed or not. </p>
+
+<h2> The Navigation Bar </h2>
+
+<p> A navigation bar is located at the top and bottom of every page.
+It indicates what type of page you are currently viewing, and allows
+you to go to related pages.  The following table describes the labels
+on the navigation bar.  Note that not some labels (such as
+[Parent]) are not displayed on all pages. </p>
+
+<table class="summary" border="1" cellspacing="0" cellpadding="3" width="100%">
+<tr class="summary">
+  <th>Label</th>
+  <th>Highlighted when...</th>
+  <th>Links to...</th>
+</tr>
+  <tr><td valign="top"><strong>[Parent]</strong></td>
+      <td valign="top"><em>(never highlighted)</em></td>
+      <td valign="top"> the parent of the current package </td></tr>
+  <tr><td valign="top"><strong>[Package]</strong></td>
+      <td valign="top">viewing a package</td>
+      <td valign="top">the package containing the current object
+      </td></tr>
+  <tr><td valign="top"><strong>[Module]</strong></td>
+      <td valign="top">viewing a module</td>
+      <td valign="top">the module containing the current object
+      </td></tr> 
+  <tr><td valign="top"><strong>[Class]</strong></td>
+      <td valign="top">viewing a class </td>
+      <td valign="top">the class containing the current object</td></tr>
+  <tr><td valign="top"><strong>[Trees]</strong></td>
+      <td valign="top">viewing the trees page</td>
+      <td valign="top"> the trees page </td></tr>
+  <tr><td valign="top"><strong>[Index]</strong></td>
+      <td valign="top">viewing the index page</td>
+      <td valign="top"> the index page </td></tr>
+  <tr><td valign="top"><strong>[Help]</strong></td>
+      <td valign="top">viewing the help page</td>
+      <td valign="top"> the help page </td></tr>
+</table>
+
+<p> The "<strong>show private</strong>" and "<strong>hide private</strong>" buttons below
+the top navigation bar can be used to control whether documentation
+for private objects is displayed.  Private objects are usually defined
+as objects whose (short) names begin with a single underscore, but do
+not end with an underscore.  For example, "<code>_x</code>",
+"<code>__pprint</code>", and "<code>epydoc.epytext._tokenize</code>"
+are private objects; but "<code>re.sub</code>",
+"<code>__init__</code>", and "<code>type_</code>" are not.  However,
+if a module defines the "<code>__all__</code>" variable, then its
+contents are used to decide which objects are private. </p>
+
+<p> A timestamp below the bottom navigation bar indicates when each
+page was last updated. </p>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Help   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/identifier-index.html b/debian/tests/data/htmldocs/expected/output/identifier-index.html
new file mode 100644
index 0000000..5be5f05
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/identifier-index.html
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>Identifier Index</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Indices   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%"> </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="identifier-index.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table border="0" width="100%">
+<tr valign="bottom"><td>
+<h1 class="epydoc">Identifier Index</h1>
+</td><td>
+[
+  A
+  B
+ <a href="#C">C</a>
+  D
+  E
+ <a href="#F">F</a>
+  G
+  H
+  I
+  J
+  K
+  L
+ <a href="#M">M</a>
+  N
+  O
+  P
+  Q
+  R
+  S
+ <a href="#T">T</a>
+ <a href="#U">U</a>
+  V
+  W
+  X
+  Y
+  Z
+ <a href="#_">_</a>
+]
+</td></table>
+<table border="0" width="100%">
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="C">C</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="testpackage.util-module.html#CONSTANT_ONE">CONSTANT_ONE</a><br />
+<span class="index-where">(in <a href="testpackage.util-module.html">testpackage.util</a>)</span></td>
+<td width="33%" class="link-index"><a href="testpackage.util-module.html#CONSTANT_TWO">CONSTANT_TWO</a><br />
+<span class="index-where">(in <a href="testpackage.util-module.html">testpackage.util</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="F">F</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="testpackage.util.FirstClass-class.html">FirstClass</a><br />
+<span class="index-where">(in <a href="testpackage.util-module.html">testpackage.util</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="M">M</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="testpackage.util-module.html#method2">method2()</a><br />
+<span class="index-where">(in <a href="testpackage.util-module.html">testpackage.util</a>)</span></td>
+<td width="33%" class="link-index"><a href="testpackage.util-module.html#methodOne">methodOne()</a><br />
+<span class="index-where">(in <a href="testpackage.util-module.html">testpackage.util</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="T">T</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="testpackage-module.html">testpackage</a></td>
+<td width="33%" class="link-index"> </td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="U">U</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="testpackage.util-module.html">util</a><br />
+<span class="index-where">(in <a href="testpackage-module.html">testpackage</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+<td width="33%" class="link-index"> </td>
+</tr>
+<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr>
+</table>
+</td></tr>
+<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="_">_</a></h2></td>
+<td valign="top">
+<table class="link-index" width="100%" border="1">
+<tr>
+<td width="33%" class="link-index"><a href="testpackage.util.FirstClass-class.html#__eq__">__eq__()</a><br />
+<span class="index-where">(in <a href="testpackage.util.FirstClass-class.html">FirstClass</a>)</span></td>
+<td width="33%" class="link-index"><a href="testpackage-module.html#__package__">__package__</a><br />
+<span class="index-where">(in <a href="testpackage-module.html">testpackage</a>)</span></td>
+<td width="33%" class="link-index"><a href="testpackage.util._SecondClass-class.html">_SecondClass</a><br />
+<span class="index-where">(in <a href="testpackage.util-module.html">testpackage.util</a>)</span></td>
+</tr>
+<tr>
+<td width="33%" class="link-index"><a href="testpackage.util._SecondClass-class.html#__init__">__init__()</a><br />
+<span class="index-where">(in <a href="testpackage.util._SecondClass-class.html" onclick="show_private();">_SecondClass</a>)</span></td>
+<td width="33%" class="link-index"><a href="testpackage.util-module.html#__package__">__package__</a><br />
+<span class="index-where">(in <a href="testpackage.util-module.html">testpackage.util</a>)</span></td>
+<td width="33%" class="link-index"> </td>
+</tr>
+</table>
+</td></tr>
+</table>
+<br /><br /><!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Indices   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/index.html b/debian/tests/data/htmldocs/expected/output/index.html
new file mode 100644
index 0000000..b87dbb4
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/index.html
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+          "DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title> Super Duper Special Project </title>
+</head>
+<frameset cols="20%,80%">
+  <frameset rows="30%,70%">
+    <frame src="toc.html" name="moduleListFrame"
+           id="moduleListFrame" />
+    <frame src="toc-everything.html" name="moduleFrame"
+           id="moduleFrame" />
+  </frameset>
+  <frame src="testpackage-module.html" name="mainFrame" id="mainFrame" />
+</frameset>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/module-tree.html b/debian/tests/data/htmldocs/expected/output/module-tree.html
new file mode 100644
index 0000000..cf65d71
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/module-tree.html
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>Module Hierarchy</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Trees   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%"> </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="module-tree.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<center><b>
+ [ <a href="module-tree.html">Module Hierarchy</a>
+ | <a href="class-tree.html">Class Hierarchy</a> ]
+</b></center><br />
+<h1 class="epydoc">Module Hierarchy</h1>
+<ul class="nomargin-top">
+    <li> <strong class="uidlink"><a href="testpackage-module.html">testpackage</a></strong>: <em class="summary">This is an important module that really needs to be documented.</em>
+    <ul>
+    <li> <strong class="uidlink"><a href="testpackage.util-module.html">testpackage.util</a></strong>: <em class="summary">Provides general-purpose utilities.</em>    </li>
+    </ul>
+    </li>
+</ul>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Trees   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/redirect.html b/debian/tests/data/htmldocs/expected/output/redirect.html
new file mode 100644
index 0000000..fd3df80
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/redirect.html
@@ -0,0 +1,38 @@
+<html><head><title>Epydoc Redirect Page</title>
+<meta http-equiv="cache-control" content="no-cache" />
+<meta http-equiv="expires" content="0" />
+<meta http-equiv="pragma" content="no-cache" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+<body>
+<script type="text/javascript">
+<!--
+var pages = ["testpackage.util._SecondClass-c", "testpackage.util.FirstClass-c", "testpackage.util-m", "testpackage-m"];
+var dottedName = get_anchor();
+if (dottedName) {
+    var target = redirect_url(dottedName);
+    if (target) window.location.replace(target);
+}
+// -->
+</script>
+
+<h3>Epydoc Auto-redirect page</h3>
+
+<p>When javascript is enabled, this page will redirect URLs of
+the form <tt>redirect.html#<i>dotted.name</i></tt> to the
+documentation for the object with the given fully-qualified
+dotted name.</p>
+<p><a id="message">   </a></p>
+
+<script type="text/javascript">
+<!--
+if (dottedName) {
+    var msg = document.getElementById("message");
+    msg.innerHTML = "No documentation found for <tt>"+
+                    dottedName+"</tt>";
+}
+// -->
+</script>
+
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/testpackage-module.html b/debian/tests/data/htmldocs/expected/output/testpackage-module.html
new file mode 100644
index 0000000..88dc57b
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/testpackage-module.html
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>testpackage</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Home   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%">
+      <span class="breadcrumbs">
+        Package testpackage
+      </span>
+    </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="testpackage-module.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<!-- ==================== PACKAGE DESCRIPTION ==================== -->
+<h1 class="epydoc">Package testpackage</h1><p class="nomargin-top"><span class="codelink"><a href="testpackage-pysrc.html">source code</a></span></p>
+<p>This is an important module that really needs to be documented.</p>
+  <p>It has a bunch of stuff in it that is not only really important, but 
+  also really interesting too.  Because of that, we really want this 
+  information to show up in the generated Epydoc documentation.</p>
+  <p>Besides being a pile of completely useless text, this is used as a 
+  test case for Epydoc, to make sure that it's working.</p>
+
+<hr />
+<div class="fields">      <p><strong>Author:</strong>
+        Kenneth J. Pronovici <pronovic at debian.org>
+      </p>
+</div><!-- ==================== SUBMODULES ==================== -->
+<a name="section-Submodules"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Submodules</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-Submodules"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+  <tr><td class="summary">
+  <ul class="nomargin">
+    <li> <strong class="uidlink"><a href="testpackage.util-module.html">testpackage.util</a></strong>: <em class="summary">Provides general-purpose utilities.</em>    </li>
+  </ul></td></tr>
+</table>
+
+<br />
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Variables</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-Variables"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+<tr class="private">
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+        <a name="__package__"></a><span class="summary-name">__package__</span> = <code title="None">None</code><br />
+      hash(x)
+    </td>
+  </tr>
+</table>
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Home   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/testpackage-pysrc.html b/debian/tests/data/htmldocs/expected/output/testpackage-pysrc.html
new file mode 100644
index 0000000..6b8cf11
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/testpackage-pysrc.html
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>testpackage</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Home   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%">
+      <span class="breadcrumbs">
+        Package testpackage
+      </span>
+    </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="testpackage-pysrc.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="testpackage-module.html">Package testpackage</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno"> 1</tt>  <tt class="py-line"><tt class="py-docstring">"""</tt> </tt>
+<a name="L2"></a><tt class="py-lineno"> 2</tt>  <tt class="py-line"><tt class="py-docstring">This is an important module that really needs to be documented.</tt> </tt>
+<a name="L3"></a><tt class="py-lineno"> 3</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L4"></a><tt class="py-lineno"> 4</tt>  <tt class="py-line"><tt class="py-docstring">It has a bunch of stuff in it that is not only really important, but also</tt> </tt>
+<a name="L5"></a><tt class="py-lineno"> 5</tt>  <tt class="py-line"><tt class="py-docstring">really interesting too.  Because of that, we really want this information to</tt> </tt>
+<a name="L6"></a><tt class="py-lineno"> 6</tt>  <tt class="py-line"><tt class="py-docstring">show up in the generated Epydoc documentation.</tt> </tt>
+<a name="L7"></a><tt class="py-lineno"> 7</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L8"></a><tt class="py-lineno"> 8</tt>  <tt class="py-line"><tt class="py-docstring">Besides being a pile of completely useless text, this is used as a test case</tt> </tt>
+<a name="L9"></a><tt class="py-lineno"> 9</tt>  <tt class="py-line"><tt class="py-docstring">for Epydoc, to make sure that it's working.</tt> </tt>
+<a name="L10"></a><tt class="py-lineno">10</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L11"></a><tt class="py-lineno">11</tt>  <tt class="py-line"><tt class="py-docstring">@author: Kenneth J. Pronovici <pronovic at debian.org></tt> </tt>
+<a name="L12"></a><tt class="py-lineno">12</tt>  <tt class="py-line"><tt class="py-docstring">"""</tt> </tt>
+<a name="L13"></a><tt class="py-lineno">13</tt>  <tt class="py-line"> </tt>
+<a name="L14"></a><tt class="py-lineno">14</tt>  <tt class="py-line"><tt class="py-name">__all__</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt> <tt class="py-string">'util'</tt><tt class="py-op">,</tt> <tt class="py-op">]</tt> </tt>
+<a name="L15"></a><tt class="py-lineno">15</tt>  <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th bgcolor="#70b0f0" class="navbar-select"
+          >   Home   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/testpackage.util-module.html b/debian/tests/data/htmldocs/expected/output/testpackage.util-module.html
new file mode 100644
index 0000000..c8f36e0
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/testpackage.util-module.html
@@ -0,0 +1,325 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>testpackage.util</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%">
+      <span class="breadcrumbs">
+        <a href="testpackage-module.html">Package testpackage</a> ::
+        Module util
+      </span>
+    </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="testpackage.util-module.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<!-- ==================== MODULE DESCRIPTION ==================== -->
+<h1 class="epydoc">Module util</h1><p class="nomargin-top"><span class="codelink"><a href="testpackage.util-pysrc.html">source code</a></span></p>
+<p>Provides general-purpose utilities.</p>
+
+<hr />
+<div class="fields">      <p><strong>Author:</strong>
+        Kenneth J. Pronovici <pronovic at ieee.org>
+      </p>
+</div><!-- ==================== CLASSES ==================== -->
+<a name="section-Classes"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Classes</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-Classes"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+        <a href="testpackage.util.FirstClass-class.html" class="summary-name">FirstClass</a><br />
+      Special list class.
+    </td>
+  </tr>
+<tr class="private">
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+        <a href="testpackage.util._SecondClass-class.html" class="summary-name" onclick="show_private();">_SecondClass</a><br />
+      Represents something else that I forgot just now.
+    </td>
+  </tr>
+</table>
+<!-- ==================== FUNCTIONS ==================== -->
+<a name="section-Functions"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Functions</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-Functions"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+      <table width="100%" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td><span class="summary-sig"><a href="testpackage.util-module.html#method2" class="summary-sig-name">method2</a>(<span class="summary-sig-arg">d</span>,
+        <span class="summary-sig-arg">keys</span>)</span><br />
+      Removes all of the keys from the dictionary.</td>
+          <td align="right" valign="top">
+            <span class="codelink"><a href="testpackage.util-pysrc.html#method2">source code</a></span>
+            
+          </td>
+        </tr>
+      </table>
+      
+    </td>
+  </tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+      <table width="100%" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td><span class="summary-sig"><a href="testpackage.util-module.html#methodOne" class="summary-sig-name">methodOne</a>(<span class="summary-sig-arg">d</span>)</span><br />
+      Returns the keys of the dictionary sorted by value.</td>
+          <td align="right" valign="top">
+            <span class="codelink"><a href="testpackage.util-pysrc.html#methodOne">source code</a></span>
+            
+          </td>
+        </tr>
+      </table>
+      
+    </td>
+  </tr>
+</table>
+<!-- ==================== VARIABLES ==================== -->
+<a name="section-Variables"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Variables</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-Variables"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+        <a name="CONSTANT_ONE"></a><span class="summary-name">CONSTANT_ONE</span> = <code title="'one'"><code class="variable-quote">'</code><code class="variable-string">one</code><code class="variable-quote">'</code></code><br />
+      The first constant
+    </td>
+  </tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+        <a name="CONSTANT_TWO"></a><span class="summary-name">CONSTANT_TWO</span> = <code title="'two'"><code class="variable-quote">'</code><code class="variable-string">two</code><code class="variable-quote">'</code></code><br />
+      The second constant
+    </td>
+  </tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+        <a name="__package__"></a><span class="summary-name">__package__</span> = <code title="None">None</code><br />
+      hash(x)
+    </td>
+  </tr>
+</table>
+<!-- ==================== FUNCTION DETAILS ==================== -->
+<a name="section-FunctionDetails"></a>
+<table class="details" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Function Details</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-FunctionDetails"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+</table>
+<a name="method2"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+  <table width="100%" cellpadding="0" cellspacing="0" border="0">
+  <tr valign="top"><td>
+  <h3 class="epydoc"><span class="sig"><span class="sig-name">method2</span>(<span class="sig-arg">d</span>,
+        <span class="sig-arg">keys</span>)</span>
+  </h3>
+  </td><td align="right" valign="top"
+    ><span class="codelink"><a href="testpackage.util-pysrc.html#method2">source code</a></span> 
+    </td>
+  </tr></table>
+  
+  <p>Removes all of the keys from the dictionary. The dictionary is altered
+  in-place. Each key must exist in the dictionary.</p>
+  <dl class="fields">
+    <dt>Parameters:</dt>
+    <dd><ul class="nomargin-top">
+        <li><strong class="pname"><code>d</code></strong> - Dictionary to operate on</li>
+        <li><strong class="pname"><code>keys</code></strong> - List of keys to remove</li>
+    </ul></dd>
+    <dt>Raises:</dt>
+    <dd><ul class="nomargin-top">
+        <li><code><strong class='fraise'>KeyError</strong></code> - If one of the keys does not exist</li>
+    </ul></dd>
+  </dl>
+</td></tr></table>
+</div>
+<a name="methodOne"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+  <table width="100%" cellpadding="0" cellspacing="0" border="0">
+  <tr valign="top"><td>
+  <h3 class="epydoc"><span class="sig"><span class="sig-name">methodOne</span>(<span class="sig-arg">d</span>)</span>
+  </h3>
+  </td><td align="right" valign="top"
+    ><span class="codelink"><a href="testpackage.util-pysrc.html#methodOne">source code</a></span> 
+    </td>
+  </tr></table>
+  
+  <p>Returns the keys of the dictionary sorted by value.</p>
+  <p>There are cuter ways to do this in Python 2.4, but we were originally 
+  attempting to stay compatible with Python 2.3.</p>
+  <dl class="fields">
+    <dt>Parameters:</dt>
+    <dd><ul class="nomargin-top">
+        <li><strong class="pname"><code>d</code></strong> - Dictionary to operate on</li>
+    </ul></dd>
+    <dt>Returns:</dt>
+        <dd>List of dictionary keys sorted in order by dictionary value.</dd>
+  </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/testpackage.util-pysrc.html b/debian/tests/data/htmldocs/expected/output/testpackage.util-pysrc.html
new file mode 100644
index 0000000..41778c0
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/testpackage.util-pysrc.html
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>testpackage.util</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%">
+      <span class="breadcrumbs">
+        <a href="testpackage-module.html">Package testpackage</a> ::
+        Module util
+      </span>
+    </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="testpackage.util-pysrc.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<h1 class="epydoc">Source Code for <a href="testpackage.util-module.html">Module testpackage.util</a></h1>
+<pre class="py-src">
+<a name="L1"></a><tt class="py-lineno"> 1</tt>  <tt class="py-line"><tt class="py-docstring">"""</tt> </tt>
+<a name="L2"></a><tt class="py-lineno"> 2</tt>  <tt class="py-line"><tt class="py-docstring">Provides general-purpose utilities.</tt> </tt>
+<a name="L3"></a><tt class="py-lineno"> 3</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L4"></a><tt class="py-lineno"> 4</tt>  <tt class="py-line"><tt class="py-docstring">@sort: FirstClass, _SecondClass, method2, methodOne, CONSTANT_ONE, CONSTANT_TWO</tt> </tt>
+<a name="L5"></a><tt class="py-lineno"> 5</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L6"></a><tt class="py-lineno"> 6</tt>  <tt class="py-line"><tt class="py-docstring">@var CONSTANT_ONE: The first constant</tt> </tt>
+<a name="L7"></a><tt class="py-lineno"> 7</tt>  <tt class="py-line"><tt class="py-docstring">@var CONSTANT_TWO: The second constant</tt> </tt>
+<a name="L8"></a><tt class="py-lineno"> 8</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L9"></a><tt class="py-lineno"> 9</tt>  <tt class="py-line"><tt class="py-docstring">@author: Kenneth J. Pronovici <pronovic at ieee.org></tt> </tt>
+<a name="L10"></a><tt class="py-lineno">10</tt>  <tt class="py-line"><tt class="py-docstring">"""</tt> </tt>
+<a name="L11"></a><tt class="py-lineno">11</tt>  <tt class="py-line"> </tt>
+<a name="L12"></a><tt class="py-lineno">12</tt>  <tt class="py-line"><tt id="link-0" class="py-name" targets="Variable testpackage.util.CONSTANT_ONE=testpackage.util-module.html#CONSTANT_ONE"><a title="testpackage.util.CONSTANT_ONE" class="py-name" href="#" onclick="return doclink('link-0', 'CONSTANT_ONE', 'link-0');">CONSTANT_ONE</a></tt>       <tt class="py-op">=</tt> <tt class="py-string">"one"</tt> </tt>
+<a name="L13"></a><tt class="py-lineno">13</tt>  <tt class="py-line"><tt id="link-1" class="py-name" targets="Variable testpackage.util.CONSTANT_TWO=testpackage.util-module.html#CONSTANT_TWO"><a title="testpackage.util.CONSTANT_TWO" class="py-name" href="#" onclick="return doclink('link-1', 'CONSTANT_TWO', 'link-1');">CONSTANT_TWO</a></tt>       <tt class="py-op">=</tt> <tt class="py-string">"two"</tt> </tt>
+<a name="L14"></a><tt class="py-lineno">14</tt>  <tt class="py-line"> </tt>
+<a name="FirstClass"></a><div id="FirstClass-def"><a name="L15"></a><tt class="py-lineno">15</tt> <a class="py-toggle" href="#" id="FirstClass-toggle" onclick="return toggle('FirstClass');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="testpackage.util.FirstClass-class.html">FirstClass</a><tt class="py-op">(</tt><tt class="py-base-class">list</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="FirstClass-collapsed" style="display:none;" pad="++" indent="++++"></div><div id="FirstClass-expanded"><a name="L16"></a><tt class="py-lineno">16</tt>  <tt class="py-line"> </tt>
+<a name="L17"></a><tt class="py-lineno">17</tt>  <tt class="py-line">   <tt class="py-docstring">"""</tt> </tt>
+<a name="L18"></a><tt class="py-lineno">18</tt>  <tt class="py-line"><tt class="py-docstring">   Special list class.</tt> </tt>
+<a name="L19"></a><tt class="py-lineno">19</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L20"></a><tt class="py-lineno">20</tt>  <tt class="py-line"><tt class="py-docstring">   This is a special class that extends list.</tt> </tt>
+<a name="L21"></a><tt class="py-lineno">21</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L22"></a><tt class="py-lineno">22</tt>  <tt class="py-line"><tt class="py-docstring">   It has some special behavior that users will find really interesting.</tt> </tt>
+<a name="L23"></a><tt class="py-lineno">23</tt>  <tt class="py-line"><tt class="py-docstring">   Or, it would if I had remembered to implement that.</tt> </tt>
+<a name="L24"></a><tt class="py-lineno">24</tt>  <tt class="py-line"><tt class="py-docstring">   """</tt> </tt>
+<a name="L25"></a><tt class="py-lineno">25</tt>  <tt class="py-line"> </tt>
+<a name="FirstClass.__eq__"></a><div id="FirstClass.__eq__-def"><a name="L26"></a><tt class="py-lineno">26</tt> <a class="py-toggle" href="#" id="FirstClass.__eq__-toggle" onclick="return toggle('FirstClass.__eq__');">-</a><tt class="py-line">   <tt class="py-keyword">def</tt> <a class="py-def-name" href="testpackage.util.FirstClass-class.html#__eq__">__eq__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">other</tt><tt class="py-op"> [...]
+</div><div id="FirstClass.__eq__-collapsed" style="display:none;" pad="++" indent="+++++++"></div><div id="FirstClass.__eq__-expanded"><a name="L27"></a><tt class="py-lineno">27</tt>  <tt class="py-line">      <tt class="py-docstring">"""</tt> </tt>
+<a name="L28"></a><tt class="py-lineno">28</tt>  <tt class="py-line"><tt class="py-docstring">      Definition of C{==} operator for this class.</tt> </tt>
+<a name="L29"></a><tt class="py-lineno">29</tt>  <tt class="py-line"><tt class="py-docstring">      @param other: Other object to compare to.</tt> </tt>
+<a name="L30"></a><tt class="py-lineno">30</tt>  <tt class="py-line"><tt class="py-docstring">      @return: True/false depending on whether C{other is None}</tt> </tt>
+<a name="L31"></a><tt class="py-lineno">31</tt>  <tt class="py-line"><tt class="py-docstring">      """</tt> </tt>
+<a name="L32"></a><tt class="py-lineno">32</tt>  <tt class="py-line">      <tt class="py-keyword">if</tt> <tt class="py-name">other</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
+<a name="L33"></a><tt class="py-lineno">33</tt>  <tt class="py-line">         <tt class="py-keyword">return</tt> <tt class="py-name">False</tt> </tt>
+<a name="L34"></a><tt class="py-lineno">34</tt>  <tt class="py-line">      <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
+<a name="L35"></a><tt class="py-lineno">35</tt>  <tt class="py-line">         <tt class="py-keyword">return</tt> <tt class="py-name">True</tt> </tt>
+</div></div><a name="L36"></a><tt class="py-lineno">36</tt>  <tt class="py-line"> </tt>
+<a name="_SecondClass"></a><div id="_SecondClass-def"><a name="L37"></a><tt class="py-lineno">37</tt> <a class="py-toggle" href="#" id="_SecondClass-toggle" onclick="return toggle('_SecondClass');">-</a><tt class="py-line"><tt class="py-keyword">class</tt> <a class="py-def-name" href="testpackage.util._SecondClass-class.html">_SecondClass</a><tt class="py-op">(</tt><tt class="py-base-class">object</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="_SecondClass-collapsed" style="display:none;" pad="++" indent="++++"></div><div id="_SecondClass-expanded"><a name="L38"></a><tt class="py-lineno">38</tt>  <tt class="py-line"> </tt>
+<a name="L39"></a><tt class="py-lineno">39</tt>  <tt class="py-line">   <tt class="py-docstring">"""</tt> </tt>
+<a name="L40"></a><tt class="py-lineno">40</tt>  <tt class="py-line"><tt class="py-docstring">   Represents something else that I forgot just now.</tt> </tt>
+<a name="L41"></a><tt class="py-lineno">41</tt>  <tt class="py-line"><tt class="py-docstring">   """</tt> </tt>
+<a name="L42"></a><tt class="py-lineno">42</tt>  <tt class="py-line"> </tt>
+<a name="_SecondClass.__init__"></a><div id="_SecondClass.__init__-def"><a name="L43"></a><tt class="py-lineno">43</tt> <a class="py-toggle" href="#" id="_SecondClass.__init__-toggle" onclick="return toggle('_SecondClass.__init__');">-</a><tt class="py-line">   <tt class="py-keyword">def</tt> <a class="py-def-name" href="testpackage.util._SecondClass-class.html#__init__">__init__</a><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">name</ [...]
+</div><div id="_SecondClass.__init__-collapsed" style="display:none;" pad="++" indent="+++++++"></div><div id="_SecondClass.__init__-expanded"><a name="L44"></a><tt class="py-lineno">44</tt>  <tt class="py-line">      <tt class="py-docstring">"""</tt> </tt>
+<a name="L45"></a><tt class="py-lineno">45</tt>  <tt class="py-line"><tt class="py-docstring">      Constructor.</tt> </tt>
+<a name="L46"></a><tt class="py-lineno">46</tt>  <tt class="py-line"><tt class="py-docstring">      @param name: Name of this instance</tt> </tt>
+<a name="L47"></a><tt class="py-lineno">47</tt>  <tt class="py-line"><tt class="py-docstring">      """</tt> </tt>
+<a name="L48"></a><tt class="py-lineno">48</tt>  <tt class="py-line">      <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">name</tt> <tt class="py-op">=</tt> <tt class="py-name">name</tt> </tt>
+<a name="L49"></a><tt class="py-lineno">49</tt>  <tt class="py-line">      <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">state</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt> </tt>
+</div></div><a name="L50"></a><tt class="py-lineno">50</tt>  <tt class="py-line"> </tt>
+<a name="methodOne"></a><div id="methodOne-def"><a name="L51"></a><tt class="py-lineno">51</tt> <a class="py-toggle" href="#" id="methodOne-toggle" onclick="return toggle('methodOne');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="testpackage.util-module.html#methodOne">methodOne</a><tt class="py-op">(</tt><tt class="py-param">d</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="methodOne-collapsed" style="display:none;" pad="++" indent="++++"></div><div id="methodOne-expanded"><a name="L52"></a><tt class="py-lineno">52</tt>  <tt class="py-line">   <tt class="py-docstring">"""</tt> </tt>
+<a name="L53"></a><tt class="py-lineno">53</tt>  <tt class="py-line"><tt class="py-docstring">   Returns the keys of the dictionary sorted by value.</tt> </tt>
+<a name="L54"></a><tt class="py-lineno">54</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L55"></a><tt class="py-lineno">55</tt>  <tt class="py-line"><tt class="py-docstring">   There are cuter ways to do this in Python 2.4, but we were originally</tt> </tt>
+<a name="L56"></a><tt class="py-lineno">56</tt>  <tt class="py-line"><tt class="py-docstring">   attempting to stay compatible with Python 2.3.</tt> </tt>
+<a name="L57"></a><tt class="py-lineno">57</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
+<a name="L58"></a><tt class="py-lineno">58</tt>  <tt class="py-line"><tt class="py-docstring">   @param d: Dictionary to operate on</tt> </tt>
+<a name="L59"></a><tt class="py-lineno">59</tt>  <tt class="py-line"><tt class="py-docstring">   @return: List of dictionary keys sorted in order by dictionary value.</tt> </tt>
+<a name="L60"></a><tt class="py-lineno">60</tt>  <tt class="py-line"><tt class="py-docstring">   """</tt> </tt>
+<a name="L61"></a><tt class="py-lineno">61</tt>  <tt class="py-line">   <tt class="py-name">items</tt> <tt class="py-op">=</tt> <tt class="py-name">d</tt><tt class="py-op">.</tt><tt class="py-name">items</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
+<a name="L62"></a><tt class="py-lineno">62</tt>  <tt class="py-line">   <tt class="py-name">items</tt><tt class="py-op">.</tt><tt class="py-name">sort</tt><tt class="py-op">(</tt><tt class="py-keyword">lambda</tt> <tt class="py-name">x</tt><tt class="py-op">,</tt> <tt class="py-name">y</tt><tt class="py-op">:</tt> <tt class="py-name">cmp</tt><tt class="py-op">(</tt><tt class="py-name">x</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">,</t [...]
+<a name="L63"></a><tt class="py-lineno">63</tt>  <tt class="py-line">   <tt class="py-keyword">return</tt> <tt class="py-op">[</tt><tt class="py-name">key</tt> <tt class="py-keyword">for</tt> <tt class="py-name">key</tt><tt class="py-op">,</tt> <tt class="py-name">value</tt> <tt class="py-keyword">in</tt> <tt class="py-name">items</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L64"></a><tt class="py-lineno">64</tt>  <tt class="py-line"> </tt>
+<a name="method2"></a><div id="method2-def"><a name="L65"></a><tt class="py-lineno">65</tt> <a class="py-toggle" href="#" id="method2-toggle" onclick="return toggle('method2');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="testpackage.util-module.html#method2">method2</a><tt class="py-op">(</tt><tt class="py-param">d</tt><tt class="py-op">,</tt> <tt class="py-param">keys</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
+</div><div id="method2-collapsed" style="display:none;" pad="++" indent="++++"></div><div id="method2-expanded"><a name="L66"></a><tt class="py-lineno">66</tt>  <tt class="py-line">   <tt class="py-docstring">"""</tt> </tt>
+<a name="L67"></a><tt class="py-lineno">67</tt>  <tt class="py-line"><tt class="py-docstring">   Removes all of the keys from the dictionary.</tt> </tt>
+<a name="L68"></a><tt class="py-lineno">68</tt>  <tt class="py-line"><tt class="py-docstring">   The dictionary is altered in-place.</tt> </tt>
+<a name="L69"></a><tt class="py-lineno">69</tt>  <tt class="py-line"><tt class="py-docstring">   Each key must exist in the dictionary.</tt> </tt>
+<a name="L70"></a><tt class="py-lineno">70</tt>  <tt class="py-line"><tt class="py-docstring">   @param d: Dictionary to operate on</tt> </tt>
+<a name="L71"></a><tt class="py-lineno">71</tt>  <tt class="py-line"><tt class="py-docstring">   @param keys: List of keys to remove</tt> </tt>
+<a name="L72"></a><tt class="py-lineno">72</tt>  <tt class="py-line"><tt class="py-docstring">   @raise KeyError: If one of the keys does not exist</tt> </tt>
+<a name="L73"></a><tt class="py-lineno">73</tt>  <tt class="py-line"><tt class="py-docstring">   """</tt> </tt>
+<a name="L74"></a><tt class="py-lineno">74</tt>  <tt class="py-line">   <tt class="py-keyword">for</tt> <tt class="py-name">key</tt> <tt class="py-keyword">in</tt> <tt class="py-name">keys</tt><tt class="py-op">:</tt> </tt>
+<a name="L75"></a><tt class="py-lineno">75</tt>  <tt class="py-line">      <tt class="py-keyword">del</tt> <tt class="py-name">d</tt><tt class="py-op">[</tt><tt class="py-name">key</tt><tt class="py-op">]</tt> </tt>
+</div><a name="L76"></a><tt class="py-lineno">76</tt>  <tt class="py-line"> </tt><script type="text/javascript">
+<!--
+expandto(location.href);
+// -->
+</script>
+</pre>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/testpackage.util.FirstClass-class.html b/debian/tests/data/htmldocs/expected/output/testpackage.util.FirstClass-class.html
new file mode 100644
index 0000000..ebd1f7c
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/testpackage.util.FirstClass-class.html
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>testpackage.util.FirstClass</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%">
+      <span class="breadcrumbs">
+        <a href="testpackage-module.html">Package testpackage</a> ::
+        <a href="testpackage.util-module.html">Module util</a> ::
+        Class FirstClass
+      </span>
+    </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="testpackage.util.FirstClass-class.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class FirstClass</h1><p class="nomargin-top"><span class="codelink"><a href="testpackage.util-pysrc.html#FirstClass">source code</a></span></p>
+<pre class="base-tree">
+object --+    
+         |    
+      list --+
+             |
+            <strong class="uidshort">FirstClass</strong>
+</pre>
+
+<hr />
+<p>Special list class.</p>
+  <p>This is a special class that extends list.</p>
+  <p>It has some special behavior that users will find really interesting. 
+  Or, it would if I had remembered to implement that.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Instance Methods</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-InstanceMethods"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+      <table width="100%" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td><span class="summary-sig"><a href="testpackage.util.FirstClass-class.html#__eq__" class="summary-sig-name">__eq__</a>(<span class="summary-sig-arg">self</span>,
+        <span class="summary-sig-arg">other</span>)</span><br />
+      Definition of <code>==</code> operator for this class.</td>
+          <td align="right" valign="top">
+            <span class="codelink"><a href="testpackage.util-pysrc.html#FirstClass.__eq__">source code</a></span>
+            
+          </td>
+        </tr>
+      </table>
+      
+    </td>
+  </tr>
+  <tr>
+    <td colspan="2" class="summary">
+    <p class="indent-wrapped-lines"><b>Inherited from <code>list</code></b>:
+      <code>__add__</code>,
+      <code>__contains__</code>,
+      <code>__delitem__</code>,
+      <code>__delslice__</code>,
+      <code>__ge__</code>,
+      <code>__getattribute__</code>,
+      <code>__getitem__</code>,
+      <code>__getslice__</code>,
+      <code>__gt__</code>,
+      <code>__iadd__</code>,
+      <code>__imul__</code>,
+      <code>__init__</code>,
+      <code>__iter__</code>,
+      <code>__le__</code>,
+      <code>__len__</code>,
+      <code>__lt__</code>,
+      <code>__mul__</code>,
+      <code>__ne__</code>,
+      <code>__new__</code>,
+      <code>__repr__</code>,
+      <code>__reversed__</code>,
+      <code>__rmul__</code>,
+      <code>__setitem__</code>,
+      <code>__setslice__</code>,
+      <code>__sizeof__</code>,
+      <code>append</code>,
+      <code>count</code>,
+      <code>extend</code>,
+      <code>index</code>,
+      <code>insert</code>,
+      <code>pop</code>,
+      <code>remove</code>,
+      <code>reverse</code>,
+      <code>sort</code>
+      </p>
+    <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+      <code>__delattr__</code>,
+      <code>__format__</code>,
+      <code>__reduce__</code>,
+      <code>__reduce_ex__</code>,
+      <code>__setattr__</code>,
+      <code>__str__</code>,
+      <code>__subclasshook__</code>
+      </p>
+    </td>
+  </tr>
+</table>
+<!-- ==================== CLASS VARIABLES ==================== -->
+<a name="section-ClassVariables"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Class Variables</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-ClassVariables"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+  <tr>
+    <td colspan="2" class="summary">
+    <p class="indent-wrapped-lines"><b>Inherited from <code>list</code></b>:
+      <code>__hash__</code>
+      </p>
+    </td>
+  </tr>
+</table>
+<!-- ==================== PROPERTIES ==================== -->
+<a name="section-Properties"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Properties</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-Properties"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+  <tr>
+    <td colspan="2" class="summary">
+    <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+      <code>__class__</code>
+      </p>
+    </td>
+  </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Method Details</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-MethodDetails"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+</table>
+<a name="__eq__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+  <table width="100%" cellpadding="0" cellspacing="0" border="0">
+  <tr valign="top"><td>
+  <h3 class="epydoc"><span class="sig"><span class="sig-name">__eq__</span>(<span class="sig-arg">self</span>,
+        <span class="sig-arg">other</span>)</span>
+    <br /><em class="fname">(Equality operator)</em>
+  </h3>
+  </td><td align="right" valign="top"
+    ><span class="codelink"><a href="testpackage.util-pysrc.html#FirstClass.__eq__">source code</a></span> 
+    </td>
+  </tr></table>
+  
+  <p>Definition of <code>==</code> operator for this class.</p>
+  <dl class="fields">
+    <dt>Parameters:</dt>
+    <dd><ul class="nomargin-top">
+        <li><strong class="pname"><code>other</code></strong> - Other object to compare to.</li>
+    </ul></dd>
+    <dt>Returns:</dt>
+        <dd>True/false depending on whether <code>other is None</code></dd>
+    <dt>Overrides:
+        list.__eq__
+    </dt>
+  </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/testpackage.util._SecondClass-class.html b/debian/tests/data/htmldocs/expected/output/testpackage.util._SecondClass-class.html
new file mode 100644
index 0000000..55f3654
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/testpackage.util._SecondClass-class.html
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>testpackage.util._SecondClass</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr valign="top">
+    <td width="100%">
+      <span class="breadcrumbs">
+        <a href="testpackage-module.html">Package testpackage</a> ::
+        <a href="testpackage.util-module.html">Module util</a> ::
+        Class _SecondClass
+      </span>
+    </td>
+    <td>
+      <table cellpadding="0" cellspacing="0">
+        <!-- hide/show private -->
+        <tr><td align="right"><span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span></td></tr>
+        <tr><td align="right"><span class="options"
+            >[<a href="frames.html" target="_top">frames</a
+            >] | <a href="testpackage.util._SecondClass-class.html"
+            target="_top">no frames</a>]</span></td></tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<!-- ==================== CLASS DESCRIPTION ==================== -->
+<h1 class="epydoc">Class _SecondClass</h1><p class="nomargin-top"><span class="codelink"><a href="testpackage.util-pysrc.html#_SecondClass">source code</a></span></p>
+<pre class="base-tree">
+object --+
+         |
+        <strong class="uidshort">_SecondClass</strong>
+</pre>
+
+<hr />
+<p>Represents something else that I forgot just now.</p>
+
+<!-- ==================== INSTANCE METHODS ==================== -->
+<a name="section-InstanceMethods"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Instance Methods</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-InstanceMethods"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+<tr>
+    <td width="15%" align="right" valign="top" class="summary">
+      <span class="summary-type"> </span>
+    </td><td class="summary">
+      <table width="100%" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td><span class="summary-sig"><a href="testpackage.util._SecondClass-class.html#__init__" class="summary-sig-name">__init__</a>(<span class="summary-sig-arg">self</span>,
+        <span class="summary-sig-arg">name</span>)</span><br />
+      Constructor.</td>
+          <td align="right" valign="top">
+            <span class="codelink"><a href="testpackage.util-pysrc.html#_SecondClass.__init__">source code</a></span>
+            
+          </td>
+        </tr>
+      </table>
+      
+    </td>
+  </tr>
+  <tr>
+    <td colspan="2" class="summary">
+    <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+      <code>__delattr__</code>,
+      <code>__format__</code>,
+      <code>__getattribute__</code>,
+      <code>__hash__</code>,
+      <code>__new__</code>,
+      <code>__reduce__</code>,
+      <code>__reduce_ex__</code>,
+      <code>__repr__</code>,
+      <code>__setattr__</code>,
+      <code>__sizeof__</code>,
+      <code>__str__</code>,
+      <code>__subclasshook__</code>
+      </p>
+    </td>
+  </tr>
+</table>
+<!-- ==================== PROPERTIES ==================== -->
+<a name="section-Properties"></a>
+<table class="summary" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Properties</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-Properties"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+  <tr>
+    <td colspan="2" class="summary">
+    <p class="indent-wrapped-lines"><b>Inherited from <code>object</code></b>:
+      <code>__class__</code>
+      </p>
+    </td>
+  </tr>
+</table>
+<!-- ==================== METHOD DETAILS ==================== -->
+<a name="section-MethodDetails"></a>
+<table class="details" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr bgcolor="#70b0f0" class="table-header">
+  <td colspan="2" class="table-header">
+    <table border="0" cellpadding="0" cellspacing="0" width="100%">
+      <tr valign="top">
+        <td align="left"><span class="table-header">Method Details</span></td>
+        <td align="right" valign="top"
+         ><span class="options">[<a href="#section-MethodDetails"
+         class="privatelink" onclick="toggle_private();"
+         >hide private</a>]</span></td>
+      </tr>
+    </table>
+  </td>
+</tr>
+</table>
+<a name="__init__"></a>
+<div>
+<table class="details" border="1" cellpadding="3"
+       cellspacing="0" width="100%" bgcolor="white">
+<tr><td>
+  <table width="100%" cellpadding="0" cellspacing="0" border="0">
+  <tr valign="top"><td>
+  <h3 class="epydoc"><span class="sig"><span class="sig-name">__init__</span>(<span class="sig-arg">self</span>,
+        <span class="sig-arg">name</span>)</span>
+    <br /><em class="fname">(Constructor)</em>
+  </h3>
+  </td><td align="right" valign="top"
+    ><span class="codelink"><a href="testpackage.util-pysrc.html#_SecondClass.__init__">source code</a></span> 
+    </td>
+  </tr></table>
+  
+  <p>Constructor.</p>
+  <dl class="fields">
+    <dt>Parameters:</dt>
+    <dd><ul class="nomargin-top">
+        <li><strong class="pname"><code>name</code></strong> - Name of this instance</li>
+    </ul></dd>
+    <dt>Overrides:
+        object.__init__
+    </dt>
+  </dl>
+</td></tr></table>
+</div>
+<br />
+<!-- ==================== NAVIGATION BAR ==================== -->
+<table class="navbar" border="0" width="100%" cellpadding="0"
+       bgcolor="#a0c0ff" cellspacing="0">
+  <tr valign="middle">
+  <!-- Home link -->
+      <th>   <a
+        href="testpackage-module.html">Home</a>   </th>
+
+  <!-- Tree link -->
+      <th>   <a
+        href="module-tree.html">Trees</a>   </th>
+
+  <!-- Index link -->
+      <th>   <a
+        href="identifier-index.html">Indices</a>   </th>
+
+  <!-- Help link -->
+      <th>   <a
+        href="help.html">Help</a>   </th>
+
+  <!-- Project homepage -->
+      <th class="navbar" align="right" width="100%">
+        <table border="0" cellpadding="0" cellspacing="0">
+          <tr><th class="navbar" align="center"
+            ><a class="navbar" target="_top" href="http://this.is.something/special">Super Duper Special Project</a></th>
+          </tr></table></th>
+  </tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%%">
+  <tr>
+    <td align="left" class="footer">
+    Generated by Epydoc 3.0.1
+    </td>
+    <td align="right" class="footer">
+      <a target="mainFrame" href="http://epydoc.sourceforge.net"
+        >http://epydoc.sourceforge.net</a>
+    </td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/toc-everything.html b/debian/tests/data/htmldocs/expected/output/toc-everything.html
new file mode 100644
index 0000000..a7e418a
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/toc-everything.html
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>Everything</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<h1 class="toc">Everything</h1>
+<hr />
+  <h2 class="toc">All Classes</h2>
+    <a target="mainFrame" href="testpackage.util.FirstClass-class.html"
+     >testpackage.util.FirstClass</a><br />  <div class="private">
+    <a target="mainFrame" href="testpackage.util._SecondClass-class.html"
+     >testpackage.util._SecondClass</a><br />  </div>
+  <h2 class="toc">All Functions</h2>
+    <a target="mainFrame" href="testpackage.util-module.html#method2"
+     >testpackage.util.method2</a><br />    <a target="mainFrame" href="testpackage.util-module.html#methodOne"
+     >testpackage.util.methodOne</a><br />  <h2 class="toc">All Variables</h2>
+  <div class="private">
+    <a target="mainFrame" href="testpackage-module.html#__package__"
+     >testpackage.__package__</a><br />  </div>
+    <a target="mainFrame" href="testpackage.util-module.html#CONSTANT_ONE"
+     >testpackage.util.CONSTANT_ONE</a><br />    <a target="mainFrame" href="testpackage.util-module.html#CONSTANT_TWO"
+     >testpackage.util.CONSTANT_TWO</a><br />    <a target="mainFrame" href="testpackage.util-module.html#__package__"
+     >testpackage.util.__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/toc-testpackage-module.html b/debian/tests/data/htmldocs/expected/output/toc-testpackage-module.html
new file mode 100644
index 0000000..57c5a77
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/toc-testpackage-module.html
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>testpackage</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<h1 class="toc">Module testpackage</h1>
+<hr />
+  <h2 class="toc">Variables</h2>
+  <div class="private">
+    <a target="mainFrame" href="testpackage-module.html#__package__"
+     >__package__</a><br />  </div>
+<hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/toc-testpackage.util-module.html b/debian/tests/data/htmldocs/expected/output/toc-testpackage.util-module.html
new file mode 100644
index 0000000..71d24ca
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/toc-testpackage.util-module.html
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>util</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<h1 class="toc">Module util</h1>
+<hr />
+  <h2 class="toc">Classes</h2>
+    <a target="mainFrame" href="testpackage.util.FirstClass-class.html"
+     >FirstClass</a><br />  <div class="private">
+    <a target="mainFrame" href="testpackage.util._SecondClass-class.html"
+     >_SecondClass</a><br />  </div>
+  <h2 class="toc">Functions</h2>
+    <a target="mainFrame" href="testpackage.util-module.html#method2"
+     >method2</a><br />    <a target="mainFrame" href="testpackage.util-module.html#methodOne"
+     >methodOne</a><br />  <h2 class="toc">Variables</h2>
+    <a target="mainFrame" href="testpackage.util-module.html#CONSTANT_ONE"
+     >CONSTANT_ONE</a><br />    <a target="mainFrame" href="testpackage.util-module.html#CONSTANT_TWO"
+     >CONSTANT_TWO</a><br />    <a target="mainFrame" href="testpackage.util-module.html#__package__"
+     >__package__</a><br /><hr />
+<span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/expected/output/toc.html b/debian/tests/data/htmldocs/expected/output/toc.html
new file mode 100644
index 0000000..6c01a4a
--- /dev/null
+++ b/debian/tests/data/htmldocs/expected/output/toc.html
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ascii"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>Table of Contents</title>
+  <link rel="stylesheet" href="epydoc.css" type="text/css" />
+  <script type="text/javascript" src="epydoc.js"></script>
+</head>
+
+<body bgcolor="white" text="black" link="blue" vlink="#204080"
+      alink="#204080">
+<h1 class="toc">Table of Contents</h1>
+<hr />
+  <a target="moduleFrame" href="toc-everything.html">Everything</a>
+  <br />
+  <h2 class="toc">Modules</h2>
+    <a target="moduleFrame" href="toc-testpackage-module.html"
+     onclick="setFrame('toc-testpackage-module.html','testpackage-module.html');"     >testpackage</a><br />    <a target="moduleFrame" href="toc-testpackage.util-module.html"
+     onclick="setFrame('toc-testpackage.util-module.html','testpackage.util-module.html');"     >testpackage.util</a><br /><hr />
+  <span class="options">[<a href="javascript:void(0);" class="privatelink"
+    onclick="toggle_private();">hide private</a>]</span>
+
+<script type="text/javascript">
+  <!--
+  // Private objects are initially displayed (because if
+  // javascript is turned off then we want them to be
+  // visible); but by default, we want to hide them.  So hide
+  // them unless we have a cookie that says to show them.
+  checkCookie();
+  // -->
+</script>
+</body>
+</html>
diff --git a/debian/tests/data/htmldocs/testpackage/__init__.py b/debian/tests/data/htmldocs/testpackage/__init__.py
new file mode 100644
index 0000000..417ebd8
--- /dev/null
+++ b/debian/tests/data/htmldocs/testpackage/__init__.py
@@ -0,0 +1,15 @@
+"""
+This is an important module that really needs to be documented.
+
+It has a bunch of stuff in it that is not only really important, but also
+really interesting too.  Because of that, we really want this information to
+show up in the generated Epydoc documentation.
+
+Besides being a pile of completely useless text, this is used as a test case
+for Epydoc, to make sure that it's working.
+
+ at author: Kenneth J. Pronovici <pronovic at debian.org>
+"""
+
+__all__ = [ 'util', ]
+
diff --git a/debian/tests/data/htmldocs/testpackage/util.py b/debian/tests/data/htmldocs/testpackage/util.py
new file mode 100644
index 0000000..9123ffc
--- /dev/null
+++ b/debian/tests/data/htmldocs/testpackage/util.py
@@ -0,0 +1,76 @@
+"""
+Provides general-purpose utilities.
+
+ at sort: FirstClass, _SecondClass, method2, methodOne, CONSTANT_ONE, CONSTANT_TWO
+
+ at var CONSTANT_ONE: The first constant
+ at var CONSTANT_TWO: The second constant
+
+ at author: Kenneth J. Pronovici <pronovic at ieee.org>
+"""
+
+CONSTANT_ONE       = "one"
+CONSTANT_TWO       = "two"
+
+class FirstClass(list):
+
+   """
+   Special list class.
+
+   This is a special class that extends list.
+
+   It has some special behavior that users will find really interesting.
+   Or, it would if I had remembered to implement that.
+   """
+
+   def __eq__(self, other):
+      """
+      Definition of C{==} operator for this class.
+      @param other: Other object to compare to.
+      @return: True/false depending on whether C{other is None}
+      """
+      if other is None:
+         return False
+      else:
+         return True
+
+class _SecondClass(object):
+
+   """
+   Represents something else that I forgot just now.
+   """
+
+   def __init__(self, name):
+      """
+      Constructor.
+      @param name: Name of this instance
+      """
+      self.name = name
+      self.state = None
+
+def methodOne(d):
+   """
+   Returns the keys of the dictionary sorted by value.
+
+   There are cuter ways to do this in Python 2.4, but we were originally
+   attempting to stay compatible with Python 2.3.
+
+   @param d: Dictionary to operate on
+   @return: List of dictionary keys sorted in order by dictionary value.
+   """
+   items = d.items()
+   items.sort(lambda x, y: cmp(x[1], y[1]))
+   return [key for key, value in items]
+
+def method2(d, keys):
+   """
+   Removes all of the keys from the dictionary.
+   The dictionary is altered in-place.
+   Each key must exist in the dictionary.
+   @param d: Dictionary to operate on
+   @param keys: List of keys to remove
+   @raise KeyError: If one of the keys does not exist
+   """
+   for key in keys:
+      del d[key]
+
diff --git a/debian/tests/htmldocs b/debian/tests/htmldocs
new file mode 100644
index 0000000..2f68899
--- /dev/null
+++ b/debian/tests/htmldocs
@@ -0,0 +1,80 @@
+#!/bin/sh
+
+# Make sure $ADTTMP is available
+if [ "${ADTTMP}"F = "F" ]; then
+   echo "Error: expected environment variable ADTTMP is not set."
+   exit 1
+fi
+
+# Make sure $ADT_ARTIFACTS is available
+if [ "${ADT_ARTIFACTS}"F = "F" ]; then
+   echo "Error: expected environment variable ADT_ARTIFACTS is not set."
+   exit 1
+fi
+
+# Determine the test execution mode 
+if [ "${1}"F = "F" ]; then
+   MODE="autopkgtest"
+elif [ "${1}" = "-r" ]; then
+   MODE="debian/rules"
+else 
+   echo "usage: $0 [-r]\n-r Run in debian/rules mode instead of autopkgtest mode"
+   exit 2
+fi
+
+# Determine locations of required tools
+SOURCE_TREE="${PWD}"
+if [ "${MODE}" = "debian/rules" ]; then
+   # In debian/rules mode, the executables are assumed to be in the source tree
+   EPYDOC="${SOURCE_TREE}/scripts/epydoc"
+   export PYTHONPATH="${SOURCE_TREE}"
+else
+   # In autopkgtest mode, the executables are assumed to be installed
+   EPYDOC="/usr/bin/epydoc"
+fi
+
+# Print a test summary
+echo ""
+echo "========================================================================="
+echo "Running ${0} in mode: ${MODE}"
+echo "========================================================================="
+echo "SOURCE_TREE..: ${SOURCE_TREE}"
+echo "ADTTMP.......: ${ADTTMP}"
+echo "ADT_ARTIFACTS: ${ADT_ARTIFACTS}"
+echo "EPYDOC.......: ${EPYDOC}"
+echo "PYTHONPATH...: ${PYTHONPATH}"
+echo "========================================================================="
+echo ""
+
+# Always run tests from within $ADTTMP
+cd ${ADTTMP}
+
+# Set up some configuration
+NAME="Super Duper Special Project"
+URL="http://this.is.something/special"
+PACKAGE="testpackage"
+OUTPUT="${ADTTMP}/output"
+
+# Copy in the sample source tree
+echo "Creating Python project..."
+cp -r ${SOURCE_TREE}/debian/tests/data/htmldocs/testpackage .
+
+# Generate the documentation
+echo "Running: ${EPYDOC} --no-include-build-time -v --html --name "${NAME}" --output "${OUTPUT}" --url "${URL}" ${PACKAGE}/"
+${EPYDOC} --no-include-build-time -v --html --name "${NAME}" --output "${OUTPUT}" --url "${URL}" ${PACKAGE}/
+if [ $? != 0 ]; then
+   echo "Error: epydoc command failed"
+   exit 1
+fi
+
+# Check that the generated results match expected
+/usr/bin/diff -Naur ${SOURCE_TREE}/debian/tests/data/htmldocs/expected/output ${OUTPUT}
+if [ $? != 0 ]; then
+   echo "Generated result differs."
+   exit 1
+fi
+echo "Actual results match expected results... success!"
+
+# Close the test
+echo ""
+
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..b1e780f
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,4 @@
+# This watch file uses the qa.debian.org redirector so that SourceForge URLs work
+version=3
+opts=dversionmangle=s/\+dfsg// \
+http://sf.net/epydoc/epydoc-(.*)\.tar\.gz

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/epydoc.git



More information about the Reproducible-commits mailing list