From ead9bfc5c392951d8f0d8c537a138df672b762e4 Mon Sep 17 00:00:00 2001 From: R David Murray Date: Fri, 3 Jun 2016 19:28:35 -0400 Subject: [PATCH] #16484: Fix pydoc doc links to modules whose names are mixed case. Patch by Sean Rodman, test by Kaushik N. --- Lib/pydoc.py | 12 ++++++------ Lib/test/test_pydoc.py | 14 ++++++++++++++ Misc/ACKS | 1 + 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Lib/pydoc.py b/Lib/pydoc.py index a9c04f0728f..3ca08c9b589 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -354,7 +354,7 @@ def safeimport(path, forceload=0, cache={}): class Doc: PYTHONDOCS = os.environ.get("PYTHONDOCS", - "http://docs.python.org/%d.%d/library" + "https://docs.python.org/%d.%d/library" % sys.version_info[:2]) def document(self, object, name=None, *args): @@ -383,7 +383,9 @@ class Doc: docmodule = docclass = docroutine = docother = docproperty = docdata = fail - def getdocloc(self, object): + def getdocloc(self, object, + basedir=os.path.join(sys.base_exec_prefix, "lib", + "python%d.%d" % sys.version_info[:2])): """Return the location of module docs or None""" try: @@ -393,8 +395,6 @@ class Doc: docloc = os.environ.get("PYTHONDOCS", self.PYTHONDOCS) - basedir = os.path.join(sys.base_exec_prefix, "lib", - "python%d.%d" % sys.version_info[:2]) if (isinstance(object, type(os)) and (object.__name__ in ('errno', 'exceptions', 'gc', 'imp', 'marshal', 'posix', 'signal', 'sys', @@ -403,9 +403,9 @@ class Doc: not file.startswith(os.path.join(basedir, 'site-packages')))) and object.__name__ not in ('xml.etree', 'test.pydoc_mod')): if docloc.startswith("http://"): - docloc = "%s/%s" % (docloc.rstrip("/"), object.__name__) + docloc = "%s/%s" % (docloc.rstrip("/"), object.__name__.lower()) else: - docloc = os.path.join(docloc, object.__name__ + ".html") + docloc = os.path.join(docloc, object.__name__.lower() + ".html") else: docloc = None return docloc diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index f284779ba47..59aa7151ee1 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -18,6 +18,7 @@ import types import unittest import urllib.parse import xml.etree +import xml.etree.ElementTree import textwrap from io import StringIO from collections import namedtuple @@ -352,6 +353,14 @@ def get_pydoc_html(module): loc = "
Module Docs" return output.strip(), loc +def get_pydoc_link(module): + "Returns a documentation web link of a module" + dirname = os.path.dirname + basedir = os.path.join(dirname(dirname(__file__))) + doc = pydoc.TextDoc() + loc = doc.getdocloc(module, basedir=basedir) + return loc + def get_pydoc_text(module): "Returns pydoc generated output as text" doc = pydoc.TextDoc() @@ -443,6 +452,11 @@ class PydocDocTest(unittest.TestCase): doc = pydoc.render_doc(BinaryInteger) self.assertIn('', doc) + def test_mixed_case_module_names_are_lower_cased(self): + # issue16484 + doc_link = get_pydoc_link(xml.etree.ElementTree) + self.assertIn('xml.etree.elementtree', doc_link) + def test_issue8225(self): # Test issue8225 to ensure no doc link appears for xml.etree result, doc_loc = get_pydoc_text(xml.etree) diff --git a/Misc/ACKS b/Misc/ACKS index 0da5cf8d8f9..709ce942235 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1018,6 +1018,7 @@ Louis Munro R. David Murray Matti Mäki Jörg Müller +Kaushik N Dale Nagata John Nagle Takahiro Nakayama