Mercurial > code > home > repos > rdfdb
annotate rdfdb/graphfile.py @ 35:deaabf47d82b
fix pyflakes warnings, including an error at import
Ignore-this: a1baa5eeb251403e2a9506a1d1841ac8
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Sat, 25 May 2019 06:39:05 +0000 |
parents | c8cf9d85fa81 |
children | 8d4822ae58bc |
rev | line source |
---|---|
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 import logging, traceback, os, time |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 from twisted.python.filepath import FilePath |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 from twisted.internet import reactor |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 from twisted.internet.inotify import humanReadableMask |
31
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
26
diff
changeset
|
5 from rdflib import Graph, RDF, URIRef |
1
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
6 from rdfdb.patch import Patch |
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
7 from rdfdb.rdflibpatch import inContext |
31
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
26
diff
changeset
|
8 from typing import Dict |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 log = logging.getLogger('graphfile') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
11 iolog = logging.getLogger('io') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 def patchN3SerializerToUseLessWhitespace(cutColumn=65): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 # todo: make a n3serializer subclass with whitespace settings |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
15 from rdflib.plugins.serializers.turtle import TurtleSerializer, OBJECT |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
16 originalWrite = TurtleSerializer.write |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
17 def write(self, s): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
18 lines = s.split('\n') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
19 if len(lines) > 1: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
20 self._column = len(lines[-1]) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
21 else: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 self._column += len(lines[0]) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 return originalWrite(self, s) |
31
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
26
diff
changeset
|
24 TurtleSerializer.write = write # type: ignore |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
25 def predicateList(self, subject, newline=False): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
26 properties = self.buildPredicateHash(subject) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
27 propList = self.sortProperties(properties) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
28 if len(propList) == 0: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
29 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
30 self.verb(propList[0], newline=newline) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
31 self.objectList(properties[propList[0]]) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
32 for predicate in propList[1:]: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
33 self.write(';') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
34 # can't do proper wrapping since we don't know how much is coming |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
35 if self._column > cutColumn: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
36 self.write('\n' + self.indent(1)) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
37 self.verb(predicate, newline=False) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
38 self.objectList(properties[predicate]) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
39 def objectList(self, objects): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
40 count = len(objects) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
41 if count == 0: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
42 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
43 depthmod = (count == 1) and 0 or 1 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
44 self.depth += depthmod |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
45 self.path(objects[0], OBJECT) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 for obj in objects[1:]: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
47 self.write(', ') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
48 self.path(obj, OBJECT, newline=True) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
49 self.depth -= depthmod |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
50 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
51 originalStatement = TurtleSerializer.statement |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
52 def statement(self, subject): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
53 if list(self.store.triples((subject, RDF.type, None))): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
54 self.write('\n') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
55 originalStatement(self, subject) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
56 return False # suppress blank line for 'minor' statements |
31
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
26
diff
changeset
|
57 TurtleSerializer.statement = statement # type: ignore |
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
26
diff
changeset
|
58 TurtleSerializer.predicateList = predicateList # type: ignore |
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
26
diff
changeset
|
59 TurtleSerializer.objectList = objectList # type: ignore |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
60 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
61 patchN3SerializerToUseLessWhitespace() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
62 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
63 class GraphFile(object): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
64 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
65 one rdf file that we read from, write to, and notice external changes to |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
66 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
67 def __init__(self, notifier, path, uri, patch, getSubgraph, globalPrefixes, ctxPrefixes): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
68 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 uri is the context for the triples in this file. We assume |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
70 sometimes that we're the only ones with triples in this |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
71 context. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
72 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
73 this does not include an initial reread() call |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
74 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
75 Prefixes are mutable dicts. The caller may add to them later. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
76 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
77 self.path, self.uri = path, uri |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
78 self.patch, self.getSubgraph = patch, getSubgraph |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
79 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
80 self.lastWriteTimestamp = 0 # mtime from the last time _we_ wrote |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
81 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
82 self.globalPrefixes = globalPrefixes |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
83 self.ctxPrefixes = ctxPrefixes |
31
3ca1a8774513
typing fixes. rewrite sequentialUri a bit
Drew Perttula <drewp@bigasterisk.com>
parents:
26
diff
changeset
|
84 self.readPrefixes: Dict[str, URIRef] = {} |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
85 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
86 if not os.path.exists(path): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
87 # can't start notify until file exists |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
88 try: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
89 os.makedirs(os.path.dirname(path)) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
90 except OSError: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
91 pass |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
92 f = open(path, "w") |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
93 f.write("#new\n") |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
94 f.close() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
95 iolog.info("%s created", path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
96 # this was supposed to cut out some extra reads but it |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
97 # didn't work: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
98 self.lastWriteTimestamp = os.path.getmtime(path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
99 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
100 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
101 self.flushDelay = 2 # seconds until we have to call flush() when dirty |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
102 self.writeCall = None # or DelayedCall |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
103 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
104 self.notifier = notifier |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
105 self.addWatch() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
106 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
107 def addWatch(self): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
108 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
109 # emacs save comes in as IN_MOVE_SELF, maybe |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
110 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
111 # I was hoping not to watch IN_CHANGED and get lots of |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
112 # half-written files, but emacs doesn't close its files after |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
113 # a write, so there's no other event. I could try to sleep |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
114 # until after all the writes are done, but I think the only |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
115 # bug left is that we'll retry too agressively on a file |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
116 # that's being written |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
117 |
35
deaabf47d82b
fix pyflakes warnings, including an error at import
Drew Perttula <drewp@bigasterisk.com>
parents:
32
diff
changeset
|
118 # See twisted.internet.inotify for IN_CHANGED event, etc. |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
119 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
120 log.info("add watch on %s", self.path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
121 self.notifier.watch(FilePath(self.path), callbacks=[self.notify]) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
122 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
123 def notify(self, notifier, filepath, mask): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
124 try: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
125 maskNames = humanReadableMask(mask) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
126 if maskNames[0] == 'delete_self': |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
127 if not filepath.exists(): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
128 log.info("%s delete_self", filepath) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
129 self.fileGone() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
130 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
131 else: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
132 log.warn("%s delete_self event but file is here. " |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
133 "probably a new version moved in", |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
134 filepath) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
135 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
136 # we could filter these out in the watch() call, but I want |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
137 # the debugging |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
138 if maskNames[0] in ['open', 'access', 'close_nowrite', 'attrib']: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
139 log.debug("%s %s event, ignoring" % (filepath, maskNames)) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
140 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
141 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
142 try: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
143 if filepath.getModificationTime() == self.lastWriteTimestamp: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
144 log.debug("%s changed, but we did this write", filepath) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
145 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
146 except OSError as e: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
147 log.error("%s: %r" % (filepath, e)) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
148 # getting OSError no such file, followed by no future reads |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
149 reactor.callLater(.5, self.addWatch) # ? |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
150 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
151 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
152 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
153 log.info("reread %s because of %s event", filepath, maskNames) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
154 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
155 self.reread() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
156 except Exception: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
157 traceback.print_exc() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
158 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
159 def fileGone(self): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
160 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
161 our file is gone; remove the statements from that context |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
162 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
163 myQuads = [(s,p,o,self.uri) for s,p,o in self.getSubgraph(self.uri)] |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
164 log.debug("dropping all statements from context %s", self.uri) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
165 if myQuads: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
166 self.patch(Patch(delQuads=myQuads), dueToFileChange=True) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
167 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
168 def reread(self): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
169 """update the graph with any diffs from this file |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
170 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
171 n3 parser fails on "1.e+0" even though rdflib was emitting that itself |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
172 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
173 old = self.getSubgraph(self.uri) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
174 new = Graph() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
175 try: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
176 contents = open(self.path).read() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
177 if contents.startswith("#new"): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
178 log.debug("%s ignoring empty contents of my new file", self.path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
179 # this is a new file we're starting, and we should not |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
180 # patch our graph as if it had just been cleared. We |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
181 # shouldn't even be here reading this, but |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
182 # lastWriteTimestamp didn't work. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
183 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
184 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
185 new.parse(location=self.path, format='n3') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
186 self.readPrefixes = dict(new.namespaces()) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
187 except SyntaxError as e: |
26 | 188 print(e) |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
189 traceback.print_exc() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
190 log.error("%s syntax error", self.path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
191 # todo: likely bug- if a file has this error upon first |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
192 # read, I think we don't retry it right. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
193 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
194 except IOError as e: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
195 log.error("%s rereading %s: %r", self.path, self.uri, e) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
196 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
197 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
198 old = inContext(old, self.uri) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
199 new = inContext(new, self.uri) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
200 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
201 p = Patch.fromDiff(old, new) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
202 if p: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
203 log.debug("%s applying patch for changes in file", self.path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
204 self.patch(p, dueToFileChange=True) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
205 else: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
206 log.debug("old == new after reread of %s", self.path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
207 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
208 def dirty(self, graph): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
209 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
210 there are new contents to write to our file |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
211 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
212 graph is the rdflib.Graph that contains the contents of the |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
213 file. It is allowed to change. Note that dirty() will probably |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
214 do the save later when the graph might be different. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
215 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
216 after a timer has passed, write it out. Any scheduling issues |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
217 between files? i don't think so. the timer might be kind of |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
218 huge, and then we might want to take a hint from a client that |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
219 it's a good time to save the files that it was editing, like |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
220 when the mouse moves out of the client's window and might be |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
221 going towards a text file editor |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
222 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
223 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
224 log.info("%s dirty, needs write", self.path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
225 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
226 self.graphToWrite = graph |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
227 if self.writeCall: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
228 self.writeCall.reset(self.flushDelay) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
229 else: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
230 self.writeCall = reactor.callLater(self.flushDelay, self.flush) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
231 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
232 def flush(self): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
233 self.writeCall = None |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
234 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
235 tmpOut = self.path + ".rdfdb-temp" |
32
c8cf9d85fa81
fix tests and test runner
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
236 f = open(tmpOut, 'wb') |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
237 t1 = time.time() |
26 | 238 for p, n in (list(self.globalPrefixes.items()) + |
239 list(self.readPrefixes.items()) + | |
240 list(self.ctxPrefixes.items())): | |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
241 self.graphToWrite.bind(p, n) |
32
c8cf9d85fa81
fix tests and test runner
Drew Perttula <drewp@bigasterisk.com>
parents:
31
diff
changeset
|
242 self.graphToWrite.serialize(destination=f, format='n3', encoding='utf8') |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
243 serializeTime = time.time() - t1 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
244 f.close() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
245 self.lastWriteTimestamp = os.path.getmtime(tmpOut) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
246 os.rename(tmpOut, self.path) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
247 iolog.info("%s rewrote in %.1f ms", |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
248 self.path, serializeTime * 1000) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
249 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
250 def __repr__(self): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
251 return "%s(path=%r, uri=%r, ...)" % ( |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
252 self.__class__.__name__, self.path, self.uri) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
253 |