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
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