changeset 9:26d3e4860adc

working on porting graph_view to n3.js. also working on making tests run
author drewp@bigasterisk.com
date Fri, 06 Dec 2019 09:19:43 -0800
parents 6fefd287aff9
children 1c3a39057b11
files package-lock.json package.json src/graph_view.ts src/streamed-graph.ts src/streamed_graph_client.ts tasks.py
diffstat 6 files changed, 97 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/package-lock.json	Thu Dec 05 01:32:13 2019 -0800
+++ b/package-lock.json	Fri Dec 06 09:19:43 2019 -0800
@@ -217,6 +217,11 @@
         "@types/node": "*"
       }
     },
+    "@types/jasmine": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.0.tgz",
+      "integrity": "sha512-kGCRI9oiCxFS6soGKlyzhMzDydfcPix9PpTkr7h11huxOxhWwP37Tg7DYBaQ18eQTNreZEuLkhpbGSqVNZPnnw=="
+    },
     "@types/jsonld": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.0.tgz",
@@ -234,6 +239,16 @@
       "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
       "dev": true
     },
+    "@types/n3": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.1.1.tgz",
+      "integrity": "sha512-Vl18OW3L7L3o++K4qnJQutzEWPTKADFjm/yGYGtpx03neEV/00tCzuyC3hd8pcINne46o0fT6LF1IYCfcR9HDA==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/rdf-js": "*"
+      }
+    },
     "@types/node": {
       "version": "12.12.14",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz",
@@ -252,6 +267,15 @@
       "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==",
       "dev": true
     },
+    "@types/rdf-js": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@types/rdf-js/-/rdf-js-2.0.4.tgz",
+      "integrity": "sha512-JPeHNs5ioxSqv4aVddCw7eEJVA37zz6O15l8ACCT6cDJa/q6pnbCk8Ti30hIJJn4oV6r0lDI5uzTd/UQynEBCg==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@types/serve-static": {
       "version": "1.13.3",
       "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz",
@@ -764,8 +788,7 @@
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
     "base": {
       "version": "0.11.2",
@@ -864,7 +887,6 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -1247,8 +1269,7 @@
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "concat-stream": {
       "version": "1.6.2",
@@ -2154,6 +2175,11 @@
         "mime-types": "^2.1.12"
       }
     },
+    "fp-ts": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.2.0.tgz",
+      "integrity": "sha512-muJL9NOYluuoRezrvOyQvLAHIXrYg7u/Tc6cu4PP/Ed4TJKrm6BVSX8H1goT/4nhgP/yQ+Z4Xjjt4ijeKFX4Ng=="
+    },
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -2194,8 +2220,7 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "fsevents": {
       "version": "1.2.9",
@@ -2778,7 +2803,6 @@
       "version": "7.1.6",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -3085,7 +3109,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -3094,8 +3117,7 @@
     "inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
       "version": "1.3.5",
@@ -3321,6 +3343,20 @@
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
     },
+    "jasmine": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz",
+      "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==",
+      "requires": {
+        "glob": "^7.1.4",
+        "jasmine-core": "~3.5.0"
+      }
+    },
+    "jasmine-core": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz",
+      "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA=="
+    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3810,7 +3846,6 @@
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
@@ -3877,6 +3912,11 @@
         }
       }
     },
+    "monocle-ts": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/monocle-ts/-/monocle-ts-2.0.0.tgz",
+      "integrity": "sha512-vPM02WypUz0Xo2MtLUPgvdelCRn70VT05pdAB7qmHJSNY4CAoQt3ClpH77AG3yZk7PY8CA6++ezHcENUDOiuEA=="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -3957,6 +3997,11 @@
       "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
       "dev": true
     },
