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()
  ........
................
This commit is contained in:
Benjamin Peterson 2010-05-21 21:49:24 +00:00
parent c7afb62cb8
commit 92e97a7166
3 changed files with 56 additions and 44 deletions

View File

@ -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

View File

@ -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)
# 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)
# 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()
with open(source_name, 'w') as source:
source.write(SOURCE_2)
source = open(source_name, 'w')
source.write(SOURCE_2)
source.close()
# Try to update a bogus cache entry
linecache.checkcache('dummy')
# 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))
# 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)
# 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)
def test_main():
support.run_unittest(LineCacheTests)

View File

@ -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.