@larsgw/formica 0.10.4 → 0.10.5

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.
@@ -161,7 +161,7 @@ function getCoveringTaxon(taxa, allTaxa) {
161
161
  }
162
162
  }
163
163
  if (!ancestors.length) {
164
- return null;
164
+ return makeTaxonUri('T141')['@id'];
165
165
  }
166
166
  const ancestor = ancestors[ancestors.length - 1];
167
167
  const ancestorEntity = allTaxa.find(taxon => taxon.get('col') === ancestor);
@@ -197,6 +197,9 @@ function makeColUri(id) {
197
197
  function makeWorkUri(id) {
198
198
  return { '@id': `${PREFIX}catalog/${id}` };
199
199
  }
200
+ function makeResourceUri(id) {
201
+ return { '@id': `${PREFIX}resource/${id}` };
202
+ }
200
203
  function makeTaxonUri(id) {
201
204
  return { '@id': `${PREFIX}taxon/${id}` };
202
205
  }
@@ -400,12 +403,13 @@ function makeLinkedDataForResource(work, files, resourceId) {
400
403
  resourceId = `${work.get('id')}:0`;
401
404
  }
402
405
  if (files.resources[resourceId] && files.resources[resourceId].metadata.catalog) {
403
- resource.fields = files.resources[resourceId].metadata.catalog;
406
+ resource.fields = Object.assign({}, files.resources[resourceId].metadata.catalog);
404
407
  }
405
408
  if (!resource.has('language')) {
406
409
  resource.fields.language = work.get('language');
407
410
  }
408
- const node = Object.assign(Object.assign({}, makeLinkedDataForWork(resource, files)), { '@id': `${PREFIX}resource/${resourceId}`, '@type': 'bibo:DocumentPart' });
411
+ resource.fields.id = resourceId;
412
+ const node = Object.assign(Object.assign({}, makeLinkedDataForWork(resource, files, makeResourceUri)), { '@type': 'bibo:DocumentPart' });
409
413
  const types = (_b = (_a = resource.get('key_type')) !== null && _a !== void 0 ? _a : work.get('key_type')) !== null && _b !== void 0 ? _b : [];
410
414
  if (types.includes('matrix') || types.includes('algorithm')) {
411
415
  node['dcterms:type'] = { '@id': 'http://purl.org/dc/dcmitype/Software' };
@@ -489,9 +493,9 @@ function makeLinkedDataForResource(work, files, resourceId) {
489
493
  }
490
494
  return node;
491
495
  }
492
- function makeLinkedDataForWork(work, files) {
496
+ function makeLinkedDataForWork(work, files, makeUri = makeWorkUri) {
493
497
  const id = work.get('id');
494
- const node = makeWorkUri(id);
498
+ const node = makeUri(id);
495
499
  node['@reverse'] = {};
496
500
  const languages = work.get('language');
497
501
  node['dcterms:language'] = languages.map(language => ({ '@id': `http://id.loc.gov/vocabulary/iso639-1/${language}` }));
@@ -624,30 +628,30 @@ function makeLinkedDataForWork(work, files) {
624
628
  if (work.has('part_of')) {
625
629
  const containers = work.get('part_of');
626
630
  if (work.get('key_type').includes('supplement')) {
627
- node['bibo:annotates'] = containers.map(makeWorkUri);
631
+ node['bibo:annotates'] = containers.map(makeUri);
628
632
  }
629
633
  else {
630
- node['dcterms:isPartOf'] = containers.map(makeWorkUri);
634
+ node['dcterms:isPartOf'] = containers.map(makeUri);
631
635
  for (const container of containers) {
632
636
  if (!Array.isArray(node['@reverse']['dcterms:hasPart'])) {
633
637
  node['@reverse']['dcterms:hasPart'] = [];
634
638
  }
635
- node['@reverse']['dcterms:hasPart'].push(makeWorkUri(container));
639
+ node['@reverse']['dcterms:hasPart'].push(makeUri(container));
636
640
  }
637
641
  }
638
642
  }
639
643
  if (work.has('listed_in')) {
640
644
  const referers = work.get('listed_in');
641
- node['bibo:citedBy'] = node['dcterms:isReferencedBy'] = referers.map(makeWorkUri);
645
+ node['bibo:citedBy'] = node['dcterms:isReferencedBy'] = referers.map(makeUri);
642
646
  for (const referer of referers) {
643
647
  if (!Array.isArray(node['@reverse']['bibo:cites'])) {
644
648
  node['@reverse']['bibo:cites'] = [];
645
649
  }
646
- node['@reverse']['bibo:cites'].push(makeWorkUri(referer));
650
+ node['@reverse']['bibo:cites'].push(makeUri(referer));
647
651
  if (!Array.isArray(node['@reverse']['dcterms:references'])) {
648
652
  node['@reverse']['dcterms:references'] = [];
649
653
  }
650
- node['@reverse']['dcterms:references'].push(makeWorkUri(referer));
654
+ node['@reverse']['dcterms:references'].push(makeUri(referer));
651
655
  }
652
656
  }
653
657
  if (work.has('version_of')) {
@@ -665,8 +669,8 @@ function makeLinkedDataForWork(work, files) {
665
669
  }
666
670
  return language;
667
671
  });
668
- node['bibo:translationOf'] = originals.filter((_, i) => originalLanguages[i] !== languages.join()).map(makeWorkUri);
669
- node['dcterms:isVersionOf'] = originals.filter(id => work.get('id') !== id).map(makeWorkUri);
672
+ node['bibo:translationOf'] = originals.filter((_, i) => originalLanguages[i] !== languages.join()).map(makeUri);
673
+ node['dcterms:isVersionOf'] = originals.filter(id => work.get('id') !== id).map(makeUri);
670
674
  }
671
675
  return node;
672
676
  }
@@ -733,6 +737,12 @@ class Writer {
733
737
  if (this.format === 'jsonld') {
734
738
  process.stdout.write(' null\n ]\n}\n');
735
739
  }
740
+ else if (this.format === 'nquads') {
741
+ // no ending required
742
+ }
743
+ else {
744
+ this.n3parser.end();
745
+ }
736
746
  }
737
747
  }
