@larsgw/formica 0.9.2 → 0.10.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.
Files changed (50) hide show
  1. package/lib/bin/process-resources-index.js +0 -0
  2. package/lib/bin/process-resources.d.ts +6 -1
  3. package/lib/bin/process-resources.js +116 -25
  4. package/lib/bin/validate-catalog.js +0 -0
  5. package/lib/bin/validate-resources-text.js +3 -1
  6. package/lib/resources/parse-text.js +6 -3
  7. package/lib/taxon-names/index.js +1 -1
  8. package/package.json +15 -13
  9. package/.gitattributes +0 -1
  10. package/.github/workflows/ci.yml +0 -27
  11. package/CHANGELOG.md +0 -390
  12. package/eslint.config.js +0 -34
  13. package/lib/bin/SHEETS.js +0 -0
  14. package/lib/bin/clean-links.d.ts +0 -2
  15. package/lib/bin/clean-links.js +0 -170
  16. package/lib/bin/download-place-shapes.js +0 -188
  17. package/lib/bin/index-place-shapes.js +0 -115
  18. package/lib/bin/process-resources-problems.js +0 -177
  19. package/lib/bin/validate-linked-data.js +0 -0
  20. package/lib/resources/content/clavis.js +0 -10
  21. package/lib/resources/content/index.js +0 -0
  22. package/lib/resources/content/sdd.js +0 -151
  23. package/lib/resources/sdd.js +0 -78
  24. package/src/bin/generate-linked-data.ts +0 -762
  25. package/src/bin/process-resources-index.ts +0 -100
  26. package/src/bin/process-resources.ts +0 -510
  27. package/src/bin/util.ts +0 -74
  28. package/src/bin/validate-catalog.ts +0 -122
  29. package/src/bin/validate-resources-text.ts +0 -25
  30. package/src/catalog/entities.ts +0 -62
  31. package/src/catalog/entity.ts +0 -116
  32. package/src/catalog/index.ts +0 -33
  33. package/src/catalog/tables/author.ts +0 -15
  34. package/src/catalog/tables/index.ts +0 -14
  35. package/src/catalog/tables/place.ts +0 -14
  36. package/src/catalog/tables/publisher.ts +0 -15
  37. package/src/catalog/tables/taxon.ts +0 -17
  38. package/src/catalog/tables/work.ts +0 -65
  39. package/src/catalog/value.ts +0 -51
  40. package/src/csv.ts +0 -33
  41. package/src/index.ts +0 -4
  42. package/src/module.d.ts +0 -148
  43. package/src/resources/diff-resource.ts +0 -226
  44. package/src/resources/index.ts +0 -4
  45. package/src/resources/parse-name.ts +0 -392
  46. package/src/resources/parse-text.ts +0 -408
  47. package/src/resources/resource.ts +0 -10
  48. package/src/taxon-names/index.ts +0 -79
  49. package/test/resources.js +0 -374
  50. package/tsconfig.json +0 -15
