Source code for pybliometrics.scival.publication_lookup

from typing import NamedTuple

from pybliometrics.superclasses import Retrieval
from pybliometrics.utils import make_int_if_possible, chained_get


class Author(NamedTuple):
    """Named tuple representing an author."""
    id: int | None
    name: str | None
    uri: str | None


class Institution(NamedTuple):
    """Named tuple representing an institution."""
    id: int | None
    name: str | None
    country: str | None
    country_code: str | None


[docs] class PublicationLookup(Retrieval): @property def authors(self) -> list[Author] | None: """A list of namedtuples representing listed authors in the form `(id, name, uri)`. """ out = [] for item in chained_get(self._json, ['publication', 'authors'], []): new = Author(id=make_int_if_possible(item['id']), name=item.get('name'), uri=item.get('uri')) out.append(new) return out or None @property def citation_count(self) -> int | None: """Count of citations.""" return make_int_if_possible(chained_get(self._json, ['publication', 'citationCount'])) @property def doi(self) -> str | None: """Digital Object Identifier (DOI).""" return chained_get(self._json, ['publication', 'doi']) @property def id(self) -> int | None: """ID of the document (same as EID without "2-s2.0-").""" return make_int_if_possible(chained_get(self._json, ['publication', 'id'])) @property def institutions(self) -> list[Institution] | None: """A list of namedtuples representing listed institutions in the form `(id, name, country, country_code)`. """ out = [] for item in chained_get(self._json, ['publication', 'institutions'], []): new = Institution(id=make_int_if_possible(item['id']), name=item.get('name'), country=item.get('country'), country_code=item.get('countryCode')) out.append(new) return out or None @property def link(self) -> str | None: """URL link.""" return chained_get(self._json, ['link', '@href']) @property def publication_year(self) -> int | None: """Year of publication.""" return make_int_if_possible(chained_get(self._json, ['publication', 'publicationYear'])) @property def sdgs(self) -> list[str] | None: """Sustainable Development Goals.""" return chained_get(self._json, ['publication', 'sdg']) @property def source_title(self) -> str | None: """Title of source.""" return chained_get(self._json, ['publication', 'sourceTitle']) @property def title(self) -> str | None: """Publication title.""" return chained_get(self._json, ['publication', 'title']) @property def topic_cluster_id(self) -> int | None: """Topic cluster id.""" return make_int_if_possible(chained_get(self._json, ['publication', 'topicClusterId'])) @property def topic_id(self) -> int | None: """Topic id.""" return make_int_if_possible(chained_get(self._json, ['publication', 'topicId'])) @property def type(self) -> str | None: """Type of publication.""" return chained_get(self._json, ['publication', 'type']) def __str__(self): """Return pretty text version of the document.""" if len(self.authors) >= 1: author_count = len(self.authors) authors = f"{author_count} author(s) found" else: authors = "(No author found)" if len(self.institutions) >= 1: institution_count = len(self.institutions) institutions = f"{institution_count} institution(s) found" else: institutions = "(No institution found)" return ( f"Document with Scopus Id {self.id or 'N/A'} received:\n" f"- Title: {self.title}\n" f"- DOI: {self.doi}\n" f"- Type: {self.type}\n" f"- Publication Year: {self.publication_year}\n" f"- {authors}\n" f"- {institutions}\n" ) def __init__(self, identifier: int | str | None = None, refresh: bool | int = False, **kwds: str ) -> None: """Interaction with the Publication Lookup API. :param identifier: The Scopus ID of the publication. :param refresh: Whether to refresh the cached file if it exists or not. If int is passed, cached file will be refreshed if the number of days since last modification exceeds that value. :param kwds: Keywords passed on as query parameters. Must contain fields and values mentioned in the API specification at https://dev.elsevier.com/documentation/SciValPublicationAPI.wadl. """ self._view = '' self._refresh = refresh Retrieval.__init__(self, identifier=str(identifier), **kwds)