diff options
| author | Josh Gachnang <josh@pcsforeducation.com> | 2014-03-19 17:29:53 -0700 |
|---|---|---|
| committer | Josh Gachnang <josh@pcsforeducation.com> | 2014-03-19 17:29:53 -0700 |
| commit | 0e6776f6c0e88ccec5d4875d6ff196bc06ec558f (patch) | |
| tree | 6fd24ed526c914ccaab77e2ccbad22a00ce0b75a /ironic_python_agent/encoding.py | |
| parent | 6e366520bbcdb1e4540d550a2017d5440b16938b (diff) | |
| parent | fc043dd1d345034dc9f63738ec09d2c88e3bb286 (diff) | |
| download | ironic-python-agent-0e6776f6c0e88ccec5d4875d6ff196bc06ec558f.tar.gz | |
Merge pull request #72 from rackerlabs/JoshNang/ipa
Rename to Ironic Python Agent
Diffstat (limited to 'ironic_python_agent/encoding.py')
| -rw-r--r-- | ironic_python_agent/encoding.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/ironic_python_agent/encoding.py b/ironic_python_agent/encoding.py new file mode 100644 index 00000000..a6386579 --- /dev/null +++ b/ironic_python_agent/encoding.py @@ -0,0 +1,53 @@ +""" +Copyright 2013 Rackspace, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import json +import uuid + + +class Serializable(object): + """Base class for things that can be serialized.""" + def serialize(self): + """Turn this object into a dict.""" + raise NotImplementedError() + + +class RESTJSONEncoder(json.JSONEncoder): + """A slightly customized JSON encoder.""" + def encode(self, o): + """Turn an object into JSON. + + Appends a newline to responses when configured to pretty-print, + in order to make use of curl less painful from most shells. + """ + delimiter = '' + + # if indent is None, newlines are still inserted, so we should too. + if self.indent is not None: + delimiter = '\n' + + return super(RESTJSONEncoder, self).encode(o) + delimiter + + def default(self, o): + """Turn an object into a serializable object. In particular, by + calling :meth:`.Serializable.serialize`. + """ + if isinstance(o, Serializable): + return o.serialize() + elif isinstance(o, uuid.UUID): + return str(o) + else: + return json.JSONEncoder.default(self, o) |
