From 1092da3b545a13732309e24e663f4b011f066315 Mon Sep 17 00:00:00 2001 From: Vincent Rubinetti Date: Thu, 27 Apr 2023 17:11:20 -0400 Subject: [PATCH] v1.1.4 (#192) - explicitly list cite process cache files in gitignore - add default values for all `.get()` calls for extra safety and also to indicate expected type - change `id` to `_id` in plugins. this was done in the main `cite.py` script in v1.1.1 but i missed it in the plugins. - fix dangerous memoize/cache bug where cache key doesn't include the id of the metasource currently being cited, which affects the output - orcid plugin: update api to v3 - orcid plugin: fix bug where all ids for single source were being included. instead, find most recent doi, and fallback to other id type if not available. - orcid plugin: keep a few details from api for ids that aren't citable by manubot - allow `format_date` util func to accept numeric timestamp (returned from orcid api) - tweak member bio page --- .gitignore | 2 + CHANGELOG.md | 6 ++ CITATION.cff | 4 +- _cite/.cache/cache.db | Bin 49152 -> 200704 bytes _cite/cite.py | 11 ++-- _cite/plugins/google-scholar.py | 22 ++++---- _cite/plugins/orcid.py | 94 ++++++++++++++++++++++++++------ _cite/plugins/pubmed.py | 16 +++--- _cite/util.py | 10 ++-- _layouts/member.html | 20 ++++--- 10 files changed, 131 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index ce175e3fcf..c3511ff453 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ _site vendor debug.log __pycache__ +.cache +!cache.db .DS_STORE .env* package.json diff --git a/CHANGELOG.md b/CHANGELOG.md index d7ab5a2c93..57e130452c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Reference: common-changelog.org +## 1.1.4 - 2023-04-28 + +### Changed + +- Fix ORCID plugin and other cite process bugs. + ## 1.1.3 - 2023-04-20 ### Changed diff --git a/CITATION.cff b/CITATION.cff index 6d40cbc530..4870fb24c2 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,8 +1,8 @@ # citation metadata for the template itself title: "Lab Website Template" -version: 1.1.3 -date-released: 2023-04-20 +version: 1.1.4 +date-released: 2023-04-28 url: "https://github.com/greenelab/lab-website-template" authors: - family-names: "Rubinetti" diff --git a/_cite/.cache/cache.db b/_cite/.cache/cache.db index 23703d7497deaf2d1cb1f7d9e72d47fb0abfcec0..fb6f435a435b76b8b493e6392485ba9cb3ba1282 100644 GIT binary patch literal 200704 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⪼y;R4UI9b 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 literal 49152 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 WlR#i^W!PPJ_07Bc#dJR?mj4GSAb)`X diff --git a/_cite/cite.py b/_cite/cite.py index 8828a9f69e..e0b7dcff37 100644 --- a/_cite/cite.py +++ b/_cite/cite.py @@ -89,11 +89,11 @@ # merge sources with matching (non-blank) ids for a in range(0, len(sources)): - _id = sources[a].get("id") + _id = sources[a].get("id", "") if not _id: continue for b in range(a + 1, len(sources)): - if sources[b].get("id") == _id: + if sources[b].get("id", "") == _id: sources[a].update(sources[b]) sources[b] = {} sources = [entry for entry in sources if entry] @@ -109,6 +109,7 @@ # list of new citations citations = [] + # loop through compiled sources for index, source in enumerate(sources): log(f"Processing source {index + 1} of {len(sources)}, {label(source)}") @@ -130,7 +131,7 @@ # if Manubot cannot cite source except Exception as e: # if regular source (id entered by user), throw error - if source.get("plugin") == "sources.py": + if source.get("plugin", "") == "sources.py": log(e, 3, "ERROR") error = True # otherwise, if from metasource (id retrieved from some third-party API), just warn @@ -143,7 +144,8 @@ citation.update(source) # ensure date in proper format for correct date sorting - citation["date"] = format_date(citation.get("date")) + if citation.get("date", ""): + citation["date"] = format_date(citation.get("date", "")) # add new citation to list citations.append(citation) @@ -153,6 +155,7 @@ log("Saving updated citations") + # save new citations try: save_data(output_file, citations) diff --git a/_cite/plugins/google-scholar.py b/_cite/plugins/google-scholar.py index 0a05a00568..f04dec811d 100644 --- a/_cite/plugins/google-scholar.py +++ b/_cite/plugins/google-scholar.py @@ -9,41 +9,41 @@ def main(entry): returns list of sources to cite """ - # get id from entry - id = entry.get("gsid") - if not id: - raise Exception('No "gsid" key') - # get api key - api_key = os.environ.get("GOOGLE_SCHOLAR_API_KEY") + api_key = os.environ.get("GOOGLE_SCHOLAR_API_KEY", "") if not api_key: raise Exception('No "GOOGLE_SCHOLAR_API_KEY" env var') # serp api params = { "engine": "google_scholar_author", - "author_id": id, "api_key": api_key, - "num": 100, + "num": 100, # max allowed } + # get id from entry + _id = entry.get("gsid", "") + if not _id: + raise Exception('No "gsid" key') + # query api @log_cache @cache.memoize(name=__file__, expire=1 * (60 * 60 * 24)) - def query(): + def query(_id): + params["author_id"] = _id return GoogleSearch(params).get_dict().get("articles", []) - response = query() + response = query(_id) # list of sources to return sources = [] # go through response and format sources for work in response: - # create source source = { "id": work.get("citation_id", ""), + # api does not provide Manubot-citeable id, so keep citation details "title": work.get("title", ""), "authors": list(map(str.strip, work.get("authors", "").split(","))), "publisher": work.get("publication", ""), diff --git a/_cite/plugins/orcid.py b/_cite/plugins/orcid.py index 28817482e5..1d47e72b7e 100644 --- a/_cite/plugins/orcid.py +++ b/_cite/plugins/orcid.py @@ -10,42 +10,102 @@ def main(entry): """ # orcid api - endpoint = "https://pub.orcid.org/v2.0/$ORCID/works" + endpoint = "https://pub.orcid.org/v3.0/$ORCID/works" headers = {"Accept": "application/json"} # get id from entry - id = entry.get("orcid") - if not id: + _id = entry.get("orcid", "") + if not _id: raise Exception('No "orcid" key') # query api @log_cache @cache.memoize(name=__file__, expire=1 * (60 * 60 * 24)) - def query(): - url = endpoint.replace("$ORCID", id) + def query(_id): + url = endpoint.replace("$ORCID", _id) request = Request(url=url, headers=headers) response = json.loads(urlopen(request).read()) - return response.get("group") + return response.get("group", []) - response = query() + response = query(_id) # list of sources to return sources = [] # go through response structure and pull out ids e.g. doi:1234/56789 for work in response: - for id in work["external-ids"]["external-id"]: - # get id and id-type from response - id_type = id["external-id-type"] - id_value = id["external-id-value"] + # get list of ids + ids = work.get("external-ids", {}).get("external-id", []) + for summary in work.get("work-summary", []): + ids = ids + summary.get("external-ids", {}).get("external-id", []) - # create source - source = {"id": f"{id_type}:{id_value}"} + # prefer doi id type, or fallback to first id + _id = next( + (id for id in ids if id.get("external-id-type", "") == "doi"), + ids[0] if len(ids) > 0 else {}, + ) - # copy fields from entry to source - source.update(entry) + # get id and id-type from response + id_type = _id.get("external-id-type", "") + id_value = _id.get("external-id-value", "") - # add source to list - sources.append(source) + # create source + source = {"id": f"{id_type}:{id_value}"} + + # if not a doi, Manubot likely can't cite, so keep citation details + if id_type != "doi": + # get summaries + summaries = work.get("work-summary", []) + + # sort summary entries by most recent + summaries = sorted( + summaries, + key=lambda summary: ( + summary.get("last-modified-date", {}).get("value", 0) + ) + or summary.get("created-date", {}).get("value", 0) + or 0, + reverse=True, + ) + + # get first summary with defined sub-value + def first(get_func): + return next(value for value in map(get_func, summaries) if value) + + # get title + title = first( + lambda s: s.get("title", {}).get("title", {}).get("value", "") + ) + + # get publisher + publisher = first(lambda s: s.get("journal-title", {}).get("value", "")) + + # get date + date = ( + work.get("last-modified-date", {}).get("value", 0) + or first(lambda s: s.get("last-modified-date", {}).get("value", 0)) + or work.get("created-date", {}).get("value", 0) + or first(lambda s: s.get("created-date", {}).get("value", 0)) + or 0 + ) + + # get link + link = first(lambda s: s.get("url", {}).get("value", "")) + + # keep available details + if title: + source["title"] = title + if publisher: + source["publisher"] = publisher + if date: + source["date"] = format_date(date) + if link: + source["link"] = link + + # copy fields from entry to source + source.update(entry) + + # add source to list + sources.append(source) return sources diff --git a/_cite/plugins/pubmed.py b/_cite/plugins/pubmed.py index ac9fac7c66..63eefb7b84 100644 --- a/_cite/plugins/pubmed.py +++ b/_cite/plugins/pubmed.py @@ -14,28 +14,28 @@ def main(entry): endpoint = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=$TERM&retmode=json&retmax=1000&usehistory=y" # get id from entry - id = entry.get("term") - if not id: + _id = entry.get("term", "") + if not _id: raise Exception('No "term" key') # query api @log_cache @cache.memoize(name=__file__, expire=1 * (60 * 60 * 24)) - def query(): - url = endpoint.replace("$TERM", quote(id)) + def query(_id): + url = endpoint.replace("$TERM", quote(_id)) request = Request(url=url) response = json.loads(urlopen(request).read()) - return response.get("esearchresult", {}).get("idlist") + return response.get("esearchresult", {}).get("idlist", []) - response = query() + response = query(_id) # list of sources to return sources = [] # go through response and format sources - for id in response: + for _id in response: # create source - source = {"id": f"pubmed:{id}"} + source = {"id": f"pubmed:{_id}"} # copy fields from entry to source source.update(entry) diff --git a/_cite/util.py b/_cite/util.py index 87efe940a4..74638a6c57 100644 --- a/_cite/util.py +++ b/_cite/util.py @@ -49,7 +49,7 @@ def log(message="\n--------------------\n", indent=0, level="", newline=True): "SUCCESS": "[black on #10B981]", "INFO": "[grey70]", } - color = palette.get(level) or palette.get(indent) or "[white]" + color = palette.get(level, "") or palette.get(indent, "") or "[white]" if newline: print() print(indent * " " + color + str(message) + "[/]", end="", flush=True) @@ -76,6 +76,8 @@ def format_date(date): format date as YYYY-MM-DD, or no date if malformed """ + if isinstance(date, int): + return datetime.fromtimestamp(date // 1000.0).strftime("%Y-%m-%d") try: return datetime.strptime(date, "%Y-%m-%d").strftime("%Y-%m-%d") except Exception: @@ -178,7 +180,7 @@ def cite_with_manubot(_id): # authors citation["authors"] = [] - for author in manubot.get("author", []): + for author in manubot.get("author", {}): given = author.get("given", "").strip() family = author.get("family", "").strip() if given or family: @@ -193,8 +195,8 @@ def cite_with_manubot(_id): # extract date part def date_part(citation, index): try: - return citation.get("issued").get("date-parts")[0][index] - except Exception: + return citation["issued"]["date-parts"][0][index] + except (KeyError, IndexError, TypeError): return "" # date diff --git a/_layouts/member.html b/_layouts/member.html index 23b665646e..034b5d080d 100644 --- a/_layouts/member.html +++ b/_layouts/member.html @@ -32,16 +32,20 @@ research/?search={% for alias in aliases %}"{{ alias }}" {% endfor %} {%- endcapture %} - - Search for {{ page.name | default: page.title }}'s papers on the Research page - +

+ + Search for {{ page.name | default: page.title }}'s papers on the Research page + +

{% capture search -%} blog/?search={{ page.name }} {%- endcapture %} - +