Source: epydoc
Version: 3.0.1+dfsg-11
Severity: wishlist
Tags: patch
User: reproducible-builds@lists.alioth.debian.org
Usertags: randomness
X-Debbugs-Cc: reproducible-builds@lists.alioth.debian.org

Hi!

While working on the “reproducible builds” effort [1], we have noticed
that class trees written by epydoc list classes in an order that varies
across builds.

The attached patch uses 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 added ordering for modules.

Once applied, more packages using epydoc can be built reproducibly in
our current experimental framework.

 [1]: https://wiki.debian.org/ReproducibleBuilds

Regards,
Val
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

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Reproducible-builds mailing list
Reproducible-builds@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/reproducible-builds

Reply via email to