@natlibfi/marc-record-validators-melinda 9.0.13 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-rights.spec.js +2 -2
- package/dist/access-rights.spec.js.map +1 -1
- package/dist/duplicates-ind1.js +3 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/duplicates-ind1.spec.js +45 -98
- package/dist/duplicates-ind1.spec.js.map +1 -1
- package/dist/indicator-fixes.js +266 -0
- package/dist/indicator-fixes.js.map +1 -0
- package/dist/indicator-fixes.spec.js +61 -0
- package/dist/indicator-fixes.spec.js.map +1 -0
- package/dist/mergeField500Lisapainokset.js +192 -0
- package/dist/mergeField500Lisapainokset.js.map +1 -0
- package/dist/mergeField500Lisapainokset.spec.js +61 -0
- package/dist/mergeField500Lisapainokset.spec.js.map +1 -0
- package/dist/urn.js +74 -18
- package/dist/urn.js.map +1 -1
- package/dist/urn.spec.js +91 -11
- package/dist/urn.spec.js.map +1 -1
- package/package.json +6 -6
- package/src/access-rights.spec.js +5 -2
- package/src/duplicates-ind1.js +1 -1
- package/src/duplicates-ind1.spec.js +39 -85
- package/src/indicator-fixes.js +249 -0
- package/src/indicator-fixes.spec.js +52 -0
- package/src/mergeField500Lisapainokset.js +154 -0
- package/src/mergeField500Lisapainokset.spec.js +52 -0
- package/src/urn.js +82 -16
- package/src/urn.spec.js +95 -4
- package/test-fixtures/duplicates-ind1/01/expectedResult.json +4 -0
- package/test-fixtures/duplicates-ind1/01/metadata.json +4 -0
- package/test-fixtures/duplicates-ind1/01/record.json +16 -0
- package/test-fixtures/duplicates-ind1/02/expectedResult.json +6 -0
- package/test-fixtures/duplicates-ind1/02/metadata.json +4 -0
- package/test-fixtures/duplicates-ind1/02/record.json +16 -0
- package/test-fixtures/duplicates-ind1/03/expectedResult.json +13 -0
- package/test-fixtures/duplicates-ind1/03/metadata.json +6 -0
- package/test-fixtures/duplicates-ind1/03/record.json +16 -0
- package/test-fixtures/indicator-fixes/01/expectedResult.json +9 -0
- package/test-fixtures/indicator-fixes/01/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/01/record.json +64 -0
- package/test-fixtures/indicator-fixes/02/expectedResult.json +66 -0
- package/test-fixtures/indicator-fixes/02/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/02/record.json +64 -0
- package/test-fixtures/indicator-fixes/03/expectedResult.json +55 -0
- package/test-fixtures/indicator-fixes/03/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/03/record.json +54 -0
- package/test-fixtures/indicator-fixes/04/expectedResult.json +66 -0
- package/test-fixtures/indicator-fixes/04/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/04/record.json +65 -0
- package/test-fixtures/indicator-fixes/05/expectedResult.json +66 -0
- package/test-fixtures/indicator-fixes/05/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/05/record.json +65 -0
- package/test-fixtures/indicator-fixes/06/expectedResult.json +75 -0
- package/test-fixtures/indicator-fixes/06/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/06/record.json +74 -0
- package/test-fixtures/lisapainokset/fixer/01/expectedResult.json +37 -0
- package/test-fixtures/lisapainokset/fixer/01/metadata.json +6 -0
- package/test-fixtures/lisapainokset/fixer/01/record.json +61 -0
- package/test-fixtures/lisapainokset/fixer/02/expectedResult.json +44 -0
- package/test-fixtures/lisapainokset/fixer/02/metadata.json +6 -0
- package/test-fixtures/lisapainokset/fixer/02/record.json +45 -0
- package/test-fixtures/lisapainokset/fixer/03/expectedResult.json +21 -0
- package/test-fixtures/lisapainokset/fixer/03/metadata.json +6 -0
- package/test-fixtures/lisapainokset/fixer/03/record.json +45 -0
- package/test-fixtures/lisapainokset/validator/01/expectedResult.json +7 -0
- package/test-fixtures/lisapainokset/validator/01/metadata.json +6 -0
- package/test-fixtures/lisapainokset/validator/01/record.json +45 -0
- package/test-fixtures/lisapainokset/validator/02/expectedResult.json +6 -0
- package/test-fixtures/lisapainokset/validator/02/metadata.json +6 -0
- package/test-fixtures/lisapainokset/validator/02/record.json +61 -0
- package/test-fixtures/lisapainokset/validator/03/expectedResult.json +4 -0
- package/test-fixtures/lisapainokset/validator/03/metadata.json +6 -0
- package/test-fixtures/lisapainokset/validator/03/record.json +37 -0
|
@@ -143,10 +143,10 @@ describe('access-rights', async () => {
|
|
|
143
143
|
await test.fix([f5060, ldf540], [f5060, ldf5061, ldf540]);
|
|
144
144
|
});
|
|
145
145
|
it('5061 but missing 540; Adds 540', async () => {
|
|
146
|
-
await test.fix([ldf5061, f540], [ldf5061,
|
|
146
|
+
await test.fix([ldf5061, f540], [ldf5061, ldf540, f540]);
|
|
147
147
|
});
|
|
148
148
|
it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {
|
|
149
|
-
await test.fix([f5060, f540], [f5060, ldf5061,
|
|
149
|
+
await test.fix([f5060, f540], [f5060, ldf5061, ldf540, f540]);
|
|
150
150
|
});
|
|
151
151
|
});
|
|
152
152
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-rights.spec.js","names":["describe","f337","tag","ind1","ind2","subfields","code","value","ldf5061","ldf540","f5060","f540","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record"],"sources":["../src/access-rights.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/access-rights';\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061 = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, ldf5061, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061, ldf540], [ldf5061, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061, f540], [ldf5061,
|
|
1
|
+
{"version":3,"file":"access-rights.spec.js","names":["describe","f337","tag","ind1","ind2","subfields","code","value","ldf5061","ldf540","f5060","f540","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record"],"sources":["../src/access-rights.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/access-rights';\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061 = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, ldf5061, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061, ldf540], [ldf5061, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061, f540], [ldf5061, ldf540, f540]);\n });\n\n it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {\n await test.fix([f5060, f540], [f5060, ldf5061, ldf540, f540]);\n });\n });\n});\n"],"mappings":"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"}
|
package/dist/duplicates-ind1.js
CHANGED
|
@@ -32,7 +32,9 @@ function _default(tagPattern) {
|
|
|
32
32
|
validation,
|
|
33
33
|
...item
|
|
34
34
|
}) => item) // eslint-disable-line no-unused-vars
|
|
35
|
-
.forEach(
|
|
35
|
+
.forEach(({
|
|
36
|
+
obj
|
|
37
|
+
}) => record.removeField(obj));
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
function iterateFields(record) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicates-ind1.js","names":["tagPattern","RegExp","description","validate","fix","Error","record","invalid","iterateFields","find","obj","validation","valid","messages","tag","filter","item","map","forEach","
|
|
1
|
+
{"version":3,"file":"duplicates-ind1.js","names":["tagPattern","RegExp","description","validate","fix","Error","record","invalid","iterateFields","find","obj","validation","valid","messages","tag","filter","item","map","forEach","removeField","fields","matches","field","test","ind1","hasDuplicate","fieldA","some","fieldB","subfields","length","every","aSf","bSf","code","value"],"sources":["../src/duplicates-ind1.js"],"sourcesContent":["export default function (tagPattern) {\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles data fields that only differ in the first indicator',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n function validate(record) {\n const invalid = iterateFields(record)\n .find(obj => obj.validation === true);\n return invalid ? {valid: false, messages: [`Multiple ${invalid.obj.tag} fields which only differ in the first indicator`]} : {valid: true, messages: []};\n }\n\n function fix(record) {\n iterateFields(record)\n .filter(item => item.validation === false)\n .map(({validation, ...item}) => item) // eslint-disable-line no-unused-vars\n .forEach(({obj}) => record.removeField(obj));\n }\n\n function iterateFields(record) {\n return record.fields.map(obj => ({validation: matches(obj, record.fields), obj}));\n }\n\n function matches(field, fields) {\n return tagPattern.test(field.tag) && field.ind1 === ' ' && hasDuplicate(field, fields);\n }\n\n function hasDuplicate(fieldA, fields) {\n return fields.some(fieldB => fieldA !== fieldB &&\n fieldA.tag === fieldB.tag &&\n fieldA.ind1 !== fieldB.ind1 &&\n fieldA.subfields.length === fieldB.subfields.length &&\n fieldA.subfields.every(aSf => fieldB.subfields.some(bSf => aSf.code === bSf.code && aSf.value === bSf.value)));\n }\n}\n"],"mappings":";;;;;;;AAAe,kBAAUA,UAAV,EAAsB;EACnC,IAAIA,UAAU,YAAYC,MAA1B,EAAkC;IAChC,OAAO;MACLC,WAAW,EACT,6DAFG;MAGLC,QAHK;MAILC;IAJK,CAAP;EAMD;;EAED,MAAM,IAAIC,KAAJ,CAAU,wBAAV,CAAN;;EAEA,SAASF,QAAT,CAAkBG,MAAlB,EAA0B;IACxB,MAAMC,OAAO,GAAGC,aAAa,CAACF,MAAD,CAAb,CACbG,IADa,CACRC,GAAG,IAAIA,GAAG,CAACC,UAAJ,KAAmB,IADlB,CAAhB;IAEA,OAAOJ,OAAO,GAAG;MAACK,KAAK,EAAE,KAAR;MAAeC,QAAQ,EAAE,CAAE,YAAWN,OAAO,CAACG,GAAR,CAAYI,GAAI,kDAA7B;IAAzB,CAAH,GAA+G;MAACF,KAAK,EAAE,IAAR;MAAcC,QAAQ,EAAE;IAAxB,CAA7H;EACD;;EAED,SAAST,GAAT,CAAaE,MAAb,EAAqB;IACnBE,aAAa,CAACF,MAAD,CAAb,CACGS,MADH,CACUC,IAAI,IAAIA,IAAI,CAACL,UAAL,KAAoB,KADtC,EAEGM,GAFH,CAEO,CAAC;MAACN,UAAD;MAAa,GAAGK;IAAhB,CAAD,KAA2BA,IAFlC,EAEwC;IAFxC,CAGGE,OAHH,CAGW,CAAC;MAACR;IAAD,CAAD,KAAWJ,MAAM,CAACa,WAAP,CAAmBT,GAAnB,CAHtB;EAID;;EAED,SAASF,aAAT,CAAuBF,MAAvB,EAA+B;IAC7B,OAAOA,MAAM,CAACc,MAAP,CAAcH,GAAd,CAAkBP,GAAG,KAAK;MAACC,UAAU,EAAEU,OAAO,CAACX,GAAD,EAAMJ,MAAM,CAACc,MAAb,CAApB;MAA0CV;IAA1C,CAAL,CAArB,CAAP;EACD;;EAED,SAASW,OAAT,CAAiBC,KAAjB,EAAwBF,MAAxB,EAAgC;IAC9B,OAAOpB,UAAU,CAACuB,IAAX,CAAgBD,KAAK,CAACR,GAAtB,KAA8BQ,KAAK,CAACE,IAAN,KAAe,GAA7C,IAAoDC,YAAY,CAACH,KAAD,EAAQF,MAAR,CAAvE;EACD;;EAED,SAASK,YAAT,CAAsBC,MAAtB,EAA8BN,MAA9B,EAAsC;IACpC,OAAOA,MAAM,CAACO,IAAP,CAAYC,MAAM,IAAIF,MAAM,KAAKE,MAAX,IAC3BF,MAAM,CAACZ,GAAP,KAAec,MAAM,CAACd,GADK,IAE3BY,MAAM,CAACF,IAAP,KAAgBI,MAAM,CAACJ,IAFI,IAG3BE,MAAM,CAACG,SAAP,CAAiBC,MAAjB,KAA4BF,MAAM,CAACC,SAAP,CAAiBC,MAHlB,IAI3BJ,MAAM,CAACG,SAAP,CAAiBE,KAAjB,CAAuBC,GAAG,IAAIJ,MAAM,CAACC,SAAP,CAAiBF,IAAjB,CAAsBM,GAAG,IAAID,GAAG,CAACE,IAAJ,KAAaD,GAAG,CAACC,IAAjB,IAAyBF,GAAG,CAACG,KAAJ,KAAcF,GAAG,CAACE,KAAxE,CAA9B,CAJK,CAAP;EAKD;AACF"}
|
|
@@ -4,106 +4,53 @@ var _chai = require("chai");
|
|
|
4
4
|
|
|
5
5
|
var _marcRecord = require("@natlibfi/marc-record");
|
|
6
6
|
|
|
7
|
-
var _duplicatesInd = _interopRequireDefault(require("
|
|
7
|
+
var _duplicatesInd = _interopRequireDefault(require("./duplicates-ind1"));
|
|
8
|
+
|
|
9
|
+
var _fixura = require("@natlibfi/fixura");
|
|
10
|
+
|
|
11
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
12
|
+
|
|
13
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
8
14
|
|
|
9
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
16
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
fields: [{
|
|
23
|
-
tag: '500',
|
|
24
|
-
ind1: ' ',
|
|
25
|
-
ind2: '0',
|
|
26
|
-
subfields: [{
|
|
27
|
-
code: 'a',
|
|
28
|
-
value: 'foo'
|
|
29
|
-
}]
|
|
30
|
-
}, {
|
|
31
|
-
tag: '500',
|
|
32
|
-
ind1: ' ',
|
|
33
|
-
ind2: '0',
|
|
34
|
-
subfields: [{
|
|
35
|
-
code: 'a',
|
|
36
|
-
value: 'foo'
|
|
37
|
-
}]
|
|
38
|
-
}]
|
|
39
|
-
});
|
|
40
|
-
const result = await validator.validate(record);
|
|
41
|
-
(0, _chai.expect)(result).to.eql({
|
|
42
|
-
valid: true,
|
|
43
|
-
messages: []
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
it('Finds the record invalid', async () => {
|
|
47
|
-
const validator = await (0, _duplicatesInd.default)(/^500$/u);
|
|
48
|
-
const record = new _marcRecord.MarcRecord({
|
|
49
|
-
fields: [{
|
|
50
|
-
tag: '500',
|
|
51
|
-
ind1: ' ',
|
|
52
|
-
ind2: '0',
|
|
53
|
-
subfields: [{
|
|
54
|
-
code: 'a',
|
|
55
|
-
value: 'foo'
|
|
56
|
-
}]
|
|
57
|
-
}, {
|
|
58
|
-
tag: '500',
|
|
59
|
-
ind1: '1',
|
|
60
|
-
ind2: '0',
|
|
61
|
-
subfields: [{
|
|
62
|
-
code: 'a',
|
|
63
|
-
value: 'foo'
|
|
64
|
-
}]
|
|
65
|
-
}]
|
|
66
|
-
});
|
|
67
|
-
const result = await validator.validate(record);
|
|
68
|
-
(0, _chai.expect)(result).to.eql({
|
|
69
|
-
valid: false,
|
|
70
|
-
messages: ['Multiple 500 fields which only differ in the first indicator']
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
describe('#fix', () => {
|
|
75
|
-
it('Removes duplicate values', async () => {
|
|
76
|
-
const validator = await (0, _duplicatesInd.default)(/^500$/u);
|
|
77
|
-
const record = new _marcRecord.MarcRecord({
|
|
78
|
-
fields: [{
|
|
79
|
-
tag: '500',
|
|
80
|
-
ind1: ' ',
|
|
81
|
-
ind2: '0',
|
|
82
|
-
subfields: [{
|
|
83
|
-
code: 'a',
|
|
84
|
-
value: 'foo'
|
|
85
|
-
}]
|
|
86
|
-
}, {
|
|
87
|
-
tag: '500',
|
|
88
|
-
ind1: '1',
|
|
89
|
-
ind2: '0',
|
|
90
|
-
subfields: [{
|
|
91
|
-
code: 'a',
|
|
92
|
-
value: 'foo'
|
|
93
|
-
}]
|
|
94
|
-
}]
|
|
95
|
-
});
|
|
96
|
-
await validator.fix(record);
|
|
97
|
-
(0, _chai.expect)(record.fields).to.eql([{
|
|
98
|
-
tag: '500',
|
|
99
|
-
ind1: ' ',
|
|
100
|
-
ind2: '0',
|
|
101
|
-
subfields: [{
|
|
102
|
-
code: 'a',
|
|
103
|
-
value: 'foo'
|
|
104
|
-
}]
|
|
105
|
-
}]);
|
|
106
|
-
});
|
|
107
|
-
});
|
|
17
|
+
(0, _fixugen.default)({
|
|
18
|
+
callback,
|
|
19
|
+
path: [__dirname, '..', 'test-fixtures', 'duplicates-ind1'],
|
|
20
|
+
useMetadataFile: true,
|
|
21
|
+
recurse: false,
|
|
22
|
+
fixura: {
|
|
23
|
+
reader: _fixura.READERS.JSON
|
|
24
|
+
},
|
|
25
|
+
mocha: {
|
|
26
|
+
before: () => testValidatorFactory()
|
|
27
|
+
}
|
|
108
28
|
});
|
|
29
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/duplicates-ind1:test');
|
|
30
|
+
|
|
31
|
+
async function testValidatorFactory() {
|
|
32
|
+
const validator = await (0, _duplicatesInd.default)(/^500$/u);
|
|
33
|
+
(0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
34
|
+
(0, _chai.expect)(validator.description).to.be.a('string');
|
|
35
|
+
(0, _chai.expect)(validator.validate).to.be.a('function');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function callback({
|
|
39
|
+
getFixture,
|
|
40
|
+
tagPattern,
|
|
41
|
+
fix = false
|
|
42
|
+
}) {
|
|
43
|
+
const validator = await (0, _duplicatesInd.default)(new RegExp(tagPattern, 'u'));
|
|
44
|
+
const record = new _marcRecord.MarcRecord(getFixture('record.json'));
|
|
45
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
46
|
+
|
|
47
|
+
if (!fix) {
|
|
48
|
+
const result = await validator.validate(record);
|
|
49
|
+
return (0, _chai.expect)(result).to.eql(expectedResult);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const fixedRecord = await validator.fix(record);
|
|
53
|
+
debug(fixedRecord);
|
|
54
|
+
(0, _chai.expect)(record.fields).to.eql(expectedResult);
|
|
55
|
+
}
|
|
109
56
|
//# sourceMappingURL=duplicates-ind1.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicates-ind1.spec.js","names":["
|
|
1
|
+
{"version":3,"file":"duplicates-ind1.spec.js","names":["generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","tagPattern","fix","RegExp","record","MarcRecord","expectedResult","result","eql","fixedRecord","fields"],"sources":["../src/duplicates-ind1.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './duplicates-ind1';\n\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'duplicates-ind1'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/duplicates-ind1:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory(/^500$/u);\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, tagPattern, fix = false}) {\n const validator = await validatorFactory(new RegExp(tagPattern, 'u'));\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n\n if (!fix) {\n const result = await validator.validate(record);\n return expect(result).to.eql(expectedResult);\n }\n\n const fixedRecord = await validator.fix(record);\n debug(fixedRecord);\n expect(record.fields).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;;;AAEA,IAAAA,gBAAA,EAAc;EACZC,QADY;EAEZC,IAAI,EAAE,CAACC,SAAD,EAAY,IAAZ,EAAkB,eAAlB,EAAmC,iBAAnC,CAFM;EAGZC,eAAe,EAAE,IAHL;EAIZC,OAAO,EAAE,KAJG;EAKZC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAA,CAAQC;EADV,CALI;EAQZC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EAD7B;AARK,CAAd;AAaA,MAAMC,KAAK,GAAG,IAAAC,cAAA,EAAkB,+DAAlB,CAAd;;AAEA,eAAeF,oBAAf,GAAsC;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sBAAA,EAAiB,QAAjB,CAAxB;EAEA,IAAAC,YAAA,EAAOF,SAAP,EACGG,EADH,CACMC,EADN,CACSC,EADT,CACY,QADZ,EAEGC,IAFH,CAEQC,GAFR,CAEYC,GAFZ,CAEgBC,IAFhB,CAEqB,aAFrB,EAEoC,UAFpC;EAIA,IAAAP,YAAA,EAAOF,SAAS,CAACU,WAAjB,EAA8BP,EAA9B,CAAiCC,EAAjC,CAAoCO,CAApC,CAAsC,QAAtC;EACA,IAAAT,YAAA,EAAOF,SAAS,CAACY,QAAjB,EAA2BT,EAA3B,CAA8BC,EAA9B,CAAiCO,CAAjC,CAAmC,UAAnC;AACD;;AAED,eAAezB,QAAf,CAAwB;EAAC2B,UAAD;EAAaC,UAAb;EAAyBC,GAAG,GAAG;AAA/B,CAAxB,EAA+D;EAC7D,MAAMf,SAAS,GAAG,MAAM,IAAAC,sBAAA,EAAiB,IAAIe,MAAJ,CAAWF,UAAX,EAAuB,GAAvB,CAAjB,CAAxB;EACA,MAAMG,MAAM,GAAG,IAAIC,sBAAJ,CAAeL,UAAU,CAAC,aAAD,CAAzB,CAAf;EACA,MAAMM,cAAc,GAAGN,UAAU,CAAC,qBAAD,CAAjC;;EAEA,IAAI,CAACE,GAAL,EAAU;IACR,MAAMK,MAAM,GAAG,MAAMpB,SAAS,CAACY,QAAV,CAAmBK,MAAnB,CAArB;IACA,OAAO,IAAAf,YAAA,EAAOkB,MAAP,EAAejB,EAAf,CAAkBkB,GAAlB,CAAsBF,cAAtB,CAAP;EACD;;EAED,MAAMG,WAAW,GAAG,MAAMtB,SAAS,CAACe,GAAV,CAAcE,MAAd,CAA1B;EACAnB,KAAK,CAACwB,WAAD,CAAL;EACA,IAAApB,YAAA,EAAOe,MAAM,CAACM,MAAd,EAAsBpB,EAAtB,CAAyBkB,GAAzB,CAA6BF,cAA7B;AACD"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = _default;
|
|
7
|
+
exports.recordNormalizeIndicators = recordNormalizeIndicators;
|
|
8
|
+
|
|
9
|
+
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
10
|
+
//import createDebugLogger from 'debug';
|
|
11
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');
|
|
12
|
+
function fieldToString(f) {
|
|
13
|
+
if (!f.subfields) {
|
|
14
|
+
return `${f.tag} ${f.value}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return `${f.tag} ${f.ind1}${f.ind2} ‡${formatSubfields(f)}`;
|
|
18
|
+
|
|
19
|
+
function formatSubfields(field) {
|
|
20
|
+
//return field.subfields.map(sf => `${sf.code}${sf.value || ''}`).join('‡');
|
|
21
|
+
return field.subfields.map(sf => `${sf.code}${sf.value}`).join(' ‡');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/*
|
|
25
|
+
function nvdebug(message, func) {
|
|
26
|
+
if (func) { // eslint-disable-line functional/no-conditional-statement
|
|
27
|
+
func(message);
|
|
28
|
+
}
|
|
29
|
+
console.info(message); // eslint-disable-line no-console
|
|
30
|
+
}
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
function _default() {
|
|
35
|
+
// NB! We should and could handle ISNIs here as well.
|
|
36
|
+
return {
|
|
37
|
+
description: 'Normalizes indicator values',
|
|
38
|
+
validate,
|
|
39
|
+
fix
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
function fix(record) {
|
|
43
|
+
const res = {
|
|
44
|
+
message: [],
|
|
45
|
+
fix: [],
|
|
46
|
+
valid: true
|
|
47
|
+
}; //message.fix = []; // eslint-disable-line functional/immutable-data
|
|
48
|
+
// Actual parsing of all fields
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
if (!record.fields) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
recordNormalizeIndicators(record); // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
|
|
57
|
+
|
|
58
|
+
return res;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function validate(record) {
|
|
62
|
+
const res = {
|
|
63
|
+
message: []
|
|
64
|
+
}; //nvdebug(`NORMALIZE CONTROL NUMBER VALIDATE`, debug);
|
|
65
|
+
// Actual parsing of all fields
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
if (!record.fields) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
validateRecord(record, res);
|
|
74
|
+
res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
|
|
75
|
+
|
|
76
|
+
return res;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function validateRecord(record, res) {
|
|
80
|
+
//nvdebug(record);
|
|
81
|
+
const clonedFields = JSON.parse(JSON.stringify(record.fields));
|
|
82
|
+
recordNormalizeIndicators(record);
|
|
83
|
+
record.fields.forEach((field, index) => compareFields(field, index));
|
|
84
|
+
|
|
85
|
+
function compareFields(field, index) {
|
|
86
|
+
const origFieldAsString = fieldToString(clonedFields[index]); //const clonedFieldAsString = fieldToString(field);
|
|
87
|
+
|
|
88
|
+
if (clonedFields[index].ind1 !== field.ind1) {
|
|
89
|
+
// eslint-disable-line functional/no-conditional-statement
|
|
90
|
+
//nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);
|
|
91
|
+
res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`); // eslint-disable-line functional/immutable-data
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (clonedFields[index].ind2 !== field.ind2) {
|
|
95
|
+
// eslint-disable-line functional/no-conditional-statement
|
|
96
|
+
//nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);
|
|
97
|
+
res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`); // eslint-disable-line functional/immutable-data
|
|
98
|
+
}
|
|
99
|
+
} // Validator should not change the original record:
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
record.fields = clonedFields; // eslint-disable-line functional/immutable-data
|
|
103
|
+
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const ind1NonFilingChars = ['130', '630', '730', '740'];
|
|
109
|
+
const ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];
|
|
110
|
+
|
|
111
|
+
function hasNonFilingIndicator1(field) {
|
|
112
|
+
return ind1NonFilingChars.includes(field.tag);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function modifiableIndicatorValue(value) {
|
|
116
|
+
// If field contains a legit-looking value, don't try to modify it here...
|
|
117
|
+
return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function hasNonFilingIndicator2(field) {
|
|
121
|
+
return ind2NonFilingChars.includes(field.tag);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function valueBeginsWithDeterminer(value, cands) {
|
|
125
|
+
return cands.find(cand => value.substring(0, cand.length) === cand);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function determineNonFilingIndicatorValue(field, languages = undefined) {
|
|
129
|
+
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
130
|
+
|
|
131
|
+
if (!subfieldA) {
|
|
132
|
+
// nvdebug(' Subfield $a miss!');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const name = subfieldA.value.toLowerCase();
|
|
137
|
+
|
|
138
|
+
if (languages.includes('eng')) {
|
|
139
|
+
const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);
|
|
140
|
+
|
|
141
|
+
if (match) {
|
|
142
|
+
return `${match.length}`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (languages.includes('fre')) {
|
|
147
|
+
const match = valueBeginsWithDeterminer(name, ['l\'', 'le ']);
|
|
148
|
+
|
|
149
|
+
if (match) {
|
|
150
|
+
return `${match.length}`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (languages.includes('ger')) {
|
|
155
|
+
const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);
|
|
156
|
+
|
|
157
|
+
if (match) {
|
|
158
|
+
return `${match.length}`;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (languages.includes('swe')) {
|
|
163
|
+
const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);
|
|
164
|
+
|
|
165
|
+
if (match) {
|
|
166
|
+
return `${match.length}`;
|
|
167
|
+
}
|
|
168
|
+
} // Fallback-ish: try to guess even without languages:
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
const match = valueBeginsWithDeterminer(name, ['the ']);
|
|
172
|
+
|
|
173
|
+
if (match) {
|
|
174
|
+
return `${match.length}`;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return '0';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function normalizeNonFilingIndicator1(field, languages = []) {
|
|
181
|
+
if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
field.ind1 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function normalizeNonFilingIndicator2(field, languages = []) {
|
|
189
|
+
if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
field.ind2 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function normalize245Indicator1(field, record) {
|
|
197
|
+
if (field.tag !== '245') {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const field1XX = record.get('^1..$');
|
|
202
|
+
field.ind1 = field1XX.length === 0 ? '0' : '1'; // eslint-disable-line functional/immutable-data
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function recordNormalize490(record) {
|
|
206
|
+
const fields490 = record.get('^490$');
|
|
207
|
+
const fields8XX = record.get('^(?:800|810|811|830)$');
|
|
208
|
+
|
|
209
|
+
if (fields490.length === 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (fields490.length <= fields8XX.length) {
|
|
214
|
+
// Trace found for each field 490:
|
|
215
|
+
fields490.forEach(f => {
|
|
216
|
+
f.ind1 = '1'; // eslint-disable-line functional/immutable-data
|
|
217
|
+
});
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (fields8XX.length === 0) {
|
|
222
|
+
// Fields 490 are always untraced (no traces found)
|
|
223
|
+
fields490.forEach(f => {
|
|
224
|
+
f.ind1 = '0'; // eslint-disable-line functional/immutable-data
|
|
225
|
+
});
|
|
226
|
+
return;
|
|
227
|
+
} // For other combinations we just can't be sure, so leave them as they are.
|
|
228
|
+
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function getLanguages(record) {
|
|
232
|
+
const langFields = record.get('^041$');
|
|
233
|
+
|
|
234
|
+
if (langFields.length === 0) {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);
|
|
239
|
+
|
|
240
|
+
function isRelevantSubfield(subfield) {
|
|
241
|
+
if (subfield.code !== 'a' && subfield.code !== 'd') {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (subfield.value.length !== 3) {
|
|
246
|
+
return false;
|
|
247
|
+
} // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function recordNormalizeIndicators(record) {
|
|
255
|
+
recordNormalize490(record); // Language is used to handle non-filing indicators
|
|
256
|
+
|
|
257
|
+
const languages = getLanguages(record);
|
|
258
|
+
record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function fieldNormalizeIndicators(field, record, languages) {
|
|
262
|
+
normalize245Indicator1(field, record);
|
|
263
|
+
normalizeNonFilingIndicator1(field, languages);
|
|
264
|
+
normalizeNonFilingIndicator2(field, languages);
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=indicator-fixes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indicator-fixes.js","names":["fieldToString","f","subfields","tag","value","ind1","ind2","formatSubfields","field","map","sf","code","join","description","validate","fix","record","res","message","valid","recordNormalizeIndicators","validateRecord","length","clonedFields","JSON","parse","stringify","fields","forEach","index","compareFields","origFieldAsString","push","ind1NonFilingChars","ind2NonFilingChars","hasNonFilingIndicator1","includes","modifiableIndicatorValue","hasNonFilingIndicator2","valueBeginsWithDeterminer","cands","find","cand","substring","determineNonFilingIndicatorValue","languages","undefined","subfieldA","name","toLowerCase","match","normalizeNonFilingIndicator1","normalizeNonFilingIndicator2","normalize245Indicator1","field1XX","get","recordNormalize490","fields490","fields8XX","getLanguages","langFields","filter","isRelevantSubfield","subfield","fieldNormalizeIndicators"],"sources":["../src/indicator-fixes.js"],"sourcesContent":["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');\n\n\nfunction fieldToString(f) {\n if (!f.subfields) {\n return `${f.tag} ${f.value}`;\n }\n return `${f.tag} ${f.ind1}${f.ind2} ‡${formatSubfields(f)}`;\n\n function formatSubfields(field) {\n //return field.subfields.map(sf => `${sf.code}${sf.value || ''}`).join('‡');\n return field.subfields.map(sf => `${sf.code}${sf.value}`).join(' ‡');\n }\n}\n\n/*\nfunction nvdebug(message, func) {\n if (func) { // eslint-disable-line functional/no-conditional-statement\n func(message);\n }\n console.info(message); // eslint-disable-line no-console\n}\n*/\n\nexport default function () {\n\n // NB! We should and could handle ISNIs here as well.\n return {\n description: 'Normalizes indicator values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n\n recordNormalizeIndicators(record);\n\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n //nvdebug(`NORMALIZE CONTROL NUMBER VALIDATE`, debug);\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n validateRecord(record, res);\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n\n\n function validateRecord(record, res) {\n //nvdebug(record);\n const clonedFields = JSON.parse(JSON.stringify(record.fields));\n recordNormalizeIndicators(record);\n\n record.fields.forEach((field, index) => compareFields(field, index));\n\n function compareFields(field, index) {\n const origFieldAsString = fieldToString(clonedFields[index]);\n //const clonedFieldAsString = fieldToString(field);\n if (clonedFields[index].ind1 !== field.ind1) { // eslint-disable-line functional/no-conditional-statement\n //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`); // eslint-disable-line functional/immutable-data\n }\n if (clonedFields[index].ind2 !== field.ind2) { // eslint-disable-line functional/no-conditional-statement\n //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`); // eslint-disable-line functional/immutable-data\n }\n }\n // Validator should not change the original record:\n record.fields = clonedFields; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\nfunction hasNonFilingIndicator1(field) {\n return ind1NonFilingChars.includes(field.tag);\n}\n\nfunction modifiableIndicatorValue(value) {\n // If field contains a legit-looking value, don't try to modify it here...\n return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);\n}\n\nfunction hasNonFilingIndicator2(field) {\n return ind2NonFilingChars.includes(field.tag);\n}\n\nfunction valueBeginsWithDeterminer(value, cands) {\n return cands.find(cand => value.substring(0, cand.length) === cand);\n}\n\nfunction determineNonFilingIndicatorValue(field, languages = undefined) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (!subfieldA) {\n // nvdebug(' Subfield $a miss!');\n return;\n }\n\n const name = subfieldA.value.toLowerCase();\n\n if (languages.includes('eng')) {\n const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('fre')) {\n const match = valueBeginsWithDeterminer(name, ['l\\'', 'le ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('ger')) {\n const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('swe')) {\n const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n // Fallback-ish: try to guess even without languages:\n const match = valueBeginsWithDeterminer(name, ['the ']);\n if (match) {\n return `${match.length}`;\n }\n\n return '0';\n}\n\nfunction normalizeNonFilingIndicator1(field, languages = []) {\n if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {\n return;\n }\n\n field.ind1 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data\n}\n\nfunction normalizeNonFilingIndicator2(field, languages = []) {\n if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {\n return;\n }\n\n field.ind2 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data\n}\n\n\nfunction normalize245Indicator1(field, record) {\n if (field.tag !== '245') {\n return;\n }\n const field1XX = record.get('^1..$');\n field.ind1 = field1XX.length === 0 ? '0' : '1'; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction recordNormalize490(record) {\n const fields490 = record.get('^490$');\n const fields8XX = record.get('^(?:800|810|811|830)$');\n\n if (fields490.length === 0) {\n return;\n }\n if (fields490.length <= fields8XX.length) {\n // Trace found for each field 490:\n fields490.forEach(f => {\n f.ind1 = '1'; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)\n fields490.forEach(f => {\n f.ind1 = '0'; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n // For other combinations we just can't be sure, so leave them as they are.\n}\n\n\nfunction getLanguages(record) {\n const langFields = record.get('^041$');\n\n if (langFields.length === 0) {\n return [];\n }\n\n return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);\n\n function isRelevantSubfield(subfield) {\n if (subfield.code !== 'a' && subfield.code !== 'd') {\n return false;\n }\n if (subfield.value.length !== 3) {\n return false;\n }\n // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.\n return true;\n }\n\n}\n\nexport function recordNormalizeIndicators(record) {\n recordNormalize490(record);\n\n // Language is used to handle non-filing indicators\n const languages = getLanguages(record);\n\n record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));\n\n}\n\nfunction fieldNormalizeIndicators(field, record, languages) {\n normalize245Indicator1(field, record);\n normalizeNonFilingIndicator1(field, languages);\n normalizeNonFilingIndicator2(field, languages);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
|
|
5
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
6
|
+
|
|
7
|
+
var _indicatorFixes = _interopRequireDefault(require("./indicator-fixes"));
|
|
8
|
+
|
|
9
|
+
var _fixura = require("@natlibfi/fixura");
|
|
10
|
+
|
|
11
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
12
|
+
|
|
13
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
14
|
+
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
|
|
17
|
+
(0, _fixugen.default)({
|
|
18
|
+
callback,
|
|
19
|
+
path: [__dirname, '..', 'test-fixtures', 'indicator-fixes'],
|
|
20
|
+
useMetadataFile: true,
|
|
21
|
+
recurse: false,
|
|
22
|
+
fixura: {
|
|
23
|
+
reader: _fixura.READERS.JSON
|
|
24
|
+
},
|
|
25
|
+
mocha: {
|
|
26
|
+
before: () => testValidatorFactory()
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/indicator-fixes:test');
|
|
30
|
+
|
|
31
|
+
async function testValidatorFactory() {
|
|
32
|
+
const validator = await (0, _indicatorFixes.default)();
|
|
33
|
+
(0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
34
|
+
(0, _chai.expect)(validator.description).to.be.a('string');
|
|
35
|
+
(0, _chai.expect)(validator.validate).to.be.a('function');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function callback({
|
|
39
|
+
getFixture,
|
|
40
|
+
enabled = true,
|
|
41
|
+
fix = false
|
|
42
|
+
}) {
|
|
43
|
+
if (enabled === false) {
|
|
44
|
+
debug('TEST SKIPPED!');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const validator = await (0, _indicatorFixes.default)();
|
|
49
|
+
const record = new _marcRecord.MarcRecord(getFixture('record.json'));
|
|
50
|
+
const expectedResult = getFixture('expectedResult.json'); // console.log(expectedResult); // eslint-disable-line
|
|
51
|
+
|
|
52
|
+
if (!fix) {
|
|
53
|
+
const result = await validator.validate(record);
|
|
54
|
+
(0, _chai.expect)(result).to.eql(expectedResult);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await validator.fix(record);
|
|
59
|
+
(0, _chai.expect)(record).to.eql(expectedResult);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=indicator-fixes.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indicator-fixes.spec.js","names":["generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/indicator-fixes.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './indicator-fixes';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'indicator-fixes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/indicator-fixes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEA,IAAAA,gBAAA,EAAc;EACZC,QADY;EAEZC,IAAI,EAAE,CAACC,SAAD,EAAY,IAAZ,EAAkB,eAAlB,EAAmC,iBAAnC,CAFM;EAGZC,eAAe,EAAE,IAHL;EAIZC,OAAO,EAAE,KAJG;EAKZC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAA,CAAQC;EADV,CALI;EAQZC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EAD7B;AARK,CAAd;AAYA,MAAMC,KAAK,GAAG,IAAAC,cAAA,EAAkB,+DAAlB,CAAd;;AAEA,eAAeF,oBAAf,GAAsC;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,uBAAA,GAAxB;EAEA,IAAAC,YAAA,EAAOF,SAAP,EACGG,EADH,CACMC,EADN,CACSC,EADT,CACY,QADZ,EAEGC,IAFH,CAEQC,GAFR,CAEYC,GAFZ,CAEgBC,IAFhB,CAEqB,aAFrB,EAEoC,UAFpC;EAIA,IAAAP,YAAA,EAAOF,SAAS,CAACU,WAAjB,EAA8BP,EAA9B,CAAiCC,EAAjC,CAAoCO,CAApC,CAAsC,QAAtC;EACA,IAAAT,YAAA,EAAOF,SAAS,CAACY,QAAjB,EAA2BT,EAA3B,CAA8BC,EAA9B,CAAiCO,CAAjC,CAAmC,UAAnC;AACD;;AAED,eAAezB,QAAf,CAAwB;EAAC2B,UAAD;EAAaC,OAAO,GAAG,IAAvB;EAA6BC,GAAG,GAAG;AAAnC,CAAxB,EAAmE;EACjE,IAAID,OAAO,KAAK,KAAhB,EAAuB;IACrBhB,KAAK,CAAC,eAAD,CAAL;IACA;EACD;;EAED,MAAME,SAAS,GAAG,MAAM,IAAAC,uBAAA,GAAxB;EACA,MAAMe,MAAM,GAAG,IAAIC,sBAAJ,CAAeJ,UAAU,CAAC,aAAD,CAAzB,CAAf;EACA,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAD,CAAjC,CARiE,CASjE;;EAEA,IAAI,CAACE,GAAL,EAAU;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAV,CAAmBI,MAAnB,CAArB;IACA,IAAAd,YAAA,EAAOiB,MAAP,EAAehB,EAAf,CAAkBiB,GAAlB,CAAsBF,cAAtB;IACA;EACD;;EAED,MAAMlB,SAAS,CAACe,GAAV,CAAcC,MAAd,CAAN;EACA,IAAAd,YAAA,EAAOc,MAAP,EAAeb,EAAf,CAAkBiB,GAAlB,CAAsBF,cAAtB;AACD"}
|