Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions site/cds_rdm/inspire_harvester/transform/splitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@ def _is_arxiv(source: str) -> bool:
return (source or "").lower() in _ARXIV_SOURCES


def keep_shared_doi_on_latest(latest_entry, versions):
"""Leave a DOI used by extra versions on the latest version only."""
latest_doi = (latest_entry.get("pids") or {}).get("doi", {}).get("identifier")
if not latest_doi:
return
for version in versions:
pids = version.get("pids") or {}
if pids.get("doi", {}).get("identifier") == latest_doi:
pids.pop("doi", None)


class InspireVersionSplitter:
"""Split one INSPIRE record with multiple doc types into two source-filtered sub-records.

Expand Down
6 changes: 5 additions & 1 deletion site/cds_rdm/inspire_harvester/transform/transform_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
from cds_rdm.inspire_harvester.transform.config import mapper_policy
from cds_rdm.inspire_harvester.transform.context import MetadataSerializationContext
from cds_rdm.inspire_harvester.transform.resource_types import ResourceTypeDetector
from cds_rdm.inspire_harvester.transform.splitter import InspireVersionSplitter
from cds_rdm.inspire_harvester.transform.splitter import (
InspireVersionSplitter,
keep_shared_doi_on_latest,
)
from cds_rdm.inspire_harvester.utils import assert_unique_ids, deep_merge_all


Expand Down Expand Up @@ -106,6 +109,7 @@ def build(self):
)

versions = self._versions()
keep_shared_doi_on_latest(rdm_record, versions)
return rdm_record, versions, self.cds_id, self.errors


Expand Down
24 changes: 23 additions & 1 deletion site/tests/inspire_harvester/test_transformer.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@
RelatedIdentifiersMapper,
)
from cds_rdm.inspire_harvester.transform.resource_types import ResourceType
from cds_rdm.inspire_harvester.transform.splitter import InspireVersionSplitter
from cds_rdm.inspire_harvester.transform.splitter import (
InspireVersionSplitter,
keep_shared_doi_on_latest,
)
from cds_rdm.inspire_harvester.transform.transform_entry import Inspire2RDM


Expand Down Expand Up @@ -643,6 +646,25 @@ def test_splitter_creates_one_version_for_duplicate_resource_types(mock_logger):
policy.build_for.assert_called_once_with(ResourceType.REPORT)


def test_keep_shared_doi_on_latest_drops_duplicate_from_extra_versions():
"""Latest version keeps a shared DOI; extra versions lose it."""
journal_doi = {
"identifier": "10.1016/j.nima.2022.166874",
"provider": "external",
}
latest = {"pids": {"doi": journal_doi}}
note = {"pids": {"doi": dict(journal_doi)}}
report = {
"pids": {"doi": {"identifier": "10.17181/other", "provider": "datacite"}}
}

keep_shared_doi_on_latest(latest, [note, report])

assert latest["pids"]["doi"]["identifier"] == journal_doi["identifier"]
assert "doi" not in note["pids"]
assert report["pids"]["doi"]["identifier"] == "10.17181/other"


def test_transform_document_type_unmapped(running_app):
"""Test ResourceTypeDetector with unmapped type."""
from cds_rdm.inspire_harvester.transform.resource_types import ResourceTypeDetector
Expand Down
Loading