summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2010-05-21 21:49:24 (GMT)
committerBenjamin Peterson <benjamin@python.org>2010-05-21 21:49:24 (GMT)
commit92e97a7166207a8b335dfa883115c2366d6d8c2e (patch)
treec2246325fa61bd887054c9cdde8dac53f63efcf6
parentc7afb62cb835624721f32cdc8ddf76177e8d9a14 (diff)
downloadcpython-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.py29
-rw-r--r--Lib/test/test_linecache.py78
-rw-r--r--Misc/NEWS3
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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 27dd6a4..32f188c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.