def test_transform_object_tree(): def add_one(a): return a + 1 assert transform_object_tree(add_one, [1, 2, 3]) == [2, 3, 4] assert transform_object_tree(add_one, {'a': 1, 'b': 2, 'c': 3}) == {'a': 2, 'b': 3, 'c': 4} assert transform_object_tree(add_one, {'a': 1, 'b': (2, 3), 'c': [4, 5]}) == {'a': 2, 'b': (3, 4), 'c': [5, 6]} assert transform_object_tree(add_one, {1: 1, '2': 2, 3.0: 3}, key_transform=float) == {1.0: 2, 2.0: 3, 3.0: 4} # Order must be maintained assert transform_object_tree(add_one, OrderedDict([('z', 1), ('w', 2), ('y', 3), ('s', 7)])) \ == OrderedDict([('z', 2), ('w', 3), ('y', 4), ('s', 8)])
def jsonify_document(doc): """ Make a document ready for serialisation as JSON. Returns the new document, leaving the original unmodified. >>> sorted(jsonify_document({'a': (1.0, 2.0, 3.0), 'b': float("inf"), 'c': datetime(2016, 3, 11)}).items()) [('a', (1.0, 2.0, 3.0)), ('b', 'Infinity'), ('c', '2016-03-11T00:00:00')] >>> # Converts keys to strings: >>> sorted(jsonify_document({1: 'a', '2': Decimal('2')}).items()) [('1', 'a'), ('2', '2')] >>> jsonify_document({'k': UUID("1f231570-e777-11e6-820f-185e0f80a5c0")}) {'k': '1f231570-e777-11e6-820f-185e0f80a5c0'} """ def fixup_value(v): if isinstance(v, float): if math.isfinite(v): return v if math.isnan(v): return "NaN" return "-Infinity" if v < 0 else "Infinity" if isinstance(v, (datetime, date)): return v.isoformat() if isinstance(v, numpy.dtype): return v.name if isinstance(v, UUID): return str(v) if isinstance(v, Decimal): return str(v) return v return transform_object_tree(fixup_value, doc, key_transform=str)
def jsonify_document(doc): """ Make a document ready for serialisation as JSON. Returns the new document, leaving the original unmodified. """ def fixup_value(v): if isinstance(v, float): if math.isfinite(v): return v if math.isnan(v): return "NaN" return "-Infinity" if v < 0 else "Infinity" if isinstance(v, (datetime, date)): return v.isoformat() if isinstance(v, numpy.dtype): return v.name if isinstance(v, UUID): return str(v) if isinstance(v, Decimal): return str(v) return v return transform_object_tree(fixup_value, doc, key_transform=str)
def sanitize_query(query): def sanitize(v): if isinstance(v, Geometry): return v.json if isinstance(v, datetime): return v.isoformat() return v return transform_object_tree(sanitize, query)