From ee014004b5c348884fa6a20dc8e730cf99cfe115 Mon Sep 17 00:00:00 2001 From: Nathan Lisgo Date: Thu, 27 Jul 2023 20:34:07 +0100 Subject: [PATCH 01/12] Add publicationYear, volume and eLocationId --- examples/generated/04.reviewed_preprintv1.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/generated/04.reviewed_preprintv1.json b/examples/generated/04.reviewed_preprintv1.json index 29bb7a6..420345d 100644 --- a/examples/generated/04.reviewed_preprintv1.json +++ b/examples/generated/04.reviewed_preprintv1.json @@ -297,7 +297,15 @@ "item": { "type": "preprint", "doi": "10.7554/eLife.80494.1", - "versionIdentifier": "1" + "versionIdentifier": "1", + "publicationYear": 2022, + "embodimentOf": { + "type": "manuscript", + "doi": "10.7554/eLife.80494", + "identifier": "80494", + "volumeIdentifier": "11", + "electronicArticleIdentifier": "RP80494" + } }, "status": "manuscript-published", "happened": "2022-10-20T00:00:00.000Z" @@ -329,4 +337,4 @@ "previous-step": "_:b2" } } -} \ No newline at end of file +} From 73c18a211fcac9ac1686e7445b2bf5493fd39a85 Mon Sep 17 00:00:00 2001 From: Will Byrne Date: Mon, 31 Jul 2023 10:49:00 +0100 Subject: [PATCH 02/12] add types for embodiementOf --- src/docmap.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/docmap.ts b/src/docmap.ts index 4745625..c0bf5f7 100644 --- a/src/docmap.ts +++ b/src/docmap.ts @@ -38,6 +38,7 @@ export type Expression = { doi?: DOI, content?: Manifestation[], license?: string, + embodimentOf?: Work, }; export type Manifestation = { @@ -115,6 +116,14 @@ export type Assertion = { happened?: Date, }; +export type Work = { + type: 'manuscript', + doi: string, + identifier: string, + volumeIdentifier: string, + electronicArticleIdentifier: string, +}; + export type Step = { assertions: Assertion[], inputs: Input[], From 055a58c9bf81ab9bcc522165017fd556cfa1f1bb Mon Sep 17 00:00:00 2001 From: Scott Aubrey Date: Mon, 31 Jul 2023 11:03:04 +0100 Subject: [PATCH 03/12] add Work to generator and create a generated fixture/example --- src/docmap-generator.ts | 12 +++++++++++- src/docmap.ts | 2 +- src/test-fixtures/docmapGenerators.ts | 8 ++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/docmap-generator.ts b/src/docmap-generator.ts index bf31287..7e9cc9a 100644 --- a/src/docmap-generator.ts +++ b/src/docmap-generator.ts @@ -25,6 +25,7 @@ import { Url, VersionOfRecord, WebPage, + Work, } from './docmap'; type Steps = { @@ -32,7 +33,7 @@ type Steps = { steps: Map }; -export const generatePreprint = (doi: DOI, published?: Date, url?: Url, version?: string, content?: Manifestation[], license?: string): Preprint => ({ +export const generatePreprint = (doi: DOI, published?: Date, url?: Url, version?: string, content?: Manifestation[], license?: string, work?: Work): Preprint => ({ type: ExpressionType.Preprint, doi, url, @@ -40,6 +41,7 @@ export const generatePreprint = (doi: DOI, published?: Date, url?: Url, version? versionIdentifier: version, content, license, + embodimentOf: work, }); export const generateRevisedPreprint = (doi: DOI, published?: Date, url?: Url, version?: string, content?: Manifestation[]): RevisedPreprint => ({ @@ -112,6 +114,14 @@ export const generateWebContent = (url: Url): WebPage => ({ url, }); +export const generateWork = (doi: DOI, identifier: string, volumeIdentifier: string, electronicArticleIdentifier: string): Work => ({ + type: 'manuscript', + doi, + identifier, + volumeIdentifier, + electronicArticleIdentifier, +}); + export const generatePersonParticipant = (name: string, role: string): Participant => ({ actor: { name, diff --git a/src/docmap.ts b/src/docmap.ts index c0bf5f7..421433e 100644 --- a/src/docmap.ts +++ b/src/docmap.ts @@ -118,7 +118,7 @@ export type Assertion = { export type Work = { type: 'manuscript', - doi: string, + doi: DOI, identifier: string, volumeIdentifier: string, electronicArticleIdentifier: string, diff --git a/src/test-fixtures/docmapGenerators.ts b/src/test-fixtures/docmapGenerators.ts index 0744cf9..39f3770 100644 --- a/src/test-fixtures/docmapGenerators.ts +++ b/src/test-fixtures/docmapGenerators.ts @@ -15,6 +15,7 @@ import { generateStep, generateUnderReviewAssertion, generateWebContent, + generateWork, } from '../docmap-generator'; const publisher = { @@ -46,6 +47,13 @@ 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); + const firstStep = generateStep([], [generateAction([], [preprint])], []); + 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])], []); From d64ed9dcf3af4c0367e8b32b578ebaf06049f69e Mon Sep 17 00:00:00 2001 From: Nathan Lisgo Date: Mon, 31 Jul 2023 11:13:53 +0100 Subject: [PATCH 04/12] Add test to verify extraction of embodimentOf, if present --- src/docmap-parser.test.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/docmap-parser.test.ts b/src/docmap-parser.test.ts index fa4e836..8ea8877 100644 --- a/src/docmap-parser.test.ts +++ b/src/docmap-parser.test.ts @@ -385,4 +385,15 @@ describe('docmap-parser', () => { expect(parsedData.versions[0].preprint.license).toStrictEqual('http://creativecommons.org/licenses/by/4.0/'); expect(parsedData.versions[0].license).toStrictEqual('http://creativecommons.org/licenses/by/4.0/'); }); + + it('extracts embodimentOf, if present', () => { + const parsedData = parseDocMap(fixtures.preprintWithWorkAsOutput()); + + expect(parsedData.embodimentOf).toStrictEqual({ + doi: '10.1101/123456', + identifier: '123456', + volumeIdentifier: '1', + electronicArticleIdentifier: 'RP123456', + }); + }); }); From 827c27b6bd4765baf9d0b0ccb410f0f3007b4f49 Mon Sep 17 00:00:00 2001 From: viktoria-mahmud <111341278+viktoria-mahmud@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:37:09 +0000 Subject: [PATCH 05/12] Add embodiment --- src/docmap-parser.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/docmap-parser.ts b/src/docmap-parser.ts index 3dfd827..6e14c5c 100644 --- a/src/docmap-parser.ts +++ b/src/docmap-parser.ts @@ -82,6 +82,11 @@ export type VersionedReviewedPreprint = ReviewedPreprint & { export type ManuscriptData = { id: string, + embodimentOf?: { + doi?: string, + volume?: string, + eLocationId?: string, + } versions: VersionedReviewedPreprint[], }; From a158418967ae6cb9e57691fb4ba1868f2ee5f6b7 Mon Sep 17 00:00:00 2001 From: Saeed Moghadamzadeh Date: Mon, 31 Jul 2023 12:43:49 +0200 Subject: [PATCH 06/12] change the test --- src/docmap-parser.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/docmap-parser.test.ts b/src/docmap-parser.test.ts index 8ea8877..1c6325e 100644 --- a/src/docmap-parser.test.ts +++ b/src/docmap-parser.test.ts @@ -391,9 +391,8 @@ describe('docmap-parser', () => { expect(parsedData.embodimentOf).toStrictEqual({ doi: '10.1101/123456', - identifier: '123456', - volumeIdentifier: '1', - electronicArticleIdentifier: 'RP123456', + volume: '1', + elocationId: 'RP123456', }); }); }); From b1da0b4092e8a56a987fe08bdb0e5832b14c171f Mon Sep 17 00:00:00 2001 From: Saeed Moghadamzadeh Date: Mon, 31 Jul 2023 12:58:02 +0200 Subject: [PATCH 07/12] add getManuscriptFromExpression --- src/docmap-parser.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/docmap-parser.ts b/src/docmap-parser.ts index 6e14c5c..acb5d6a 100644 --- a/src/docmap-parser.ts +++ b/src/docmap-parser.ts @@ -80,16 +80,31 @@ export type VersionedReviewedPreprint = ReviewedPreprint & { versionIdentifier: string, }; -export type ManuscriptData = { - id: string, - embodimentOf?: { +export type Manuscript = { doi?: string, volume?: string, eLocationId?: string, - } + +}; + +export type ManuscriptData = { + id: string, + manuscript: Manuscript, versions: VersionedReviewedPreprint[], }; +const getManuscriptFromExpression = (expression: Expression): Manuscript | false => { + if (!expression.embodimentOf) { + return false; + } + + return { + doi: expression.embodimentOf.doi, + volume: expression.embodimentOf.volumeIdentifier, + eLocationId: expression.embodimentOf.electronicArticleIdentifier, + }; +}; + const getPreprintFromExpression = (expression: Expression): Preprint => { if (!expression.doi) { throw Error('Cannot identify Expression by DOI'); From ae43312f9e7d9170574c417645b08ef49d0ae2a1 Mon Sep 17 00:00:00 2001 From: Dave Price Date: Mon, 31 Jul 2023 12:06:28 +0100 Subject: [PATCH 08/12] Make manuscript optional and linting corrections --- src/docmap-parser.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/docmap-parser.ts b/src/docmap-parser.ts index acb5d6a..879a136 100644 --- a/src/docmap-parser.ts +++ b/src/docmap-parser.ts @@ -81,15 +81,14 @@ export type VersionedReviewedPreprint = ReviewedPreprint & { }; export type Manuscript = { - doi?: string, - volume?: string, - eLocationId?: string, - + doi?: string, + volume?: string, + eLocationId?: string, }; export type ManuscriptData = { id: string, - manuscript: Manuscript, + manuscript?: Manuscript, versions: VersionedReviewedPreprint[], }; From c436c1a2be650f8cd3947d09c644f9f77a281220 Mon Sep 17 00:00:00 2001 From: Dave Price Date: Mon, 31 Jul 2023 12:26:49 +0100 Subject: [PATCH 09/12] Finding and updating manuscript data from manuscript expressions --- src/docmap-parser.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/docmap-parser.ts b/src/docmap-parser.ts index 879a136..c8d2f9b 100644 --- a/src/docmap-parser.ts +++ b/src/docmap-parser.ts @@ -190,13 +190,19 @@ const addPreprintDescribedBy = (expression: Expression, preprintCollection: Arra return newPreprint; }; -const findAndUpdateOrAddPreprintDescribedBy = (expression: Expression, preprintCollection: Array): ReviewedPreprint => { +const findAndUpdateOrAddPreprintDescribedBy = (expression: Expression, preprintCollection: Array, manuscript: Manuscript): ReviewedPreprint => { const foundPreprint = findPreprintDescribedBy(expression, preprintCollection); if (!foundPreprint) { return addPreprintDescribedBy(expression, preprintCollection); } // Update fields, default to any data already there. updateReviewedPreprintFrom(foundPreprint, expression); + const foundManuscriptData = getManuscriptFromExpression(expression); + if (foundManuscriptData) { + manuscript.doi = foundManuscriptData.doi; + manuscript.eLocationId = foundManuscriptData.eLocationId; + manuscript.volume = foundManuscriptData.volume; + } return foundPreprint; }; From 81ade1741489c75c7946d61b164226af6fdd31da Mon Sep 17 00:00:00 2001 From: Will Byrne Date: Mon, 31 Jul 2023 14:22:05 +0100 Subject: [PATCH 10/12] wired up parsing and fixed lint issues --- src/docmap-parser.test.ts | 4 ++-- src/docmap-parser.ts | 34 +++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/docmap-parser.test.ts b/src/docmap-parser.test.ts index 1c6325e..911cd06 100644 --- a/src/docmap-parser.test.ts +++ b/src/docmap-parser.test.ts @@ -389,10 +389,10 @@ describe('docmap-parser', () => { it('extracts embodimentOf, if present', () => { const parsedData = parseDocMap(fixtures.preprintWithWorkAsOutput()); - expect(parsedData.embodimentOf).toStrictEqual({ + expect(parsedData.manuscript).toStrictEqual({ doi: '10.1101/123456', volume: '1', - elocationId: 'RP123456', + eLocationId: 'RP123456', }); }); }); diff --git a/src/docmap-parser.ts b/src/docmap-parser.ts index c8d2f9b..55fa12f 100644 --- a/src/docmap-parser.ts +++ b/src/docmap-parser.ts @@ -191,18 +191,20 @@ const addPreprintDescribedBy = (expression: Expression, preprintCollection: Arra }; const findAndUpdateOrAddPreprintDescribedBy = (expression: Expression, preprintCollection: Array, manuscript: Manuscript): ReviewedPreprint => { + const foundManuscriptData = getManuscriptFromExpression(expression); + const existingManuscript = manuscript; + if (foundManuscriptData) { + existingManuscript.doi = foundManuscriptData.doi; + existingManuscript.eLocationId = foundManuscriptData.eLocationId; + existingManuscript.volume = foundManuscriptData.volume; + } const foundPreprint = findPreprintDescribedBy(expression, preprintCollection); if (!foundPreprint) { return addPreprintDescribedBy(expression, preprintCollection); } // Update fields, default to any data already there. updateReviewedPreprintFrom(foundPreprint, expression); - const foundManuscriptData = getManuscriptFromExpression(expression); - if (foundManuscriptData) { - manuscript.doi = foundManuscriptData.doi; - manuscript.eLocationId = foundManuscriptData.eLocationId; - manuscript.volume = foundManuscriptData.volume; - } + return foundPreprint; }; @@ -339,36 +341,36 @@ const getAuthorResponse = (step: Step): { preprint: Item, authorResponse: Item } return (authorResponseOutputs.length === 1 && items.preprintInputs.length === 1) ? { preprint: items.preprintInputs[0], authorResponse: authorResponseOutputs[0] } : false; }; -const parseStep = (step: Step, preprints: Array): Array => { +const parseStep = (step: Step, preprints: Array, manuscript: Manuscript): Array => { const preprintPublishedAssertion = step.assertions.find((assertion) => assertion.status === AssertionStatus.Published); if (preprintPublishedAssertion) { // Update type and sent for review date - const preprint = findAndUpdateOrAddPreprintDescribedBy(preprintPublishedAssertion.item, preprints); + const preprint = findAndUpdateOrAddPreprintDescribedBy(preprintPublishedAssertion.item, preprints, manuscript); preprint.publishedDate = preprintPublishedAssertion.happened ?? preprint.publishedDate; } const inferredPublished = getPublishedPreprint(step); if (inferredPublished) { - findAndUpdateOrAddPreprintDescribedBy(inferredPublished, preprints); + findAndUpdateOrAddPreprintDescribedBy(inferredPublished, preprints, manuscript); } const preprintUnderReviewAssertion = step.assertions.find((assertion) => assertion.status === AssertionStatus.UnderReview); if (preprintUnderReviewAssertion) { // Update type and sent for review date - const preprint = findAndUpdateOrAddPreprintDescribedBy(preprintUnderReviewAssertion.item, preprints); + const preprint = findAndUpdateOrAddPreprintDescribedBy(preprintUnderReviewAssertion.item, preprints, manuscript); preprint.sentForReviewDate = preprintUnderReviewAssertion.happened; } const inferredRepublished = getRepublishedPreprint(step); if (inferredRepublished) { // preprint input, preprint output, but no evaluations = superceed input preprint with output Reviewed Preprint - const preprint = findAndUpdateOrAddPreprintDescribedBy(inferredRepublished.originalExpression, preprints); + const preprint = findAndUpdateOrAddPreprintDescribedBy(inferredRepublished.originalExpression, preprints, manuscript); republishPreprintAs(inferredRepublished.republishedExpression, preprint); } const inferredPeerReviewed = getPeerReviewedPreprint(step); if (inferredPeerReviewed) { - const preprint = findAndUpdateOrAddPreprintDescribedBy(inferredPeerReviewed.peerReviewedPreprint, preprints); + const preprint = findAndUpdateOrAddPreprintDescribedBy(inferredPeerReviewed.peerReviewedPreprint, preprints, manuscript); setPeerReviewFrom(step.actions, preprint); preprint.reviewedDate = preprint.peerReview?.evaluationSummary?.date; @@ -380,13 +382,13 @@ const parseStep = (step: Step, preprints: Array): Array const stepsIterator = getSteps(docMapStruct); let currentStep = stepsIterator.next().value; let preprints: Array = []; + const manuscript: Manuscript = {}; while (currentStep) { - preprints = parseStep(currentStep, preprints); + preprints = parseStep(currentStep, preprints, manuscript); currentStep = stepsIterator.next().value; } @@ -467,6 +470,7 @@ export const parsePreprintDocMap = (docMap: DocMap | string): ManuscriptData => const { id, versions } = finaliseVersions(preprints); return { id, + manuscript, versions, }; }; From 0e6001923616eeea3bff7c1e18edf40f8384c7f5 Mon Sep 17 00:00:00 2001 From: Saeed Moghadamzadeh Date: Mon, 31 Jul 2023 15:34:10 +0200 Subject: [PATCH 11/12] Add a test for partial embodirment --- src/docmap-generator.ts | 2 +- src/docmap-parser.test.ts | 10 ++++++++++ src/docmap-parser.ts | 12 +++++++++--- src/docmap.ts | 8 ++++---- src/test-fixtures/docmapGenerators.ts | 7 +++++++ 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/docmap-generator.ts b/src/docmap-generator.ts index 7e9cc9a..61beeec 100644 --- a/src/docmap-generator.ts +++ b/src/docmap-generator.ts @@ -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 generateWork = (doi?: DOI, identifier?: string, volumeIdentifier?: string, electronicArticleIdentifier?: string): Work => ({ type: 'manuscript', doi, identifier, diff --git a/src/docmap-parser.test.ts b/src/docmap-parser.test.ts index 911cd06..55bd395 100644 --- a/src/docmap-parser.test.ts +++ b/src/docmap-parser.test.ts @@ -395,4 +395,14 @@ describe('docmap-parser', () => { eLocationId: 'RP123456', }); }); + + it('extracts partial embodimentOf, if present', () => { + const parsedData = parseDocMap(fixtures.preprintWithPartialWorkAsOutput()); + + expect(parsedData.manuscript).toStrictEqual({ + doi: '10.1101/123456', + eLocationId: 'RP123456', + }); + }); + }); diff --git a/src/docmap-parser.ts b/src/docmap-parser.ts index 55fa12f..c2a0a11 100644 --- a/src/docmap-parser.ts +++ b/src/docmap-parser.ts @@ -194,9 +194,15 @@ const findAndUpdateOrAddPreprintDescribedBy = (expression: Expression, preprintC const foundManuscriptData = getManuscriptFromExpression(expression); const existingManuscript = manuscript; if (foundManuscriptData) { - existingManuscript.doi = foundManuscriptData.doi; - existingManuscript.eLocationId = foundManuscriptData.eLocationId; - existingManuscript.volume = foundManuscriptData.volume; + if (foundManuscriptData.doi) { + existingManuscript.doi = foundManuscriptData.doi; + } + if (foundManuscriptData.eLocationId) { + existingManuscript.eLocationId = foundManuscriptData.eLocationId; + } + if (foundManuscriptData.volume) { + existingManuscript.volume = foundManuscriptData.volume; + } } const foundPreprint = findPreprintDescribedBy(expression, preprintCollection); if (!foundPreprint) { diff --git a/src/docmap.ts b/src/docmap.ts index 421433e..449a713 100644 --- a/src/docmap.ts +++ b/src/docmap.ts @@ -118,10 +118,10 @@ export type Assertion = { export type Work = { type: 'manuscript', - doi: DOI, - identifier: string, - volumeIdentifier: string, - electronicArticleIdentifier: string, + doi?: DOI, + identifier?: string, + volumeIdentifier?: string, + electronicArticleIdentifier?: string, }; export type Step = { diff --git a/src/test-fixtures/docmapGenerators.ts b/src/test-fixtures/docmapGenerators.ts index 39f3770..64919b3 100644 --- a/src/test-fixtures/docmapGenerators.ts +++ b/src/test-fixtures/docmapGenerators.ts @@ -54,6 +54,13 @@ export const fixtures = { 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); + const firstStep = generateStep([], [generateAction([], [preprint])], []); + 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])], []); From 9a0e6404d677e0ac3c9c8450729e40c9f4fa25ad Mon Sep 17 00:00:00 2001 From: Will Byrne Date: Mon, 31 Jul 2023 14:36:46 +0100 Subject: [PATCH 12/12] lint fix --- src/docmap-parser.test.ts | 1 - src/test-fixtures/docmapGenerators.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/docmap-parser.test.ts b/src/docmap-parser.test.ts index 55bd395..25694fc 100644 --- a/src/docmap-parser.test.ts +++ b/src/docmap-parser.test.ts @@ -404,5 +404,4 @@ describe('docmap-parser', () => { eLocationId: 'RP123456', }); }); - }); diff --git a/src/test-fixtures/docmapGenerators.ts b/src/test-fixtures/docmapGenerators.ts index 64919b3..eb51d22 100644 --- a/src/test-fixtures/docmapGenerators.ts +++ b/src/test-fixtures/docmapGenerators.ts @@ -60,7 +60,7 @@ export const fixtures = { const firstStep = generateStep([], [generateAction([], [preprint])], []); 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])], []);