Source code for pybliometrics.sciencedirect.object_retrieval
"""Module to retrieve a specific object of a document."""
from io import BytesIO
from pybliometrics.sciencedirect import ArticleRetrieval
from pybliometrics.superclasses import Retrieval
from pybliometrics.utils import check_parameter_value, detect_id_type
[docs]
class ObjectRetrieval(Retrieval):
@property
def object(self) -> BytesIO:
"""The object retrieved."""
return BytesIO(self._object)
def __init__(self,
identifier: int | str,
filename: str,
id_type: str | None = None,
refresh: bool | int = False,
**kwds: str
):
"""Class to retrieve a specific object of a document by its filename.
:param identifier: The indentifier of the document.
:param filename: Filename of the object to be retrieved. To get a list
of all available objects of a document (and its
corresponding filename) use the class `ObjectMetadata`.
:param id_type: Document identifier. Allowed values: `doi`, `pii`,
`scopus_id`, `pubmed_id`, `eid`.
:param refresh: Whether to refresh the cached file if it exists. Default: False.
"""
identifier = str(identifier)
if id_type is None:
id_type = detect_id_type(identifier)
else:
allowed_id_types = ('doi', 'pii', 'scopus_id', 'pubmed_id', 'eid')
check_parameter_value(id_type, allowed_id_types, "id_type")
if id_type != 'eid':
identifier = self._get_eid(identifier)
file_identifier = f'{identifier}-{filename}'
self._identifier = identifier
self._filename = filename
self._view = ''
self._refresh = refresh
super().__init__(file_identifier, 'eid', **kwds)
def _get_eid(self, identifier: str) -> str:
"""Get the EID of a document."""
am = ArticleRetrieval(identifier, field='eid')
return am.eid
def __str__(self) -> str:
"""Return a string with the filename, document and object size in KB."""
size_kb = f"{len(self._object) / 1024:.1f}" if self._object else "0.0"
return (f"Object {self._filename} from document with EID {self._identifier}"
f" has size of {size_kb} KB.")