From 42a53e105d45af4a93f5046795e5081302ff0bba 2012-05-05 04:16:03 From: Brandon Parsons Date: 2012-05-05 04:16:03 Subject: [PATCH] saner default encoding mechanism --- diff --git a/IPython/config/loader.py b/IPython/config/loader.py index d8fdb11..353420c 100644 --- a/IPython/config/loader.py +++ b/IPython/config/loader.py @@ -26,7 +26,7 @@ import sys from IPython.external import argparse from IPython.utils.path import filefind, get_ipython_dir from IPython.utils import py3compat, text, warn -from IPython.utils.encoding import getdefaultencoding +from IPython.utils.encoding import DEFAULT_ENCODING #----------------------------------------------------------------------------- # Exceptions @@ -440,7 +440,7 @@ class KeyValueConfigLoader(CommandLineConfigLoader): """decode argv if bytes, using stin.encoding, falling back on default enc""" uargv = [] if enc is None: - enc = getdefaultencoding() + enc = DEFAULT_ENCODING for arg in argv: if not isinstance(arg, unicode): # only decode if not already decoded @@ -604,7 +604,7 @@ class ArgParseConfigLoader(CommandLineConfigLoader): def _parse_args(self, args): """self.parser->self.parsed_data""" # decode sys.argv to support unicode command-line options - enc = getdefaultencoding() + enc = DEFAULT_ENCODING uargs = [py3compat.cast_unicode(a, enc) for a in args] self.parsed_data, self.extra_args = self.parser.parse_known_args(uargs) diff --git a/IPython/core/macro.py b/IPython/core/macro.py index 75950f2..619fb47 100644 --- a/IPython/core/macro.py +++ b/IPython/core/macro.py @@ -11,7 +11,7 @@ import re import sys from IPython.utils import py3compat -from IPython.utils.encoding import getdefaultencoding +from IPython.utils.encoding import DEFAULT_ENCODING coding_declaration = re.compile(r"#\s*coding[:=]\s*([-\w.]+)") @@ -36,7 +36,7 @@ class Macro(object): lines.append(line) code = "\n".join(lines) if isinstance(code, bytes): - code = code.decode(enc or getdefaultencoding()) + code = code.decode(enc or DEFAULT_ENCODING) self.value = code + '\n' def __str__(self): diff --git a/IPython/core/magic.py b/IPython/core/magic.py index b7590c6..ecee0f3 100644 --- a/IPython/core/magic.py +++ b/IPython/core/magic.py @@ -57,7 +57,7 @@ from IPython.core.pylabtools import mpl_runner from IPython.testing.skipdoctest import skip_doctest from IPython.utils import py3compat from IPython.utils import openpy -from IPython.utils.encoding import getdefaultencoding +from IPython.utils.encoding import DEFAULT_ENCODING from IPython.utils.io import file_read, nlprint from IPython.utils.module_paths import find_mod from IPython.utils.path import get_py_filename, unquote_filename @@ -950,7 +950,7 @@ Currently the magic system has the following functions:\n""" try: vstr = str(var) except UnicodeEncodeError: - vstr = unicode(var).encode(getdefaultencoding(), + vstr = unicode(var).encode(DEFAULT_ENCODING, 'backslashreplace') vstr = vstr.replace('\n','\\n') if len(vstr) < 50: diff --git a/IPython/testing/tools.py b/IPython/testing/tools.py index 326a8b7..a378a69 100644 --- a/IPython/testing/tools.py +++ b/IPython/testing/tools.py @@ -45,7 +45,7 @@ from IPython.utils.process import find_cmd, getoutputerror from IPython.utils.text import list_strings from IPython.utils.io import temp_pyfile, Tee from IPython.utils import py3compat -from IPython.utils.encoding import getdefaultencoding +from IPython.utils.encoding import DEFAULT_ENCODING from . import decorators as dec from . import skipdoctest @@ -323,7 +323,7 @@ else: # so we need a class that can handle both. class MyStringIO(StringIO): def write(self, s): - s = py3compat.cast_unicode(s, encoding=getdefaultencoding()) + s = py3compat.cast_unicode(s, encoding=DEFAULT_ENCODING) super(MyStringIO, self).write(s) notprinted_msg = """Did not find {0!r} in printed output (on {1}): diff --git a/IPython/utils/_process_posix.py b/IPython/utils/_process_posix.py index 57fb1bf..8d4e6f2 100644 --- a/IPython/utils/_process_posix.py +++ b/IPython/utils/_process_posix.py @@ -26,7 +26,7 @@ from .autoattr import auto_attr from ._process_common import getoutput, arg_split from IPython.utils import text from IPython.utils import py3compat -from IPython.utils.encoding import getdefaultencoding +from IPython.utils.encoding import DEFAULT_ENCODING #----------------------------------------------------------------------------- # Function definitions @@ -129,7 +129,7 @@ class ProcessHandler(object): int : child's exitstatus """ # Get likely encoding for the output. - enc = getdefaultencoding() + enc = DEFAULT_ENCODING # Patterns to match on the output, for pexpect. We read input and # allow either a short timeout or EOF diff --git a/IPython/utils/_process_win32.py b/IPython/utils/_process_win32.py index 7a39f4a..1565d34 100644 --- a/IPython/utils/_process_win32.py +++ b/IPython/utils/_process_win32.py @@ -29,7 +29,7 @@ from subprocess import STDOUT from ._process_common import read_no_interrupt, process_handler, arg_split as py_arg_split from . import py3compat from . import text -from .encoding import getdefaultencoding +from .encoding import DEFAULT_ENCODING #----------------------------------------------------------------------------- # Function definitions @@ -95,7 +95,7 @@ def _find_cmd(cmd): def _system_body(p): """Callback for _system.""" - enc = getdefaultencoding() + enc = DEFAULT_ENCODING for line in read_no_interrupt(p.stdout).splitlines(): line = line.decode(enc, 'replace') print(line, file=sys.stdout) diff --git a/IPython/utils/encoding.py b/IPython/utils/encoding.py index add75e5..470cf8c 100644 --- a/IPython/utils/encoding.py +++ b/IPython/utils/encoding.py @@ -52,3 +52,5 @@ def getdefaultencoding(): except Exception: pass return enc or sys.getdefaultencoding() + +DEFAULT_ENCODING = getdefaultencoding() diff --git a/IPython/utils/jsonutil.py b/IPython/utils/jsonutil.py index 77ace4f..932c02b 100644 --- a/IPython/utils/jsonutil.py +++ b/IPython/utils/jsonutil.py @@ -17,7 +17,7 @@ import types from datetime import datetime from IPython.utils import py3compat -from IPython.utils.encoding import getdefaultencoding +from IPython.utils.encoding import DEFAULT_ENCODING from IPython.utils import text next_attr_name = '__next__' if py3compat.PY3 else 'next' @@ -136,7 +136,7 @@ def json_clean(obj): return obj if isinstance(obj, bytes): - return obj.decode(getdefaultencoding(), 'replace') + return obj.decode(DEFAULT_ENCODING, 'replace') if isinstance(obj, container_to_list) or ( hasattr(obj, '__iter__') and hasattr(obj, next_attr_name)): diff --git a/IPython/utils/py3compat.py b/IPython/utils/py3compat.py index 97e31f4..f80a696 100644 --- a/IPython/utils/py3compat.py +++ b/IPython/utils/py3compat.py @@ -6,9 +6,7 @@ import sys import re import types -from .encoding import getdefaultencoding - -default_encoding = getdefaultencoding() +from .encoding import DEFAULT_ENCODING orig_open = open @@ -16,11 +14,11 @@ def no_code(x, encoding=None): return x def decode(s, encoding=None): - encoding = encoding or default_encoding + encoding = encoding or DEFAULT_ENCODING return s.decode(encoding, "replace") def encode(u, encoding=None): - encoding = encoding or default_encoding + encoding = encoding or DEFAULT_ENCODING return u.encode(encoding, "replace")