Merge branch 'master' into python2
authorFredrik Tolf <fredrik@dolda2000.com>
Wed, 21 Dec 2011 07:16:56 +0000 (08:16 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Wed, 21 Dec 2011 07:16:56 +0000 (08:16 +0100)
Conflicts:
wrw/__init__.py

1  2 
wrw/__init__.py
wrw/dispatch.py
wrw/session.py
wrw/util.py

diff --combined wrw/__init__.py
@@@ -1,6 -1,6 +1,6 @@@
  __all__ = ["wsgiwrap", "restart", "cookie", "formdata"]
  
- from .util import wsgiwrap, persession
 -from util import wsgiwrap, persession, sessiondata
 -from dispatch import restart
 -import cookie
 -from form import formdata
++from .util import wsgiwrap, persession, sessiondata
 +from .dispatch import restart
 +from . import cookie
 +from .form import formdata
diff --combined wrw/dispatch.py
@@@ -13,14 -13,40 +13,40 @@@ def mangle(result)
          return result
      return [str(result)]
  
+ class iterproxy(object):
+     # Makes sure iter(real).next() is called immediately, in order to
+     # let generator code run.
+     def __init__(self, real):
+         self.bk = real
+         self.bki = iter(real)
+         self._next = [None]
+         self.next()
+     def __iter__(self):
+         return self
+     def next(self):
+         if self._next is None:
+             raise StopIteration()
+         ret = self._next[0]
+         try:
+             self._next[:] = [self.bki.next()]
+         except StopIteration:
+             self._next = None
+         return ret
+     def close(self):
+         if hasattr(self.bk, "close"):
+             self.bk.close()
  def handle(req, startreq, handler):
      try:
          resp = [""]
          while True:
              try:
-                 resp = handler(req)
+                 resp = iterproxy(handler(req))
                  break
 -            except restart, i:
 +            except restart as i:
                  handler = i.handle
          req.commit(startreq)
          return resp
diff --combined wrw/session.py
@@@ -1,5 -1,5 +1,5 @@@
  import threading, time, pickle, random, os
 -import cookie
 +from . import cookie
  
  __all__ = ["db", "get"]
  
@@@ -11,7 -11,7 +11,7 @@@ def hexencode(str)
  
  def gennonce(length):
      nonce = ""
 -    for i in xrange(length):
 +    for i in range(length):
          nonce += chr(random.randint(0, 255))
      return nonce
  
@@@ -83,7 -83,7 +83,7 @@@ class db(object)
          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():
                  sess.atime = now
              except KeyError:
                  sess = session()
-                 self.live[sess.id] = sess
                  new = True
  
          def ckfreeze(req):
              if sess.dirty():
+                 if new:
+                     cookie.add(req, self.cookiename, sess.id, self.path)
+                     with self.lock:
+                         self.live[sess.id] = sess
                  try:
-                     if new:
-                         cookie.add(req, self.cookiename, sess.id, self.path)
                      self.freeze(sess)
                  except:
                      pass
  
  class backeddb(db):
      def __init__(self, backdb, *args, **kw):
 -        super(backeddb, self).__init__(*args, **kw)
 +        super().__init__(*args, **kw)
          self.backdb = backdb
  
      def thaw(self, sessid):
          data = self.backdb[sessid]
          try:
              return pickle.loads(data)
 -        except Exception, e:
 +        except:
              raise KeyError()
  
      def freeze(self, sess):
diff --combined wrw/util.py
@@@ -1,4 -1,4 +1,4 @@@
 -import req, dispatch, session
 +from . import req, dispatch, session
  
  def wsgiwrap(callable):
      def wrapper(env, startreq):
@@@ -19,3 -19,35 +19,35 @@@ def persession(data = None)
              return sess[callable].handle(req)
          return wrapper
      return dec
 -        super(sessiondata, self).__setattr__(name, value)
+ class sessiondata(object):
+     @classmethod
+     def get(cls, req):
+         sess = cls.sessdb().get(req)
+         with sess.lock:
+             try:
+                 return sess[cls]
+             except KeyError:
+                 ret = cls(req)
+                 ret._is_dirty = [False]
+                 sess[cls] = ret
+                 return ret
+     @classmethod
+     def sessdb(cls):
+         return session.default
+     def sessfrozen(self):
+         self._is_dirty[:] = [False]
+     def sessdirty(self):
+         return self._is_dirty[0]
+     def __setattr__(self, name, value):
+         if hasattr(self, "_is_dirty"):
+             self._is_dirty[:] = [True]
 -        super(sessiondata, self).__delattr__(name)
++        super().__setattr__(name, value)
+     def __delattr__(self, name):
++        super().__delattr__(name)
+         self._is_dirty[:] = [True]