In DocFileTest:
- Fixed bug in handling of absolute paths.
- If run from an interactive session, make paths relative to the
directory containing sys.argv[0] (since __main__ doesn't have
a __file__ attribute).
diff --git a/Lib/doctest.py b/Lib/doctest.py
index c1a87b3..3414f4a 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -2312,10 +2312,27 @@
)
def DocFileTest(path, package=None, globs=None, **options):
- package = _normalize_module(package)
name = path.split('/')[-1]
- dir = os.path.split(package.__file__)[0]
- path = os.path.join(dir, *(path.split('/')))
+
+ # Interpret relative paths as relative to the given package's
+ # directory (or the current module, if no package is specified).
+ if not os.path.isabs(path):
+ package = _normalize_module(package)
+ if hasattr(package, '__file__'):
+ # A normal package/module.
+ dir = os.path.split(package.__file__)[0]
+ path = os.path.join(dir, *(path.split('/')))
+ elif package.__name__ == '__main__':
+ # An interactive session.
+ if sys.argv[0] != '':
+ dir = os.path.split(sys.argv[0])[0]
+ path = os.path.join(dir, *(path.split('/')))
+ else:
+ # A module w/o __file__ (this includes builtins)
+ raise ValueError("Can't resolve paths relative to " +
+ "the module %s (it has" % package +
+ "no __file__)")
+
doc = open(path).read()
if globs is None:
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index 77b9ef5..8c96b21 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -1812,14 +1812,37 @@
>>> suite.run(unittest.TestResult())
<unittest.TestResult run=2 errors=0 failures=2>
- Note that '/' should be used as a path separator. It will be
- converted to a native separator at run time:
-
+ '/' should be used as a path separator. It will be converted
+ to a native separator at run time:
>>> suite = doctest.DocFileSuite('../test/test_doctest.txt')
>>> suite.run(unittest.TestResult())
<unittest.TestResult run=1 errors=0 failures=1>
+ If DocFileSuite is used from an interactive session, then files
+ are resolved relative to the directory of sys.argv[0]:
+
+ >>> import new, os.path, test.test_doctest
+ >>> save_argv = sys.argv
+ >>> sys.argv = [test.test_doctest.__file__]
+ >>> suite = doctest.DocFileSuite('test_doctest.txt',
+ ... package=new.module('__main__'))
+ >>> sys.argv = save_argv
+
+ Absolute paths may also be used; they should use the native
+ path separator (*not* '/').
+
+ >>> # Get the absolute path of the test package.
+ >>> test_doctest_path = os.path.abspath(test.test_doctest.__file__)
+ >>> test_pkg_path = os.path.split(test_doctest_path)[0]
+
+ >>> # Use it to find the absolute path of test_doctest.txt.
+ >>> test_file = os.path.join(test_pkg_path, 'test_doctest.txt')
+
+ >>> suite = doctest.DocFileSuite(test_file)
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=1 errors=0 failures=1>
+
You can specify initial global variables:
>>> suite = doctest.DocFileSuite('test_doctest.txt',