]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
doctest now supports packages
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 29 Mar 2016 23:29:05 +0000 (01:29 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 29 Mar 2016 23:29:05 +0000 (01:29 +0200)
Issue #26641: doctest.DocFileTest and doctest.testfile() now support packages
(module splitted into multiple directories) for the package parameter.

Lib/doctest.py
Misc/NEWS

index 38fdd80b4a495df179454cd2a020e63e1e56b549..5630220c5f5cfb09a5b94eaa9e8a2faf931c2e2d 100644 (file)
@@ -381,12 +381,15 @@ class _OutputRedirectingPdb(pdb.Pdb):
             sys.stdout = save_stdout
 
 # [XX] Normalize with respect to os.path.pardir?
-def _module_relative_path(module, path):
+def _module_relative_path(module, test_path):
     if not inspect.ismodule(module):
         raise TypeError('Expected a module: %r' % module)
-    if path.startswith('/'):
+    if test_path.startswith('/'):
         raise ValueError('Module-relative files may not have absolute paths')
 
+    # Normalize the path. On Windows, replace "/" with "\".
+    test_path = os.path.join(*(test_path.split('/')))
+
     # Find the base directory for the path.
     if hasattr(module, '__file__'):
         # A normal module/package
@@ -398,13 +401,19 @@ def _module_relative_path(module, path):
         else:
             basedir = os.curdir
     else:
+        if hasattr(module, '__path__'):
+            for directory in module.__path__:
+                fullpath = os.path.join(directory, test_path)
+                if os.path.exists(fullpath):
+                    return fullpath
+
         # A module w/o __file__ (this includes builtins)
         raise ValueError("Can't resolve paths relative to the module "
                          "%r (it has no __file__)"
                          % module.__name__)
 
-    # Combine the base directory and the path.
-    return os.path.join(basedir, *(path.split('/')))
+    # Combine the base directory and the test path.
+    return os.path.join(basedir, test_path)
 
 ######################################################################
 ## 2. Example & DocTest
index 3923af1e13743a5c6a16d7acee33a280e738538d..73c355d88f696810b5d59a3cda529fc2bcfde607 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -232,6 +232,10 @@ Core and Builtins
 Library
 -------
 
+- Issue #26641: doctest.DocFileTest and doctest.testfile() now support
+  packages (module splitted into multiple directories) for the package
+  parameter.
+
 - Issue #25195: Fix a regression in mock.MagicMock. _Call is a subclass of
   tuple (changeset 3603bae63c13 only works for classes) so we need to
   implement __ne__ ourselves.  Patch by Andrew Plummer.