diff options
author | Benjamin Peterson <benjamin@python.org> | 2010-05-21 21:49:24 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2010-05-21 21:49:24 (GMT) |
commit | 92e97a7166207a8b335dfa883115c2366d6d8c2e (patch) | |
tree | c2246325fa61bd887054c9cdde8dac53f63efcf6 | |
parent | c7afb62cb835624721f32cdc8ddf76177e8d9a14 (diff) | |
download | cpython-92e97a7166207a8b335dfa883115c2366d6d8c2e.zip cpython-92e97a7166207a8b335dfa883115c2366d6d8c2e.tar.gz cpython-92e97a7166207a8b335dfa883115c2366d6d8c2e.tar.bz2 |
Merged revisions 81438 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
r81438 | benjamin.peterson | 2010-05-21 16:45:06 -0500 (Fri, 21 May 2010) | 25 lines
Merged revisions 81428-81429,81432-81433,81437 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r81428 | benjamin.peterson | 2010-05-21 16:16:12 -0500 (Fri, 21 May 2010) | 1 line
use addCleanup
........
r81429 | benjamin.peterson | 2010-05-21 16:17:22 -0500 (Fri, 21 May 2010) | 1 line
fix name
........
r81432 | benjamin.peterson | 2010-05-21 16:31:24 -0500 (Fri, 21 May 2010) | 1 line
ensure the last line has a trailing newline #8782
........
r81433 | benjamin.peterson | 2010-05-21 16:32:49 -0500 (Fri, 21 May 2010) | 1 line
remove debugging rubish
........
r81437 | benjamin.peterson | 2010-05-21 16:35:44 -0500 (Fri, 21 May 2010) | 1 line
simplify and modernize updatecache()
........
................
-rw-r--r-- | Lib/linecache.py | 29 | ||||
-rw-r--r-- | Lib/test/test_linecache.py | 78 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 61 insertions, 49 deletions
diff --git a/Lib/linecache.py b/Lib/linecache.py index 27883fde..ef2adf5 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -73,13 +73,13 @@ def updatecache(filename, module_globals=None): if filename in cache: del cache[filename] - if not filename or filename[0] + filename[-1] == '<>': + if not filename or (filename.startswith('<') and filename.endswith('>')): return [] fullname = filename try: stat = os.stat(fullname) - except os.error as msg: + except OSError: basename = filename # Try for a __loader__, if available @@ -114,20 +114,23 @@ def updatecache(filename, module_globals=None): fullname = os.path.join(dirname, basename) except (TypeError, AttributeError): # Not sufficiently string-like to do anything useful with. + continue + try: + stat = os.stat(fullname) + break + except os.error: pass - else: - try: - stat = os.stat(fullname) - break - except os.error: - pass else: - # No luck return [] - with open(fullname, 'rb') as fp: - coding, line = tokenize.detect_encoding(fp.readline) - with open(fullname, 'r', encoding=coding) as fp: - lines = fp.readlines() + try: + with open(fullname, 'rb') as fp: + coding, line = tokenize.detect_encoding(fp.readline) + with open(fullname, 'r', encoding=coding) as fp: + lines = fp.readlines() + except IOError: + pass + if lines and not lines[-1].endswith('\n'): + lines[-1] += '\n' size, mtime = stat.st_size, stat.st_mtime cache[filename] = size, mtime, lines, fullname return lines diff --git a/Lib/test/test_linecache.py b/Lib/test/test_linecache.py index 4899511..d4c4777 100644 --- a/Lib/test/test_linecache.py +++ b/Lib/test/test_linecache.py @@ -31,6 +31,11 @@ a = f() ''' +SOURCE_3 = ''' +def f(): + return 3''' # No ending newline + + class LineCacheTests(unittest.TestCase): def test_getline(self): @@ -63,6 +68,13 @@ class LineCacheTests(unittest.TestCase): empty = linecache.getlines('a/b/c/__init__.py') self.assertEquals(empty, []) + def test_no_ending_newline(self): + self.addCleanup(support.unlink, support.TESTFN) + with open(support.TESTFN, "w") as fp: + fp.write(SOURCE_3) + lines = linecache.getlines(support.TESTFN) + self.assertEqual(lines, ["\n", "def f():\n", " return 3\n"]) + def test_clearcache(self): cached = [] for entry in TESTS: @@ -81,42 +93,36 @@ class LineCacheTests(unittest.TestCase): def test_checkcache(self): getline = linecache.getline - try: - # Create a source file and cache its contents - source_name = support.TESTFN + '.py' - with open(source_name, 'w') as source: - 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) - - finally: - support.unlink(source_name) + # Create a source file and cache its contents + source_name = support.TESTFN + '.py' + self.addCleanup(support.unlink, source_name) + with open(source_name, 'w') as source: + source.write(SOURCE_1) + getline(source_name, 1) + # Keep a copy of the old contents + source_list = [] + with open(source_name) as source: + for index, line in enumerate(source): + self.assertEquals(line, getline(source_name, index + 1)) + source_list.append(line) + + with open(source_name, 'w') as source: + source.write(SOURCE_2) + + # 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) + with open(source_name) as source: + for index, line in enumerate(source): + self.assertEquals(line, getline(source_name, index + 1)) + source_list.append(line) + def test_main(): support.run_unittest(LineCacheTests) @@ -54,6 +54,9 @@ C-API Library ------- +- Issue #8782: Add a trailing newline in linecache.updatecache to the last line + of files without one. + - Issue #8729: Return NotImplemented from collections.Mapping.__eq__ when comparing to a non-mapping. |