|
5 | 5 | import os.path
|
6 | 6 | import tempfile
|
7 | 7 | import tokenize
|
| 8 | +from importlib.machinery import ModuleSpec |
8 | 9 | from test import support
|
9 | 10 | from test.support import os_helper
|
10 | 11 |
|
@@ -97,6 +98,16 @@ class BadUnicode_WithDeclaration(GetLineTestsBadData, unittest.TestCase):
|
97 | 98 | file_byte_string = b'# coding=utf-8\n\x80abc'
|
98 | 99 |
|
99 | 100 |
|
| 101 | +class FakeLoader: |
| 102 | + def get_source(self, fullname): |
| 103 | + return f'source for {fullname}' |
| 104 | + |
| 105 | + |
| 106 | +class NoSourceLoader: |
| 107 | + def get_source(self, fullname): |
| 108 | + return None |
| 109 | + |
| 110 | + |
100 | 111 | class LineCacheTests(unittest.TestCase):
|
101 | 112 |
|
102 | 113 | def test_getline(self):
|
@@ -238,6 +249,33 @@ def raise_memoryerror(*args, **kwargs):
|
238 | 249 | self.assertEqual(lines3, [])
|
239 | 250 | self.assertEqual(linecache.getlines(FILENAME), lines)
|
240 | 251 |
|
| 252 | + def test_loader(self): |
| 253 | + filename = 'scheme://path' |
| 254 | + |
| 255 | + for loader in (None, object(), NoSourceLoader()): |
| 256 | + linecache.clearcache() |
| 257 | + module_globals = {'__name__': 'a.b.c', '__loader__': loader} |
| 258 | + self.assertEqual(linecache.getlines(filename, module_globals), []) |
| 259 | + |
| 260 | + linecache.clearcache() |
| 261 | + module_globals = {'__name__': 'a.b.c', '__loader__': FakeLoader()} |
| 262 | + self.assertEqual(linecache.getlines(filename, module_globals), |
| 263 | + ['source for a.b.c\n']) |
| 264 | + |
| 265 | + for spec in (None, object(), ModuleSpec('', FakeLoader())): |
| 266 | + linecache.clearcache() |
| 267 | + module_globals = {'__name__': 'a.b.c', '__loader__': FakeLoader(), |
| 268 | + '__spec__': spec} |
| 269 | + self.assertEqual(linecache.getlines(filename, module_globals), |
| 270 | + ['source for a.b.c\n']) |
| 271 | + |
| 272 | + linecache.clearcache() |
| 273 | + spec = ModuleSpec('x.y.z', FakeLoader()) |
| 274 | + module_globals = {'__name__': 'a.b.c', '__loader__': spec.loader, |
| 275 | + '__spec__': spec} |
| 276 | + self.assertEqual(linecache.getlines(filename, module_globals), |
| 277 | + ['source for x.y.z\n']) |
| 278 | + |
241 | 279 |
|
242 | 280 | class LineCacheInvalidationTests(unittest.TestCase):
|
243 | 281 | def setUp(self):
|
|
0 commit comments