From 0273f5b6b29486629f74f184da84172cb43fe221 Mon Sep 17 00:00:00 2001 From: Edward Loper Date: Sat, 18 Sep 2004 20:27:04 +0000 Subject: 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). --- Lib/doctest.py | 23 ++++++++++++++++++++--- Lib/test/test_doctest.py | 29 ++++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) 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 @@ class DocFileCase(DocTestCase): ) 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 @@ def test_DocFileSuite(): >>> suite.run(unittest.TestResult()) - 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()) + 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()) + + You can specify initial global variables: >>> suite = doctest.DocFileSuite('test_doctest.txt', -- cgit v0.12