Skip to content

Commit

Permalink
add a JSON encoder, to deal with decimal.Decimal, datetime.date and d…
Browse files Browse the repository at this point in the history
…atetime.datetime
  • Loading branch information
elemoine committed May 21, 2011
1 parent c65bbcd commit 274dd33
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
17 changes: 16 additions & 1 deletion papyrus/renderers.py
@@ -1,10 +1,25 @@
import decimal
import datetime

import geojson
from geojson.codec import PyGFPEncoder as GeoJSONEncoder

class Encoder(GeoJSONEncoder):
# SQLAlchemy's Reflecting Tables mechanism uses decimal.Decimal
# for numeric columns and datetime.date for dates. simplejson
# does'nt deal with these types. This class provides a simple
# encoder to deal with objects of these types.

def default(self, obj):
if isinstance(obj, (decimal.Decimal, datetime.date, datetime.datetime)):
return str(obj)
return GeoJSONEncoder.default(self, obj)

def geojson_renderer_factory(info):
def _render(value, system):
request = system.get('request')
if request is not None:
if not hasattr(request, 'response_content_type'):
request.response_content_type = 'application/json'
return geojson.dumps(value)
return geojson.dumps(value, cls=Encoder)
return _render
42 changes: 42 additions & 0 deletions papyrus/tests/test_renderers.py
Expand Up @@ -38,3 +38,45 @@ def test_geojson_content_type(self):
result = renderer(f, {'request': request})
self.assertEqual(result, '{"geometry": {"type": "Point", "coordinates": [53, -4]}, "type": "Feature", "properties": {"title": "Dict 1"}, "id": 1}')
self.assertEqual(request.response_content_type, 'text/javascript')

def test_Decimal(self):
renderer = self._callFUT(None)
import decimal
f = {
'type': 'Feature',
'id': 1,
'geometry': {'type': 'Point', 'coordinates': [53, -4]},
'properties': {'decimal': decimal.Decimal('0.003')}
}
request = testing.DummyRequest()
result = renderer(f, {'request': request})
self.assertEqual(result, '{"geometry": {"type": "Point", "coordinates": [53, -4]}, "type": "Feature", "properties": {"decimal": "0.003"}, "id": 1}')
self.assertEqual(request.response_content_type, 'application/json')

def test_date(self):
renderer = self._callFUT(None)
import datetime
f = {
'type': 'Feature',
'id': 1,
'geometry': {'type': 'Point', 'coordinates': [53, -4]},
'properties': {'date': datetime.date(2011, 05, 21)}
}
request = testing.DummyRequest()
result = renderer(f, {'request': request})
self.assertEqual(result, '{"geometry": {"type": "Point", "coordinates": [53, -4]}, "type": "Feature", "properties": {"date": "2011-05-21"}, "id": 1}')
self.assertEqual(request.response_content_type, 'application/json')

def test_datetime(self):
renderer = self._callFUT(None)
import datetime
f = {
'type': 'Feature',
'id': 1,
'geometry': {'type': 'Point', 'coordinates': [53, -4]},
'properties': {'datetime': datetime.datetime(2011, 05, 21, 20, 55, 12)}
}
request = testing.DummyRequest()
result = renderer(f, {'request': request})
self.assertEqual(result, '{"geometry": {"type": "Point", "coordinates": [53, -4]}, "type": "Feature", "properties": {"datetime": "2011-05-21 20:55:12"}, "id": 1}')
self.assertEqual(request.response_content_type, 'application/json')

0 comments on commit 274dd33

Please sign in to comment.