def _coerce_to_error(obj, default_title): """ Given an arbitrary return result, coerce it into an Error instance. """ if isinstance(obj, Document): return Error(title=obj.title or default_title, content=_coerce_to_error_content(obj)) elif isinstance(obj, dict): return Error(title=default_title, content=obj) elif isinstance(obj, list): return Error(title=default_title, content={'messages': obj}) elif obj is None: return Error(title=default_title) return Error(title=default_title, content={'message': obj})
def test_minimal_error(json_codec): """ Ensure we can load a minimal error message encoding. """ error = json_codec.decode( b'{"_type":"error","_meta":{"title":"Failure"},"messages":["failed"]}') assert error == Error(title="Failure", content={'messages': ['failed']})
def _primative_to_document(data, base_url=None): """ Take Python primatives as returned from parsing JSON content, and return a Core API document. """ if isinstance(data, dict) and data.get('_type') == 'document': # Document meta = _get_dict(data, '_meta') url = _get_string(meta, 'url') url = urlparse.urljoin(base_url, url) title = _get_string(meta, 'title') content = _get_content(data, base_url=url) return Document(url=url, title=title, content=content) if isinstance(data, dict) and data.get('_type') == 'error': # Error meta = _get_dict(data, '_meta') title = _get_string(meta, 'title') content = _get_content(data, base_url=base_url) return Error(title=title, content=content) elif isinstance(data, dict) and data.get('_type') == 'link': # Link url = _get_string(data, 'url') url = urlparse.urljoin(base_url, url) action = _get_string(data, 'action') encoding = _get_string(data, 'encoding') transform = _get_string(data, 'transform') description = _get_string(data, 'description') fields = _get_list(data, 'fields') fields = [ Field(name=_get_string(item, 'name'), required=_get_bool(item, 'required'), location=_get_string(item, 'location'), type=_get_string(item, 'type'), description=_get_string(item, 'description')) for item in fields if isinstance(item, dict) ] return Link(url=url, action=action, encoding=encoding, transform=transform, description=description, fields=fields) elif isinstance(data, dict): # Map content = _get_content(data, base_url=base_url) return Object(content) elif isinstance(data, list): # Array content = [_primative_to_document(item, base_url) for item in data] return Array(content) # String, Integer, Number, Boolean, null. return data
def test_primitive_to_error(): error = Error(title='Failure', content={'messages': ['failed']}) data = { '_type': 'error', '_meta': { 'title': 'Failure' }, 'messages': ['failed'] } assert _primitive_to_document(data) == error
def test_error_to_primative(): error = Error(title='Failure', content={'messages': ['failed']}) data = { '_type': 'error', '_meta': { 'title': 'Failure' }, 'messages': ['failed'] } assert _document_to_primative(error) == data
def _primitive_to_document(data, base_url=None): """ Take Python primitives as returned from parsing JSON content, and return a Core API document. """ if isinstance(data, dict) and data.get("_type") == "document": # Document meta = _get_dict(data, "_meta") url = _get_string(meta, "url") url = urlparse.urljoin(base_url, url) title = _get_string(meta, "title") description = _get_string(meta, "description") content = _get_content(data, base_url=url) return Document( url=url, title=title, description=description, media_type="application/coreapi+json", content=content, ) if isinstance(data, dict) and data.get("_type") == "error": # Error meta = _get_dict(data, "_meta") title = _get_string(meta, "title") content = _get_content(data, base_url=base_url) return Error(title=title, content=content) elif isinstance(data, dict) and data.get("_type") == "link": # Link url = _get_string(data, "url") url = urlparse.urljoin(base_url, url) action = _get_string(data, "action") encoding = _get_string(data, "encoding") transform = _get_string(data, "transform") title = _get_string(data, "title") description = _get_string(data, "description") fields = _get_list(data, "fields") fields = [ Field( name=_get_string(item, "name"), required=_get_bool(item, "required"), location=_get_string(item, "location"), schema=_get_schema(item, "schema"), ) for item in fields if isinstance(item, dict) ] return Link( url=url, action=action, encoding=encoding, transform=transform, title=title, description=description, fields=fields, ) elif isinstance(data, dict): # Map content = _get_content(data, base_url=base_url) return Object(content) elif isinstance(data, list): # Array content = [_primitive_to_document(item, base_url) for item in data] return Array(content) # String, Integer, Number, Boolean, null. return data