@natlibfi/marc-record-validators-melinda 11.3.5 → 11.3.7-alpha.1

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.
Files changed (105) hide show
  1. package/dist/cyrillux.js +1 -1
  2. package/dist/cyrillux.js.map +1 -1
  3. package/dist/punctuation2.js +42 -10
  4. package/dist/punctuation2.js.map +1 -1
  5. package/dist/urn.js +15 -6
  6. package/dist/urn.js.map +1 -1
  7. package/dist/urn.spec.js +45 -276
  8. package/dist/urn.spec.js.map +1 -1
  9. package/package.json +10 -10
  10. package/src/cyrillux.js +1 -1
  11. package/src/punctuation2.js +27 -10
  12. package/src/urn.js +17 -3
  13. package/src/urn.spec.js +49 -264
  14. package/test-fixtures/cyrillux/f09/expectedResult.json +130 -0
  15. package/test-fixtures/cyrillux/f09/metadata.json +10 -0
  16. package/test-fixtures/cyrillux/f09/record.json +104 -0
  17. package/test-fixtures/punctuation2/787/expectedResult.json +14 -0
  18. package/test-fixtures/punctuation2/787/metadata.json +5 -0
  19. package/test-fixtures/punctuation2/787/record.json +13 -0
  20. package/test-fixtures/sort-fields/05/input.json +11 -10
  21. package/test-fixtures/sort-fields/05/result.json +10 -10
  22. package/test-fixtures/strip-punctuation/787/expectedResult.json +14 -0
  23. package/test-fixtures/strip-punctuation/787/metadata.json +5 -0
  24. package/test-fixtures/strip-punctuation/787/record.json +13 -0
  25. package/test-fixtures/urn/f01/input.json +15 -0
  26. package/test-fixtures/urn/f01/metadata.json +6 -0
  27. package/test-fixtures/urn/f01/result.json +16 -0
  28. package/test-fixtures/urn/f02/input.json +11 -0
  29. package/test-fixtures/urn/f02/metadata.json +7 -0
  30. package/test-fixtures/urn/f02/result.json +15 -0
  31. package/test-fixtures/urn/f03/input.json +8 -0
  32. package/test-fixtures/urn/f03/metadata.json +7 -0
  33. package/test-fixtures/urn/f03/result.json +12 -0
  34. package/test-fixtures/urn/f04/input.json +9 -0
  35. package/test-fixtures/urn/f04/metadata.json +7 -0
  36. package/test-fixtures/urn/f04/result.json +13 -0
  37. package/test-fixtures/urn/f05/input.json +9 -0
  38. package/test-fixtures/urn/f05/metadata.json +9 -0
  39. package/test-fixtures/urn/f05/result.json +13 -0
  40. package/test-fixtures/urn/f06/input.json +17 -0
  41. package/test-fixtures/urn/f06/metadata.json +6 -0
  42. package/test-fixtures/urn/f06/result.json +18 -0
  43. package/test-fixtures/urn/f07/input.json +17 -0
  44. package/test-fixtures/urn/f07/metadata.json +6 -0
  45. package/test-fixtures/urn/f07/result.json +18 -0
  46. package/test-fixtures/urn/f08/input.json +11 -0
  47. package/test-fixtures/urn/f08/metadata.json +6 -0
  48. package/test-fixtures/urn/f08/result.json +17 -0
  49. package/test-fixtures/urn/f09/input.json +7 -0
  50. package/test-fixtures/urn/f09/metadata.json +7 -0
  51. package/test-fixtures/urn/f09/result.json +8 -0
  52. package/test-fixtures/urn/f10/input.json +7 -0
  53. package/test-fixtures/urn/f10/metadata.json +7 -0
  54. package/test-fixtures/urn/f10/result.json +8 -0
  55. package/test-fixtures/urn/f11/input.json +7 -0
  56. package/test-fixtures/urn/f11/metadata.json +7 -0
  57. package/test-fixtures/urn/f11/result.json +8 -0
  58. package/test-fixtures/urn/f12/input.json +8 -0
  59. package/test-fixtures/urn/f12/metadata.json +6 -0
  60. package/test-fixtures/urn/f12/result.json +14 -0
  61. package/test-fixtures/urn/f13/input.json +14 -0
  62. package/test-fixtures/urn/f13/metadata.json +6 -0
  63. package/test-fixtures/urn/f13/result.json +20 -0
  64. package/test-fixtures/urn/f14/input.json +14 -0
  65. package/test-fixtures/urn/f14/metadata.json +6 -0
  66. package/test-fixtures/urn/f14/result.json +20 -0
  67. package/test-fixtures/urn/f15/input.json +11 -0
  68. package/test-fixtures/urn/f15/metadata.json +7 -0
  69. package/test-fixtures/urn/f15/result.json +17 -0
  70. package/test-fixtures/urn/v01/input.json +14 -0
  71. package/test-fixtures/urn/v01/metadata.json +6 -0
  72. package/test-fixtures/urn/v01/result.json +3 -0
  73. package/test-fixtures/urn/v02/input.json +18 -0
  74. package/test-fixtures/urn/v02/metadata.json +6 -0
  75. package/test-fixtures/urn/v02/result.json +3 -0
  76. package/test-fixtures/urn/v03/input.json +18 -0
  77. package/test-fixtures/urn/v03/metadata.json +6 -0
  78. package/test-fixtures/urn/v03/result.json +3 -0
  79. package/test-fixtures/urn/v04/input.json +18 -0
  80. package/test-fixtures/urn/v04/metadata.json +6 -0
  81. package/test-fixtures/urn/v04/result.json +3 -0
  82. package/test-fixtures/urn/v05/input.json +18 -0
  83. package/test-fixtures/urn/v05/metadata.json +6 -0
  84. package/test-fixtures/urn/v05/result.json +3 -0
  85. package/test-fixtures/urn/v06/input.json +16 -0
  86. package/test-fixtures/urn/v06/metadata.json +6 -0
  87. package/test-fixtures/urn/v06/result.json +3 -0
  88. package/test-fixtures/urn/v07/input.json +16 -0
  89. package/test-fixtures/urn/v07/metadata.json +6 -0
  90. package/test-fixtures/urn/v07/result.json +3 -0
  91. package/test-fixtures/urn/v08/input.json +15 -0
  92. package/test-fixtures/urn/v08/metadata.json +6 -0
  93. package/test-fixtures/urn/v08/result.json +3 -0
  94. package/test-fixtures/urn/v09/input.json +13 -0
  95. package/test-fixtures/urn/v09/metadata.json +6 -0
  96. package/test-fixtures/urn/v09/result.json +3 -0
  97. package/test-fixtures/urn/v10/input.json +13 -0
  98. package/test-fixtures/urn/v10/metadata.json +6 -0
  99. package/test-fixtures/urn/v10/result.json +3 -0
  100. package/test-fixtures/urn/v11/input.json +21 -0
  101. package/test-fixtures/urn/v11/metadata.json +6 -0
  102. package/test-fixtures/urn/v11/result.json +3 -0
  103. package/test-fixtures/urn/v12/input.json +12 -0
  104. package/test-fixtures/urn/v12/metadata.json +6 -0
  105. package/test-fixtures/urn/v12/result.json +3 -0
