Skip to content

Commit

Permalink
Merge pull request #26 from elifesciences/investigate-suspicious-vers…
Browse files Browse the repository at this point in the history
…ion-parsing

Investigate suspicious version parsing
  • Loading branch information
will-byrne authored Aug 2, 2023
2 parents 2866c68 + 2b5ff8f commit 7391449
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 24 deletions.
8 changes: 4 additions & 4 deletions src/docmap-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
JsonLDFrameUrl,
Manifestation,
ManifestationType,
Manuscript,
Output,
Participant,
PeerReview,
Expand All @@ -25,23 +26,22 @@ import {
Url,
VersionOfRecord,
WebPage,
Work,
} from './docmap';

type Steps = {
'first-step': string,
steps: Map<string, Step>
};

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,
published,
versionIdentifier: version,
content,
license,
embodimentOf: work,
partOf: manuscript,
});

export const generateRevisedPreprint = (doi: DOI, published?: Date, url?: Url, version?: string, content?: Manifestation[]): RevisedPreprint => ({
Expand Down Expand Up @@ -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,
Expand Down
19 changes: 16 additions & 3 deletions src/docmap-parser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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',
Expand All @@ -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',
});
});
});
28 changes: 20 additions & 8 deletions src/docmap-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
};

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -371,7 +383,7 @@ const parseStep = (step: Step, preprints: Array<ReviewedPreprint>, 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);
Expand All @@ -382,7 +394,7 @@ const parseStep = (step: Step, preprints: Array<ReviewedPreprint>, manuscript: M

// sometimes a new reviewed preprint is published as an output
if (inferredPeerReviewed.republishedPreprint) {
republishPreprintAs(inferredPeerReviewed.republishedPreprint, preprint);
republishPreprintAs(inferredPeerReviewed.republishedPreprint, preprint, manuscript);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/docmap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export type Expression = {
doi?: DOI,
content?: Manifestation[],
license?: string,
embodimentOf?: Work,
partOf?: Manuscript,
};

export type Manifestation = {
Expand Down Expand Up @@ -116,7 +116,7 @@ export type Assertion = {
happened?: Date,
};

export type Work = {
export type Manuscript = {
type: 'manuscript',
doi?: DOI,
identifier?: string,
Expand Down
24 changes: 17 additions & 7 deletions src/test-fixtures/docmapGenerators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
generateStep,
generateUnderReviewAssertion,
generateWebContent,
generateWork,
generateManuscript,
} from '../docmap-generator';

const publisher = {
Expand Down Expand Up @@ -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])], []);
Expand Down

0 comments on commit 7391449

Please sign in to comment.