Skip to content
Snippets Groups Projects
Commit 14971dfa0c67 authored by Bob Ippolito's avatar Bob Ippolito
Browse files

clean up #96 and prep for v3.5.0 release

parent 8b702c529647
Branches
No related tags found
No related merge requests found
Version 3.5.0 released 2014-05-20
* Added int_as_string_bitcount encoder option
https://github.com/simplejson/pull/96
* Fixed potential crash when encoder created with incorrect options
Version 3.4.1 released 2014-04-30
* Fixed tests to run on Python 3.4
......
......@@ -42,5 +42,5 @@
# other places throughout the built documents.
#
# The short X.Y version.
version = '3.4'
version = '3.5'
# The full version, including alpha/beta/rc tags.
......@@ -46,5 +46,5 @@
# The full version, including alpha/beta/rc tags.
release = '3.4.1'
release = '3.5.0'
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
......
......@@ -129,7 +129,7 @@
Basic Usage
-----------
.. function:: dump(obj, fp[, skipkeys[, ensure_ascii[, check_circular[, allow_nan[, cls[, indent[, separators[, encoding[, default[, use_decimal[, namedtuple_as_object[, tuple_as_array[, bigint_as_string[, sort_keys[, item_sort_key[, [for_json[, ignore_nan[, **kw]]]]]]]]]]]]]]]]]]])
.. function:: dump(obj, fp[, skipkeys[, ensure_ascii[, check_circular[, allow_nan[, cls[, indent[, separators[, encoding[, default[, use_decimal[, namedtuple_as_object[, tuple_as_array[, bigint_as_string[, sort_keys[, item_sort_key[, [for_json[, ignore_nan[, int_as_string_bitcount[, **kw]]]]]]]]]]]]]]]]]]])
Serialize *obj* as a JSON formatted stream to *fp* (a ``.write()``-supporting
file-like object).
......@@ -216,7 +216,7 @@
.. versionchanged:: 2.2.0
*tuple_as_array* is new in 2.2.0.
If *bigint_as_string* is true (default: ``False``), :class:`int`` ``2**53``
If *bigint_as_string* is true (default: ``False``), :class:`int` ``2**53``
and higher or lower than ``-2**53`` will be encoded as strings. This is to
avoid the rounding that happens in Javascript otherwise. Note that this
option loses type information, so use with extreme caution.
......@@ -220,6 +220,7 @@
and higher or lower than ``-2**53`` will be encoded as strings. This is to
avoid the rounding that happens in Javascript otherwise. Note that this
option loses type information, so use with extreme caution.
See also *int_as_string_bitcount*.
.. versionchanged:: 2.4.0
*bigint_as_string* is new in 2.4.0.
......@@ -261,6 +262,15 @@
.. versionchanged:: 3.2.0
*ignore_nan* is new in 3.2.0.
If *int_as_string_bitcount* is a positive number ``n`` (default: ``False``),
:class:`int` ``2**n`` and higher or lower than ``-2**n`` will be encoded as strings. This is to
avoid the rounding that happens in Javascript otherwise. Note that this
option loses type information, so use with extreme caution.
See also *bigint_as_string* (which is equivalent to `int_as_string_bitcount=53`).
.. versionchanged:: 3.5.0
*int_as_string_bitcount* is new in 3.5.0.
.. note::
JSON is not a framed protocol so unlike :mod:`pickle` or :mod:`marshal` it
......@@ -268,7 +278,7 @@
container protocol to delimit them.
.. function:: dumps(obj[, skipkeys[, ensure_ascii[, check_circular[, allow_nan[, cls[, indent[, separators[, encoding[, default[, use_decimal[, namedtuple_as_object[, tuple_as_array[, bigint_as_string[, sort_keys[, item_sort_key[, for_json[, ignore_nan[, **kw]]]]]]]]]]]]]]]]]])
.. function:: dumps(obj[, skipkeys[, ensure_ascii[, check_circular[, allow_nan[, cls[, indent[, separators[, encoding[, default[, use_decimal[, namedtuple_as_object[, tuple_as_array[, bigint_as_string[, sort_keys[, item_sort_key[, for_json[, ignore_nan[, int_as_string_bitcount[, **kw]]]]]]]]]]]]]]]]]])
Serialize *obj* to a JSON formatted :class:`str`.
......
......@@ -11,7 +11,7 @@
DistutilsPlatformError
IS_PYPY = hasattr(sys, 'pypy_translation_info')
VERSION = '3.4.1'
VERSION = '3.5.0'
DESCRIPTION = "Simple, fast, extensible JSON encoder/decoder for Python"
with open('README.rst', 'r') as f:
......@@ -30,6 +30,7 @@
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
Programming Language :: Python :: 3.3
Programming Language :: Python :: 3.4
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: Implementation :: PyPy
Topic :: Software Development :: Libraries :: Python Modules
......
......@@ -98,7 +98,7 @@
Expecting property name: line 1 column 3 (char 2)
"""
from __future__ import absolute_import
__version__ = '3.4.1'
__version__ = '3.5.0'
__all__ = [
'dump', 'dumps', 'load', 'loads',
'JSONDecoder', 'JSONDecodeError', 'JSONEncoder',
......@@ -211,7 +211,8 @@
sparingly.
If *int_as_string_bitcount* is a positive number (n), then int of size
greater than 2**n or lower than -2**n will be encoded as strings.
greater than or equal to 2**n or lower than or equal to -2**n will be
encoded as strings.
If specified, *item_sort_key* is a callable used to sort the items in
each dictionary. This is useful if you want to sort items other than
......@@ -325,7 +326,8 @@
rounding that happens in Javascript otherwise.
If *int_as_string_bitcount* is a positive number (n), then int of size
greater than 2**n or lower than -2**n will be encoded as strings.
greater than or equal to 2**n or lower than or equal to -2**n will be
encoded as strings.
If specified, *item_sort_key* is a callable used to sort the items in
each dictionary. This is useful if you want to sort items other than
......
......@@ -2608,4 +2608,5 @@
&ignore_nan, &Decimal))
return -1;
Py_INCREF(markers);
s->markers = markers;
......@@ -2611,2 +2612,3 @@
s->markers = markers;
Py_INCREF(defaultfn);
s->defaultfn = defaultfn;
......@@ -2612,5 +2614,6 @@
s->defaultfn = defaultfn;
Py_INCREF(encoder);
s->encoder = encoder;
s->encoding = JSON_ParseEncoding(encoding);
if (s->encoding == NULL)
return -1;
......@@ -2613,5 +2616,6 @@
s->encoder = encoder;
s->encoding = JSON_ParseEncoding(encoding);
if (s->encoding == NULL)
return -1;
Py_INCREF(indent);
s->indent = indent;
......@@ -2617,2 +2621,3 @@
s->indent = indent;
Py_INCREF(key_separator);
s->key_separator = key_separator;
......@@ -2618,2 +2623,3 @@
s->key_separator = key_separator;
Py_INCREF(item_separator);
s->item_separator = item_separator;
......@@ -2619,3 +2625,4 @@
s->item_separator = item_separator;
Py_INCREF(skipkeys);
s->skipkeys_bool = skipkeys;
s->skipkeys = PyObject_IsTrue(skipkeys);
......@@ -2620,5 +2627,6 @@
s->skipkeys_bool = skipkeys;
s->skipkeys = PyObject_IsTrue(skipkeys);
Py_INCREF(key_memo);
s->key_memo = key_memo;
s->fast_encode = (PyCFunction_Check(s->encoder) && PyCFunction_GetFunction(s->encoder) == (PyCFunction)py_encode_basestring_ascii);
s->allow_or_ignore_nan = (
......@@ -2627,12 +2635,7 @@
s->use_decimal = PyObject_IsTrue(use_decimal);
s->namedtuple_as_object = PyObject_IsTrue(namedtuple_as_object);
s->tuple_as_array = PyObject_IsTrue(tuple_as_array);
s->max_long_size = Py_None;
Py_INCREF(Py_None);
s->min_long_size = Py_None;
Py_INCREF(Py_None);
if (PyInt_Check(int_as_string_bitcount) || PyLong_Check(int_as_string_bitcount)) {
static const unsigned int long_long_bitsize = SIZEOF_LONG_LONG * 8;
int int_as_string_bitcount_val = PyLong_AsLong(int_as_string_bitcount);
if (int_as_string_bitcount_val > 0 && int_as_string_bitcount_val < long_long_bitsize) {
......@@ -2635,9 +2638,7 @@
if (PyInt_Check(int_as_string_bitcount) || PyLong_Check(int_as_string_bitcount)) {
static const unsigned int long_long_bitsize = SIZEOF_LONG_LONG * 8;
int int_as_string_bitcount_val = PyLong_AsLong(int_as_string_bitcount);
if (int_as_string_bitcount_val > 0 && int_as_string_bitcount_val < long_long_bitsize) {
Py_DECREF(Py_None);
Py_DECREF(Py_None);
s->max_long_size = PyLong_FromUnsignedLongLong(1LLU << int_as_string_bitcount_val);
s->min_long_size = PyLong_FromLongLong(-1LL << int_as_string_bitcount_val);
if (s->min_long_size == NULL || s->max_long_size == NULL) {
......@@ -2648,9 +2649,19 @@
PyErr_Format(PyExc_TypeError,
"int_as_string_bitcount (%d) must be greater than 0 and less than the number of bits of a `long long` type (%u bits)",
int_as_string_bitcount_val, long_long_bitsize);
}
}
return -1;
}
}
else if (int_as_string_bitcount == Py_None) {
Py_INCREF(Py_None);
s->max_long_size = Py_None;
Py_INCREF(Py_None);
s->min_long_size = Py_None;
}
else {
PyErr_SetString(PyExc_TypeError, "int_as_string_bitcount must be None or an integer");
return -1;
}
if (item_sort_key != Py_None) {
if (!PyCallable_Check(item_sort_key)) {
PyErr_SetString(PyExc_TypeError, "item_sort_key must be None or callable");
......@@ -2681,4 +2692,5 @@
if (PyDict_SetItemString(s->item_sort_kw, "key", item_sort_key))
return -1;
}
Py_INCREF(sort_keys);
s->sort_keys = sort_keys;
......@@ -2684,2 +2696,3 @@
s->sort_keys = sort_keys;
Py_INCREF(item_sort_key);
s->item_sort_key = item_sort_key;
......@@ -2685,4 +2698,5 @@
s->item_sort_key = item_sort_key;
Py_INCREF(Decimal);
s->Decimal = Decimal;
s->for_json = PyObject_IsTrue(for_json);
......@@ -2686,17 +2700,6 @@
s->Decimal = Decimal;
s->for_json = PyObject_IsTrue(for_json);
Py_INCREF(s->markers);
Py_INCREF(s->defaultfn);
Py_INCREF(s->encoder);
Py_INCREF(s->indent);
Py_INCREF(s->key_separator);
Py_INCREF(s->item_separator);
Py_INCREF(s->key_memo);
Py_INCREF(s->skipkeys_bool);
Py_INCREF(s->sort_keys);
Py_INCREF(s->item_sort_key);
Py_INCREF(s->Decimal);
return 0;
}
......
......@@ -183,7 +183,8 @@
rounding that happens in Javascript otherwise.
If int_as_string_bitcount is a positive number (n), then int of size
greater than 2**n or lower than -2**n will be encoded as strings.
greater than or equal to 2**n or lower than or equal to -2**n will be
encoded as strings.
If specified, item_sort_key is a callable used to sort the items in
each dictionary. This is useful if you want to sort items other than
......@@ -323,10 +324,7 @@
key_memo = {}
int_as_string_bitcount = (
(self.bigint_as_string and 53)
or
self.int_as_string_bitcount
)
53 if self.bigint_as_string else self.int_as_string_bitcount)
if (_one_shot and c_make_encoder is not None
and self.indent is None):
_iterencode = c_make_encoder(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment