annotate rdfdb/service.py @ 87:a96f4eb95ef0

more typing and formatting
author drewp@bigasterisk.com
date Mon, 04 Apr 2022 23:01:08 -0700
parents 5b6e90a708ce
children 1120c6489888
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
1 import itertools
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
2 import json
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
3 import logging
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
4 import optparse
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
5 import os
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
6 import sys
87
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
7 from typing import Dict, List, Optional, cast
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
8
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
9 import cyclone.web
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
10 import cyclone.websocket
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
11 import twisted.internet.error
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
12 from rdflib import ConjunctiveGraph, Graph, URIRef
87
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
13 import twisted.internet.reactor
46
3b36b2c8ae65 fix bug that echoed a patch back to KC. https://bigasterisk.com/light9/work/2019/kc-patch-echo-bug.png
Drew Perttula <drewp@bigasterisk.com>
parents: 45
diff changeset
14 from twisted.internet.inotify import IN_CREATE, INotify
3b36b2c8ae65 fix bug that echoed a patch back to KC. https://bigasterisk.com/light9/work/2019/kc-patch-echo-bug.png
Drew Perttula <drewp@bigasterisk.com>
parents: 45
diff changeset
15 from twisted.python.failure import Failure
3b36b2c8ae65 fix bug that echoed a patch back to KC. https://bigasterisk.com/light9/work/2019/kc-patch-echo-bug.png
Drew Perttula <drewp@bigasterisk.com>
parents: 45
diff changeset
16 from twisted.python.filepath import FilePath
87
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
17 from twisted.internet.interfaces import IReactorCore
46
3b36b2c8ae65 fix bug that echoed a patch back to KC. https://bigasterisk.com/light9/work/2019/kc-patch-echo-bug.png
Drew Perttula <drewp@bigasterisk.com>
parents: 45
diff changeset
18
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
19 from rdfdb.file_vs_uri import (DirUriMap, correctToTopdirPrefix, fileForUri, uriFromFile)
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
20 from rdfdb.graphfile import GetSubgraph, GraphFile, PatchCb
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
21 from rdfdb.patch import ALLSTMTS, Patch
46
3b36b2c8ae65 fix bug that echoed a patch back to KC. https://bigasterisk.com/light9/work/2019/kc-patch-echo-bug.png
Drew Perttula <drewp@bigasterisk.com>
parents: 45
diff changeset
22 from rdfdb.rdflibpatch import patchQuads
87
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
23 reactor = cast(IReactorCore, twisted.internet.reactor)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
24
81
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
25 # gatherProcessStats()
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
26 # stats = scales.collection(
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
27 # '/webServer',
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
28 # scales.IntStat('clients'),
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
29 # scales.IntStat('liveClients'),
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
30 # scales.PmfStat('setAttr'),
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
31 # )
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
32 # graphStats = scales.collection(
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
33 # '/graph',
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
34 # scales.IntStat('statements'),
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
35 # scales.RecentFpsStat('patchFps'),
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
36 # )
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
37 # fileStats = scales.collection(
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
38 # '/file',
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
39 # scales.IntStat('mappedGraphFiles'),
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
40 # )
52
c81bd512d587 start the stats/ page
drewp@bigasterisk.com
parents: 48
diff changeset
41
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
42 log = logging.getLogger('rdfdb')
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
43
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
44
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
45 class WebsocketDisconnect(ValueError):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
46 pass
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
47
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
48
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
49 class WatchedFiles(object):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
50 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
51 find files, notice new files.
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
52
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
53 This object watches directories. Each GraphFile watches its own file.
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
54 """
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
55
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
56 def __init__(self, dirUriMap: DirUriMap, patch: PatchCb, getSubgraph: GetSubgraph, addlPrefixes: Dict[str, URIRef]):
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
57 self.dirUriMap = dirUriMap # {abspath : uri prefix}
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
58 self.patch, self.getSubgraph = patch, getSubgraph
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
59 self.addlPrefixes = addlPrefixes
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
60
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
61 self.graphFiles: Dict[URIRef, GraphFile] = {} # context uri : GraphFile
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
62
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
63 self.notifier = INotify()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
64 self.notifier.startReading()
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
65
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
66 self.findAndLoadFiles()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
67
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
68 def findAndLoadFiles(self) -> None:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
69 self.initialLoad = True
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
70 try:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
71 for topdir in self.dirUriMap:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
72 for dirpath, dirnames, filenames in os.walk(topdir):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
73 for base in filenames:
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
74 p = os.path.join(dirpath, base)
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
75 # why wasn't mypy catching this?
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
76 assert isinstance(p, bytes)
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
77 self.watchFile(p)
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
78 self.notifier.watch(FilePath(dirpath), autoAdd=True, callbacks=[self.dirChange])
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
79 finally:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
80 self.initialLoad = False
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
81
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
82 def dirChange(self, watch, path: FilePath, mask):
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
83 if mask & IN_CREATE:
86
5b6e90a708ce some weak file_vs_uri coverage
drewp@bigasterisk.com
parents: 81
diff changeset
84 if cast(str, path.path).endswith((b'~', b'.swp', b'swx', b'.rdfdb-temp')):
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
85 return
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
86
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
87 log.debug("%s created; consider adding a watch", path)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
88 self.watchFile(path.path)
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
89
39
83fc83e919e5 more type errors.
Drew Perttula <drewp@bigasterisk.com>
parents: 37
diff changeset
90 def watchFile(self, inFile: bytes):
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
91 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
92 consider adding a GraphFile to self.graphFiles
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
93
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
94 inFile needs to be a relative path, not an absolute (e.g. in a
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
95 FilePath) because we use its exact relative form in the
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
96 context URI
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
97 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
98 if not os.path.isfile(inFile):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
99 return
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
100
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
101 inFile = correctToTopdirPrefix(self.dirUriMap, inFile)
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
102 if os.path.splitext(inFile)[1] not in [b'.n3']:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
103 return
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
104
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
105 if b'/capture/' in inFile:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
106 # smaller graph for now
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
107 return
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
108
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
109 # an n3 file with rules makes it all the way past this reading
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
110 # and the serialization. Then, on the receiving side, a
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
111 # SyncedGraph calls graphFromNQuad on the incoming data and
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
112 # has a parse error. I'm not sure where this should be fixed
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
113 # yet.
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
114 if b'-rules' in inFile:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
115 return
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
116
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
117 # for legacy versions, compile all the config stuff you want
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
118 # read into one file called config.n3. New versions won't read
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
119 # it.
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
120 if inFile.endswith(b"config.n3"):
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
121 return
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
122
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
123 ctx = uriFromFile(self.dirUriMap, inFile)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
124 gf = self._addGraphFile(ctx, inFile)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
125 log.info("%s do initial read", inFile)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
126 gf.reread()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
127
43
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
128 def aboutToPatch(self, ctx: URIRef):
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
129 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
130 warn us that a patch is about to come to this context. it's more
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
131 straightforward to create the new file now
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
132
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
133 this is meant to make the file before we add triples, so we
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
134 wouldn't see the blank file and lose those triples. But it
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
135 didn't work, so there are other measures that make us not lose
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
136 the triples from a new file. Calling this before patching the
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
137 graph is still a reasonable thing to do, though.
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
138 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
139 if ctx not in self.graphFiles:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
140 outFile = fileForUri(self.dirUriMap, ctx)
43
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
141 # mypy missed the next line because of
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
142 # https://github.com/python/typeshed/issues/2937 ('str in
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
143 # bytes' isn't an error)
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
144 assert b'//' not in outFile, (outFile, self.dirUriMap, ctx)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
145 log.info("starting new file %r", outFile)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
146 self._addGraphFile(ctx, outFile)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
147
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
148 def _addGraphFile(self, ctx, path):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
149 self.addlPrefixes.setdefault(ctx, {})
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
150 self.addlPrefixes.setdefault(None, {})
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
151 gf = GraphFile(self.notifier, path, ctx, self.patch, self.getSubgraph, globalPrefixes=self.addlPrefixes[None], ctxPrefixes=self.addlPrefixes[ctx])
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
152 self.graphFiles[ctx] = gf
54
a47c135b58b8 more stats reporting
Drew Perttula <drewp@bigasterisk.com>
parents: 52
diff changeset
153 fileStats.mappedGraphFiles = len(self.graphFiles)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
154 return gf
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
155
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
156 def dirtyFiles(self, ctxs):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
157 """mark dirty the files that we watch in these contexts.
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
158
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
159 the ctx might not be a file that we already read; it might be
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
160 for a new file we have to create, or it might be for a
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
161 transient context that we're not going to save
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
162
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
163 if it's a ctx with no file, error
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
164 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
165 for ctx in ctxs:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
166 g = self.getSubgraph(ctx)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
167 self.graphFiles[ctx].dirty(g)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
168
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
169
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
170 _wsClientSerial = itertools.count(0)
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
171
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
172
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
173 class WebsocketClient(cyclone.websocket.WebSocketHandler):
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
174 """
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
175 Send patches to the client (starting with a client who has 0
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
176 statements) to keep it in sync with the graph.
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
177
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
178 Accept patches from the client, and assume that the client has
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
179 already applied them to its local graph.
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
180
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
181 Treat a disconnect as 'out of sync'. Either the client thinks it
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
182 is out of sync and wants to start over, or we can't apply a patch
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
183 correctly therefore we disconnect to make the client start over.
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
184
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
185 This socket may also carry some special messages meant for the
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
186 rdfdb web UI, e.g. about who is connected, etc.
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
187 """
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
188 connectionId: str
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
189
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
190 def connectionMade(self, *args, **kwargs) -> None:
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
191 self.connectionId = f'WS{next(_wsClientSerial)}'
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
192
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
193 self.sendMessage(json.dumps({'connectedAs': self.connectionId}))
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
194 log.info("new ws client %r", self)
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
195 self.settings.db.addClient(self)
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
196
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
197 def connectionLost(self, reason):
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
198 log.info("bye ws client %r: %s", self, reason)
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
199 self.settings.db.clientErrored(Failure(WebsocketDisconnect(reason)), self)
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
200
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
201 def messageReceived(self, message: bytes):
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
202 if message == b'PING':
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
203 self.sendMessage('PONG')
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
204 return
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
205 log.debug("got message from %r: %s", self, message[:32])
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
206 p = Patch(jsonRepr=message.decode('utf8'))
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
207 self.settings.db.patch(p, sender=self.connectionId)
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
208
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
209 def sendPatch(self, p: Patch):
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
210 self.sendMessage(p.makeJsonRepr())
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
211
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
212 def __repr__(self):
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
213 return f"<SyncedGraph client {self.connectionId}>"
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
214
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
215
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
216 class Db(object):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
217 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
218 the master graph, all the connected clients, all the files we're watching
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
219 """
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
220
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
221 def __init__(self, dirUriMap: DirUriMap, addlPrefixes):
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
222 self.clients: List[WebsocketClient] = []
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
223 self.graph = ConjunctiveGraph()
81
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
224 # stats.graphLen = len(self.graph)
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
225 # stats.clients = len(self.clients)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
226
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
227 self.watchedFiles = WatchedFiles(dirUriMap, self.patch, self.getSubgraph, addlPrefixes)
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
228
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
229 self.summarizeToLog()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
230
81
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
231 # @graphStats.patchFps.rate()
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
232 def patch(self, patch: Patch, sender: Optional[str] = None, dueToFileChange: bool = False) -> None:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
233 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
234 apply this patch to the master graph then notify everyone about it
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
235
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
236 dueToFileChange if this is a patch describing an edit we read
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
237 *from* the file (such that we shouldn't write it back to the file)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
238 """
43
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
239 ctx = patch.getContext()
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
240 log.info("patching graph %s -%d +%d" % (ctx, len(patch.delQuads), len(patch.addQuads)))
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
241
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
242 if hasattr(self, 'watchedFiles'): # todo: eliminate this
66
109fefea80a7 fix on watchedFiles startup
Drew Perttula <drewp@bigasterisk.com>
parents: 65
diff changeset
243 self.watchedFiles.aboutToPatch(ctx)
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
244
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
245 # an error here needs to drop the sender, and reset everyone
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
246 # else if we can't rollback the failing patch.
43
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
247 patchQuads(self.graph, patch.delQuads, patch.addQuads, perfect=True)
52
c81bd512d587 start the stats/ page
drewp@bigasterisk.com
parents: 48
diff changeset
248 stats.graphLen = len(self.graph)
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
249
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
250 self._syncPatchToOtherClients(patch, sender)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
251 if not dueToFileChange:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
252 self.watchedFiles.dirtyFiles([ctx])
52
c81bd512d587 start the stats/ page
drewp@bigasterisk.com
parents: 48
diff changeset
253 graphStats.statements = len(self.graph)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
254
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
255 def _syncPatchToOtherClients(self, p: Patch, sender: Optional[str] = None):
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
256 for c in self.clients:
69
6b01e1e5859b drop patches and log, but don't otherwise error, if we're not connected to rdfdb
Drew Perttula <drewp@bigasterisk.com>
parents: 66
diff changeset
257 if sender is not None and c.connectionId == sender:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
258 # this client has self-applied the patch already
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
259 log.debug("_syncPatchToOtherClients: don't resend to %r", c)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
260 continue
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
261 log.debug('_syncPatchToOtherClients: send to %r', c)
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
262 c.sendPatch(p)
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
263
46
3b36b2c8ae65 fix bug that echoed a patch back to KC. https://bigasterisk.com/light9/work/2019/kc-patch-echo-bug.png
Drew Perttula <drewp@bigasterisk.com>
parents: 45
diff changeset
264 def clientErrored(self, err, c) -> None:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
265 err.trap(twisted.internet.error.ConnectError, WebsocketDisconnect)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
266 log.info("%r %r - dropping client", c, err.getErrorMessage())
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
267 if c in self.clients:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
268 self.clients.remove(c)
54
a47c135b58b8 more stats reporting
Drew Perttula <drewp@bigasterisk.com>
parents: 52
diff changeset
269 stats.clients = len(self.clients)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
270
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
271 def summarizeToLog(self):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
272 log.info("contexts in graph (%s total stmts):" % len(self.graph))
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
273 for c in self.graph.contexts():
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
274 log.info(" %s: %s statements" % (c.identifier, len(self.getSubgraph(c.identifier))))
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
275
43
8d4822ae58bc more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents: 42
diff changeset
276 def getSubgraph(self, uri: URIRef) -> Graph:
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
277 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
278 this is meant to return a live view of the given subgraph, but
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
279 if i'm still working around an rdflib bug, it might return a
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
280 copy
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
281
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
282 and it's returning triples, but I think quads would be better
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
283 """
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
284 # this is returning an empty Graph :(
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
285 #return self.graph.get_context(uri)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
286
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
287 g = Graph()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
288 for s in self.graph.triples(ALLSTMTS, uri):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
289 g.add(s)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
290 return g
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
291
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
292 def addClient(self, newClient: WebsocketClient) -> None:
72
8bf24d5a0d21 shorter debug log on initial graph sync
drewp@bigasterisk.com
parents: 71
diff changeset
293 log.info("new connection: sending all graphs to %r" % newClient)
65
9bc9de580033 big rewrite of rdfdb and syncedgraph to use a single websocket connecton
Drew Perttula <drewp@bigasterisk.com>
parents: 59
diff changeset
294 newClient.sendPatch(Patch(addQuads=self.graph.quads(ALLSTMTS), delQuads=[]))
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
295 self.clients.append(newClient)
54
a47c135b58b8 more stats reporting
Drew Perttula <drewp@bigasterisk.com>
parents: 52
diff changeset
296 stats.clients = len(self.clients)
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
297
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
298
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
299 class GraphResource(cyclone.web.RequestHandler):
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
300
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
301 def get(self):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
302 accept = self.request.headers.get('accept', '')
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
303 format = 'n3'
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
304 if accept == 'text/plain':
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
305 format = 'nt'
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
306 elif accept == 'application/n-quads':
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
307 format = 'nquads'
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
308 elif accept == 'pickle':
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
309 # don't use this; it's just for speed comparison
26
95c57a5cb18e run 2to3
drewp@bigasterisk.com
parents: 13
diff changeset
310 import pickle as pickle
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
311 pickle.dump(self.settings.db.graph, self, protocol=2)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
312 return
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
313 elif accept == 'msgpack':
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
314 self.write(repr(self.settings.db.graph.__getstate__))
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
315 return
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
316 self.write(self.settings.db.graph.serialize(format=format))
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
317
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
318
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
319 class Prefixes(cyclone.web.RequestHandler):
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
320
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
321 def post(self):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
322 suggestion = json.loads(self.request.body)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
323 addlPrefixes = self.settings.db.watchedFiles.addlPrefixes
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
324 addlPrefixes.setdefault(URIRef(suggestion['ctx']), {}).update(suggestion['prefixes'])
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
325
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
326
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
327 class NoExts(cyclone.web.StaticFileHandler):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
328 # .html pages can be get() without .html on them
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
329 def get(self, path, *args, **kw):
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
330 if path and '.' not in path:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
331 path = path + ".html"
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
332 cyclone.web.StaticFileHandler.get(self, path, *args, **kw)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
333
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
334
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
335 def main(dirUriMap: Optional[DirUriMap] = None, prefixes: Optional[Dict[str, URIRef]] = None, port=9999):
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
336
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
337 if dirUriMap is None:
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
338 dirUriMap = {b'data/': URIRef('http://example.com/data/')}
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
339 if prefixes is None:
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
340 prefixes = {
42
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
341 'rdf': URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#'),
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
342 'rdfs': URIRef('http://www.w3.org/2000/01/rdf-schema#'),
541010f99d61 type fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 40
diff changeset
343 'xsd': URIRef('http://www.w3.org/2001/XMLSchema#'),
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
344 }
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
345
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
346 logging.basicConfig()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
347 log = logging.getLogger()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
348
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
349 parser = optparse.OptionParser()
80
22c9679dbf67 reformat
drewp@bigasterisk.com
parents: 72
diff changeset
350 parser.add_option("-v", "--verbose", action="store_true", help="logging.DEBUG")
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
351 (options, args) = parser.parse_args()
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
352
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
353 log.setLevel(logging.DEBUG if options.verbose else logging.INFO)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
354
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
355 db = Db(dirUriMap=dirUriMap, addlPrefixes={None: prefixes})
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
356
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
357 from twisted.python import log as twlog
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
358 twlog.startLogging(sys.stdout)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
359
45
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
360 reactor.listenTCP(
dc61012eeace python reformat
Drew Perttula <drewp@bigasterisk.com>
parents: 43
diff changeset
361 port,
87
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
362 cyclone.web.Application(
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
363 handlers=[
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
364 (r'/graph', GraphResource),
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
365 (r'/syncedGraph', WebsocketClient),
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
366 (r'/prefixes', Prefixes),
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
367 # (r'/stats/(.*)', StatsHandler, {
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
368 # 'serverName': 'rdfdb'
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
369 # }),
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
370 (r'/(.*)', NoExts, {
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
371 "path": FilePath(__file__).sibling("web").path,
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
372 "default_filename": "index.html"
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
373 }),
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
374 ],
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
375 debug=True,
a96f4eb95ef0 more typing and formatting
drewp@bigasterisk.com
parents: 86
diff changeset
376 db=db))
13
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
377 log.info("serving on %s" % port)
c9d1764d64ad add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
378 reactor.run()
86
5b6e90a708ce some weak file_vs_uri coverage
drewp@bigasterisk.com
parents: 81
diff changeset
379
5b6e90a708ce some weak file_vs_uri coverage
drewp@bigasterisk.com
parents: 81
diff changeset
380
81
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
381 if __name__ == '__main__':
8d3c3e7cfb54 (barely) runnable demo service instance
drewp@bigasterisk.com
parents: 80
diff changeset
382 main()