##// END OF EJS Templates
Merge branch 'main' into shaperilio/autoreload-verbosity
Merge branch 'main' into shaperilio/autoreload-verbosity

File last commit:

r26419:7663c521
r27961:0aa7a071 merge
Show More
openpy.py
105 lines | 3.3 KiB | text/x-python | PythonLexer
Thomas Kluyver
Add IPython.utils.openpy to decode Python files.
r6247 """
Tools to open .py files as Unicode, using the encoding specified within the file,
as per PEP 263.
Much of the code is taken from the tokenize module in Python 3.2.
"""
import io
Jörgen Stenarson
make source_to_unicode use BytesIO and refactor
r8309 from io import TextIOWrapper, BytesIO
rushabh-v
use pathlib in utils/openpy.py
r26026 from pathlib import Path
Thomas Kluyver
Add IPython.utils.openpy to decode Python files.
r6247 import re
Srinivas Reddy Thatiparthy
remove python 2.7.x specific code
r23073 from tokenize import open, detect_encoding
Thomas Kluyver
Replace references to unicode and basestring
r13353
cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)", re.UNICODE)
cookie_comment_re = re.compile(r"^\s*#.*coding[:=]\s*([-\w.]+)", re.UNICODE)
Thomas Kluyver
Add IPython.utils.openpy to decode Python files.
r6247
Jörgen Stenarson
make source_to_unicode use BytesIO and refactor
r8309 def source_to_unicode(txt, errors='replace', skip_encoding_cookie=True):
"""Converts a bytes string with python source code to unicode.
Unicode strings are passed through unchanged. Byte strings are checked
for the python source file encoding cookie to determine encoding.
txt can be either a bytes buffer or a string containing the source
code.
Jörgen Stenarson
merge functionality in io and openpy relating to encoding...
r8304 """
Srinivas Reddy Thatiparthy
remove unicode_type function
r23044 if isinstance(txt, str):
Jörgen Stenarson
merge functionality in io and openpy relating to encoding...
r8304 return txt
Jörgen Stenarson
check for bytes instead of str for python3 compatibility
r8314 if isinstance(txt, bytes):
Jörgen Stenarson
make source_to_unicode use BytesIO and refactor
r8309 buffer = BytesIO(txt)
else:
buffer = txt
Jörgen Stenarson
merge functionality in io and openpy relating to encoding...
r8304 try:
Jörgen Stenarson
make source_to_unicode use BytesIO and refactor
r8309 encoding, _ = detect_encoding(buffer.readline)
Jörgen Stenarson
merge functionality in io and openpy relating to encoding...
r8304 except SyntaxError:
Jörgen Stenarson
make source_to_unicode use BytesIO and refactor
r8309 encoding = "ascii"
buffer.seek(0)
Matthias Bussonnier
Properly close some leaked resources.
r25102 with TextIOWrapper(buffer, encoding, errors=errors, line_buffering=True) as text:
text.mode = 'r'
if skip_encoding_cookie:
return u"".join(strip_encoding_cookie(text))
else:
return text.read()
Jörgen Stenarson
merge functionality in io and openpy relating to encoding...
r8304
Thomas Kluyver
Add IPython.utils.openpy to decode Python files.
r6247 def strip_encoding_cookie(filelike):
"""Generator to pull lines from a text-mode file, skipping the encoding
cookie if it is found in the first two lines.
"""
it = iter(filelike)
try:
first = next(it)
if not cookie_comment_re.match(first):
yield first
second = next(it)
if not cookie_comment_re.match(second):
yield second
except StopIteration:
return
for line in it:
yield line
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 def read_py_file(filename, skip_encoding_cookie=True):
"""Read a Python file, using the encoding declared inside the file.
Matthias Bussonnier
reformat docstring in IPython utils
r26419
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 Parameters
----------
filename : str
Matthias Bussonnier
reformat docstring in IPython utils
r26419 The path to the file to read.
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 skip_encoding_cookie : bool
Matthias Bussonnier
reformat docstring in IPython utils
r26419 If True (the default), and the encoding declaration is found in the first
two lines, that line will be excluded from the output.
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 Returns
-------
A unicode string containing the contents of the file.
"""
rushabh-v
use pathlib in utils/openpy.py
r26026 filepath = Path(filename)
Matthias Bussonnier
autoreformat with darker
r26092 with open(filepath) as f: # the open function defined in this module.
Thomas Kluyver
Use openpy module for %loadpy magic.
r6301 if skip_encoding_cookie:
return "".join(strip_encoding_cookie(f))
else:
rushabh-v
use file.read instead of filepath.read_text
r26029 return f.read()
Thomas Kluyver
Use openpy module for %loadpy magic.
r6301
def read_py_url(url, errors='replace', skip_encoding_cookie=True):
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 """Read a Python file from a URL, using the encoding declared inside the file.
Matthias Bussonnier
reformat docstring in IPython utils
r26419
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 Parameters
----------
url : str
Matthias Bussonnier
reformat docstring in IPython utils
r26419 The URL from which to fetch the file.
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 errors : str
Matthias Bussonnier
reformat docstring in IPython utils
r26419 How to handle decoding errors in the file. Options are the same as for
bytes.decode(), but here 'replace' is the default.
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 skip_encoding_cookie : bool
Matthias Bussonnier
reformat docstring in IPython utils
r26419 If True (the default), and the encoding declaration is found in the first
two lines, that line will be excluded from the output.
Thomas Kluyver
Add docstrings for read_py_file and read_py_url.
r6450 Returns
-------
A unicode string containing the contents of the file.
Thomas Kluyver
Use openpy module for %loadpy magic.
r6301 """
Sean Vig
Fix Python 3 handling of urllib...
r13640 # Deferred import for faster start
Srinivas Reddy Thatiparthy
remove python 2.7.x specific code
r23073 from urllib.request import urlopen
Thomas Kluyver
Defer import of urllib
r9389 response = urlopen(url)
Thomas Kluyver
Use openpy module for %loadpy magic.
r6301 buffer = io.BytesIO(response.read())
Jörgen Stenarson
make source_to_unicode use BytesIO and refactor
r8309 return source_to_unicode(buffer, errors, skip_encoding_cookie)