summaryrefslogtreecommitdiff
path: root/cheetah/DummyTransaction.py
diff options
context:
space:
mode:
Diffstat (limited to 'cheetah/DummyTransaction.py')
-rw-r--r--cheetah/DummyTransaction.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/cheetah/DummyTransaction.py b/cheetah/DummyTransaction.py
new file mode 100644
index 0000000..26d2ea7
--- /dev/null
+++ b/cheetah/DummyTransaction.py
@@ -0,0 +1,95 @@
+
+'''
+Provides dummy Transaction and Response classes is used by Cheetah in place
+of real Webware transactions when the Template obj is not used directly as a
+Webware servlet.
+
+Warning: This may be deprecated in the future, please do not rely on any
+specific DummyTransaction or DummyResponse behavior
+'''
+
+import types
+
+class DummyResponseFailure(Exception):
+ pass
+
+class DummyResponse(object):
+ '''
+ A dummy Response class is used by Cheetah in place of real Webware
+ Response objects when the Template obj is not used directly as a Webware
+ servlet
+ '''
+ def __init__(self):
+ self._outputChunks = []
+
+ def flush(self):
+ pass
+
+ def write(self, value):
+ self._outputChunks.append(value)
+
+ def writeln(self, txt):
+ write(txt)
+ write('\n')
+
+ def getvalue(self, outputChunks=None):
+ chunks = outputChunks or self._outputChunks
+ try:
+ return ''.join(chunks)
+ except UnicodeDecodeError, ex:
+ nonunicode = [c for c in chunks if not isinstance(c, unicode)]
+ raise DummyResponseFailure('''Looks like you're trying to mix encoded strings with Unicode strings
+ (most likely utf-8 encoded ones)
+
+ This can happen if you're using the `EncodeUnicode` filter, or if you're manually
+ encoding strings as utf-8 before passing them in on the searchList (possible offenders:
+ %s)
+ (%s)''' % (nonunicode, ex))
+
+
+ def writelines(self, *lines):
+ ## not used
+ [self.writeln(ln) for ln in lines]
+
+
+class DummyTransaction(object):
+ '''
+ A dummy Transaction class is used by Cheetah in place of real Webware
+ transactions when the Template obj is not used directly as a Webware
+ servlet.
+
+ It only provides a response object and method. All other methods and
+ attributes make no sense in this context.
+ '''
+ def __init__(self, *args, **kwargs):
+ self._response = None
+
+ def response(self, resp=None):
+ if self._response is None:
+ self._response = resp or DummyResponse()
+ return self._response
+
+
+class TransformerResponse(DummyResponse):
+ def __init__(self, *args, **kwargs):
+ super(TransformerResponse, self).__init__(*args, **kwargs)
+ self._filter = None
+
+ def getvalue(self, **kwargs):
+ output = super(TransformerResponse, self).getvalue(**kwargs)
+ if self._filter:
+ _filter = self._filter
+ if isinstance(_filter, types.TypeType):
+ _filter = _filter()
+ return _filter.filter(output)
+ return output
+
+
+class TransformerTransaction(object):
+ def __init__(self, *args, **kwargs):
+ self._response = None
+ def response(self):
+ if self._response:
+ return self._response
+ return TransformerResponse()
+