Added support for saving Pillar resources as JSON.

This commit is contained in:
2016-03-22 12:42:31 +01:00
parent 2c39a88cfe
commit dac5d638da
2 changed files with 26 additions and 0 deletions

View File

@@ -20,6 +20,22 @@ else:
text_type = unicode
class PillarJSONEncoder(json.JSONEncoder):
"""JSON encoder with support for Pillar resources."""
def default(self, obj):
# Late import to prevent circular references.
from .resource import Resource
if isinstance(obj, datetime):
return obj.isoformat(' ')
if isinstance(obj, Resource):
return obj.to_dict()
# Let the base class default method raise the TypeError
return json.JSONEncoder.default(self, obj)
def join_url(url, *paths):
"""
Joins individual URL strings together, and returns a single string.

View File

@@ -1,5 +1,7 @@
# -*- encoding: utf-8 -*-
import datetime
import json
import unittest
try:
@@ -9,6 +11,7 @@ except ImportError:
from urllib import quote_plus
from pillarsdk import utils
from pillarsdk.resource import Resource
class PillarUtilsTests(unittest.TestCase):
@@ -59,3 +62,10 @@ class PillarUtilsTests(unittest.TestCase):
self.assertEqual({'foo': 'bar'}, utils.merge_dict(None, {'foo': 'bar'}))
self.assertEqual({}, utils.merge_dict(None, None))
def test_json_encoding(self):
resource = Resource()
resource['datetime'] = datetime.datetime(2016, 3, 22, 12, 35, 16)
as_json = json.dumps(resource, cls=utils.PillarJSONEncoder, sort_keys=True)
self.assertEqual('{"datetime": "2016-03-22 12:35:16"}', as_json)