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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
95c57a5cb18e run 2to3
drewp@bigasterisk.com
parents: 1
diff changeset
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
95c57a5cb18e run 2to3
drewp@bigasterisk.com
parents: 1
diff changeset
238 for p, n in (list(self.globalPrefixes.items()) +
95c57a5cb18e run 2to3
drewp@bigasterisk.com
parents: 1
diff changeset
239 list(self.readPrefixes.items()) +
95c57a5cb18e run 2to3
drewp@bigasterisk.com
parents: 1
diff changeset
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