+    "newtype-ts": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/newtype-ts/-/newtype-ts-0.3.2.tgz",
+      "integrity": "sha512-1F5ff8LdXtMgcuy+t2F0q6b8VCt26YiXCw/YCSLacBBGH5N+fkFzNoRzvvP6JAjmFCb1Zcfyn0ZyJOCJIpTkKQ=="
+    },
     "nice-try": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -4113,7 +4158,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -4281,8 +4325,7 @@
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
     },
     "path-key": {
       "version": "2.0.1",
@@ -6246,8 +6289,7 @@
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "ws": {
       "version": "7.2.0",
--- a/package.json	Thu Dec 05 01:32:13 2019 -0800
+++ b/package.json	Fri Dec 06 09:19:43 2019 -0800
@@ -5,14 +5,20 @@
     "@polymer/polymer": "^3.3.1",
     "@types/async": "^3.0.3",
     "@types/eventsource": "^1.1.2",
+    "@types/jasmine": "^3.5.0",
     "@types/jsonld": "^1.5.0",
     "@webcomponents/webcomponentsjs": "^2.4.0",
     "async": "^3.1.0",
+    "fp-ts": "^2.2.0",
+    "jasmine": "^3.5.0",
     "jsonld": "^1.8.1",
     "lit-html": "^1.1.2",
-    "n3": "^1.3.4"
+    "monocle-ts": "^2.0.0",
+    "n3": "^1.3.4",
+    "newtype-ts": "^0.3.2"
   },
   "devDependencies": {
+    "@types/n3": "^1.1.1",
     "@types/node": "^12.12.14",
     "@types/webpack": "^4.41.0",
     "@types/webpack-dev-server": "^3.9.0",
--- a/src/graph_view.ts	Thu Dec 05 01:32:13 2019 -0800
+++ b/src/graph_view.ts	Fri Dec 06 09:19:43 2019 -0800
@@ -1,18 +1,22 @@
 // from /my/site/homepage/www/rdf/browse/graphView.js
 
+/// <reference types="./n3.d.ts">
+
 import { html } from 'lit-html';
-import { SuffixLabels } from './suffixLabels.js';
-import { Store, Quad, DataFactory } from "n3"
-const { namedNode, literal, quad } = DataFactory;
+import { SuffixLabels } from './suffixLabels';
+
+import { NamedNode, N3Store } from 'n3';
+
+import ns from 'n3/src/IRIs';
+const {rdf} = ns;
 
-const groupByRdfType = (graph: Store) => {
-  const env = graph.store.rdf;
-  const rdfType = env.createNamedNode('rdf:type');
-  const byType = new Map(); // type : subjs
+const groupByRdfType = (graph: N3Store) => {
+  const rdfType = new NamedNode(rdf.type);
+  const byType: Map<NamedNode, Set<NamedNode>> = new Map(); // type : subjs
   const untyped = new Set(); // subjs
-  graph.quadStore.quads({}, (q) => {
+  graph.getQuads({}, (q) => {
     let subjType = null;
-    graph.quadStore.quads({
+    graph.getQuads({
       subject: q.subject,
       predicate: rdfType
     },
@@ -31,15 +35,13 @@
   return { byType: byType, untyped: untyped };
 };
 
-const graphView = (graph: Store) => {
-  const env = graph.store.rdf;
-
+const graphView = (graph: N3Store) => {
   const labels = new SuffixLabels();
-  graph.quadStore.quads({}, (q) => {
+  graph.getQuads({}, (q) => {
     if (q.subject.interfaceName == "NamedNode") { labels.planDisplayForNode(q.subject); }
     if (q.predicate.interfaceName == "NamedNode") { labels.planDisplayForNode(q.predicate); }
     if (q.object.interfaceName == "NamedNode") { labels.planDisplayForNode(q.object); }
-    if (q.object.interfaceName == "Literal" && q.object.datatype) { labels.planDisplayForNode(env.createNamedNode(q.object.datatype)); }
+    if (q.object.interfaceName == "Literal" && q.object.datatype) { labels.planDisplayForNode(new NamedNode(q.object.datatype)); }
   });
 
   const rdfNode = (n) => {
@@ -48,7 +50,7 @@
       if (n.datatype) {
         dtPart = html`
         ^^<span class="literalType">
-          ${rdfNode(env.createNamedNode(n.datatype))}
+          ${rdfNode(new NamedNode(n.datatype))}
         </span>`;
       }
       return html`<span class="literal">${n.nominalValue}${dtPart}</span>`;
@@ -74,7 +76,7 @@
   /// bunch of table rows
   const predBlock = (subj, pred) => {
     const objsSet = new Set();
-    graph.quadStore.quads({ subject: subj, predicate: pred }, (q) => {
+    graph.getQuads({ subject: subj, predicate: pred }, (q) => {
 
       if (q.object.length) {
         console.log(q.object)
@@ -100,9 +102,9 @@
   untypedSubjs.sort();
 
   const subjBlock = (subj) => {
-    const subjNode = env.createNamedNode(subj);
+    const subjNode = new NamedNode(subj);
     const predsSet = new Set();
-    graph.quadStore.quads({ subject: subjNode }, (q) => {
+    graph.getQuads({ subject: subjNode }, (q) => {
       predsSet.add(q.predicate);
     });
     const preds = Array.from(predsSet.values());
@@ -124,7 +126,7 @@
     const preds = new Set();
 
     subjs.forEach((subj) => {
-      graph.quadStore.quads({ subject: env.createNamedNode(subj) }, (q) => {
+      graph.getQuads({ subject: new NamedNode(subj) }, (q) => {
         preds.add(q.predicate.toString());
         const cellKey = subj + '|||' + q.predicate.toString();
         if (!graphCells.has(cellKey)) {
@@ -140,7 +142,7 @@
 
     const thead = () => {
       const predColumnHead = (pred) => {
-        return html`<th>${rdfNode(env.createNamedNode(pred))}</th>`;
+        return html`<th>${rdfNode(new NamedNode(pred))}</th>`;
       };
       return html`
               <thead>
@@ -167,14 +169,14 @@
 
       return html`
               <tr>
-                <td>${rdfNode(env.createNamedNode(subj))}</td>
+                <td>${rdfNode(new NamedNode(subj))}</td>
                 ${predsList.map(cell)}
               </tr>
             `;
     };
 
     return html`
-          <div>[icon] ${rdfNode(env.createNamedNode(typeUri))} resources</div>
+          <div>[icon] ${rdfNode(new NamedNode(typeUri))} resources</div>
 <div class="typeBlockScroll">
           <table class="typeBlock">
             ${thead()}
--- a/src/streamed-graph.ts	Thu Dec 05 01:32:13 2019 -0800
+++ b/src/streamed-graph.ts	Fri Dec 06 09:19:43 2019 -0800
@@ -7,7 +7,7 @@
 import { customElement, property, computed } from '@polymer/decorators';
 import { render } from 'lit-html';
 import { graphView } from './graph_view';
-import { Store, DataFactory } from "n3"
+import { N3Store } from "n3"
 
 import { StreamedGraphClient } from './streamed_graph_client';
 
@@ -17,7 +17,7 @@
     url: string = '';
 
     @property({ type: Object })
-    graph: {version: number, graph: Store};
+    graph: {version: number, graph: N3Store};
 
     @property({ type: Boolean })
     expanded: Boolean = false;
--- a/src/streamed_graph_client.ts	Thu Dec 05 01:32:13 2019 -0800
+++ b/src/streamed_graph_client.ts	Fri Dec 06 09:19:43 2019 -0800
@@ -4,7 +4,7 @@
 // import * as jsonld from "jsonld";
 
 import { eachJsonLdQuad } from "./json_ld_quads";
-import { Store, DataFactory } from "n3"
+import { Store } from "n3"
 
 // /// <reference types="eventsource" />
 // const EventSource = window.EventSource;
--- a/tasks.py	Thu Dec 05 01:32:13 2019 -0800
+++ b/tasks.py	Fri Dec 06 09:19:43 2019 -0800
@@ -14,3 +14,7 @@
     ctx.run(f'npm run build')
     ctx.run(f'cp build/streamed-graph.bundle.js /my/site/homepage/www/rdf/streamed-graph.bundle.js')
     ctx.run(f'cp streamed-graph.css /my/site/homepage/www/rdf/streamed-graph.css')
+
+@task
+def test(ctx):
+    ctx.run(f'node_modules/ts-node/dist/bin.js node_modules/jasmine/bin/jasmine --config=jasmine.json')
\ No newline at end of file