def test_elements(): """Test simple dc.""" elements = [ ('contributors', 'contributor'), ('coverage', 'coverage'), ('creators', 'creator'), ('dates', 'date'), ('descriptions', 'description'), ('formats', 'format'), ('identifiers', 'identifier'), ('languages', 'language'), ('publishers', 'publisher'), ('relations', 'relation'), ('rights', 'rights'), ('sources', 'source'), ('subjects', 'subject'), ('titles', 'title'), ('types', 'type'), ] # Test each element individually for plural, singular in elements: # Test multiple values tree = simpledc.dump_etree({plural: ['value 1', 'value 2']}) elems = tree.xpath( '/oai_dc:dc/dc:{0}'.format(singular), namespaces=simpledc.ns) assert len(elems) == 2, singular assert elems[0].text == 'value 1' assert elems[1].text == 'value 2' # Test empty values tree = simpledc.dump_etree({plural: []}) elem = tree.xpath( '//dc:{0}'.format(singular), namespaces=simpledc.ns) assert len(elem) == 0, singular # Test all elements together data = {} for plural, singular in elements: data[plural] = ['test 1', 'test 2'] tree = simpledc.dump_etree(data) for plural, singular in elements: elems = tree.xpath( '/oai_dc:dc/dc:{0}'.format(singular), namespaces=simpledc.ns) assert len(elems) == 2, singular assert elems[0].text == 'test 1' assert elems[1].text == 'test 2' # Test tostring xml = simpledc.tostring(data) for plural, singular in elements: assert '<dc:{0}>'.format(singular) in xml
def test_elements(): """Test simple dc.""" elements = [ ('contributors', 'contributor'), ('coverage', 'coverage'), ('creators', 'creator'), ('dates', 'date'), ('descriptions', 'description'), ('formats', 'format'), ('identifiers', 'identifier'), ('languages', 'language'), ('publishers', 'publisher'), ('relations', 'relation'), ('rights', 'rights'), ('sources', 'source'), ('subjects', 'subject'), ('titles', 'title'), ('types', 'type'), ] # Test each element individually for plural, singular in elements: # Test multiple values tree = simpledc.dump_etree({plural: ['value 1', 'value 2']}) elems = tree.xpath('/oai_dc:dc/dc:{0}'.format(singular), namespaces=simpledc.ns) assert len(elems) == 2, singular assert elems[0].text == 'value 1' assert elems[1].text == 'value 2' # Test empty values tree = simpledc.dump_etree({plural: []}) elem = tree.xpath('//dc:{0}'.format(singular), namespaces=simpledc.ns) assert len(elem) == 0, singular # Test all elements together data = {} for plural, singular in elements: data[plural] = ['test 1', 'test 2'] tree = simpledc.dump_etree(data) for plural, singular in elements: elems = tree.xpath('/oai_dc:dc/dc:{0}'.format(singular), namespaces=simpledc.ns) assert len(elems) == 2, singular assert elems[0].text == 'test 1' assert elems[1].text == 'test 2' # Test tostring xml = simpledc.tostring(data) for plural, singular in elements: assert '<dc:{0}>'.format(singular) in xml
def serialize_oaipmh(self, pid, record): """Serialize a single record for OAI-PMH.""" obj = self.transform_record(pid, record['_source']) \ if isinstance(record['_source'], Record) \ else self.transform_search_hit(pid, record) return simpledc.dump_etree(obj)
def serialize_object_xml(self, obj): """Serialize a single record and persistent identifier to etree. :param obj: Record instance """ json = self._schema_cls().dump(obj) return simpledc.dump_etree(json)
def serialize_search(self, pid_fetcher, search_result, links=None, item_links_factory=None, **kwargs): """Serialize a search result. :param pid_fetcher: Persistent identifier fetcher. :param search_result: Elasticsearch search result. :param links: Dictionary of links to add to response. """ total = search_result['hits']['total']['value'] sru = search_result['hits'].get('sru', {}) start_record = sru.get('start_record', 0) maximum_records = sru.get('maximum_records', 0) query = sru.get('query') query_es = sru.get('query_es') next_record = start_record + maximum_records + 1 element = ElementMaker() xml_root = element.searchRetrieveResponse() if sru: xml_root.append(element.version('1.1')) xml_root.append(element.numberOfRecords(str(total))) xml_records = element.records() language = request.args.get('ln', DEFAULT_LANGUAGE) for hit in search_result['hits']['hits']: record = hit['_source'] pid = record['pid'] record = self.transform_search_hit( pid=pid, record=record, links_factory=item_links_factory, language=language, **kwargs) element_record = simpledc.dump_etree( record, container=self.container_element, nsmap=self.namespace, attribs=self.container_attribs) xml_records.append(element_record) xml_root.append(xml_records) if sru: echoed_search_rr = element.echoedSearchRetrieveRequest() if query: echoed_search_rr.append(element.query(query)) if query_es: echoed_search_rr.append(element.query_es(query_es)) if start_record: echoed_search_rr.append(element.startRecord(str(start_record))) if next_record > 1 and next_record < total: echoed_search_rr.append( element.nextRecordPosition(str(next_record))) if maximum_records: echoed_search_rr.append( element.maximumRecords(str(maximum_records))) echoed_search_rr.append(element.recordPacking('XML')) xml_root.append(echoed_search_rr) # Maybe needed if we use this serialiser directly with documents # else: # xml_links = element.links() # self_link = links.get('self') # if self_link: # xml_links.append(element.self(f'{self_link}&format=dc')) # next_link = links.get('next') # if next_link: # xml_links.append(element.next(f'{next_link}&format=dc')) # xml_root.append(xml_links) return etree.tostring(xml_root, encoding='utf-8', method='xml', pretty_print=True)