package/src/urn.spec.js CHANGED
@@ -1,267 +1,52 @@
1
1
  import {expect} from 'chai';
2
2
  import {MarcRecord} from '@natlibfi/marc-record';
3
- import validatorFactory from '../src/urn';
4
-
5
- describe('urn', async () => {
6
- // Fields
7
- const f337 = {
8
- tag: '337',
9
- ind1: ' ',
10
- ind2: ' ',
11
- subfields: [
12
- {code: 'b', value: 'c'},
13
- {code: '2', value: 'rdamedia'}
14
- ]
15
- };
16
-
17
- const f337nonElectronic = {
18
- tag: '337',
19
- ind1: ' ',
20
- ind2: ' ',
21
- subfields: [
22
- {code: 'b', value: 'n'},
23
- {code: '2', value: 'rdamedia'}
24
- ]
25
- };
26
-
27
- const ldf856 = {
28
- tag: '856',
29
- ind1: '4',
30
- ind2: '0',
31
- subfields: [
32
- {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},
33
- {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},
34
- {code: '5', value: 'FI-Vapaa'}
35
- ]
36
- };
37
-
38
- const ldf856old = {
39
- tag: '856',
40
- ind1: '4',
41
- ind2: '0',
42
- subfields: [
43
- {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},
44
- {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},
45
- {code: '5', value: 'FI-Vapaa'}
46
- ]
47
- };
48
-
49
- const ldf856Https = {
50
- tag: '856',
51
- ind1: '4',
52
- ind2: '0',
53
- subfields: [
54
- {code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'},
55
- {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},
56
- {code: '5', value: 'FI-Vapaa'}
57
- ]
58
- };
59
-
60
- const ldf856partial = {
61
- tag: '856',
62
- ind1: '4',
63
- ind2: '0',
64
- subfields: [
65
- {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},
66
- {code: '5', value: 'FI-Vapaa'}
67
- ]
68
- };
69
-
70
- const f856URN = {
71
- tag: '856',
72
- ind1: '4',
73
- ind2: '0',
74
- subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]
75
- };
76
-
77
- const f856URNHttps = {
78
- tag: '856',
79
- ind1: '4',
80
- ind2: '0',
81
- subfields: [{code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'}]
82
- };
83
-
84
- const f856URNnotResource = {
85
- tag: '856',
86
- ind1: '4',
87
- ind2: '1',
88
- subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]
89
- };
90
-
91
-
92
- const f856URL = {
93
- tag: '856',
94
- ind1: '4',
95
- ind2: '0',
96
- subfields: [{code: 'u', value: 'http://foo.bar/'}]
97
- };
98
-
99
- const f020 = {
100
- tag: '020',
101
- ind1: ' ',
102
- ind2: ' ',
103
- subfields: [{code: 'a', value: '978-951-9155-47-0'}]
104
- };
105
-
106
- const f020second = {
107
- tag: '020',
108
- ind1: ' ',
109
- ind2: ' ',
110
- subfields: [{code: 'a', value: '9789519155470'}]
111
- };
112
-
113
-
114
- it('Creates a validator', async () => {
115
- const validator = await validatorFactory();
116
-
117
- expect(validator)
118
- .to.be.an('object')
119
- .that.has.any.keys('description', 'validate');
120
-
121
- expect(validator.description).to.be.a('string');
122
- expect(validator.validate).to.be.a('function');
123
- });
124
-
125
- // Tests
126
- const test = async isLegalDeposit => {
127
- const validator = await validatorFactory(isLegalDeposit);
128
- return {
129
- validate: async (valid, ...recfields) => {
130
- const result = await validator.validate(new MarcRecord({fields: recfields}));
131
- expect(result).to.eql({valid});
132
- },
133
-
134
- fix: async (recfields, resfields) => {
135
- const record = new MarcRecord({fields: recfields});
136
- await validator.fix(record);
137
- expect(record.fields).to.eql(resfields);
138
- }
139
- };
140
- };
141
-
142
- /// Non-legal and legal deposit
143
- const nonld = await test(false);
144
- const ld = await test(true);
145
-
146
- describe('#validate', () => {
147
- // Validate non-electoronic
148
- it('Finds the record valid; non-electronic record', async () => {
149
- await nonld.validate(true, f337nonElectronic);
150
- });
151
-
152
- // Validate non-legal deposit
153
- it('Finds the record valid; 856 with urn, and is non-legal deposit', async () => {
154
- await nonld.validate(true, f337, f856URN);
155
- });
156
-
157
- // we should recognize that 856 with second indicator 1 is not describing the resource itself
158
- it.skip('Finds the record invalid; 856 ind2: 1 with urn, and is non-legal deposit', async () => {
159
- await nonld.validate(false, f337, f856URNnotResource);
160
- });
161
-
162
- // should we require urn if we're not handling a legal deposit
163
- it('Finds the record invalid; 856 without urn, and is non-legal deposit', async () => {
164
- await nonld.validate(false, f337, f856URL);
165
- });
166
-
167
-
168
- // should we require urn if we're not handling a legal deposit
169
- it('Finds the record invalid; Missing 856, and is non-legal deposit', async () => {
170
- await nonld.validate(false, f337, f020);
171
- });
172
-
173
- // Validate legal deposit
174
- it('Finds the record invalid; 856 with urn, and is legal deposit', async () => {
175
- await ld.validate(false, f020, f337, f856URN);
176
- });
177
-
178
- it('Finds the record invalid; 856 without urn, and is legal deposit', async () => {
179
- await ld.validate(false, f020, f337, f856URL);
180
- });
181
-
182
- it('Finds the record invalid; Missing 856, and is legal deposit', async () => {
183
- await ld.validate(false, f337, f020);
184
- });
185
-
186
- it('Finds the record valid; 856 with URN and legal deposit subfields, and is legal deposit', async () => {
187
- await ld.validate(true, f337, f020, ldf856);
188
- });
189
-
190
- it('Finds the record invalid; old phrase is used in $z', async () => {
191
- await ld.validate(false, f337, f020, ldf856old);
192
- });
193
-
194
- it('Finds the record valid; 856 with URN and legal deposit subfields and other f856s, and is legal deposit', async () => {
195
- await ld.validate(true, f337, f020, ldf856partial, ldf856, f856URL);
196
- });
197
-
198
- it('Finds the record invalid; 856 with URN and partial legal deposit subfields, and is legal deposit', async () => {
199
- await ld.validate(false, f337, f020, ldf856partial);
200
- });
201
-
202
-
203
- });
204
-
205
- describe('#fix', () => {
206
- // Fix non-legal deposit
207
- it('856 with urn, and is non-legal deposit; Nothing to add', async () => {
208
- await nonld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN]);
209
- });
210
-
211
- // should we actually add non-resolvable urns?
212
- it('856 without urn, and is non-legal deposit; Adds 856 with urn (https)', async () => {
213
- await nonld.fix([f020, f856URL], [f020, f856URL, f856URNHttps]);
214
- });
215
-
216
- // should we actually add non-resolvable urns?
217
- it('Missing 856, and is non-legal deposit; Adds 856 with urn (https)', async () => {
218
- await nonld.fix([f020], [f020, f856URNHttps]);
219
- });
220
-
221
- // should we actually add non-resolvable urns?
222
- it('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from second 020 (https)', async () => {
223
- await nonld.fix([f020second, f020], [f020second, f020, f856URNHttps]);
224
- });
225
-
226
- // should we actually add non resovable urns?
227
- // we should think about how to choose the isbn to use in case of several ISBNs
228
- it.skip('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from first 020 (https)', async () => {
229
- await nonld.fix([f020, f020second], [f020, f020second, f856URNHttps]);
230
- });
231
-
232
-
233
- // Fix legal deposit
234
- it('856 with urn and legal deposit fields, and is legal deposit; Nothing to add', async () => {
235
- await ld.fix([f020, f856URL, ldf856], [f020, f856URL, ldf856]);
236
- });
237
-
238
- it('856 with urn and legal deposit fields, and is legal deposit but phrase is old; change phrase to new', async () => {
239
- await ld.fix([f020, f856URL, ldf856old], [f020, f856URL, ldf856]);
240
- });
241
-
242
- it('856 without urn, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {
243
- await ld.fix([f020, f856URL], [f020, f856URL, ldf856Https]);
244
- });
245
-
246
- // we should test generating the URN in case of no ISBN
247
-
248
- // we should test creating Melinda-temp field
249
-
250
- // We shouldn't lock the open URN for legal deposit use
251
- it('Missing 856, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {
252
- await ld.fix([f020], [f020, ldf856Https]);
253
- });
254
-
255
- // We should actually do this instead of locking the original non-legal deposit URN for legal deposit use
256
- it.skip('856 with urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {
257
- await ld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN, ldf856Https]);
258
- });
259
-
260
- // We should actually add a new urn in case of a non-resource URN
261
- it.skip('856 with non-resource-urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {
262
- await ld.fix([f020, f856URL, f856URNnotResource], [f020, f856URL, f856URNnotResource, ldf856Https]);
263
- });
264
-
265
-
266
- });
3
+ import validatorFactory from './urn';
4
+ import {READERS} from '@natlibfi/fixura';
5
+ import generateTests from '@natlibfi/fixugen';
6
+ import createDebugLogger from 'debug';
7
+
8
+ generateTests({
9
+ callback,
10
+ path: [__dirname, '..', 'test-fixtures', 'urn'],
11
+ useMetadataFile: true,
12
+ recurse: false,
13
+ fixura: {
14
+ reader: READERS.JSON
15
+ },
16
+ mocha: {
17
+ before: () => testValidatorFactory()
18
+ }
267
19
  });
