Merged revisions 72319-72320,72467,72661,72675-72679,72703,72708,72710,72712,72801-72802,72820,72822,72824,72826-72828,72830 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r72319 | georg.brandl | 2009-05-05 10:28:49 +0200 (Di, 05 Mai 2009) | 1 line
#1309567: fix linecache behavior of stripping subdirectories from paths when looking for relative filename matches. Also add a linecache test suite.
........
r72320 | georg.brandl | 2009-05-05 10:30:28 +0200 (Di, 05 Mai 2009) | 1 line
Add a news entry for r72319.
........
r72467 | georg.brandl | 2009-05-08 14:17:34 +0200 (Fr, 08 Mai 2009) | 1 line
Fix name.
........
r72661 | georg.brandl | 2009-05-15 10:03:03 +0200 (Fr, 15 Mai 2009) | 1 line
Fix example output for doctest-like demos.
........
r72675 | georg.brandl | 2009-05-16 13:13:21 +0200 (Sa, 16 Mai 2009) | 1 line
#6034: clarify __reversed__ doc.
........
r72676 | georg.brandl | 2009-05-16 13:14:46 +0200 (Sa, 16 Mai 2009) | 1 line
#6025: fix signature of parse().
........
r72677 | georg.brandl | 2009-05-16 13:18:55 +0200 (Sa, 16 Mai 2009) | 1 line
#6009: undocument default argument of Option as deprecated.
........
r72678 | georg.brandl | 2009-05-16 13:21:29 +0200 (Sa, 16 Mai 2009) | 1 line
#2856: document 2.x os.listdir() behavior for undecodable filenames.
........
r72679 | georg.brandl | 2009-05-16 13:24:41 +0200 (Sa, 16 Mai 2009) | 1 line
Fix about and bugs pages to match real workflow.
........
r72703 | georg.brandl | 2009-05-17 10:10:27 +0200 (So, 17 Mai 2009) | 1 line
part of #4144: fix exception message in console session.
........
r72708 | georg.brandl | 2009-05-17 10:24:29 +0200 (So, 17 Mai 2009) | 1 line
#6017: better document behavior of dictiterators when the dict is changed.
........
r72710 | georg.brandl | 2009-05-17 10:36:04 +0200 (So, 17 Mai 2009) | 1 line
#5942: Copy over flag table from dbm.rst which is clearer.
........
r72712 | georg.brandl | 2009-05-17 10:55:00 +0200 (So, 17 Mai 2009) | 1 line
#5935: mention that BROWSER is looked for in PATH.
........
r72801 | georg.brandl | 2009-05-20 20:31:14 +0200 (Mi, 20 Mai 2009) | 1 line
#6055: refer to "sqlite3" consistently.
........
r72802 | georg.brandl | 2009-05-20 20:35:27 +0200 (Mi, 20 Mai 2009) | 1 line
#6051: refer to email examples for better way to construct email messages.
........
r72820 | georg.brandl | 2009-05-22 09:23:32 +0200 (Fr, 22 Mai 2009) | 1 line
Use raise X(y).
........
r72822 | georg.brandl | 2009-05-22 11:33:25 +0200 (Fr, 22 Mai 2009) | 1 line
#6084: fix example.
........
r72824 | georg.brandl | 2009-05-22 11:43:17 +0200 (Fr, 22 Mai 2009) | 1 line
Fix references to file-related functions and methods (os.* vs file.*).
........
r72826 | georg.brandl | 2009-05-22 11:49:42 +0200 (Fr, 22 Mai 2009) | 1 line
Fix confusing wording.
........
r72827 | georg.brandl | 2009-05-22 11:50:30 +0200 (Fr, 22 Mai 2009) | 1 line
s/use/call/
........
r72828 | georg.brandl | 2009-05-22 11:58:48 +0200 (Fr, 22 Mai 2009) | 1 line
Correction in softspace behavior description.
........
r72830 | georg.brandl | 2009-05-22 12:40:00 +0200 (Fr, 22 Mai 2009) | 1 line
#6086: fix spelling and use a better exception to catch.
........
diff --git a/Lib/linecache.py b/Lib/linecache.py
index 48f7dda..e7c33e1 100644
--- a/Lib/linecache.py
+++ b/Lib/linecache.py
@@ -79,7 +79,7 @@
try:
stat = os.stat(fullname)
except os.error, msg:
- basename = os.path.split(filename)[1]
+ basename = filename
# Try for a __loader__, if available
if module_globals and '__loader__' in module_globals:
@@ -103,7 +103,10 @@
)
return cache[filename][2]
- # Try looking through the module search path.
+ # Try looking through the module search path, which is only useful
+ # when handling a relative filename.
+ if os.path.isabs(filename):
+ return []
for dirname in sys.path:
# When using imputil, sys.path may contain things other than
diff --git a/Lib/test/test_linecache.py b/Lib/test/test_linecache.py
new file mode 100644
index 0000000..2894bb4
--- /dev/null
+++ b/Lib/test/test_linecache.py
@@ -0,0 +1,129 @@
+""" Tests for the linecache module """
+
+import linecache
+import unittest
+import os.path
+from test import test_support as support
+
+
+FILENAME = linecache.__file__
+INVALID_NAME = '!@$)(!@#_1'
+EMPTY = ''
+TESTS = 'cjkencodings_test inspect_fodder inspect_fodder2 mapping_tests'
+TESTS = TESTS.split()
+TEST_PATH = os.path.dirname(support.__file__)
+MODULES = "linecache unittest".split()
+MODULE_PATH = os.path.dirname(FILENAME)
+
+SOURCE_1 = '''
+" Docstring "
+
+def function():
+ return result
+
+'''
+
+SOURCE_2 = '''
+def f():
+ return 1 + 1
+
+a = f()
+
+'''
+
+class LineCacheTests(unittest.TestCase):
+
+ def test_getline(self):
+ getline = linecache.getline
+
+ # Bad values for line number should return an empty string
+ self.assertEquals(getline(FILENAME, 2**15), EMPTY)
+ self.assertEquals(getline(FILENAME, -1), EMPTY)
+
+ # Float values currently raise TypeError, should it?
+ self.assertRaises(TypeError, getline, FILENAME, 1.1)
+
+ # Bad filenames should return an empty string
+ self.assertEquals(getline(EMPTY, 1), EMPTY)
+ self.assertEquals(getline(INVALID_NAME, 1), EMPTY)
+
+ # Check whether lines correspond to those from file iteration
+ for entry in TESTS:
+ filename = os.path.join(TEST_PATH, entry) + '.py'
+ for index, line in enumerate(open(filename)):
+ self.assertEquals(line, getline(filename, index + 1))
+
+ # Check module loading
+ for entry in MODULES:
+ filename = os.path.join(MODULE_PATH, entry) + '.py'
+ for index, line in enumerate(open(filename)):
+ self.assertEquals(line, getline(filename, index + 1))
+
+ # Check that bogus data isn't returned (issue #1309567)
+ empty = linecache.getlines('a/b/c/__init__.py')
+ self.assertEquals(empty, [])
+
+ def test_clearcache(self):
+ cached = []
+ for entry in TESTS:
+ filename = os.path.join(TEST_PATH, entry) + '.py'
+ cached.append(filename)
+ linecache.getline(filename, 1)
+
+ # Are all files cached?
+ cached_empty = [fn for fn in cached if fn not in linecache.cache]
+ self.assertEquals(cached_empty, [])
+
+ # Can we clear the cache?
+ linecache.clearcache()
+ cached_empty = [fn for fn in cached if fn in linecache.cache]
+ self.assertEquals(cached_empty, [])
+
+ def test_checkcache(self):
+ getline = linecache.getline
+ try:
+ # Create a source file and cache its contents
+ source_name = os.path.join(TEST_PATH, 'linecache_test.py')
+ source = open(source_name, 'w')
+ source.write(SOURCE_1)
+ source.close()
+ getline(source_name, 1)
+
+ # Keep a copy of the old contents
+ source_list = []
+ source = open(source_name)
+ for index, line in enumerate(source):
+ self.assertEquals(line, getline(source_name, index + 1))
+ source_list.append(line)
+ source.close()
+
+ source = open(source_name, 'w')
+ source.write(SOURCE_2)
+ source.close()
+
+ # Try to update a bogus cache entry
+ linecache.checkcache('dummy')
+
+ # Check that the cache matches the old contents
+ for index, line in enumerate(source_list):
+ self.assertEquals(line, getline(source_name, index + 1))
+
+ # Update the cache and check whether it matches the new source file
+ linecache.checkcache(source_name)
+ source = open(source_name)
+ for index, line in enumerate(source):
+ self.assertEquals(line, getline(source_name, index + 1))
+ source_list.append(line)
+ source.close()
+
+ finally:
+ try:
+ source.close()
+ finally:
+ support.unlink(source_name)
+
+def test_main():
+ support.run_unittest(LineCacheTests)
+
+if __name__ == "__main__":
+ test_main()