diff --git a/src/docmap-generator.ts b/src/docmap-generator.ts index 61beeec..a5371ae 100644 --- a/src/docmap-generator.ts +++ b/src/docmap-generator.ts @@ -14,6 +14,7 @@ import { JsonLDFrameUrl, Manifestation, ManifestationType, + Manuscript, Output, Participant, PeerReview, @@ -25,7 +26,6 @@ import { Url, VersionOfRecord, WebPage, - Work, } from './docmap'; type Steps = { @@ -33,7 +33,7 @@ type Steps = { steps: Map }; -export const generatePreprint = (doi: DOI, published?: Date, url?: Url, version?: string, content?: Manifestation[], license?: string, work?: Work): Preprint => ({ +export const generatePreprint = (doi: DOI, published?: Date, url?: Url, version?: string, content?: Manifestation[], license?: string, manuscript?: Manuscript): Preprint => ({ type: ExpressionType.Preprint, doi, url, @@ -41,7 +41,7 @@ export const generatePreprint = (doi: DOI, published?: Date, url?: Url, version? versionIdentifier: version, content, license, - embodimentOf: work, + partOf: manuscript, }); export const generateRevisedPreprint = (doi: DOI, published?: Date, url?: Url, version?: string, content?: Manifestation[]): RevisedPreprint => ({ @@ -114,7 +114,7 @@ export const generateWebContent = (url: Url): WebPage => ({ url, }); -export const generateWork = (doi?: DOI, identifier?: string, volumeIdentifier?: string, electronicArticleIdentifier?: string): Work => ({ +export const generateManuscript = (doi?: DOI, identifier?: string, volumeIdentifier?: string, electronicArticleIdentifier?: string): Manuscript => ({ type: 'manuscript', doi, identifier, diff --git a/src/docmap-parser.test.ts b/src/docmap-parser.test.ts index 8454235..acfa9ad 100644 --- a/src/docmap-parser.test.ts +++ b/src/docmap-parser.test.ts @@ -386,8 +386,8 @@ describe('docmap-parser', () => { expect(parsedData.versions[0].license).toStrictEqual('http://creativecommons.org/licenses/by/4.0/'); }); - it('extracts embodimentOf, if present', () => { - const parsedData = parseDocMap(fixtures.preprintWithWorkAsOutput()); + it('extracts partOf, if present', () => { + const parsedData = parseDocMap(fixtures.preprintWithManuscriptAsOutput()); expect(parsedData.manuscript).toStrictEqual({ doi: '10.1101/123456', @@ -397,7 +397,7 @@ describe('docmap-parser', () => { }); it('extracts partial embodimentOf, if present', () => { - const parsedData = parseDocMap(fixtures.preprintWithPartialWorkAsOutput()); + const parsedData = parseDocMap(fixtures.preprintWithPartialManuscriptAsOutput()); expect(parsedData.manuscript).toStrictEqual({ doi: '10.1101/123456', @@ -420,4 +420,17 @@ describe('docmap-parser', () => { versionIdentifier: '1', }); }); + + it('parses umbrella expressions from multiple locations', () => { + const docmap = fixtures.preprintWithUmbrellaExpressionsFromMultipleLocations(); + const parsedData = parseDocMap(docmap); + + expect(parsedData.versions.length).toEqual(1); + + expect(parsedData.manuscript).toStrictEqual({ + doi: '10.1101/123456', + volume: '1', + eLocationId: 'RP123456', + }); + }); }); diff --git a/src/docmap-parser.ts b/src/docmap-parser.ts index 47772c8..9fdb812 100644 --- a/src/docmap-parser.ts +++ b/src/docmap-parser.ts @@ -93,14 +93,14 @@ export type ManuscriptData = { }; const getManuscriptFromExpression = (expression: Expression): Manuscript | false => { - if (!expression.embodimentOf) { + if (!expression.partOf) { return false; } return { - doi: expression.embodimentOf.doi, - volume: expression.embodimentOf.volumeIdentifier, - eLocationId: expression.embodimentOf.electronicArticleIdentifier, + doi: expression.partOf.doi, + volume: expression.partOf.volumeIdentifier, + eLocationId: expression.partOf.electronicArticleIdentifier, }; }; @@ -214,11 +214,23 @@ const findAndUpdateOrAddPreprintDescribedBy = (expression: Expression, preprintC return foundPreprint; }; -const republishPreprintAs = (expression: Expression, preprint: ReviewedPreprint) => { +const republishPreprintAs = (expression: Expression, preprint: ReviewedPreprint, manuscript: Manuscript) => { if (!expression.doi) { throw Error('Cannot identify Expression by DOI'); } - + const foundManuscriptData = getManuscriptFromExpression(expression); + const existingManuscript = manuscript; + if (foundManuscriptData) { + if (foundManuscriptData.doi) { + existingManuscript.doi = foundManuscriptData.doi; + } + if (foundManuscriptData.eLocationId) { + existingManuscript.eLocationId = foundManuscriptData.eLocationId; + } + if (foundManuscriptData.volume) { + existingManuscript.volume = foundManuscriptData.volume; + } + } const newPreprint = preprint; newPreprint.id = expression.identifier ?? expression.doi; @@ -371,7 +383,7 @@ const parseStep = (step: Step, preprints: Array, manuscript: M if (inferredRepublished) { // preprint input, preprint output, but no evaluations = superceed input preprint with output Reviewed Preprint const preprint = findAndUpdateOrAddPreprintDescribedBy(inferredRepublished.originalExpression, preprints, manuscript); - republishPreprintAs(inferredRepublished.republishedExpression, preprint); + republishPreprintAs(inferredRepublished.republishedExpression, preprint, manuscript); } const inferredPeerReviewed = getPeerReviewedPreprint(step); @@ -382,7 +394,7 @@ const parseStep = (step: Step, preprints: Array, manuscript: M // sometimes a new reviewed preprint is published as an output if (inferredPeerReviewed.republishedPreprint) { - republishPreprintAs(inferredPeerReviewed.republishedPreprint, preprint); + republishPreprintAs(inferredPeerReviewed.republishedPreprint, preprint, manuscript); } } diff --git a/src/docmap.ts b/src/docmap.ts index 449a713..5b53413 100644 --- a/src/docmap.ts +++ b/src/docmap.ts @@ -38,7 +38,7 @@ export type Expression = { doi?: DOI, content?: Manifestation[], license?: string, - embodimentOf?: Work, + partOf?: Manuscript, }; export type Manifestation = { @@ -116,7 +116,7 @@ export type Assertion = { happened?: Date, }; -export type Work = { +export type Manuscript = { type: 'manuscript', doi?: DOI, identifier?: string, diff --git a/src/test-fixtures/docmapGenerators.ts b/src/test-fixtures/docmapGenerators.ts index 691cf0b..c728ef2 100644 --- a/src/test-fixtures/docmapGenerators.ts +++ b/src/test-fixtures/docmapGenerators.ts @@ -16,7 +16,7 @@ import { generateStep, generateUnderReviewAssertion, generateWebContent, - generateWork, + generateManuscript, } from '../docmap-generator'; const publisher = { @@ -48,20 +48,30 @@ export const fixtures = { return generateDocMap('test', publisher, firstStep); }, - preprintWithWorkAsOutput: (): DocMap => { - const work = generateWork('10.1101/123456', '123456', '1', 'RP123456'); - const preprint = generatePreprint('preprint/article1', new Date('2022-03-01'), undefined, undefined, undefined, undefined, work); + preprintWithManuscriptAsOutput: (): DocMap => { + const manuscript = generateManuscript('10.1101/123456', '123456', '1', 'RP123456'); + const preprint = generatePreprint('preprint/article1', new Date('2022-03-01'), undefined, undefined, undefined, undefined, manuscript); const firstStep = generateStep([], [generateAction([], [preprint])], []); return generateDocMap('test', publisher, firstStep); }, - preprintWithPartialWorkAsOutput: (): DocMap => { - const work = generateWork('10.1101/123456', '123456', undefined, 'RP123456'); - const preprint = generatePreprint('preprint/article1', new Date('2022-03-01'), undefined, undefined, undefined, undefined, work); + preprintWithPartialManuscriptAsOutput: (): DocMap => { + const manuscript = generateManuscript('10.1101/123456', '123456', undefined, 'RP123456'); + const preprint = generatePreprint('preprint/article1', new Date('2022-03-01'), undefined, undefined, undefined, undefined, manuscript); const firstStep = generateStep([], [generateAction([], [preprint])], []); return generateDocMap('test', publisher, firstStep); }, + preprintWithUmbrellaExpressionsFromMultipleLocations: (): DocMap => { + const manuscript = generateManuscript('10.1101/123456', '123456', undefined, 'RP123456'); + const manuscript2 = generateManuscript('10.1101/123456', '123456', "1"); + const preprint = generatePreprint('preprint/article1', new Date('2022-03-01'), undefined, undefined, undefined, undefined, manuscript); + const preprint2 = generatePreprint('preprint/article1', new Date('2022-03-01'), undefined, undefined, undefined, undefined, manuscript2); + const assertion = generateDraftAssertion(preprint2); + const firstStep = generateStep([], [generateAction([], [preprint])], [assertion]); + return generateDocMap('test', publisher, firstStep); + }, + simplePreprintWithUrlAsOutput: (): DocMap => { const preprint = generatePreprint('preprint/article1', new Date('2022-03-01'), 'https://somewhere.org/preprint/article1'); const firstStep = generateStep([], [generateAction([], [preprint])], []);