20
+ const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/urn:test');
21
+
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+
25
+ expect(validator)
26
+ .to.be.an('object')
27
+ .that.has.any.keys('description', 'validate');
28
+
29
+ expect(validator.description).to.be.a('string');
30
+ expect(validator.validate).to.be.a('function');
31
+ }
32
+
33
+ async function callback({getFixture, enabled = true, fix = true, isLegalDeposit = false}) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+
39
+ const validator = await validatorFactory(isLegalDeposit);
40
+ const record = new MarcRecord(getFixture('input.json'));
41
+ const expectedResult = getFixture('result.json');
42
+ // console.log(expectedResult); // eslint-disable-line
43
+
44
+ if (!fix) {
45
+ const result = await validator.validate(record);
46
+ expect(result).to.eql(expectedResult);
47
+ return;
48
+ }
49
+
50
+ await validator.fix(record);
51
+ expect(record).to.eql(expectedResult);
52
+ }
@@ -0,0 +1,130 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "00000cam a22008174i 4500",
4
+ "fields": [
5
+ { "tag": "001", "value": "019168678" },
6
+ { "tag": "003", "value": "FI-MELINDA" },
7
+ { "tag": "005", "value": "20240909171519.0" },
8
+ { "tag": "008", "value": "240903s2024 ru a 000|0|rus|c" },
9
+ { "tag": "040", "ind1": " ", "ind2": " ", "subfields": [
10
+ { "code": "a", "value": "FI-He" },
11
+ { "code": "b", "value": "fin" },
12
+ { "code": "e", "value": "rda" },
13
+ { "code": "d", "value": "FI-Piki" }
14
+ ]},
15
+ { "tag": "041", "ind1": "0", "ind2": " ", "subfields": [
16
+ { "code": "a", "value": "rus" }
17
+ ]},
18
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
19
+ { "code": "6", "value": "880-01" },
20
+ { "code": "a", "value": "Moskalenko, N. V." },
21
+ { "code": "e", "value": "kirjoittaja." },
22
+ { "code": "9", "value": "ISO9 <TRANS>" }
23
+ ]},
24
+ { "tag": "245", "ind1": "1", "ind2": "0", "subfields": [
25
+ { "code": "6", "value": "880-02" },
26
+ { "code": "a", "value": "Sekrety peterburgskih dvorcov :" },
27
+ { "code": "b", "value": "ih tajny, simvoly i sozdateli /" },
28
+ { "code": "c", "value": "Moskalenko N.V." },
29
+ { "code": "9", "value": "ISO9 <TRANS>" }
30
+ ]},
31
+ { "tag": "246", "ind1": "3", "ind2": "0", "subfields": [
32
+ { "code": "6", "value": "880-03" },
33
+ { "code": "a", "value": "Ih tajny, simvoly i sozdateli" },
34
+ { "code": "9", "value": "ISO9 <TRANS>" }
35
+ ]},
36
+ { "tag": "246", "ind1": "3", "ind2": " ", "subfields": [
37
+ { "code": "a", "value": "Sekrety peterburgskih dvorcov" }
38
+ ]},
39
+ { "tag": "264", "ind1": " ", "ind2": "1", "subfields": [
40
+ { "code": "6", "value": "880-04" },
41
+ { "code": "a", "value": "Moskva :" },
42
+ { "code": "b", "value": "BOMBORA," },
43
+ { "code": "c", "value": "2024." }
44
+ ]},
45
+ { "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
46
+ { "code": "a", "value": "204 sivua" }
47
+ ]},
48
+ { "tag": "336", "ind1": " ", "ind2": " ", "subfields": [
49
+ { "code": "a", "value": "teksti" },
50
+ { "code": "b", "value": "txt" },
51
+ { "code": "2", "value": "rdacontent" }
52
+ ]},
53
+ { "tag": "490", "ind1": "0", "ind2": " ", "subfields": [
54
+ { "code": "6", "value": "880-05" },
55
+ { "code": "a", "value": "Dva serdtsa Rossii. Podarochnye izdanija" }
56
+ ]},
57
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
58
+ { "code": "6", "value": "100-01" },
59
+ { "code": "a", "value": "Москаленко, Н. В." },
60
+ { "code": "e", "value": "kirjoittaja." },
61
+ { "code": "9", "value": "CYRILLIC <TRANS>" }
62
+ ]},
63
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
64
+ { "code": "6", "value": "100-01" },
65
+ { "code": "a", "value": "Moskalenko, N. V.," },
66
+ { "code": "e", "value": "kirjoittaja." },
67
+ { "code": "9", "value": "SFS4900 <TRANS>" }
68
+ ]},
69
+ { "tag": "880", "ind1": "1", "ind2": "0", "subfields": [
70
+ { "code": "6", "value": "245-02" },
71
+ { "code": "a", "value": "Секреты петербургских дворцов :" },
72
+ { "code": "b", "value": "их тайны, символы и создатели /" },
73
+ { "code": "c", "value": "Москаленко Н.В." },
74
+ { "code": "9", "value": "CYRILLIC <TRANS>" }
75
+ ]},
76
+ { "tag": "880", "ind1": "1", "ind2": "0", "subfields": [
77
+ { "code": "6", "value": "245-02" },
78
+ { "code": "a", "value": "Sekrety peterburgskih dvortsov :" },
79
+ { "code": "b", "value": "ih tainy, simvoly i sozdateli /" },
80
+ { "code": "c", "value": "Moskalenko N.V." },
81
+ { "code": "9", "value": "SFS4900 <TRANS>" }
82
+ ]},
83
+ { "tag": "880", "ind1": "3", "ind2": "0", "subfields": [
84
+ { "code": "6", "value": "246-03" },
85
+ { "code": "a", "value": "Их тайны, символы и создатели" },
86
+ { "code": "9", "value": "CYRILLIC <TRANS>" }
87
+ ]},
88
+ { "tag": "880", "ind1": "3", "ind2": "0", "subfields": [
89
+ { "code": "6", "value": "246-03" },
90
+ { "code": "a", "value": "Ih tainy, simvoly i sozdateli" },
91
+ { "code": "9", "value": "SFS4900 <TRANS>" }
92
+ ]},
93
+ { "tag": "880", "ind1": " ", "ind2": "1", "subfields": [
94
+ { "code": "6", "value": "264-04" },
95
+ { "code": "a", "value": "Москва :" },
96
+ { "code": "b", "value": "БОМБОРА Издательство," },
97
+ { "code": "c", "value": "2024." }
98
+ ]},
99
+ { "tag": "880", "ind1": "0", "ind2": " ", "subfields": [
100
+ { "code": "6", "value": "490-05" },
101
+ { "code": "a", "value": "Два сердца России. Подарочные издания" }
102
+ ]},
103
+ { "tag": "884", "ind1": " ", "ind2": " ", "subfields": [
104
+ { "code": "a", "value": "Helmet to Melinda MARC transformation" },
105
+ { "code": "g", "value": "20240903" },
106
+ { "code": "k", "value": "HELMET:6ab959d4b216289318aebf01167b80d38fa7a2d6844c5d55588823cb63dd1fe3" },
107
+ { "code": "q", "value": "FI-NL" },
108
+ { "code": "5", "value": "MELINDA" }
109
+ ]},
110
+ { "tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
111
+ { "code": "c", "value": "2587473" },
112
+ { "code": "b", "value": "helme" }
113
+ ]},
114
+ { "tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
115
+ { "code": "c", "value": "(ANDL100008)5557598" },
116
+ { "code": "b", "value": "piki" }
117
+ ]},
118
+ { "tag": "LOW", "ind1": " ", "ind2": " ", "subfields": [
119
+ { "code": "a", "value": "PIKI" }
120
+ ]},
121
+ { "tag": "CAT", "ind1": " ", "ind2": " ", "subfields": [
122
+ { "code": "a", "value": "IMP_HELMET" },
123
+ { "code": "b", "value": "30" },
124
+ { "code": "c", "value": "20240903" },
125
+ { "code": "l", "value": "FIN01" },
126
+ { "code": "h", "value": "1858" }
127
+ ]}
128
+
129
+ ]
130
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "description": "Fix MELINDA-10330, round 3: big file that had issues",
3
+ "comment": "Some sorting issues: SIDs are sorted by $c (bug) and LOW precedes SID...",
4
+ "only": false,
5
+ "fix": true,
6
+ "config": {
7
+ "doISO9Transliteration": true,
8
+ "doSFS4900Transliteration": true
9
+ }
10
+ }
@@ -0,0 +1,104 @@
1
+ {
2
+ "leader": "00000cam a22008174i 4500",
3
+ "fields": [
4
+ { "tag": "001", "value": "019168678" },
5
+ { "tag": "003", "value": "FI-MELINDA" },
6
+ { "tag": "005", "value": "20240909171519.0" },
7
+ { "tag": "008", "value": "240903s2024 ru a 000|0|rus|c" },
8
+ { "tag": "040", "ind1": " ", "ind2": " ", "subfields": [
9
+ { "code": "a", "value": "FI-He" },
10
+ { "code": "b", "value": "fin" },
11
+ { "code": "e", "value": "rda" },
12
+ { "code": "d", "value": "FI-Piki" }
13
+ ]},
14
+ { "tag": "041", "ind1": "0", "ind2": " ", "subfields": [
15
+ { "code": "a", "value": "rus" }
16
+ ]},
17
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
18
+ { "code": "6", "value": "880-01" },
19
+ { "code": "a", "value": "Moskalenko, N. V.," },
20
+ { "code": "e", "value": "kirjoittaja." }
21
+ ]},
22
+ { "tag": "245", "ind1": "1", "ind2": "0", "subfields": [
23
+ { "code": "6", "value": "880-02" },
24
+ { "code": "a", "value": "Sekrety peterburgskih dvortsov :" },
25
+ { "code": "b", "value": "ih tainy, simvoly i sozdateli /" },
26
+ { "code": "c", "value": "Moskalenko N.V." }
27
+ ]},
28
+ { "tag": "246", "ind1": "3", "ind2": "0", "subfields": [
29
+ { "code": "6", "value": "880-03" },
30
+ { "code": "a", "value": "Ih tainy, simvoly i sozdateli" }
31
+ ]},
32
+ { "tag": "246", "ind1": "3", "ind2": " ", "subfields": [
33
+ { "code": "a", "value": "Sekrety peterburgskih dvorcov" }
34
+ ]},
35
+ { "tag": "264", "ind1": " ", "ind2": "1", "subfields": [
36
+ { "code": "6", "value": "880-04" },
37
+ { "code": "a", "value": "Moskva :" },
38
+ { "code": "b", "value": "BOMBORA," },
39
+ { "code": "c", "value": "2024." }
40
+ ]},
41
+ { "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
42
+ { "code": "a", "value": "204 sivua" }
43
+ ]},
44
+ { "tag": "336", "ind1": " ", "ind2": " ", "subfields": [
45
+ { "code": "a", "value": "teksti" },
46
+ { "code": "b", "value": "txt" },
47
+ { "code": "2", "value": "rdacontent" }
48
+ ]},
49
+ { "tag": "490", "ind1": "0", "ind2": " ", "subfields": [
50
+ { "code": "6", "value": "880-05" },
51
+ { "code": "a", "value": "Dva serdtsa Rossii. Podarochnye izdanija" }
52
+ ]},
53
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
54
+ { "code": "6", "value": "100-01" },
55
+ { "code": "a", "value": "Москаленко, Н. В." },
56
+ { "code": "e", "value": "kirjoittaja." }
57
+ ]},
58
+ { "tag": "880", "ind1": "1", "ind2": "0", "subfields": [
59
+ { "code": "6", "value": "245-02" },
60
+ { "code": "a", "value": "Секреты петербургских дворцов :" },
61
+ { "code": "b", "value": "их тайны, символы и создатели /" },
62
+ { "code": "c", "value": "Москаленко Н.В." }
63
+ ]},
64
+ { "tag": "880", "ind1": "3", "ind2": "0", "subfields": [
65
+ { "code": "6", "value": "246-03" },
66
+ { "code": "a", "value": "Их тайны, символы и создатели" }
67
+ ]},
68
+ { "tag": "880", "ind1": " ", "ind2": "1", "subfields": [
69
+ { "code": "6", "value": "264-04" },
70
+ { "code": "a", "value": "Москва :" },
71
+ { "code": "b", "value": "БОМБОРА Издательство," },
72
+ { "code": "c", "value": "2024." }
73
+ ]},
74
+ { "tag": "880", "ind1": "0", "ind2": " ", "subfields": [
75
+ { "code": "6", "value": "490-05" },
76
+ { "code": "a", "value": "Два сердца России. Подарочные издания" }
77
+ ]},
78
+ { "tag": "884", "ind1": " ", "ind2": " ", "subfields": [
79
+ { "code": "a", "value": "Helmet to Melinda MARC transformation" },
80
+ { "code": "g", "value": "20240903" },
81
+ { "code": "k", "value": "HELMET:6ab959d4b216289318aebf01167b80d38fa7a2d6844c5d55588823cb63dd1fe3" },
82
+ { "code": "q", "value": "FI-NL" },
83
+ { "code": "5", "value": "MELINDA" }
84
+ ]},
85
+ { "tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
86
+ { "code": "c", "value": "2587473" },
87
+ { "code": "b", "value": "helme" }
88
+ ]},
89
+ { "tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
90
+ { "code": "c", "value": "(ANDL100008)5557598" },
91
+ { "code": "b", "value": "piki" }
92
+ ]},
93
+ { "tag": "CAT", "ind1": " ", "ind2": " ", "subfields": [
94
+ { "code": "a", "value": "IMP_HELMET" },
95
+ { "code": "b", "value": "30" },
96
+ { "code": "c", "value": "20240903" },
97
+ { "code": "l", "value": "FIN01" },
98
+ { "code": "h", "value": "1858" }
99
+ ]},
100
+ { "tag": "LOW", "ind1": " ", "ind2": " ", "subfields": [
101
+ { "code": "a", "value": "PIKI" }
102
+ ]}
103
+ ]
104
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "01331cam a22003494i 4500",
4
+ "fields": [
5
+ { "tag": "001", "value": "000000001" },
6
+ { "tag": "787", "ind1": "0", "ind2": "8", "subfields": [
7
+ { "code": "i", "value": "Arvosteltu teos:" },
8
+ { "code": "a", "value": "Joku halvatun tekijä." },
9
+ { "code": "t", "value": "Nimeke." },
10
+ { "code": "z", "value": "1234567890" },
11
+ { "code": "w", "value": "(FI-MELINDA)012345678"}
12
+ ]}
13
+ ]
14
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "description":"Add punctuation from 787",
3
+ "fix": true,
4
+ "only": false
5
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "leader": "01331cam a22003494i 4500",
3
+ "fields": [
4
+ { "tag": "001", "value": "000000001" },
5
+ { "tag": "787", "ind1": "0", "ind2": "8", "subfields": [
6
+ { "code": "i", "value": "Arvosteltu teos" },
7
+ { "code": "a", "value": "Joku halvatun tekijä" },
8
+ { "code": "t", "value": "Nimeke" },
9
+ { "code": "z", "value": "1234567890" },
10
+ { "code": "w", "value": "(FI-MELINDA)012345678"}
11
+ ]}
12
+ ]
13
+ }
@@ -3,24 +3,25 @@
3
3
  "fields":
