update windows build to Python 3.7
This commit is contained in:
parent
73105fa71e
commit
ddc59ab92d
5761 changed files with 750298 additions and 213405 deletions
|
|
@ -77,7 +77,8 @@ Specializing JSON object encoding::
|
|||
>>> def encode_complex(obj):
|
||||
... if isinstance(obj, complex):
|
||||
... return [obj.real, obj.imag]
|
||||
... raise TypeError(repr(o) + " is not JSON serializable")
|
||||
... raise TypeError('Object of type %s is not JSON serializable' %
|
||||
... obj.__class__.__name__)
|
||||
...
|
||||
>>> json.dumps(2 + 1j, default=encode_complex)
|
||||
'[2.0, 1.0]'
|
||||
|
|
@ -97,18 +98,19 @@ Using simplejson.tool from the shell to validate and pretty-print::
|
|||
Expecting property name: line 1 column 3 (char 2)
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
__version__ = '3.8.1'
|
||||
__version__ = '3.16.0'
|
||||
__all__ = [
|
||||
'dump', 'dumps', 'load', 'loads',
|
||||
'JSONDecoder', 'JSONDecodeError', 'JSONEncoder',
|
||||
'OrderedDict', 'simple_first',
|
||||
'OrderedDict', 'simple_first', 'RawJSON'
|
||||
]
|
||||
|
||||
__author__ = 'Bob Ippolito <bob@redivi.com>'
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
from .scanner import JSONDecodeError
|
||||
from .errors import JSONDecodeError
|
||||
from .raw_json import RawJSON
|
||||
from .decoder import JSONDecoder
|
||||
from .encoder import JSONEncoder, JSONEncoderForHTML
|
||||
def _import_OrderedDict():
|
||||
|
|
|
|||
BIN
Lib/site-packages/simplejson/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/__init__.cpython-37.pyc
Normal file
Binary file not shown.
BIN
Lib/site-packages/simplejson/__pycache__/compat.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/compat.cpython-37.pyc
Normal file
Binary file not shown.
BIN
Lib/site-packages/simplejson/__pycache__/decoder.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/decoder.cpython-37.pyc
Normal file
Binary file not shown.
BIN
Lib/site-packages/simplejson/__pycache__/encoder.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/encoder.cpython-37.pyc
Normal file
Binary file not shown.
BIN
Lib/site-packages/simplejson/__pycache__/errors.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/errors.cpython-37.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
Lib/site-packages/simplejson/__pycache__/raw_json.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/raw_json.cpython-37.pyc
Normal file
Binary file not shown.
BIN
Lib/site-packages/simplejson/__pycache__/scanner.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/scanner.cpython-37.pyc
Normal file
Binary file not shown.
BIN
Lib/site-packages/simplejson/__pycache__/tool.cpython-37.pyc
Normal file
BIN
Lib/site-packages/simplejson/__pycache__/tool.cpython-37.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
Lib/site-packages/simplejson/_speedups.cp37-win_amd64.pyd
Normal file
BIN
Lib/site-packages/simplejson/_speedups.cp37-win_amd64.pyd
Normal file
Binary file not shown.
|
|
@ -5,42 +5,30 @@ if sys.version_info[0] < 3:
|
|||
PY3 = False
|
||||
def b(s):
|
||||
return s
|
||||
def u(s):
|
||||
return unicode(s, 'unicode_escape')
|
||||
import cStringIO as StringIO
|
||||
StringIO = BytesIO = StringIO.StringIO
|
||||
try:
|
||||
from cStringIO import StringIO
|
||||
except ImportError:
|
||||
from StringIO import StringIO
|
||||
BytesIO = StringIO
|
||||
text_type = unicode
|
||||
binary_type = str
|
||||
string_types = (basestring,)
|
||||
integer_types = (int, long)
|
||||
unichr = unichr
|
||||
reload_module = reload
|
||||
def fromhex(s):
|
||||
return s.decode('hex')
|
||||
|
||||
else:
|
||||
PY3 = True
|
||||
if sys.version_info[:2] >= (3, 4):
|
||||
from importlib import reload as reload_module
|
||||
else:
|
||||
from imp import reload as reload_module
|
||||
import codecs
|
||||
def b(s):
|
||||
return codecs.latin_1_encode(s)[0]
|
||||
def u(s):
|
||||
return s
|
||||
import io
|
||||
StringIO = io.StringIO
|
||||
BytesIO = io.BytesIO
|
||||
return bytes(s, 'latin1')
|
||||
from io import StringIO, BytesIO
|
||||
text_type = str
|
||||
binary_type = bytes
|
||||
string_types = (str,)
|
||||
integer_types = (int,)
|
||||
|
||||
def unichr(s):
|
||||
return u(chr(s))
|
||||
|
||||
def fromhex(s):
|
||||
return bytes.fromhex(s)
|
||||
unichr = chr
|
||||
|
||||
long_type = integer_types[-1]
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ from __future__ import absolute_import
|
|||
import re
|
||||
import sys
|
||||
import struct
|
||||
from .compat import fromhex, b, u, text_type, binary_type, PY3, unichr
|
||||
from .compat import PY3, unichr
|
||||
from .scanner import make_scanner, JSONDecodeError
|
||||
|
||||
def _import_c_scanstring():
|
||||
|
|
@ -22,12 +22,12 @@ __all__ = ['JSONDecoder']
|
|||
FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
|
||||
|
||||
def _floatconstants():
|
||||
_BYTES = fromhex('7FF80000000000007FF0000000000000')
|
||||
# The struct module in Python 2.4 would get frexp() out of range here
|
||||
# when an endian is specified in the format string. Fixed in Python 2.5+
|
||||
if sys.byteorder != 'big':
|
||||
_BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1]
|
||||
nan, inf = struct.unpack('dd', _BYTES)
|
||||
if sys.version_info < (2, 6):
|
||||
_BYTES = '7FF80000000000007FF0000000000000'.decode('hex')
|
||||
nan, inf = struct.unpack('>dd', _BYTES)
|
||||
else:
|
||||
nan = float('nan')
|
||||
inf = float('inf')
|
||||
return nan, inf, -inf
|
||||
|
||||
NaN, PosInf, NegInf = _floatconstants()
|
||||
|
|
@ -40,14 +40,14 @@ _CONSTANTS = {
|
|||
|
||||
STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS)
|
||||
BACKSLASH = {
|
||||
'"': u('"'), '\\': u('\u005c'), '/': u('/'),
|
||||
'b': u('\b'), 'f': u('\f'), 'n': u('\n'), 'r': u('\r'), 't': u('\t'),
|
||||
'"': u'"', '\\': u'\\', '/': u'/',
|
||||
'b': u'\b', 'f': u'\f', 'n': u'\n', 'r': u'\r', 't': u'\t',
|
||||
}
|
||||
|
||||
DEFAULT_ENCODING = "utf-8"
|
||||
|
||||
def py_scanstring(s, end, encoding=None, strict=True,
|
||||
_b=BACKSLASH, _m=STRINGCHUNK.match, _join=u('').join,
|
||||
_b=BACKSLASH, _m=STRINGCHUNK.match, _join=u''.join,
|
||||
_PY3=PY3, _maxunicode=sys.maxunicode):
|
||||
"""Scan the string s for a JSON string. End is the index of the
|
||||
character in s after the quote that started the JSON string.
|
||||
|
|
@ -71,8 +71,8 @@ def py_scanstring(s, end, encoding=None, strict=True,
|
|||
content, terminator = chunk.groups()
|
||||
# Content is contains zero or more unescaped string characters
|
||||
if content:
|
||||
if not _PY3 and not isinstance(content, text_type):
|
||||
content = text_type(content, encoding)
|
||||
if not _PY3 and not isinstance(content, unicode):
|
||||
content = unicode(content, encoding)
|
||||
_append(content)
|
||||
# Terminator is the end of string, a literal control character,
|
||||
# or a backslash denoting that an escape sequence follows
|
||||
|
|
@ -365,8 +365,8 @@ class JSONDecoder(object):
|
|||
instance containing a JSON document)
|
||||
|
||||
"""
|
||||
if _PY3 and isinstance(s, binary_type):
|
||||
s = s.decode(self.encoding)
|
||||
if _PY3 and isinstance(s, bytes):
|
||||
s = str(s, self.encoding)
|
||||
obj, end = self.raw_decode(s)
|
||||
end = _w(s, end).end()
|
||||
if end != len(s):
|
||||
|
|
@ -388,7 +388,7 @@ class JSONDecoder(object):
|
|||
# Ensure that raw_decode bails on negative indexes, the regex
|
||||
# would otherwise mask this behavior. #98
|
||||
raise JSONDecodeError('Expecting value', s, idx)
|
||||
if _PY3 and not isinstance(s, text_type):
|
||||
if _PY3 and not isinstance(s, str):
|
||||
raise TypeError("Input string must be text, not bytes")
|
||||
# strip UTF-8 bom
|
||||
if len(s) > idx:
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import re
|
|||
from operator import itemgetter
|
||||
# Do not import Decimal directly to avoid reload issues
|
||||
import decimal
|
||||
from .compat import u, unichr, binary_type, string_types, integer_types, PY3
|
||||
from .compat import unichr, binary_type, text_type, string_types, integer_types, PY3
|
||||
def _import_speedups():
|
||||
try:
|
||||
from . import _speedups
|
||||
|
|
@ -14,12 +14,10 @@ def _import_speedups():
|
|||
return None, None
|
||||
c_encode_basestring_ascii, c_make_encoder = _import_speedups()
|
||||
|
||||
from simplejson.decoder import PosInf
|
||||
from .decoder import PosInf
|
||||
from .raw_json import RawJSON
|
||||
|
||||
#ESCAPE = re.compile(ur'[\x00-\x1f\\"\b\f\n\r\t\u2028\u2029]')
|
||||
# This is required because u() will mangle the string and ur'' isn't valid
|
||||
# python3 syntax
|
||||
ESCAPE = re.compile(u'[\\x00-\\x1f\\\\"\\b\\f\\n\\r\\t\u2028\u2029]')
|
||||
ESCAPE = re.compile(r'[\x00-\x1f\\"]')
|
||||
ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
|
||||
HAS_UTF8 = re.compile(r'[\x80-\xff]')
|
||||
ESCAPE_DCT = {
|
||||
|
|
@ -34,21 +32,31 @@ ESCAPE_DCT = {
|
|||
for i in range(0x20):
|
||||
#ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i))
|
||||
ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
|
||||
for i in [0x2028, 0x2029]:
|
||||
ESCAPE_DCT.setdefault(unichr(i), '\\u%04x' % (i,))
|
||||
|
||||
FLOAT_REPR = repr
|
||||
|
||||
def encode_basestring(s, _PY3=PY3, _q=u('"')):
|
||||
def encode_basestring(s, _PY3=PY3, _q=u'"'):
|
||||
"""Return a JSON representation of a Python string
|
||||
|
||||
"""
|
||||
if _PY3:
|
||||
if isinstance(s, binary_type):
|
||||
s = s.decode('utf-8')
|
||||
if isinstance(s, bytes):
|
||||
s = str(s, 'utf-8')
|
||||
elif type(s) is not str:
|
||||
# convert an str subclass instance to exact str
|
||||
# raise a TypeError otherwise
|
||||
s = str.__str__(s)
|
||||
else:
|
||||
if isinstance(s, str) and HAS_UTF8.search(s) is not None:
|
||||
s = s.decode('utf-8')
|
||||
s = unicode(s, 'utf-8')
|
||||
elif type(s) not in (str, unicode):
|
||||
# convert an str subclass instance to exact str
|
||||
# convert a unicode subclass instance to exact unicode
|
||||
# raise a TypeError otherwise
|
||||
if isinstance(s, str):
|
||||
s = str.__str__(s)
|
||||
else:
|
||||
s = unicode.__getnewargs__(s)[0]
|
||||
def replace(match):
|
||||
return ESCAPE_DCT[match.group(0)]
|
||||
return _q + ESCAPE.sub(replace, s) + _q
|
||||
|
|
@ -59,11 +67,23 @@ def py_encode_basestring_ascii(s, _PY3=PY3):
|
|||
|
||||
"""
|
||||
if _PY3:
|
||||
if isinstance(s, binary_type):
|
||||
s = s.decode('utf-8')
|
||||
if isinstance(s, bytes):
|
||||
s = str(s, 'utf-8')
|
||||
elif type(s) is not str:
|
||||
# convert an str subclass instance to exact str
|
||||
# raise a TypeError otherwise
|
||||
s = str.__str__(s)
|
||||
else:
|
||||
if isinstance(s, str) and HAS_UTF8.search(s) is not None:
|
||||
s = s.decode('utf-8')
|
||||
s = unicode(s, 'utf-8')
|
||||
elif type(s) not in (str, unicode):
|
||||
# convert an str subclass instance to exact str
|
||||
# convert a unicode subclass instance to exact unicode
|
||||
# raise a TypeError otherwise
|
||||
if isinstance(s, str):
|
||||
s = str.__str__(s)
|
||||
else:
|
||||
s = unicode.__getnewargs__(s)[0]
|
||||
def replace(match):
|
||||
s = match.group(0)
|
||||
try:
|
||||
|
|
@ -169,7 +189,7 @@ class JSONEncoder(object):
|
|||
transformed into unicode using that encoding prior to JSON-encoding.
|
||||
The default is UTF-8.
|
||||
|
||||
If use_decimal is true (not the default), ``decimal.Decimal`` will
|
||||
If use_decimal is true (default: ``True``), ``decimal.Decimal`` will
|
||||
be supported directly by the encoder. For the inverse, decode JSON
|
||||
with ``parse_float=decimal.Decimal``.
|
||||
|
||||
|
|
@ -249,7 +269,8 @@ class JSONEncoder(object):
|
|||
return JSONEncoder.default(self, o)
|
||||
|
||||
"""
|
||||
raise TypeError(repr(o) + " is not JSON serializable")
|
||||
raise TypeError('Object of type %s is not JSON serializable' %
|
||||
o.__class__.__name__)
|
||||
|
||||
def encode(self, o):
|
||||
"""Return a JSON string representation of a Python data structure.
|
||||
|
|
@ -263,7 +284,7 @@ class JSONEncoder(object):
|
|||
if isinstance(o, binary_type):
|
||||
_encoding = self.encoding
|
||||
if (_encoding is not None and not (_encoding == 'utf-8')):
|
||||
o = o.decode(_encoding)
|
||||
o = text_type(o, _encoding)
|
||||
if isinstance(o, string_types):
|
||||
if self.ensure_ascii:
|
||||
return encode_basestring_ascii(o)
|
||||
|
|
@ -298,10 +319,10 @@ class JSONEncoder(object):
|
|||
_encoder = encode_basestring_ascii
|
||||
else:
|
||||
_encoder = encode_basestring
|
||||
if self.encoding != 'utf-8':
|
||||
if self.encoding != 'utf-8' and self.encoding is not None:
|
||||
def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
|
||||
if isinstance(o, binary_type):
|
||||
o = o.decode(_encoding)
|
||||
o = text_type(o, _encoding)
|
||||
return _orig_encoder(o)
|
||||
|
||||
def floatstr(o, allow_nan=self.allow_nan, ignore_nan=self.ignore_nan,
|
||||
|
|
@ -366,6 +387,11 @@ class JSONEncoderForHTML(JSONEncoder):
|
|||
characters &, < and > should be escaped. They cannot be escaped
|
||||
with the usual entities (e.g. &) because they are not expanded
|
||||
within <script> tags.
|
||||
|
||||
This class also escapes the line separator and paragraph separator
|
||||
characters U+2028 and U+2029, irrespective of the ensure_ascii setting,
|
||||
as these characters are not valid in JavaScript strings (see
|
||||
http://timelessrepo.com/json-isnt-a-javascript-subset).
|
||||
"""
|
||||
|
||||
def encode(self, o):
|
||||
|
|
@ -383,6 +409,11 @@ class JSONEncoderForHTML(JSONEncoder):
|
|||
chunk = chunk.replace('&', '\\u0026')
|
||||
chunk = chunk.replace('<', '\\u003c')
|
||||
chunk = chunk.replace('>', '\\u003e')
|
||||
|
||||
if not self.ensure_ascii:
|
||||
chunk = chunk.replace(u'\u2028', '\\u2028')
|
||||
chunk = chunk.replace(u'\u2029', '\\u2029')
|
||||
|
||||
yield chunk
|
||||
|
||||
|
||||
|
|
@ -461,9 +492,12 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
first = False
|
||||
else:
|
||||
buf = separator
|
||||
if (isinstance(value, string_types) or
|
||||
(_PY3 and isinstance(value, binary_type))):
|
||||
if isinstance(value, string_types):
|
||||
yield buf + _encoder(value)
|
||||
elif _PY3 and isinstance(value, bytes) and _encoding is not None:
|
||||
yield buf + _encoder(value)
|
||||
elif isinstance(value, RawJSON):
|
||||
yield buf + value.encoded_json
|
||||
elif value is None:
|
||||
yield buf + 'null'
|
||||
elif value is True:
|
||||
|
|
@ -510,8 +544,8 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
def _stringify_key(key):
|
||||
if isinstance(key, string_types): # pragma: no cover
|
||||
pass
|
||||
elif isinstance(key, binary_type):
|
||||
key = key.decode(_encoding)
|
||||
elif _PY3 and isinstance(key, bytes) and _encoding is not None:
|
||||
key = str(key, _encoding)
|
||||
elif isinstance(key, float):
|
||||
key = _floatstr(key)
|
||||
elif key is True:
|
||||
|
|
@ -530,7 +564,8 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
elif _skipkeys:
|
||||
key = None
|
||||
else:
|
||||
raise TypeError("key " + repr(key) + " is not a string")
|
||||
raise TypeError('keys must be str, int, float, bool or None, '
|
||||
'not %s' % key.__class__.__name__)
|
||||
return key
|
||||
|
||||
def _iterencode_dict(dct, _current_indent_level):
|
||||
|
|
@ -579,9 +614,12 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
yield item_separator
|
||||
yield _encoder(key)
|
||||
yield _key_separator
|
||||
if (isinstance(value, string_types) or
|
||||
(_PY3 and isinstance(value, binary_type))):
|
||||
if isinstance(value, string_types):
|
||||
yield _encoder(value)
|
||||
elif _PY3 and isinstance(value, bytes) and _encoding is not None:
|
||||
yield _encoder(value)
|
||||
elif isinstance(value, RawJSON):
|
||||
yield value.encoded_json
|
||||
elif value is None:
|
||||
yield 'null'
|
||||
elif value is True:
|
||||
|
|
@ -621,9 +659,12 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
del markers[markerid]
|
||||
|
||||
def _iterencode(o, _current_indent_level):
|
||||
if (isinstance(o, string_types) or
|
||||
(_PY3 and isinstance(o, binary_type))):
|
||||
if isinstance(o, string_types):
|
||||
yield _encoder(o)
|
||||
elif _PY3 and isinstance(o, bytes) and _encoding is not None:
|
||||
yield _encoder(o)
|
||||
elif isinstance(o, RawJSON):
|
||||
yield o.encoded_json
|
||||
elif o is None:
|
||||
yield 'null'
|
||||
elif o is True:
|
||||
|
|
|
|||
53
Lib/site-packages/simplejson/errors.py
Normal file
53
Lib/site-packages/simplejson/errors.py
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
"""Error classes used by simplejson
|
||||
"""
|
||||
__all__ = ['JSONDecodeError']
|
||||
|
||||
|
||||
def linecol(doc, pos):
|
||||
lineno = doc.count('\n', 0, pos) + 1
|
||||
if lineno == 1:
|
||||
colno = pos + 1
|
||||
else:
|
||||
colno = pos - doc.rindex('\n', 0, pos)
|
||||
return lineno, colno
|
||||
|
||||
|
||||
def errmsg(msg, doc, pos, end=None):
|
||||
lineno, colno = linecol(doc, pos)
|
||||
msg = msg.replace('%r', repr(doc[pos:pos + 1]))
|
||||
if end is None:
|
||||
fmt = '%s: line %d column %d (char %d)'
|
||||
return fmt % (msg, lineno, colno, pos)
|
||||
endlineno, endcolno = linecol(doc, end)
|
||||
fmt = '%s: line %d column %d - line %d column %d (char %d - %d)'
|
||||
return fmt % (msg, lineno, colno, endlineno, endcolno, pos, end)
|
||||
|
||||
|
||||
class JSONDecodeError(ValueError):
|
||||
"""Subclass of ValueError with the following additional properties:
|
||||
|
||||
msg: The unformatted error message
|
||||
doc: The JSON document being parsed
|
||||
pos: The start index of doc where parsing failed
|
||||
end: The end index of doc where parsing failed (may be None)
|
||||
lineno: The line corresponding to pos
|
||||
colno: The column corresponding to pos
|
||||
endlineno: The line corresponding to end (may be None)
|
||||
endcolno: The column corresponding to end (may be None)
|
||||
|
||||
"""
|
||||
# Note that this exception is used from _speedups
|
||||
def __init__(self, msg, doc, pos, end=None):
|
||||
ValueError.__init__(self, errmsg(msg, doc, pos, end=end))
|
||||
self.msg = msg
|
||||
self.doc = doc
|
||||
self.pos = pos
|
||||
self.end = end
|
||||
self.lineno, self.colno = linecol(doc, pos)
|
||||
if end is not None:
|
||||
self.endlineno, self.endcolno = linecol(doc, end)
|
||||
else:
|
||||
self.endlineno, self.endcolno = None, None
|
||||
|
||||
def __reduce__(self):
|
||||
return self.__class__, (self.msg, self.doc, self.pos, self.end)
|
||||
|
|
@ -5,17 +5,6 @@ http://code.activestate.com/recipes/576693/
|
|||
"""
|
||||
from UserDict import DictMixin
|
||||
|
||||
# Modified from original to support Python 2.4, see
|
||||
# http://code.google.com/p/simplejson/issues/detail?id=53
|
||||
try:
|
||||
all
|
||||
except NameError:
|
||||
def all(seq):
|
||||
for elem in seq:
|
||||
if not elem:
|
||||
return False
|
||||
return True
|
||||
|
||||
class OrderedDict(dict, DictMixin):
|
||||
|
||||
def __init__(self, *args, **kwds):
|
||||
|
|
@ -63,12 +52,7 @@ class OrderedDict(dict, DictMixin):
|
|||
def popitem(self, last=True):
|
||||
if not self:
|
||||
raise KeyError('dictionary is empty')
|
||||
# Modified from original to support Python 2.4, see
|
||||
# http://code.google.com/p/simplejson/issues/detail?id=53
|
||||
if last:
|
||||
key = reversed(self).next()
|
||||
else:
|
||||
key = iter(self).next()
|
||||
key = reversed(self).next() if last else iter(self).next()
|
||||
value = self.pop(key)
|
||||
return key, value
|
||||
|
||||
|
|
|
|||
9
Lib/site-packages/simplejson/raw_json.py
Normal file
9
Lib/site-packages/simplejson/raw_json.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
"""Implementation of RawJSON
|
||||
"""
|
||||
|
||||
class RawJSON(object):
|
||||
"""Wrap an encoded JSON document for direct embedding in the output
|
||||
|
||||
"""
|
||||
def __init__(self, encoded_json):
|
||||
self.encoded_json = encoded_json
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
"""JSON token scanner
|
||||
"""
|
||||
import re
|
||||
from .errors import JSONDecodeError
|
||||
def _import_c_make_scanner():
|
||||
try:
|
||||
from simplejson._speedups import make_scanner
|
||||
from ._speedups import make_scanner
|
||||
return make_scanner
|
||||
except ImportError:
|
||||
return None
|
||||
|
|
@ -15,55 +16,6 @@ NUMBER_RE = re.compile(
|
|||
r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
|
||||
(re.VERBOSE | re.MULTILINE | re.DOTALL))
|
||||
|
||||
class JSONDecodeError(ValueError):
|
||||
"""Subclass of ValueError with the following additional properties:
|
||||
|
||||
msg: The unformatted error message
|
||||
doc: The JSON document being parsed
|
||||
pos: The start index of doc where parsing failed
|
||||
end: The end index of doc where parsing failed (may be None)
|
||||
lineno: The line corresponding to pos
|
||||
colno: The column corresponding to pos
|
||||
endlineno: The line corresponding to end (may be None)
|
||||
endcolno: The column corresponding to end (may be None)
|
||||
|
||||
"""
|
||||
# Note that this exception is used from _speedups
|
||||
def __init__(self, msg, doc, pos, end=None):
|
||||
ValueError.__init__(self, errmsg(msg, doc, pos, end=end))
|
||||
self.msg = msg
|
||||
self.doc = doc
|
||||
self.pos = pos
|
||||
self.end = end
|
||||
self.lineno, self.colno = linecol(doc, pos)
|
||||
if end is not None:
|
||||
self.endlineno, self.endcolno = linecol(doc, end)
|
||||
else:
|
||||
self.endlineno, self.endcolno = None, None
|
||||
|
||||
def __reduce__(self):
|
||||
return self.__class__, (self.msg, self.doc, self.pos, self.end)
|
||||
|
||||
|
||||
def linecol(doc, pos):
|
||||
lineno = doc.count('\n', 0, pos) + 1
|
||||
if lineno == 1:
|
||||
colno = pos + 1
|
||||
else:
|
||||
colno = pos - doc.rindex('\n', 0, pos)
|
||||
return lineno, colno
|
||||
|
||||
|
||||
def errmsg(msg, doc, pos, end=None):
|
||||
lineno, colno = linecol(doc, pos)
|
||||
msg = msg.replace('%r', repr(doc[pos:pos + 1]))
|
||||
if end is None:
|
||||
fmt = '%s: line %d column %d (char %d)'
|
||||
return fmt % (msg, lineno, colno, pos)
|
||||
endlineno, endcolno = linecol(doc, end)
|
||||
fmt = '%s: line %d column %d - line %d column %d (char %d - %d)'
|
||||
return fmt % (msg, lineno, colno, endlineno, endcolno, pos, end)
|
||||
|
||||
|
||||
def py_make_scanner(context):
|
||||
parse_object = context.parse_object
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from __future__ import absolute_import
|
||||
import unittest
|
||||
import doctest
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
class NoExtensionTestSuite(unittest.TestSuite):
|
||||
|
|
@ -27,6 +27,13 @@ def additional_tests(suite=None):
|
|||
import simplejson.decoder
|
||||
if suite is None:
|
||||
suite = unittest.TestSuite()
|
||||
try:
|
||||
import doctest
|
||||
except ImportError:
|
||||
if sys.version_info < (2, 7):
|
||||
# doctests in 2.6 depends on cStringIO
|
||||
return suite
|
||||
raise
|
||||
for mod in (simplejson, simplejson.encoder, simplejson.decoder):
|
||||
suite.addTest(doctest.DocTestSuite(mod))
|
||||
suite.addTest(doctest.DocFileSuite('../../index.rst'))
|
||||
|
|
@ -35,36 +42,13 @@ def additional_tests(suite=None):
|
|||
|
||||
def all_tests_suite():
|
||||
def get_suite():
|
||||
suite_names = [
|
||||
'simplejson.tests.%s' % (os.path.splitext(f)[0],)
|
||||
for f in os.listdir(os.path.dirname(__file__))
|
||||
if f.startswith('test_') and f.endswith('.py')
|
||||
]
|
||||
return additional_tests(
|
||||
unittest.TestLoader().loadTestsFromNames([
|
||||
'simplejson.tests.test_bitsize_int_as_string',
|
||||
'simplejson.tests.test_bigint_as_string',
|
||||
'simplejson.tests.test_check_circular',
|
||||
'simplejson.tests.test_decode',
|
||||
'simplejson.tests.test_default',
|
||||
'simplejson.tests.test_dump',
|
||||
'simplejson.tests.test_encode_basestring_ascii',
|
||||
'simplejson.tests.test_encode_for_html',
|
||||
'simplejson.tests.test_errors',
|
||||
'simplejson.tests.test_fail',
|
||||
'simplejson.tests.test_float',
|
||||
'simplejson.tests.test_indent',
|
||||
'simplejson.tests.test_iterable',
|
||||
'simplejson.tests.test_pass1',
|
||||
'simplejson.tests.test_pass2',
|
||||
'simplejson.tests.test_pass3',
|
||||
'simplejson.tests.test_recursion',
|
||||
'simplejson.tests.test_scanstring',
|
||||
'simplejson.tests.test_separators',
|
||||
'simplejson.tests.test_speedups',
|
||||
'simplejson.tests.test_unicode',
|
||||
'simplejson.tests.test_decimal',
|
||||
'simplejson.tests.test_tuple',
|
||||
'simplejson.tests.test_namedtuple',
|
||||
'simplejson.tests.test_tool',
|
||||
'simplejson.tests.test_for_json',
|
||||
'simplejson.tests.test_subclass',
|
||||
]))
|
||||
unittest.TestLoader().loadTestsFromNames(suite_names))
|
||||
suite = get_suite()
|
||||
import simplejson
|
||||
if simplejson._import_c_make_encoder() is None:
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -3,9 +3,17 @@ import decimal
|
|||
from unittest import TestCase
|
||||
|
||||
import simplejson as json
|
||||
from simplejson.compat import StringIO
|
||||
from simplejson.compat import StringIO, b, binary_type
|
||||
from simplejson import OrderedDict
|
||||
|
||||
class MisbehavingBytesSubtype(binary_type):
|
||||
def decode(self, encoding=None):
|
||||
return "bad decode"
|
||||
def __str__(self):
|
||||
return "bad __str__"
|
||||
def __bytes__(self):
|
||||
return b("bad __bytes__")
|
||||
|
||||
class TestDecode(TestCase):
|
||||
if not hasattr(TestCase, 'assertIs'):
|
||||
def assertIs(self, a, b):
|
||||
|
|
@ -87,6 +95,18 @@ class TestDecode(TestCase):
|
|||
({'a': {}}, 11),
|
||||
cls().raw_decode(" \n{\"a\": {}}"))
|
||||
|
||||
def test_bytes_decode(self):
|
||||
cls = json.decoder.JSONDecoder
|
||||
data = b('"\xe2\x82\xac"')
|
||||
self.assertEqual(cls().decode(data), u'\u20ac')
|
||||
self.assertEqual(cls(encoding='latin1').decode(data), u'\xe2\x82\xac')
|
||||
self.assertEqual(cls(encoding=None).decode(data), u'\u20ac')
|
||||
|
||||
data = MisbehavingBytesSubtype(b('"\xe2\x82\xac"'))
|
||||
self.assertEqual(cls().decode(data), u'\u20ac')
|
||||
self.assertEqual(cls(encoding='latin1').decode(data), u'\xe2\x82\xac')
|
||||
self.assertEqual(cls(encoding=None).decode(data), u'\u20ac')
|
||||
|
||||
def test_bounds_checking(self):
|
||||
# https://github.com/simplejson/simplejson/issues/98
|
||||
j = json.decoder.JSONDecoder()
|
||||
|
|
|
|||
|
|
@ -1,12 +1,27 @@
|
|||
from unittest import TestCase
|
||||
from simplejson.compat import StringIO, long_type, b, binary_type, PY3
|
||||
from simplejson.compat import StringIO, long_type, b, binary_type, text_type, PY3
|
||||
import simplejson as json
|
||||
|
||||
class MisbehavingTextSubtype(text_type):
|
||||
def __str__(self):
|
||||
return "FAIL!"
|
||||
|
||||
class MisbehavingBytesSubtype(binary_type):
|
||||
def decode(self, encoding=None):
|
||||
return "bad decode"
|
||||
def __str__(self):
|
||||
return "bad __str__"
|
||||
def __bytes__(self):
|
||||
return b("bad __bytes__")
|
||||
|
||||
def as_text_type(s):
|
||||
if PY3 and isinstance(s, binary_type):
|
||||
if PY3 and isinstance(s, bytes):
|
||||
return s.decode('ascii')
|
||||
return s
|
||||
|
||||
def decode_iso_8859_15(b):
|
||||
return b.decode('iso-8859-15')
|
||||
|
||||
class TestDump(TestCase):
|
||||
def test_dump(self):
|
||||
sio = StringIO()
|
||||
|
|
@ -128,3 +143,107 @@ class TestDump(TestCase):
|
|||
json.dump(p, sio, sort_keys=True)
|
||||
self.assertEqual(sio.getvalue(), json.dumps(p, sort_keys=True))
|
||||
self.assertEqual(json.loads(sio.getvalue()), p)
|
||||
|
||||
def test_misbehaving_text_subtype(self):
|
||||
# https://github.com/simplejson/simplejson/issues/185
|
||||
text = "this is some text"
|
||||
self.assertEqual(
|
||||
json.dumps(MisbehavingTextSubtype(text)),
|
||||
json.dumps(text)
|
||||
)
|
||||
self.assertEqual(
|
||||
json.dumps([MisbehavingTextSubtype(text)]),
|
||||
json.dumps([text])
|
||||
)
|
||||
self.assertEqual(
|
||||
json.dumps({MisbehavingTextSubtype(text): 42}),
|
||||
json.dumps({text: 42})
|
||||
)
|
||||
|
||||
def test_misbehaving_bytes_subtype(self):
|
||||
data = b("this is some data \xe2\x82\xac")
|
||||
self.assertEqual(
|
||||
json.dumps(MisbehavingBytesSubtype(data)),
|
||||
json.dumps(data)
|
||||
)
|
||||
self.assertEqual(
|
||||
json.dumps([MisbehavingBytesSubtype(data)]),
|
||||
json.dumps([data])
|
||||
)
|
||||
self.assertEqual(
|
||||
json.dumps({MisbehavingBytesSubtype(data): 42}),
|
||||
json.dumps({data: 42})
|
||||
)
|
||||
|
||||
def test_bytes_toplevel(self):
|
||||
self.assertEqual(json.dumps(b('\xe2\x82\xac')), r'"\u20ac"')
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, b('\xa4'))
|
||||
self.assertEqual(json.dumps(b('\xa4'), encoding='iso-8859-1'),
|
||||
r'"\u00a4"')
|
||||
self.assertEqual(json.dumps(b('\xa4'), encoding='iso-8859-15'),
|
||||
r'"\u20ac"')
|
||||
if PY3:
|
||||
self.assertRaises(TypeError, json.dumps, b('\xe2\x82\xac'),
|
||||
encoding=None)
|
||||
self.assertRaises(TypeError, json.dumps, b('\xa4'),
|
||||
encoding=None)
|
||||
self.assertEqual(json.dumps(b('\xa4'), encoding=None,
|
||||
default=decode_iso_8859_15),
|
||||
r'"\u20ac"')
|
||||
else:
|
||||
self.assertEqual(json.dumps(b('\xe2\x82\xac'), encoding=None),
|
||||
r'"\u20ac"')
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, b('\xa4'),
|
||||
encoding=None)
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, b('\xa4'),
|
||||
encoding=None, default=decode_iso_8859_15)
|
||||
|
||||
def test_bytes_nested(self):
|
||||
self.assertEqual(json.dumps([b('\xe2\x82\xac')]), r'["\u20ac"]')
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, [b('\xa4')])
|
||||
self.assertEqual(json.dumps([b('\xa4')], encoding='iso-8859-1'),
|
||||
r'["\u00a4"]')
|
||||
self.assertEqual(json.dumps([b('\xa4')], encoding='iso-8859-15'),
|
||||
r'["\u20ac"]')
|
||||
if PY3:
|
||||
self.assertRaises(TypeError, json.dumps, [b('\xe2\x82\xac')],
|
||||
encoding=None)
|
||||
self.assertRaises(TypeError, json.dumps, [b('\xa4')],
|
||||
encoding=None)
|
||||
self.assertEqual(json.dumps([b('\xa4')], encoding=None,
|
||||
default=decode_iso_8859_15),
|
||||
r'["\u20ac"]')
|
||||
else:
|
||||
self.assertEqual(json.dumps([b('\xe2\x82\xac')], encoding=None),
|
||||
r'["\u20ac"]')
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, [b('\xa4')],
|
||||
encoding=None)
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, [b('\xa4')],
|
||||
encoding=None, default=decode_iso_8859_15)
|
||||
|
||||
def test_bytes_key(self):
|
||||
self.assertEqual(json.dumps({b('\xe2\x82\xac'): 42}), r'{"\u20ac": 42}')
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, {b('\xa4'): 42})
|
||||
self.assertEqual(json.dumps({b('\xa4'): 42}, encoding='iso-8859-1'),
|
||||
r'{"\u00a4": 42}')
|
||||
self.assertEqual(json.dumps({b('\xa4'): 42}, encoding='iso-8859-15'),
|
||||
r'{"\u20ac": 42}')
|
||||
if PY3:
|
||||
self.assertRaises(TypeError, json.dumps, {b('\xe2\x82\xac'): 42},
|
||||
encoding=None)
|
||||
self.assertRaises(TypeError, json.dumps, {b('\xa4'): 42},
|
||||
encoding=None)
|
||||
self.assertRaises(TypeError, json.dumps, {b('\xa4'): 42},
|
||||
encoding=None, default=decode_iso_8859_15)
|
||||
self.assertEqual(json.dumps({b('\xa4'): 42}, encoding=None,
|
||||
skipkeys=True),
|
||||
r'{}')
|
||||
else:
|
||||
self.assertEqual(json.dumps({b('\xe2\x82\xac'): 42}, encoding=None),
|
||||
r'{"\u20ac": 42}')
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, {b('\xa4'): 42},
|
||||
encoding=None)
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, {b('\xa4'): 42},
|
||||
encoding=None, default=decode_iso_8859_15)
|
||||
self.assertRaises(UnicodeDecodeError, json.dumps, {b('\xa4'): 42},
|
||||
encoding=None, skipkeys=True)
|
||||
|
|
|
|||
|
|
@ -7,11 +7,19 @@ class TestEncodeForHTML(unittest.TestCase):
|
|||
def setUp(self):
|
||||
self.decoder = json.JSONDecoder()
|
||||
self.encoder = json.JSONEncoderForHTML()
|
||||
self.non_ascii_encoder = json.JSONEncoderForHTML(ensure_ascii=False)
|
||||
|
||||
def test_basic_encode(self):
|
||||
self.assertEqual(r'"\u0026"', self.encoder.encode('&'))
|
||||
self.assertEqual(r'"\u003c"', self.encoder.encode('<'))
|
||||
self.assertEqual(r'"\u003e"', self.encoder.encode('>'))
|
||||
self.assertEqual(r'"\u2028"', self.encoder.encode(u'\u2028'))
|
||||
|
||||
def test_non_ascii_basic_encode(self):
|
||||
self.assertEqual(r'"\u0026"', self.non_ascii_encoder.encode('&'))
|
||||
self.assertEqual(r'"\u003c"', self.non_ascii_encoder.encode('<'))
|
||||
self.assertEqual(r'"\u003e"', self.non_ascii_encoder.encode('>'))
|
||||
self.assertEqual(r'"\u2028"', self.non_ascii_encoder.encode(u'\u2028'))
|
||||
|
||||
def test_basic_roundtrip(self):
|
||||
for char in '&<>':
|
||||
|
|
|
|||
|
|
@ -2,12 +2,29 @@ import sys, pickle
|
|||
from unittest import TestCase
|
||||
|
||||
import simplejson as json
|
||||
from simplejson.compat import u, b
|
||||
from simplejson.compat import text_type, b
|
||||
|
||||
class TestErrors(TestCase):
|
||||
def test_string_keys_error(self):
|
||||
data = [{'a': 'A', 'b': (2, 4), 'c': 3.0, ('d',): 'D tuple'}]
|
||||
self.assertRaises(TypeError, json.dumps, data)
|
||||
try:
|
||||
json.dumps(data)
|
||||
except TypeError:
|
||||
err = sys.exc_info()[1]
|
||||
else:
|
||||
self.fail('Expected TypeError')
|
||||
self.assertEqual(str(err),
|
||||
'keys must be str, int, float, bool or None, not tuple')
|
||||
|
||||
def test_not_serializable(self):
|
||||
try:
|
||||
json.dumps(json)
|
||||
except TypeError:
|
||||
err = sys.exc_info()[1]
|
||||
else:
|
||||
self.fail('Expected TypeError')
|
||||
self.assertEqual(str(err),
|
||||
'Object of type module is not JSON serializable')
|
||||
|
||||
def test_decode_error(self):
|
||||
err = None
|
||||
|
|
@ -24,7 +41,7 @@ class TestErrors(TestCase):
|
|||
|
||||
def test_scan_error(self):
|
||||
err = None
|
||||
for t in (u, b):
|
||||
for t in (text_type, b):
|
||||
try:
|
||||
json.loads(t('{"asdf": "'))
|
||||
except json.JSONDecodeError:
|
||||
|
|
|
|||
|
|
@ -18,3 +18,10 @@ class TestItemSortKey(TestCase):
|
|||
self.assertEqual(
|
||||
'{"a": 1, "Array": [1, 5, 6, 9], "c": 5, "crate": "dog", "Jack": "jill", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}',
|
||||
json.dumps(a, item_sort_key=lambda kv: kv[0].lower()))
|
||||
|
||||
def test_item_sort_key_value(self):
|
||||
# https://github.com/simplejson/simplejson/issues/173
|
||||
a = {'a': 1, 'b': 0}
|
||||
self.assertEqual(
|
||||
'{"b": 0, "a": 1}',
|
||||
json.dumps(a, item_sort_key=lambda kv: kv[1]))
|
||||
|
|
|
|||
47
Lib/site-packages/simplejson/tests/test_raw_json.py
Normal file
47
Lib/site-packages/simplejson/tests/test_raw_json.py
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
import unittest
|
||||
import simplejson as json
|
||||
|
||||
dct1 = {
|
||||
'key1': 'value1'
|
||||
}
|
||||
|
||||
dct2 = {
|
||||
'key2': 'value2',
|
||||
'd1': dct1
|
||||
}
|
||||
|
||||
dct3 = {
|
||||
'key2': 'value2',
|
||||
'd1': json.dumps(dct1)
|
||||
}
|
||||
|
||||
dct4 = {
|
||||
'key2': 'value2',
|
||||
'd1': json.RawJSON(json.dumps(dct1))
|
||||
}
|
||||
|
||||
|
||||
class TestRawJson(unittest.TestCase):
|
||||
|
||||
def test_normal_str(self):
|
||||
self.assertNotEqual(json.dumps(dct2), json.dumps(dct3))
|
||||
|
||||
def test_raw_json_str(self):
|
||||
self.assertEqual(json.dumps(dct2), json.dumps(dct4))
|
||||
self.assertEqual(dct2, json.loads(json.dumps(dct4)))
|
||||
|
||||
def test_list(self):
|
||||
self.assertEqual(
|
||||
json.dumps([dct2]),
|
||||
json.dumps([json.RawJSON(json.dumps(dct2))]))
|
||||
self.assertEqual(
|
||||
[dct2],
|
||||
json.loads(json.dumps([json.RawJSON(json.dumps(dct2))])))
|
||||
|
||||
def test_direct(self):
|
||||
self.assertEqual(
|
||||
json.dumps(dct2),
|
||||
json.dumps(json.RawJSON(json.dumps(dct2))))
|
||||
self.assertEqual(
|
||||
dct2,
|
||||
json.loads(json.dumps(json.RawJSON(json.dumps(dct2)))))
|
||||
|
|
@ -22,6 +22,8 @@ class TestScanString(TestCase):
|
|||
return
|
||||
self._test_scanstring(simplejson.decoder.c_scanstring)
|
||||
|
||||
self.assertTrue(isinstance(simplejson.decoder.c_scanstring('""', 0)[0], str))
|
||||
|
||||
def _test_scanstring(self, scanstring):
|
||||
if sys.maxunicode == 65535:
|
||||
self.assertEqual(
|
||||
|
|
|
|||
|
|
@ -1,8 +1,12 @@
|
|||
from __future__ import with_statement
|
||||
|
||||
import sys
|
||||
import unittest
|
||||
from unittest import TestCase
|
||||
|
||||
from simplejson import encoder, scanner
|
||||
import simplejson
|
||||
from simplejson import encoder, decoder, scanner
|
||||
from simplejson.compat import PY3, long_type, b
|
||||
|
||||
|
||||
def has_speedups():
|
||||
|
|
@ -22,11 +26,28 @@ def skip_if_speedups_missing(func):
|
|||
return wrapper
|
||||
|
||||
|
||||
class BadBool:
|
||||
def __bool__(self):
|
||||
1/0
|
||||
__nonzero__ = __bool__
|
||||
|
||||
|
||||
class TestDecode(TestCase):
|
||||
@skip_if_speedups_missing
|
||||
def test_make_scanner(self):
|
||||
self.assertRaises(AttributeError, scanner.c_make_scanner, 1)
|
||||
|
||||
@skip_if_speedups_missing
|
||||
def test_bad_bool_args(self):
|
||||
def test(value):
|
||||
decoder.JSONDecoder(strict=BadBool()).decode(value)
|
||||
self.assertRaises(ZeroDivisionError, test, '""')
|
||||
self.assertRaises(ZeroDivisionError, test, '{}')
|
||||
if not PY3:
|
||||
self.assertRaises(ZeroDivisionError, test, u'""')
|
||||
self.assertRaises(ZeroDivisionError, test, u'{}')
|
||||
|
||||
class TestEncode(TestCase):
|
||||
@skip_if_speedups_missing
|
||||
def test_make_encoder(self):
|
||||
self.assertRaises(
|
||||
|
|
@ -37,3 +58,57 @@ class TestDecode(TestCase):
|
|||
"\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75"),
|
||||
None
|
||||
)
|
||||
|
||||
@skip_if_speedups_missing
|
||||
def test_bad_str_encoder(self):
|
||||
# Issue #31505: There shouldn't be an assertion failure in case
|
||||
# c_make_encoder() receives a bad encoder() argument.
|
||||
import decimal
|
||||
def bad_encoder1(*args):
|
||||
return None
|
||||
enc = encoder.c_make_encoder(
|
||||
None, lambda obj: str(obj),
|
||||
bad_encoder1, None, ': ', ', ',
|
||||
False, False, False, {}, False, False, False,
|
||||
None, None, 'utf-8', False, False, decimal.Decimal, False)
|
||||
self.assertRaises(TypeError, enc, 'spam', 4)
|
||||
self.assertRaises(TypeError, enc, {'spam': 42}, 4)
|
||||
|
||||
def bad_encoder2(*args):
|
||||
1/0
|
||||
enc = encoder.c_make_encoder(
|
||||
None, lambda obj: str(obj),
|
||||
bad_encoder2, None, ': ', ', ',
|
||||
False, False, False, {}, False, False, False,
|
||||
None, None, 'utf-8', False, False, decimal.Decimal, False)
|
||||
self.assertRaises(ZeroDivisionError, enc, 'spam', 4)
|
||||
|
||||
@skip_if_speedups_missing
|
||||
def test_bad_bool_args(self):
|
||||
def test(name):
|
||||
encoder.JSONEncoder(**{name: BadBool()}).encode({})
|
||||
self.assertRaises(ZeroDivisionError, test, 'skipkeys')
|
||||
self.assertRaises(ZeroDivisionError, test, 'ensure_ascii')
|
||||
self.assertRaises(ZeroDivisionError, test, 'check_circular')
|
||||
self.assertRaises(ZeroDivisionError, test, 'allow_nan')
|
||||
self.assertRaises(ZeroDivisionError, test, 'sort_keys')
|
||||
self.assertRaises(ZeroDivisionError, test, 'use_decimal')
|
||||
self.assertRaises(ZeroDivisionError, test, 'namedtuple_as_object')
|
||||
self.assertRaises(ZeroDivisionError, test, 'tuple_as_array')
|
||||
self.assertRaises(ZeroDivisionError, test, 'bigint_as_string')
|
||||
self.assertRaises(ZeroDivisionError, test, 'for_json')
|
||||
self.assertRaises(ZeroDivisionError, test, 'ignore_nan')
|
||||
self.assertRaises(ZeroDivisionError, test, 'iterable_as_array')
|
||||
|
||||
@skip_if_speedups_missing
|
||||
def test_int_as_string_bitcount_overflow(self):
|
||||
long_count = long_type(2)**32+31
|
||||
def test():
|
||||
encoder.JSONEncoder(int_as_string_bitcount=long_count).encode(0)
|
||||
self.assertRaises((TypeError, OverflowError), test)
|
||||
|
||||
if PY3:
|
||||
@skip_if_speedups_missing
|
||||
def test_bad_encoding(self):
|
||||
with self.assertRaises(UnicodeEncodeError):
|
||||
encoder.JSONEncoder(encoding='\udcff').encode({b('key'): 123})
|
||||
|
|
|
|||
21
Lib/site-packages/simplejson/tests/test_str_subclass.py
Normal file
21
Lib/site-packages/simplejson/tests/test_str_subclass.py
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
from unittest import TestCase
|
||||
|
||||
import simplejson
|
||||
from simplejson.compat import text_type
|
||||
|
||||
# Tests for issue demonstrated in https://github.com/simplejson/simplejson/issues/144
|
||||
class WonkyTextSubclass(text_type):
|
||||
def __getslice__(self, start, end):
|
||||
return self.__class__('not what you wanted!')
|
||||
|
||||
class TestStrSubclass(TestCase):
|
||||
def test_dump_load(self):
|
||||
for s in ['', '"hello"', 'text', u'\u005c']:
|
||||
self.assertEqual(
|
||||
s,
|
||||
simplejson.loads(simplejson.dumps(WonkyTextSubclass(s))))
|
||||
|
||||
self.assertEqual(
|
||||
s,
|
||||
simplejson.loads(simplejson.dumps(WonkyTextSubclass(s),
|
||||
ensure_ascii=False)))
|
||||
|
|
@ -21,6 +21,15 @@ except ImportError:
|
|||
"".encode(),
|
||||
stderr).strip()
|
||||
|
||||
def open_temp_file():
|
||||
if sys.version_info >= (2, 6):
|
||||
file = tempfile.NamedTemporaryFile(delete=False)
|
||||
filename = file.name
|
||||
else:
|
||||
fd, filename = tempfile.mkstemp()
|
||||
file = os.fdopen(fd, 'w+b')
|
||||
return file, filename
|
||||
|
||||
class TestTool(unittest.TestCase):
|
||||
data = """
|
||||
|
||||
|
|
@ -63,35 +72,43 @@ class TestTool(unittest.TestCase):
|
|||
out, err = proc.communicate(data)
|
||||
self.assertEqual(strip_python_stderr(err), ''.encode())
|
||||
self.assertEqual(proc.returncode, 0)
|
||||
return out
|
||||
return out.decode('utf8').splitlines()
|
||||
|
||||
def test_stdin_stdout(self):
|
||||
self.assertEqual(
|
||||
self.runTool(data=self.data.encode()),
|
||||
self.expect.encode())
|
||||
self.expect.splitlines())
|
||||
|
||||
def test_infile_stdout(self):
|
||||
with tempfile.NamedTemporaryFile() as infile:
|
||||
infile, infile_name = open_temp_file()
|
||||
try:
|
||||
infile.write(self.data.encode())
|
||||
infile.flush()
|
||||
infile.close()
|
||||
self.assertEqual(
|
||||
self.runTool(args=[infile.name]),
|
||||
self.expect.encode())
|
||||
self.runTool(args=[infile_name]),
|
||||
self.expect.splitlines())
|
||||
finally:
|
||||
os.unlink(infile_name)
|
||||
|
||||
def test_infile_outfile(self):
|
||||
with tempfile.NamedTemporaryFile() as infile:
|
||||
infile, infile_name = open_temp_file()
|
||||
try:
|
||||
infile.write(self.data.encode())
|
||||
infile.flush()
|
||||
infile.close()
|
||||
# outfile will get overwritten by tool, so the delete
|
||||
# may not work on some platforms. Do it manually.
|
||||
outfile = tempfile.NamedTemporaryFile()
|
||||
outfile, outfile_name = open_temp_file()
|
||||
try:
|
||||
self.assertEqual(
|
||||
self.runTool(args=[infile.name, outfile.name]),
|
||||
''.encode())
|
||||
with open(outfile.name, 'rb') as f:
|
||||
self.assertEqual(f.read(), self.expect.encode())
|
||||
finally:
|
||||
outfile.close()
|
||||
if os.path.exists(outfile.name):
|
||||
os.unlink(outfile.name)
|
||||
self.assertEqual(
|
||||
self.runTool(args=[infile_name, outfile_name]),
|
||||
[])
|
||||
with open(outfile_name, 'rb') as f:
|
||||
self.assertEqual(
|
||||
f.read().decode('utf8').splitlines(),
|
||||
self.expect.splitlines()
|
||||
)
|
||||
finally:
|
||||
os.unlink(outfile_name)
|
||||
finally:
|
||||
os.unlink(infile_name)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import codecs
|
|||
from unittest import TestCase
|
||||
|
||||
import simplejson as json
|
||||
from simplejson.compat import unichr, text_type, b, u, BytesIO
|
||||
from simplejson.compat import unichr, text_type, b, BytesIO
|
||||
|
||||
class TestUnicode(TestCase):
|
||||
def test_encoding1(self):
|
||||
|
|
@ -93,7 +93,7 @@ class TestUnicode(TestCase):
|
|||
def test_ensure_ascii_false_bytestring_encoding(self):
|
||||
# http://code.google.com/p/simplejson/issues/detail?id=48
|
||||
doc1 = {u'quux': b('Arr\xc3\xaat sur images')}
|
||||
doc2 = {u'quux': u('Arr\xeat sur images')}
|
||||
doc2 = {u'quux': u'Arr\xeat sur images'}
|
||||
doc_ascii = '{"quux": "Arr\\u00eat sur images"}'
|
||||
doc_unicode = u'{"quux": "Arr\xeat sur images"}'
|
||||
self.assertEqual(json.dumps(doc1), doc_ascii)
|
||||
|
|
@ -106,10 +106,11 @@ class TestUnicode(TestCase):
|
|||
s1 = u'\u2029\u2028'
|
||||
s2 = s1.encode('utf8')
|
||||
expect = '"\\u2029\\u2028"'
|
||||
expect_non_ascii = u'"\u2029\u2028"'
|
||||
self.assertEqual(json.dumps(s1), expect)
|
||||
self.assertEqual(json.dumps(s2), expect)
|
||||
self.assertEqual(json.dumps(s1, ensure_ascii=False), expect)
|
||||
self.assertEqual(json.dumps(s2, ensure_ascii=False), expect)
|
||||
self.assertEqual(json.dumps(s1, ensure_ascii=False), expect_non_ascii)
|
||||
self.assertEqual(json.dumps(s2, ensure_ascii=False), expect_non_ascii)
|
||||
|
||||
def test_invalid_escape_sequences(self):
|
||||
# incomplete escape sequence
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue