import threading, time, pickle, random, os
-import cookie, env
+from . import cookie, env
__all__ = ["db", "get"]
def gennonce(length):
nonce = ""
- for i in xrange(length):
+ for i in range(length):
nonce += chr(random.randint(0, 255))
return nonce
def __init__(self, expire = 86400 * 7):
self.id = hexencode(gennonce(16))
self.dict = {}
- self.lock = threading.Lock()
+ self.lock = threading.RLock()
self.ctime = self.atime = self.mtime = int(time.time())
self.expire = expire
self.dctl = set()
now = int(time.time())
with self.lock:
dlist = []
- for sess in self.live.itervalues():
+ for sess in self.live.values():
if sess.atime + self.freezetime < now:
try:
if sess.dirty():
data = self.backdb[sessid]
try:
return pickle.loads(data)
- except Exception, e:
+ except:
raise KeyError()
def freeze(self, sess):
doc = xml.dom.minidom.Document()
return self.__todom__(doc).toxml()
-class text(node, unicode):
+class text(node, str):
def __todom__(self, doc):
return doc.createTextNode(self)
-class raw(node, unicode):
++class raw(node, str):
+ def __todom__(self, doc):
+ raise Exception("Cannot convert raw code to DOM objects")
+
class element(node):
def __init__(self, ns, name, ctx):
self.ns = ns
- self.name = unicode(name)
+ self.name = str(name)
self.ctx = ctx
self.attrs = {}
self.children = []
def __call__(self, *children, **attrs):
for child in children:
self.children.append(self.ctx.nodefrom(child))
- for k, v in attrs.iteritems():
- self.attrs[unicode(k)] = unicode(v)
+ for k, v in attrs.items():
+ self.attrs[str(k)] = str(v)
return self
def __todom__(self, doc):
el = doc.createElementNS(self.ns, self.name)
- for k, v in self.attrs.iteritems():
+ for k, v in self.attrs.items():
el.setAttribute(k, v)
for child in self.children:
el.appendChild(child.__todom__(doc))
class context(object):
def __init__(self):
self.nodeconv = {}
- self.nodeconv[str] = lambda ob: text(ob, "utf-8")
- self.nodeconv[unicode] = text
+ self.nodeconv[bytes] = lambda ob: text(ob, "utf-8")
+ self.nodeconv[str] = text
self.nodeconv[int] = text
- self.nodeconv[long] = text
self.nodeconv[float] = text
def nodefrom(self, ob):
-import cons
+from . import cons
def findnsnames(el):
names = {}
def proc(el):
if isinstance(el, cons.element):
if el.ns not in names:
- names[el.ns] = u"n" + unicode(nid[0])
+ names[el.ns] = "n" + str(nid[0])
nid[:] = [nid[0] + 1]
for ch in el.children:
proc(ch)
def quotewrite(self, buf):
for ch in buf:
- if ch == u'&':
- self.write(u"&")
- elif ch == u'<':
- self.write(u"<")
- elif ch == u'>':
- self.write(u">")
+ if ch == '&':
+ self.write("&")
+ elif ch == '<':
+ self.write("<")
+ elif ch == '>':
+ self.write(">")
else:
self.write(ch)
def text(self, el):
self.quotewrite(el)
+ def rawcode(self, el):
+ self.write(el)
+
def attrval(self, buf):
- qc, qt = (u"'", u"'") if u'"' in buf else (u'"', u""")
+ qc, qt = ("'", "'") if '"' in buf else ('"', """)
self.write(qc)
for ch in buf:
- if ch == u'&':
- self.write(u"&")
- elif ch == u'<':
- self.write(u"<")
- elif ch == u'>':
- self.write(u">")
+ if ch == '&':
+ self.write("&")
+ elif ch == '<':
+ self.write("<")
+ elif ch == '>':
+ self.write(">")
elif ch == qc:
self.write(qt)
else:
def attr(self, k, v):
self.write(k)
- self.write(u'=')
+ self.write('=')
self.attrval(v)
def shorttag(self, el, **extra):
- self.write(u'<' + self.elname(el))
- for k, v in el.attrs.iteritems():
- self.write(u' ')
+ self.write('<' + self.elname(el))
+ for k, v in el.attrs.items():
+ self.write(' ')
self.attr(k, v)
- for k, v in extra.iteritems():
- self.write(u' ')
+ for k, v in extra.items():
+ self.write(' ')
self.attr(k, v)
- self.write(u" />")
+ self.write(" />")
def elname(self, el):
ns = self.nsnames[el.ns]
if ns is None:
return el.name
else:
- return ns + u':' + el.name
+ return ns + ':' + el.name
def starttag(self, el, **extra):
- self.write(u'<' + self.elname(el))
- for k, v in el.attrs.iteritems():
- self.write(u' ')
+ self.write('<' + self.elname(el))
+ for k, v in el.attrs.items():
+ self.write(' ')
self.attr(k, v)
- for k, v in extra.iteritems():
- self.write(u' ')
+ for k, v in extra.items():
+ self.write(' ')
self.attr(k, v)
- self.write(u'>')
+ self.write('>')
def endtag(self, el):
- self.write(u'</' + self.elname(el) + u'>')
+ self.write('</' + self.elname(el) + '>')
def longtag(self, el):
self.starttag(el, **extra)
self.element(el)
elif isinstance(el, cons.text):
self.text(el)
+ elif isinstance(el, cons.raw):
+ self.rawcode(el)
else:
raise Exception("Unknown object in element tree: " + el)
def start(self):
- self.write(u'<?xml version="1.0" encoding="' + self.charset + u'" ?>\n')
+ self.write('<?xml version="1.0" encoding="' + self.charset + '" ?>\n')
if self.doctype:
- self.write(u'<!DOCTYPE %s PUBLIC "%s" "%s">\n' % (self.root.name,
- self.doctype[0],
- self.doctype[1]))
+ self.write('<!DOCTYPE %s PUBLIC "%s" "%s">\n' % (self.root.name,
+ self.doctype[0],
+ self.doctype[1]))
extra = {}
- for uri, nm in self.nsnames.iteritems():
+ for uri, nm in self.nsnames.items():
if uri is None:
continue
if nm is None:
- extra[u"xmlns"] = uri
+ extra["xmlns"] = uri
else:
- extra[u"xmlns:" + nm] = uri
+ extra["xmlns:" + nm] = uri
self.element(self.root, **extra)
@classmethod
self.col = 0
def write(self, buf):
- for c in buf:
- if c == '\n':
+ for i in range(len(buf)):
+ c = buf[i:i + 1]
+ if c == b'\n':
self.col = 0
else:
self.col += 1
if self.atbol:
return
if self.col != 0:
- self.write('\n')
+ self.write(b'\n')
self.write(indent)
self.atbol = True
class indenter(formatter):
- def __init__(self, indent=u" ", *args, **kw):
+ def __init__(self, indent=" ", *args, **kw):
super(indenter, self).__init__(*args, **kw)
self.out = iwriter(self.out)
self.indent = indent
- self.curind = u""
+ self.curind = ""
def simple(self, el):
for ch in el.children:
import inspect
-import req, dispatch, session, form
+from . import req, dispatch, session, form
def wsgiwrap(callable):
def wrapper(env, startreq):
return dispatch.handle(req.origrequest(env), startreq, callable)
return wrapper
+def stringwrap(charset):
+ def dec(callable):
+ def wrapper(*args, **kwargs):
+ bk = callable(*args, **kwargs)
+ for string in bk:
+ yield string.encode(charset)
+ return wrapper
+ return dec
+
def formparams(callable):
def wrapper(req):
data = form.formdata(req)
except KeyError:
if not create:
return None
- ret = cls(req)
+ ret = cls(req, sess)
sess[cls] = ret
return ret
class autodirty(sessiondata):
@classmethod
def get(cls, req):
- ret = super(autodirty, cls).get(req)
+ ret = super().get(req)
if "_is_dirty" not in ret.__dict__:
ret.__dict__["_is_dirty"] = False
return ret
return self._is_dirty
def __setattr__(self, name, value):
- super(autodirty, self).__setattr__(name, value)
+ super().__setattr__(name, value)
if "_is_dirty" in self.__dict__:
self.__dict__["_is_dirty"] = True
def __delattr__(self, name):
- super(autodirty, self).__delattr__(name, value)
+ super().__delattr__(name, value)
if "_is_dirty" in self.__dict__:
self.__dict__["_is_dirty"] = True
class manudirty(object):
def __init__(self, *args, **kwargs):
- super(manudirty, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.__dirty = False
def sessfrozen(self):