import json
import jsonschema
import requests
-from requests.utils import urlparse, urlunparse
import types
-from urlparse import urljoin
+from urlparse import urljoin, urlparse, urlunparse
LOGGER = logging.getLogger(__name__)
# provide common defaults.
None: {
# terms in multiple encoded objects
+ 'award': { '@type': '@id' },
+ 'dataset': {'@type': '@id'},
'description': 'rdf:description',
+ 'documents': { '@type': '@id' },
'experiment': {'@type': '@id'},
'href': { '@type': '@id' },
'lab': { '@type': '@id' },
'library': {'@type': '@id' },
'pi': { '@type': '@id' },
'platform': { '@type': '@id' },
+ 'replicates': { '@type': '@id' },
'submitted_by': { '@type': '@id' },
'url': { '@type': '@id' },
},
},
'experiment': {
"assay_term_id": { "@type": "@id" },
- },
- 'file': {
- 'dataset': {'@type': '@id'},
+ "files": { "@type": "@id" },
+ "original_files": { "@type": "@id"},
},
# I tried to use the JSON-LD mapping capabilities to convert the lab
# contact information into a vcard record, but the encoded model
# "state": "vcard:region",
# "country": "vcard:country"
#},
- 'human_donor': {
- 'award': { '@type': '@id' },
- },
'library': {
- 'award': { '@type': '@id' },
'nucleic_acid_term_id': { '@type': '@id' }
}
}
# OBI: available from http://svn.code.sf.net/p/obi/code/releases/2012-07-01/merged/merged-obi-comments.owl
'SO': 'http://purl.obolibrary.org/obo/SO_', # Sequence ontology
# SO: available from http://www.berkeleybop.org/ontologies/so.owl
+ # NTR: New Term Request space for DCC to implement new ontology terms
}
def get_schema_url(self, obj):
obj_type = self.get_object_type(obj)
if obj_type:
- return self.prepare_url(ENCODED_SCHEMA_ROOT + obj_type + '.json')
+ return self.prepare_url(ENCODED_SCHEMA_ROOT + obj_type + '.json') + '#'
def _is_encoded_object(self, obj):
'''Test to see if an object is a JSON-LD object
# clean up potentially messy urls
url = urlparse(request_url)._asdict()
if not url['scheme']:
- url['scheme'] = 'http'
+ url['scheme'] = 'https'
if not url['netloc']:
url['netloc'] = self.server
url = urlunparse(url.values())
return url
+ def search_jsonld(self, term, **kwargs):
+ '''Send search request to ENCODED
+ '''
+ url = self.prepare_url('/search/')
+ result = self.get_json(url, searchTerm=term, **kwargs)
+ self.convert_search_to_jsonld(result)
+ return result
+
+ def convert_search_to_jsonld(self, result):
+ '''Add the context to search result
+
+ Also remove hard to handle nested attributes
+ e.g. remove object.term when we have no id
+ '''
+ graph = result['@graph']
+ for i, obj in enumerate(graph):
+ # suppress nested attributes
+ graph[i] = {k: v for k, v in obj.items() if '.' not in k}
+
+ self.add_jsonld_context(result, self.prepare_url(result['@id']))
+ return result
+
def validate(self, obj):
obj_type = self.get_object_type(obj)
schema_url = self.get_schema_url(obj)