package/test/resources.js DELETED
@@ -1,374 +0,0 @@
1
- const { suite, test } = require('node:test')
2
- const assert = require('assert')
3
-
4
- const { catalog, resources } = require('../lib')
5
-
6
- suite('catalog', () => {
7
- test('reports missing required fields', () => {
8
- const errors = catalog.loadData(`id
9
- B1`, 'catalog').validate()
10
- assert.deepStrictEqual(errors, [
11
- { entity: 'B1', field: 'title', error: 'Value(s) required but missing' },
12
- { entity: 'B1', field: 'entry_type', error: 'Value(s) required but missing' },
13
- { entity: 'B1', field: 'language', error: 'Value(s) required but missing' },
14
- { entity: 'B1', field: 'key_type', error: 'Value(s) required but missing' },
15
- { entity: 'B1', field: 'taxon', error: 'Value(s) required but missing' },
16
- { entity: 'B1', field: 'region', error: 'Value(s) required but missing' }
17
- ])
18
- })
19
- })
20
-
21
- suite('resources', () => {
22
- test('parses author with initials', () => {
23
- const [resource] = resources.parseTextFile(`---
24
- levels: [family, genus, species]
25
- ---
26
-
27
- Dolichurus haemorrhous A. Costa, 1886
28
- Dolichurus A. Costa, 1886
29
- [indet]
30
- Sphecidae A. Costa, 1886
31
- [indet]
32
- `, 'T1')
33
- assert.deepStrictEqual(Object.values(resource.taxa).map(taxon => taxon.scientificNameAuthorship), Array(3).fill('A. Costa, 1886'))
34
- })
35
-
36
- test('parses synonyms starting with intraspecific ranks', () => {
37
- const [resource] = resources.parseTextFile(`---
38
- levels: [species]
39
- ---
40
-
41
- Lygaeus equestris (Linnaeus, 1758)
42
- = f. lactans Horváth, 1899
43
- `, 'T1')
44
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Lygaeus equestris f. lactans Horváth, 1899')
45
- })
46
-
47
- test('parses accepted taxa starting with intraspecific ranks', () => {
48
- const [resource] = resources.parseTextFile(`---
49
- levels: [species, form]
50
- ---
51
-
52
- Lygaeus equestris (Linnaeus, 1758)
53
- f. lactans Horváth, 1899
54
- `, 'T1')
55
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Lygaeus equestris f. lactans Horváth, 1899')
56
- })
57
-
58
- test('parses names containing non-ASCII characters', () => {
59
- const [resource] = resources.parseTextFile(`---
60
- levels: [species]
61
- ---
62
-
63
- Nematus fåhraei Thomson
64
- `, 'T1')
65
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Nematus fåhraei Thomson')
66
- })
67
-
68
- test('parses synonyms in different genera', () => {
69
- const [resource] = resources.parseTextFile(`---
70
- levels: [species]
71
- ---
72
-
73
- Katamenes arbustorum subsp. burlinii
74
- > arbustorum subsp. burlinii
75
- = Eumenes arbustorum var. burlinii
76
- `, 'T1')
77
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Eumenes arbustorum var. burlinii')
78
- })
79
-
80
- test('parses species without generic names', () => {
81
- const [resource] = resources.parseTextFile(`---
82
- levels: [genus, subgenus, species]
83
- ---
84
-
85
- Microdynerus Thomson, 1874
86
- Alastorynerus Blüthgen, 1938
87
- microdynerus (Dalla Torre, 1889)
88
- `, 'T1')
89
- assert.strictEqual(resource.taxa['T1:1:3'].scientificName, 'Microdynerus microdynerus (Dalla Torre, 1889)')
90
- })
91
-
92
- test('parses hybrids', () => {
93
- const [resource] = resources.parseTextFile(`---
94
- levels: [species]
95
- ---
96
-
97
- Rumex conglomeratus x maritimus
98
- Tilia x vulgaris
99
- `, 'T1')
100
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Rumex conglomeratus×maritimus')
101
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Tilia ×vulgaris')
102
- })
103
-
104
- test('parses cross-genus hybrids', () => {
105
- const [resource] = resources.parseTextFile(`---
106
- levels: [genus, species]
107
- ---
108
-
109
- x Triticosecale
110
- [indet]
111
- x Festulpia
112
- Festuca_rubra x Vulpia_bromoides
113
- `, 'T1')
114
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, '×Triticosecale')
115
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, '×Festulpia')
116
- assert.strictEqual(resource.taxa['T1:1:3'].scientificName, '×Festulpia Festuca rubra×Vulpia bromoides')
117
- })
118
-
119
- test('parses cross-genus hybrids without parent context', () => {
120
- const [resource] = resources.parseTextFile(`---
121
- levels: [species]
122
- ---
123
-
124
- x Festulpia Festuca_rubra x Vulpia_bromoides
125
- `, 'T1')
126
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, '×Festulpia Festuca rubra×Vulpia bromoides')
127
- assert.strictEqual(resource.taxa['T1:1:1'].verbatimIdentification, '× Festulpia Festuca rubra × Vulpia bromoides')
128
- })
129
-
130
- test('handles skips in ranks', () => {
131
- const [resource] = resources.parseTextFile(`---
132
- levels: [family, genus, species]
133
- ---
134
-
135
- Apidae
136
- Apis mellifera
137
- `, 'T1')
138
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Apis mellifera')
139
- assert.strictEqual(resource.taxa['T1:1:2'].genus, 'Apis')
140
- assert.strictEqual(resource.taxa['T1:1:2'].taxonRank, 'species')
141
- })
142
-
143
- test('parses genera with subgenus-rank synonyms', () => {
144
- const [resource] = resources.parseTextFile(`---
145
- levels: [genus]
146
- ---
147
-
148
- Ectemnius Dahlbom
149
- = Crabro (Ectemnius) Dahlbom
150
- `, 'T1')
151
- assert.strictEqual(resource.taxa['T1:1:2'].taxonRank, 'subgenus')
152
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Ectemnius Dahlbom')
153
- assert.strictEqual(resource.taxa['T1:1:2'].genericName, 'Crabro')
154
- })
155
-
156
- test('parses genera with like-name subgenera', () => {
157
- const [resource] = resources.parseTextFile(`---
158
- levels: [genus, subgenus]
159
- ---
160
-
161
- Polistes Latreille, 1802
162
- Polistes Latreille, 1802
163
- `, 'T1')
164
- assert.strictEqual(resource.taxa['T1:1:2'].taxonRank, 'subgenus')
165
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Polistes Latreille, 1802')
166
- assert.strictEqual(resource.taxa['T1:1:2'].genericName, 'Polistes')
167
- })
168
-
169
- test('handles clusters', () => {
170
- const [resource] = resources.parseTextFile(`---
171
- levels: [genus, species]
172
- ---
173
-
174
- Eurydema Laporte, 1833
175
- oleracea (Linnaeus, 1758)
176
- [1] rotundicollis (Dohrn, 1860)
177
- [1] fieberi Schummel, 1837
178
- [2] ornata (Linnaeus, 1758)
179
- [2] ventralis Kolenati, 1846
180
- [_] eckerleini Josifov, 1961
181
- `, 'T1')
182
- assert.strictEqual(resource.taxa['T1:1:2'].dynamicProperties, undefined)
183
- assert.strictEqual(resource.taxa['T1:1:3'].dynamicProperties, '{"indistinguishableFrom":["T1:1:4"]}')
184
- assert.strictEqual(resource.taxa['T1:1:4'].dynamicProperties, '{"indistinguishableFrom":["T1:1:3"]}')
185
- assert.strictEqual(resource.taxa['T1:1:5'].dynamicProperties, '{"indistinguishableFrom":["T1:1:6"]}')
186
- assert.strictEqual(resource.taxa['T1:1:6'].dynamicProperties, '{"indistinguishableFrom":["T1:1:5"]}')
187
- assert.strictEqual(resource.taxa['T1:1:7'].dynamicProperties, '{"identifiable":false}')
188
- })
189
-
190
- suite('leaf taxa checks', () => {
191
- test('errors for missing leaf taxa', () => {
192
- assert.throws(() => {
193
- resources.parseTextFile(`---
194
- levels: [family, genus, species]
195
- ---
196
-
197
- Cydnidae
198
- Cydnidae
199
- Legnotus
200
- limbosus`, 'T1')
201
- })
202
- })
203
-
204
- test('does not validate "indet." lines', () => {
205
- const [resource] = resources.parseTextFile(`---
206
- levels: [genus, species]
207
- ---
208
-
209
- Drymus
210
- [indet]
211
- `, 'T1')
212
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Drymus')
213
- })
214
-
215
- test('synonyms do not break recognition of missing leaf taxa (1)', () => {
216
- const [resource] = resources.parseTextFile(`---
217
- levels: [genus, subgenus, species]
218
- ---
219
-
220
- Bombus
221
- = Psithyrus
222
- Bombus
223
- pascuorum
224
- `, 'T1')
225
- assert.strictEqual(resource.taxa['T1:1:4'].scientificName, 'Bombus pascuorum')
226
- })
227
-
228
- test('synonyms do not break recognition of missing leaf taxa (2)', () => {
229
- assert.throws(() => {
230
- resources.parseTextFile(`---
231
- levels: [genus, subgenus, species]
232
- ---
233
-
234
- Bombus
235
- Psithyrus
236
- = Psithirus
237
- Bombus
238
- pascuorum
239
- `, 'T1')
240
- })
241
- })
242
-
243
- test('synonyms do not break recognition of missing leaf taxa (3)', () => {
244
- assert.throws(() => {
245
- resources.parseTextFile(`---
246
- levels: [family, genus, species]
247
- ---
248
-
249
- Acanthosomidae
250
- = Acanthosomatidae
251
- Cydnidae
252
- Legnotus
253
- limbosus
254
- `, 'T1')
255
- })
256
- })
257
- })
258
-
259
- suite('corrections', () => {
260
- test('outputs corrected generic names', () => {
261
- const [resource] = resources.parseTextFile(`---
262
- levels: [genus, species]
263
- ---
264
-
265
- Bogdania Kerzhner, 1964
266
- > Bogdiana Kerzhner, 1964
267
- myrmica Kerzhner, 1964
268
- `, 'T1')
269
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Bogdiana Kerzhner, 1964')
270
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Bogdiana myrmica Kerzhner, 1964')
271
- })
272
-
273
- test('does not validate name with correction', () => {
274
- const [resource] = resources.parseTextFile(`---
275
- levels: [species]
276
- ---
277
-
278
- Clytochrysus lapidarius (Panzer, 1804)
279
- = Crabo chrysostomus Lepeletier & Brullé, 1835
280
- > Crabro chrysostomus Lepeletier & Brullé, 1835
281
- `, 'T1')
282
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Clytochrysus lapidarius (Panzer, 1804)')
283
- })
284
-
285
- test('parses invalid but corrected name', () => {
286
- const [resource] = resources.parseTextFile(`---
287
- levels: [species]
288
- ---
289
-
290
- Crabro Kiesenwetteri A. Morawitz. 1866
291
- > Crabro kiesenwetteri A. Morawitz. 1866
292
- `, 'T1')
293
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Crabro kiesenwetteri A. Morawitz. 1866')
294
- assert.strictEqual(resource.taxa['T1:1:1'].scientificNameAuthorship, 'A. Morawitz. 1866')
295
- assert.strictEqual(resource.taxa['T1:1:1'].verbatimIdentification, 'Crabro Kiesenwetteri A. Morawitz. 1866')
296
- })
297
-
298
- test('parses children of invalid but corrected name', () => {
299
- const [resource] = resources.parseTextFile(`---
300
- levels: [genus, species]
301
- ---
302
-
303
- Pirus L.
304
- > Pyrus L.
305
- aucuparia Gaertn.
306
- Pirus domestica Sm.
307
- Pirus aria Ehrh.
308
- > Pyrus aria Ehrh.
309
- `, 'T1')
310
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Pyrus aucuparia Gaertn.')
311
- assert.strictEqual(resource.taxa['T1:1:3'].scientificName, 'Pyrus domestica Sm.')
312
- assert.strictEqual(resource.taxa['T1:1:4'].scientificName, 'Pyrus aria Ehrh.')
313
- })
314
-
315
- test('does not keep parts of invalid but corrected name', () => {
316
- const [resource] = resources.parseTextFile(`---
317
- levels: [species]
318
- ---
319
-
320
- Scolia 5-punctata FABRICIUS, 1781
321
- > Scolia quinquepunctata FABRICIUS, 1781
322
- `, 'T1')
323
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Scolia quinquepunctata Fabricius, 1781')
324
- assert.strictEqual(resource.taxa['T1:1:1'].verbatimIdentification, 'Scolia 5-punctata FABRICIUS, 1781')
325
- })
326
-
327
- test('make correct diff when last line changes', () => {
328
- const newText = `---
329
- levels: [species]
330
- ---
331
-
332
- Bittacus Hageni Brauer
333
- > Bittacus hageni Brauer
334
- `
335
- const oldText = `---
336
- levels: [genus, species]
337
- ---
338
-
339
- Bittacus hageni Brauer
340
- `
341
-
342
- const [resource] = resources.parseTextFile(newText, 'T1', { txt: oldText, dwc: [[null, ['T:1:1'], ['T:1:2']]] })
343
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Bittacus hageni Brauer')
344
- assert.strictEqual(resource.taxa['T1:1:1'].verbatimIdentification, 'Bittacus Hageni Brauer')
345
- })
346
-
347
- test('corrections of synonyms are correctly applied', () => {
348
- const [resource] = resources.parseTextFile(`---
349
- levels: [genus, subgenus, species]
350
- ---
351
-
352
- Lasius F.
353
- = Domisthorpea Mor. & Drnt., 1915
354
- > Donisthorpea Mor. & Drnt., 1915
355
- fuliginosus Latr.
356
- `, 'T1')
357
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Donisthorpea Mor. & Drnt., 1915')
358
- assert.strictEqual(resource.taxa['T1:1:3'].scientificName, 'Lasius fuliginosus Latr.')
359
- })
360
-
361
- test('corrections are correctly applied', () => {
362
- const [resource] = resources.parseTextFile(`---
363
- levels: [genus, species]
364
- ---
365
-
366
- Neopachygaster Austin, 1901
367
- > Neopachygaster Austen, 1901
368
- meromelas (Dufour, 1841)
369
- `, 'T1')
370
- assert.strictEqual(resource.taxa['T1:1:1'].scientificName, 'Neopachygaster Austen, 1901')
371
- assert.strictEqual(resource.taxa['T1:1:2'].scientificName, 'Neopachygaster meromelas (Dufour, 1841)')
372
- })
373
- })
374
- })
package/tsconfig.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "outDir": "./lib",
4
- "target": "es6",
5
-
6
- "noImplicitAny": true,
7
- "strictNullChecks": true,
8
- "noImplicitThis": true,
9
-
10
- "module": "commonjs",
11
- "moduleResolution": "node10",
12
- "esModuleInterop": true
13
- },
14
- "include": ["./src/**/*"]
15
- }