def test_invalid_document_title_ignored(json_codec): doc = json_codec.decode( b'{"_type": "document", "_meta": {"title": 1}, "a": 1}') assert doc == Document(content={"a": 1})
def test_compact_style(json_codec): doc = Document(content={'a': 123, 'b': 456}) bytes = json_codec.encode(doc) assert bytes == b'{"_type":"document","a":123,"b":456}'
def test_verbose_style(json_codec): doc = Document(content={'a': 123, 'b': 456}) bytes = json_codec.encode(doc, indent=True) assert bytes == b"""{
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
def test_not_a_document(json_codec): """ Valid JSON that does not return a document should be coerced into one. """ assert json_codec.decode(b'{}') == Document()
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
def test_invalid_link_fields_ignored(json_codec): doc = json_codec.load( b'{"_type": "document", "link": {"_type": "link", "fields": 1}}') assert doc == Document(content={"link": Link()})
def test_invalid_document_url_ignored(json_codec): doc = json_codec.load( b'{"_type": "document", "_meta": {"url": 1}, "a": 1}') assert doc == Document(content={"a": 1})
def build_document(content): return Document(url='http://base_url.com', title='Base API', description='doc', content=content)
def test_invalid_link_url_ignored(json_codec): doc = json_codec.decode( b'{"_type": "document", "link": {"_type": "link", "url": 1}}') assert doc == Document(content={"link": Link()})