Mercurial > code > home > repos > rdfdb
annotate rdfdb/service.py @ 43:8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Ignore-this: 9bc5d28702e6684fcce62104fc50966d
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Mon, 27 May 2019 06:58:51 +0000 |
parents | 541010f99d61 |
children | dc61012eeace |
rev | line source |
---|---|
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 from twisted.internet import reactor, defer |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 import twisted.internet.error |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 from twisted.python.filepath import FilePath |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 from twisted.python.failure import Failure |
35
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
5 from twisted.internet.inotify import IN_CREATE |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
6 import sys, optparse, logging, json, os |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
7 import cyclone.web, cyclone.httpclient, cyclone.websocket |
42 | 8 from typing import Dict, List, Set, Optional, Union |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 from rdflib import ConjunctiveGraph, URIRef, Graph |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
11 from rdfdb.graphfile import GraphFile, PatchCb, GetSubgraph |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 from rdfdb.patch import Patch, ALLSTMTS |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 from rdfdb.rdflibpatch import patchQuads |
42 | 14 from rdfdb.file_vs_uri import correctToTopdirPrefix, fileForUri, uriFromFile, DirUriMap |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
15 from rdfdb.patchsender import sendPatch |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
16 from rdfdb.patchreceiver import makePatchEndpointPutMethod |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
17 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
18 from twisted.internet.inotify import INotify |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
19 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
20 log = logging.getLogger('rdfdb') |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
21 log.setLevel(logging.DEBUG) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 class WebsocketDisconnect(ValueError): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
24 pass |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
25 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
26 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
27 class Client(object): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
28 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
29 one of our syncedgraph clients |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
30 """ |
42 | 31 def __init__(self, updateUri: URIRef, label: str): |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
32 self.label = label |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
33 # todo: updateUri is used publicly to compare clients. Replace |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
34 # it with Client.__eq__ so WsClient doesn't have to fake an |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
35 # updateUri. |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
36 self.updateUri = updateUri |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
37 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
38 def __repr__(self): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
39 return "<%s client at %s>" % (self.label, self.updateUri) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
40 |
42 | 41 def sendPatch(self, p: Patch) -> defer.Deferred: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
42 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
43 returns deferred. error will be interpreted as the client being |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
44 broken. |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
45 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 return sendPatch(self.updateUri, p) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
47 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
48 class WsClient(object): |
42 | 49 def __init__(self, connectionId: str, sendMessage): |
50 self.updateUri = URIRef(connectionId) | |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
51 self.sendMessage = sendMessage |
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 def __repr__(self): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
54 return "<WsClient %s>" % self.updateUri |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
55 |
42 | 56 def sendPatch(self, p: Patch) -> defer.Deferred: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
57 self.sendMessage(p.makeJsonRepr()) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
58 return defer.succeed(None) |
42 | 59 |
60 def sendGraphToClient(graph, client: Union[Client, WsClient]) -> None: | |
61 """send the client the whole graph contents""" | |
62 log.info("sending all graphs to %r" % client) | |
63 client.sendPatch(Patch( | |
64 addQuads=graph.quads(ALLSTMTS), | |
65 delQuads=[])) | |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
66 |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
67 class WatchedFiles(object): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
68 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 find files, notice new files. |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
70 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
71 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
|
72 """ |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
73 def __init__(self, dirUriMap: DirUriMap, patch: PatchCb, getSubgraph: GetSubgraph, addlPrefixes: Dict[str, URIRef]): |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
74 self.dirUriMap = dirUriMap # {abspath : uri prefix} |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
75 self.patch, self.getSubgraph = patch, getSubgraph |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
76 self.addlPrefixes = addlPrefixes |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
77 |
31
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
30
diff
changeset
|
78 self.graphFiles: Dict[URIRef, GraphFile] = {} # context uri : GraphFile |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
79 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
80 self.notifier = INotify() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
81 self.notifier.startReading() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
82 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
83 self.findAndLoadFiles() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
84 |
42 | 85 def findAndLoadFiles(self) -> None: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
86 self.initialLoad = True |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
87 try: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
88 for topdir in self.dirUriMap: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
89 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
|
90 for base in filenames: |
42 | 91 p = os.path.join(dirpath, base) |
92 # why wasn't mypy catching this? | |
93 assert isinstance(p, bytes) | |
94 self.watchFile(p) | |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
95 self.notifier.watch(FilePath(dirpath), autoAdd=True, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
96 callbacks=[self.dirChange]) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
97 finally: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
98 self.initialLoad = False |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
99 |
42 | 100 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
|
101 if mask & IN_CREATE: |
39 | 102 if 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
|
103 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
104 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
105 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
|
106 self.watchFile(path.path) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
107 |
39 | 108 def watchFile(self, inFile: bytes): |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
109 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
110 consider adding a GraphFile to self.graphFiles |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
111 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
112 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
|
113 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
|
114 context URI |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
115 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
116 if not os.path.isfile(inFile): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
117 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
118 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
119 inFile = correctToTopdirPrefix(self.dirUriMap, inFile) |
42 | 120 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
|
121 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
122 |
42 | 123 if b'/capture/' in inFile: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
124 # smaller graph for now |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
125 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
126 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
127 # 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
|
128 # 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
|
129 # 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
|
130 # 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
|
131 # yet. |
42 | 132 if b'-rules' in inFile: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
133 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
134 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
135 # 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
|
136 # 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
|
137 # it. |
42 | 138 if inFile.endswith(b"config.n3"): |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
139 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
140 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
141 ctx = uriFromFile(self.dirUriMap, inFile) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
142 gf = self._addGraphFile(ctx, inFile) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
143 log.info("%s do initial read", inFile) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
144 gf.reread() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
145 |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
146 def aboutToPatch(self, ctx: URIRef): |
13
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 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
|
149 straightforward to create the new file now |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
150 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
151 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
|
152 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
|
153 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
|
154 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
|
155 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
|
156 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
157 if ctx not in self.graphFiles: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
158 outFile = fileForUri(self.dirUriMap, ctx) |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
159 # mypy missed the next line because of |
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
160 # 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
|
161 # bytes' isn't an error) |
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
162 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
|
163 log.info("starting new file %r", outFile) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
164 self._addGraphFile(ctx, outFile) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
165 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
166 def _addGraphFile(self, ctx, path): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
167 self.addlPrefixes.setdefault(ctx, {}) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
168 self.addlPrefixes.setdefault(None, {}) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
169 gf = GraphFile(self.notifier, path, ctx, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
170 self.patch, self.getSubgraph, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
171 globalPrefixes=self.addlPrefixes[None], |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
172 ctxPrefixes=self.addlPrefixes[ctx]) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
173 self.graphFiles[ctx] = gf |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
174 return gf |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
175 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
176 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
177 def dirtyFiles(self, ctxs): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
178 """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
|
179 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
180 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
|
181 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
|
182 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
|
183 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
184 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
|
185 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
186 for ctx in ctxs: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
187 g = self.getSubgraph(ctx) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
188 self.graphFiles[ctx].dirty(g) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
189 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
190 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
191 class Db(object): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
192 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
193 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
|
194 """ |
42 | 195 def __init__(self, dirUriMap: DirUriMap, addlPrefixes): |
196 self.clients: List[Union[Client, WsClient]] = [] | |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
197 self.graph = ConjunctiveGraph() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
198 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
199 self.watchedFiles = WatchedFiles(dirUriMap, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
200 self.patch, self.getSubgraph, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
201 addlPrefixes) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
202 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
203 self.summarizeToLog() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
204 |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
205 def patch(self, patch: Patch, dueToFileChange: bool=False) -> None: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
206 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
207 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
|
208 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
209 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
|
210 *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
|
211 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
212 if p has a senderUpdateUri attribute, we won't send this patch |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
213 back to the sender with that updateUri |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
214 """ |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
215 ctx = patch.getContext() |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
216 log.info("patching graph %s -%d +%d" % ( |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
217 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
|
218 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
219 if hasattr(self, 'watchedFiles'): # not available during startup |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
220 self.watchedFiles.aboutToPatch(ctx) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
221 |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
222 patchQuads(self.graph, patch.delQuads, patch.addQuads, perfect=True) |
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
223 self._sendPatch(patch) |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
224 if not dueToFileChange: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
225 self.watchedFiles.dirtyFiles([ctx]) |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
226 sendToLiveClients(asJson=patch.jsonRepr) |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
227 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
228 def _sendPatch(self, p): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
229 senderUpdateUri = getattr(p, 'senderUpdateUri', None) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
230 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
231 for c in self.clients: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
232 if c.updateUri == senderUpdateUri: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
233 # this client has self-applied the patch already |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
234 continue |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
235 d = c.sendPatch(p) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
236 d.addErrback(self.clientErrored, c) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
237 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
238 def clientErrored(self, err, c): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
239 err.trap(twisted.internet.error.ConnectError, WebsocketDisconnect) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
240 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
|
241 if c in self.clients: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
242 self.clients.remove(c) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
243 self.sendClientsToAllLivePages() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
244 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
245 def summarizeToLog(self): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
246 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
|
247 for c in self.graph.contexts(): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
248 log.info(" %s: %s statements" % |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
249 (c.identifier, len(self.getSubgraph(c.identifier)))) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
250 |
43
8d4822ae58bc
more types, as needed on light9 keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
42
diff
changeset
|
251 def getSubgraph(self, uri: URIRef) -> Graph: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
252 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
253 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
|
254 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
|
255 copy |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
256 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
257 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
|
258 """ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
259 # this is returning an empty Graph :( |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
260 #return self.graph.get_context(uri) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
261 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
262 g = Graph() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
263 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
|
264 g.add(s) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
265 return g |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
266 |
42 | 267 def addClient(self, newClient: Union[Client, WsClient]) -> None: |
268 for c in self.clients: | |
269 if c.updateUri == newClient.updateUri: | |
270 self.clients.remove(c) | |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
271 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
272 log.info("new client %r" % newClient) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
273 sendGraphToClient(self.graph, newClient) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
274 self.clients.append(newClient) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
275 self.sendClientsToAllLivePages() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
276 |
37
9b4c551dddfb
fix registration bug (tried to send bytes to json encoder)
Drew Perttula <drewp@bigasterisk.com>
parents:
35
diff
changeset
|
277 def sendClientsToAllLivePages(self) -> None: |
9b4c551dddfb
fix registration bug (tried to send bytes to json encoder)
Drew Perttula <drewp@bigasterisk.com>
parents:
35
diff
changeset
|
278 sendToLiveClients({"clients": [ |
42 | 279 dict(updateUri=c.updateUri.toPython(), label=repr(c)) |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
280 for c in self.clients]}) |
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 class GraphResource(cyclone.web.RequestHandler): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
283 def get(self): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
284 accept = self.request.headers.get('accept', '') |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
285 format = 'n3' |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
286 if accept == 'text/plain': |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
287 format = 'nt' |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
288 elif accept == 'application/n-quads': |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
289 format = 'nquads' |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
290 elif accept == 'pickle': |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
291 # don't use this; it's just for speed comparison |
26 | 292 import pickle as pickle |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
293 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
|
294 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
295 elif accept == 'msgpack': |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
296 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
|
297 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
298 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
|
299 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
300 class Patches(cyclone.web.RequestHandler): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
301 def __init__(self, *args, **kw): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
302 cyclone.web.RequestHandler.__init__(self, *args, **kw) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
303 p = makePatchEndpointPutMethod(self.settings.db.patch) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
304 self.put = lambda: p(self) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
305 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
306 def get(self): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
307 pass |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
308 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
309 class GraphClients(cyclone.web.RequestHandler): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
310 def get(self): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
311 pass |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
312 |
42 | 313 def post(self) -> None: |
314 upd = URIRef(self.get_argument("clientUpdate")) | |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
315 try: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
316 self.settings.db.addClient(Client(upd, self.get_argument("label"))) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
317 except: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
318 import traceback |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
319 traceback.print_exc() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
320 raise |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
321 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
322 class Prefixes(cyclone.web.RequestHandler): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
323 def post(self): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
324 suggestion = json.loads(self.request.body) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
325 addlPrefixes = self.settings.db.watchedFiles.addlPrefixes |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
326 addlPrefixes.setdefault(URIRef(suggestion['ctx']), {}).update(suggestion['prefixes']) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
327 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
328 _wsClientSerial = 0 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
329 class WebsocketClient(cyclone.websocket.WebSocketHandler): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
330 |
39 | 331 wsClient: Optional[WsClient] = None |
42 | 332 def connectionMade(self, *args, **kwargs) -> None: |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
333 global _wsClientSerial |
42 | 334 connectionId = f'connection-{_wsClientSerial}' |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
335 _wsClientSerial += 1 |
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 self.wsClient = WsClient(connectionId, self.sendMessage) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
338 log.info("new ws client %r", self.wsClient) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
339 self.settings.db.addClient(self.wsClient) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
340 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
341 def connectionLost(self, reason): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
342 log.info("bye ws client %r", self.wsClient) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
343 self.settings.db.clientErrored( |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
344 Failure(WebsocketDisconnect(reason)), self.wsClient) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
345 |
40 | 346 def messageReceived(self, message: bytes): |
347 if message == b'PING': | |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
348 self.sendMessage('PONG') |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
349 return |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
350 log.info("got message from %r: %s", self.wsClient, message) |
40 | 351 p = Patch(jsonRepr=message.decode('utf8')) |
42 | 352 assert self.wsClient is not None |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
353 p.senderUpdateUri = self.wsClient.updateUri |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
354 self.settings.db.patch(p) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
355 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
356 class Live(cyclone.websocket.WebSocketHandler): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
357 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
358 def connectionMade(self, *args, **kwargs): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
359 log.info("websocket opened") |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
360 liveClients.add(self) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
361 self.settings.db.sendClientsToAllLivePages() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
362 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
363 def connectionLost(self, reason): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
364 log.info("websocket closed") |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
365 liveClients.remove(self) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
366 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
367 def messageReceived(self, message): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
368 log.info("got message %s" % message) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
369 self.sendMessage(message) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
370 |
35
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
371 liveClients: Set[Live] = set() |
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
372 def sendToLiveClients(d=None, asJson=None): |
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
373 j = asJson or json.dumps(d) |
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
374 for c in liveClients: |
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
375 c.sendMessage(j) |
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
376 |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
377 class NoExts(cyclone.web.StaticFileHandler): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
378 # .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
|
379 def get(self, path, *args, **kw): |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
380 if path and '.' not in path: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
381 path = path + ".html" |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
382 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
|
383 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
384 |
42 | 385 def main(dirUriMap: Optional[DirUriMap]=None, |
386 prefixes: Optional[Dict[str, URIRef]]=None, | |
387 port=9999): | |
13
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
388 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
389 if dirUriMap is None: |
42 | 390 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
|
391 if prefixes is None: |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
392 prefixes = { |
42 | 393 'rdf': URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#'), |
394 'rdfs': URIRef('http://www.w3.org/2000/01/rdf-schema#'), | |
395 '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
|
396 } |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
397 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
398 logging.basicConfig() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
399 log = logging.getLogger() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
400 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
401 parser = optparse.OptionParser() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
402 parser.add_option("-v", "--verbose", action="store_true", |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
403 help="logging.DEBUG") |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
404 (options, args) = parser.parse_args() |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
405 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
406 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
|
407 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
408 db = Db(dirUriMap=dirUriMap, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
409 addlPrefixes={None: prefixes}) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
410 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
411 from twisted.python import log as twlog |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
412 twlog.startLogging(sys.stdout) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
413 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
414 reactor.listenTCP(port, cyclone.web.Application(handlers=[ |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
415 (r'/live', Live), |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
416 (r'/graph', GraphResource), |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
417 (r'/patches', Patches), |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
418 (r'/graphClients', GraphClients), |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
419 (r'/syncedGraph', WebsocketClient), |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
420 (r'/prefixes', Prefixes), |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
421 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
422 (r'/(.*)', NoExts, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
423 {"path" : FilePath(__file__).sibling("web").path, |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
424 "default_filename" : "index.html"}), |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
425 |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
426 ], debug=True, db=db)) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
427 log.info("serving on %s" % port) |
c9d1764d64ad
add web server. remove more traces of light9
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
428 reactor.run() |