aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/ipython/py2/IPython/utils/ulinecache.py
blob: 886454c267fb68540bebb55169ab10fd24f551a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
"""Wrapper around linecache which decodes files to unicode according to PEP 263. 
 
This is only needed for Python 2 - linecache in Python 3 does the same thing 
itself. 
""" 
import functools 
import linecache 
import sys 
 
from IPython.utils import py3compat 
from IPython.utils import openpy 
 
if py3compat.PY3: 
    getline = linecache.getline 
     
    # getlines has to be looked up at runtime, because doctests monkeypatch it. 
    @functools.wraps(linecache.getlines) 
    def getlines(filename, module_globals=None): 
        return linecache.getlines(filename, module_globals=module_globals) 
 
else: 
    def getlines(filename, module_globals=None): 
        """Get the lines (as unicode) for a file from the cache. 
        Update the cache if it doesn't contain an entry for this file already.""" 
        filename = py3compat.cast_bytes(filename, sys.getfilesystemencoding()) 
        lines = linecache.getlines(filename, module_globals=module_globals) 
         
        # The bits we cache ourselves can be unicode. 
        if (not lines) or isinstance(lines[0], py3compat.unicode_type): 
            return lines 
         
        readline = openpy._list_readline(lines) 
        try: 
            encoding, _ = openpy.detect_encoding(readline) 
        except SyntaxError: 
            encoding = 'ascii' 
        return [l.decode(encoding, 'replace') for l in lines] 
 
    # This is a straight copy of linecache.getline 
    def getline(filename, lineno, module_globals=None): 
        lines = getlines(filename, module_globals) 
        if 1 <= lineno <= len(lines): 
            return lines[lineno-1] 
        else: 
            return ''