738
748
  function main() {
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ const path = __importStar(require("path"));
50
+ const fs_1 = require("fs");
51
+ const n3_1 = __importDefault(require("n3"));
52
+ const shape_map_1 = require("shape-map");
53
+ const shex_1 = __importDefault(require("shex"));
54
+ const neighborhood_rdfjs_1 = require("@shexjs/neighborhood-rdfjs");
55
+ const ShExParser = __importStar(require("@shexjs/parser"));
56
+ const SCHEMA_PATH = 'docs/linked-data/shape.shex';
57
+ const SHAPEMAP_PATH = 'docs/linked-data/shapeMap.sm';
58
+ const BASE = 'https://identification-resources.github.io/assets/data/';
59
+ const SCHEMA_BASE = BASE + SCHEMA_PATH;
60
+ const SHAPEMAP_BASE = BASE + SHAPEMAP_PATH;
61
+ const DATA_BASE = BASE;
62
+ function loadData(path) {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const parser = new n3_1.default.Parser();
65
+ const file = yield fs_1.promises.readFile(path, 'utf8');
66
+ const data = new n3_1.default.Store(parser.parse(file));
67
+ return (0, neighborhood_rdfjs_1.ctor)(data);
68
+ });
69
+ }
70
+ function loadSchema(path) {
71
+ return __awaiter(this, void 0, void 0, function* () {
72
+ const parser = ShExParser.construct(SCHEMA_BASE);
73
+ const file = yield fs_1.promises.readFile(path, 'utf8');
74
+ const schema = parser.parse(file, SCHEMA_BASE);
75
+ return schema;
76
+ });
77
+ }
78
+ function loadShapeMap(path) {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ const parser = shape_map_1.Parser.construct(SHAPEMAP_BASE, { base: SCHEMA_BASE }, { base: DATA_BASE });
81
+ const file = yield fs_1.promises.readFile(path, 'utf8');
82
+ const shapeMap = parser.parse(file);
83
+ return shapeMap;
84
+ });
85
+ }
86
+ function resolveShapeMap(shapeMap, db) {
87
+ var _a;
88
+ const pairs = [];
89
+ for (const part of shapeMap) {
90
+ if (typeof part.node === 'string') {
91
+ pairs.push(part);
92
+ }
93
+ else if (part.node.type === 'TriplePattern') {
94
+ const focusSubject = typeof part.node.subject === 'object' && ((_a = part.node.subject) === null || _a === void 0 ? void 0 : _a.term) === shape_map_1.Focus.term;
95
+ const subject = typeof part.node.subject === 'string' ? part.node.subject : null;
96
+ const object = typeof part.node.object === 'string' ? part.node.object : null;
97
+ const quads = db.getQuads(subject, part.node.predicate, object, null);
98
+ for (const quad of quads) {
99
+ pairs.push({
100
+ node: focusSubject ? quad.subject.id : quad.object.id,
101
+ shape: part.shape
102
+ });
103
+ }
104
+ }
105
+ else {
106
+ throw new Error(`Shape map type not supported: "${part.node.type}"`);
107
+ }
108
+ }
109
+ return pairs;
110
+ }
111
+ function main(args) {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ const [base, data] = args.map(arg => path.resolve(arg));
114
+ const db = yield loadData(data);
115
+ const schema = yield loadSchema(path.join(base, SCHEMA_PATH));
116
+ const shapeMap = yield loadShapeMap(path.join(base, SHAPEMAP_PATH));
117
+ const nodePairs = resolveShapeMap(shapeMap, db);
118
+ const validator = new shex_1.default.Validator(schema, db);
119
+ const results = validator.validateShapeMap(nodePairs);
120
+ let successes = 0;
121
+ for (const result of results) {
122
+ if (!result.appinfo.errors) {
123
+ successes++;
124
+ continue;
125
+ }
126
+ console.error('===', result.node, '===');
127
+ console.error(JSON.stringify(result.appinfo, null, 2));
128
+ }
129
+ console.error(`Success: ${successes}/${nodePairs.length}`);
130
+ });
131
+ }
132
+ main(process.argv.slice(2));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@larsgw/formica",
3
- "version": "0.10.4",
3
+ "version": "0.10.5",
4
4
  "description": "SDK and tools for data from the Library of Identification Resources",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -11,6 +11,7 @@
11
11
  "loir-validate-catalog": "lib/bin/validate-catalog.js",
12
12
  "loir-validate-resources": "lib/bin/validate-resources-text.js",
13
13
  "loir-validate-integrity": "lib/bin/validate-integrity.js",
14
+ "loir-validate-linked-data": "lib/bin/validate-linked-data.js",
14
15
  "loir-resources-process": "lib/bin/process-resources.js",
15
16
  "loir-resources-index": "lib/bin/process-resources-index.js",
16
17
  "loir-resources-check-diff": "lib/bin/check-resources-diff.js",
@@ -40,6 +41,7 @@
40
41
  "js-yaml": "^5.2.1",
41
42
  "jsonld": "^9.0.0",
42
43
  "n3": "^2.1.1",
44
+ "shex": "^1.0.0-alpha.30",
43
45
  "spdx-license-list": "^6.6.0"
44
46
  },
45
47
  "devDependencies": {