annotate PageTemplates/PythonExpr.py @ 984:a3a8ac7b8c40

Adding PageTemplates to the dist
author Richard Jones <richard@users.sourceforge.net>
date Fri, 30 Aug 2002 08:27:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
984
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 #
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 # This software is subject to the provisions of the Zope Public License,
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # FOR A PARTICULAR PURPOSE
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 #
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 ##############################################################################
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 """Generic Python Expression Handler
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 """
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 __version__='$Revision: 1.1 $'[11:-2]
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 from TALES import CompilerError
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 from string import strip, split, join, replace, lstrip
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 from sys import exc_info
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 class getSecurityManager:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 '''Null security manager'''
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 def validate(self, *args, **kwargs):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 return 1
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 addContext = removeContext = validateValue = validate
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 class PythonExpr:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 def __init__(self, name, expr, engine):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 self.expr = expr = replace(strip(expr), '\n', ' ')
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 try:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 d = {}
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 exec 'def f():\n return %s\n' % strip(expr) in d
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 self._f = d['f']
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 except:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 raise CompilerError, ('Python expression error:\n'
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 '%s: %s') % exc_info()[:2]
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 self._get_used_names()
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 def _get_used_names(self):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 self._f_varnames = vnames = []
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 for vname in self._f.func_code.co_names:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 if vname[0] not in '$_':
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 vnames.append(vname)
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 def _bind_used_names(self, econtext):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 # Bind template variables
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 names = {}
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 vars = econtext.vars
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 getType = econtext._engine.getTypes().get
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 for vname in self._f_varnames:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 has, val = vars.has_get(vname)
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 if not has:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 has = val = getType(vname)
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 if has:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 val = ExprTypeProxy(vname, val, econtext)
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 if has:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 names[vname] = val
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 return names
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 def __call__(self, econtext):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 __traceback_info__ = self.expr
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 f = self._f
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 f.func_globals.update(self._bind_used_names(econtext))
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 return f()
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 def __str__(self):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 return 'Python expression "%s"' % self.expr
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 def __repr__(self):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 return '<PythonExpr %s>' % self.expr
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 class ExprTypeProxy:
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 '''Class that proxies access to an expression type handler'''
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 def __init__(self, name, handler, econtext):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 self._name = name
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 self._handler = handler
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 self._econtext = econtext
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 def __call__(self, text):
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 return self._handler(self._name, text,
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 self._econtext._engine)(self._econtext)
a3a8ac7b8c40 Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82

Roundup Issue Tracker: http://roundup-tracker.org/