summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/linecache.py4
-rw-r--r--Lib/test/test_inspect/test_inspect.py14
-rw-r--r--Lib/test/test_linecache.py4
-rw-r--r--Misc/NEWS.d/next/Library/2020-06-11-16-20-33.bpo-27578.CIA-fu.rst3
4 files changed, 23 insertions, 2 deletions
diff --git a/Lib/linecache.py b/Lib/linecache.py
index 04c8f45..b97999f 100644
--- a/Lib/linecache.py
+++ b/Lib/linecache.py
@@ -137,7 +137,9 @@ def updatecache(filename, module_globals=None):
lines = fp.readlines()
except (OSError, UnicodeDecodeError, SyntaxError):
return []
- if lines and not lines[-1].endswith('\n'):
+ if not lines:
+ lines = ['\n']
+ elif not lines[-1].endswith('\n'):
lines[-1] += '\n'
size, mtime = stat.st_size, stat.st_mtime
cache[filename] = size, mtime, lines, fullname
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index c3a9dc9..21d9f96 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -35,7 +35,7 @@ except ImportError:
from test.support import cpython_only
from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ
from test.support.import_helper import DirsOnSysPath, ready_to_import
-from test.support.os_helper import TESTFN
+from test.support.os_helper import TESTFN, temp_cwd
from test.support.script_helper import assert_python_ok, assert_python_failure, kill_python
from test.support import has_subprocess_support, SuppressCrashReport
from test import support
@@ -730,6 +730,18 @@ class TestRetrievingSourceCode(GetSourceBase):
finally:
del linecache.cache[co.co_filename]
+ def test_getsource_empty_file(self):
+ with temp_cwd() as cwd:
+ with open('empty_file.py', 'w'):
+ pass
+ sys.path.insert(0, cwd)
+ try:
+ import empty_file
+ self.assertEqual(inspect.getsource(empty_file), '\n')
+ self.assertEqual(inspect.getsourcelines(empty_file), (['\n'], 0))
+ finally:
+ sys.path.remove(cwd)
+
def test_getfile(self):
self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__)
diff --git a/Lib/test/test_linecache.py b/Lib/test/test_linecache.py
index e42df3d..8ac521d 100644
--- a/Lib/test/test_linecache.py
+++ b/Lib/test/test_linecache.py
@@ -83,6 +83,10 @@ class GetLineTestsBadData(TempFile):
class EmptyFile(GetLineTestsGoodData, unittest.TestCase):
file_list = []
+ def test_getlines(self):
+ lines = linecache.getlines(self.file_name)
+ self.assertEqual(lines, ['\n'])
+
class SingleEmptyLine(GetLineTestsGoodData, unittest.TestCase):
file_list = ['\n']
diff --git a/Misc/NEWS.d/next/Library/2020-06-11-16-20-33.bpo-27578.CIA-fu.rst b/Misc/NEWS.d/next/Library/2020-06-11-16-20-33.bpo-27578.CIA-fu.rst
new file mode 100644
index 0000000..df58a7e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-06-11-16-20-33.bpo-27578.CIA-fu.rst
@@ -0,0 +1,3 @@
+:func:`inspect.getsource` (and related functions) work with
+empty module files, returning ``'\n'`` (or reasonable equivalent)
+instead of raising ``OSError``. Patch by Kernc.