4
4
  [
5
5
  {"tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
6
- {"code": "c", "value": "hanna"},
7
- {"code": "b", "value": "30"}
6
+ {"code": "c", "value": "30"},
7
+ {"code": "b", "value": "hanna"}
8
8
  ]},
9
9
  {"tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
10
- {"code": "c", "value": "alli"},
11
- {"code": "b", "value": "4"}
10
+ {"code": "c", "value": "4"},
11
+ {"code": "b", "value": "alli"}
12
12
  ]},
13
13
  {"tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
14
- {"code": "c", "value": "helka"},
15
- {"code": "b", "value": "4"}
14
+ {"code": "c", "value": "4"},
15
+ {"code": "b", "value": "helka"}
16
16
  ]},
17
17
  {"tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
18
- {"code": "c", "value": "wilma"},
19
- {"code": "b", "value": "666"}
18
+ {"code": "c", "value": "666"},
19
+ {"code": "b", "value": "wilma"}
20
20
  ]},
21
21
  {"tag": "SID", "ind1": " ", "ind2": " ", "subfields": [
22
- {"code": "c", "value": "taist"},
23
- {"code": "b", "value": "999999999"}
22
+ {"code": "c", "value": "999999999"},
23
+ {"code": "b", "value": "taist"}
24
+
24
25
  ]},
25
26
  {"tag": "LOW", "subfields": [{"code": "a", "value": "TEST"}]}
26
27
  ]