from __future__ import unicode_literals from coreapi.codecs.base import BaseCodec from coreapi.document import Document, Link, Array, Object, Error, Field def _to_repr(node): if isinstance(node, Document): content = ', '.join([ '%s: %s' % (repr(key), _to_repr(value)) for key, value in node.items() ]) return 'Document(url=%s, title=%s, content={%s})' % ( repr(node.url), repr(node.title), content ) elif isinstance(node, Error): content = ', '.join([ '%s: %s' % (repr(key), _to_repr(value)) for key, value in node.items() ]) return 'Error(title=%s, content={%s})' % ( repr(node.title), content ) elif isinstance(node, Object): return '{%s}' % ', '.join([ '%s: %s' % (repr(key), _to_repr(value)) for key, value in node.items() ]) elif isinstance(node, Array): return '[%s]' % ', '.join([ _to_repr(value) for value in node ]) elif isinstance(node, Link): args = "url=%s" % repr(node.url) if node.action: args += ", action=%s" % repr(node.action) if node.inplace is not None: args += ", inplace=%s" % repr(node.inplace) if node.fields: fields_repr = ', '.join(_to_repr(item) for item in node.fields) args += ", fields=[%s]" % fields_repr return "Link(%s)" % args elif isinstance(node, Field): args = repr(node.name) if not node.required and not node.location: return args if node.required: args += ', required=True' if node.location: args += ', location=%s' % repr(node.location) return 'Field(%s)' % args return repr(node) class PythonCodec(BaseCodec): """ A Python representation of a Document, for use with '__repr__'. """ media_type = 'text/python' def dump(self, node, **kwargs): # Object and Array only have the class name wrapper if they # are the outermost element. if isinstance(node, Object): return 'Object(%s)' % _to_repr(node) elif isinstance(node, Array): return 'Array(%s)' % _to_repr(node) return _to_repr(node)