diff --git a/doi2dataset/api/processors.py b/doi2dataset/api/processors.py index 3f8fdfc..4e8491b 100644 --- a/doi2dataset/api/processors.py +++ b/doi2dataset/api/processors.py @@ -6,12 +6,15 @@ including license processing and abstract extraction/cleaning. """ import re -from typing import Any +from typing import TYPE_CHECKING, Any from rich.console import Console from ..core.models import Abstract, License +if TYPE_CHECKING: + from .client import APIClient + class LicenseProcessor: """ @@ -68,12 +71,12 @@ class AbstractProcessor: # Icons for console output - TODO: should be moved to a constants module ICONS = {"info": "ℹ️", "warning": "⚠️", "error": "❌"} - def __init__(self, api_client, console: Console | None = None): + def __init__(self, api_client: "APIClient", console: Console | None = None): """ Initialize with an APIClient instance. Args: - api_client: The API client to use for requests. + api_client (APIClient): The API client to use for requests. console (Console | None): Rich console instance for output. """ self.api_client = api_client diff --git a/doi2dataset/processing/metadata.py b/doi2dataset/processing/metadata.py index ce122d9..b38bc21 100644 --- a/doi2dataset/processing/metadata.py +++ b/doi2dataset/processing/metadata.py @@ -21,7 +21,7 @@ from ..core.metadata_fields import ( ControlledVocabularyMetadataField, PrimitiveMetadataField, ) -from ..core.models import Person +from ..core.models import Abstract, Person from ..processing.citation import CitationBuilder from ..processing.utils import NameProcessor, PIFinder, SubjectMapper @@ -335,13 +335,13 @@ class MetadataProcessor: return return_dict - def _build_description(self, data: dict[str, Any], abstract) -> str: + def _build_description(self, data: dict[str, Any], abstract: Abstract) -> str: """ Build the description field by combining a header and the abstract. Args: data (dict[str, Any]): The metadata. - abstract: The abstract object. + abstract (Abstract): The abstract object. Returns: str: The full description. @@ -404,7 +404,7 @@ class MetadataProcessor: list[Person]: List of matching PIs for use as corresponding authors. """ involved_pis: list[Person] = [] - authors_in_publication = [] + authors_in_publication: list[Person] = [] # Build list of authors from publication for authorship in data.get("authorships", []): diff --git a/doi2dataset/processing/utils.py b/doi2dataset/processing/utils.py index 3f1dd2b..3a9e61b 100644 --- a/doi2dataset/processing/utils.py +++ b/doi2dataset/processing/utils.py @@ -223,7 +223,7 @@ class SubjectMapper: Returns: list[str]: List of mapped controlled vocabulary terms. """ - mapped = [] + mapped: list[str] = [] for subject in subjects: # Try exact match first if subject in cls.CONTROLLED_VOCAB: diff --git a/doi2dataset/utils/validation.py b/doi2dataset/utils/validation.py index ba85e7e..13b3cea 100644 --- a/doi2dataset/utils/validation.py +++ b/doi2dataset/utils/validation.py @@ -29,7 +29,7 @@ def validate_doi(doi: str) -> bool: Returns: bool: True if the DOI is valid, False otherwise. """ - return is_doi(doi) + return bool(is_doi(doi)) def normalize_doi(doi: str) -> str: