def test_process_doc9(self, monkeypatch, data9): monkeypatch_ol(monkeypatch) p = dynlinks.DataProcessor() p.authors = data9 p.works = data9 assert p.process_doc(data9['/books/OL9M']) == data9['result']['data']
def test_get_authors1(self, data1): p = dynlinks.DataProcessor() p.authors = data1 assert p.get_authors(data1['/works/OL1W']) == [{ "url": "https://openlibrary.org/authors/OL1A/Mark_Twain", "name": "Mark Twain" }]
def test_process_doc0(self, data0): p = dynlinks.DataProcessor() assert p.process_doc(data0['/books/OL0M']) == data0['result']['data']
def test_get_authors0(self, data0): p = dynlinks.DataProcessor() p.authors = data0 assert p.get_authors(data0['/books/OL0M']) == []
def process(self, req): requests = req.split('|') bib_keys = sum([r.split(';') for r in requests], []) # filter out 'id:foo' before passing to dynlinks bib_keys = [k for k in bib_keys if k[:3].lower() != 'id:'] self.docs = dynlinks.query_docs(bib_keys) if not self.options.get('no_details'): self.detailss = dynlinks.process_result_for_details(self.docs) else: self.detailss = {} dp = dynlinks.DataProcessor() self.datas = dp.process(self.docs) self.works = dp.works # XXX control costs below with [:iaid_limit] - note that this may result # in no 'exact' item match, even if one exists # Note that it's available thru above works/docs iaid_limit = 500 self.wkey_to_iaids = dict( (wkey, get_work_iaids(wkey)[:iaid_limit]) for wkey in self.works) iaids = sum(self.wkey_to_iaids.values(), []) self.iaid_to_meta = dict( (iaid, ia.get_metadata(iaid)) for iaid in iaids) def lookup_iaids(iaids): step = 10 if len(iaids) > step and not self.options.get('debug_things'): result = [] while iaids: result += lookup_iaids(iaids[:step]) iaids = iaids[step:] return result query = { 'type': '/type/edition', 'ocaid': iaids, } result = web.ctx.site.things(query) return result ekeys = lookup_iaids(iaids) # If returned order were reliable, I could skip the below. eds = dynlinks.ol_get_many_as_dict(ekeys) self.iaid_to_ed = dict((ed['ocaid'], ed) for ed in eds.values()) # self.iaid_to_ekey = dict((iaid, ed['key']) # for iaid, ed in self.iaid_to_ed.items()) # Work towards building a dict of iaid loanability, # def has_lending_collection(meta): # collections = meta.get("collection", []) # return 'lendinglibrary' in collections or 'inlibrary' in collections # in case site.store supports get_many (unclear) # maybe_loanable_iaids = [iaid for iaid in iaids # if has_lending_collection(self.iaid_to_meta.get(iaid, {}))] # loanable_ekeys = [self.iaid_to_ekey.get(iaid) for iaid in maybe_loanable_iaids] # loanstatus = web.ctx.site.store.get('ebooks' + ekey, {'borrowed': 'false'}) result = {} for r in requests: bib_keys = r.split(';') if r.lower().startswith('id:'): result_key = bib_keys.pop(0)[3:] else: result_key = r sub_result = self.make_record(bib_keys) if sub_result: result[result_key] = sub_result if self.options.get('debug_items'): result['ekeys'] = ekeys result['eds'] = eds result['iaids'] = iaids return result