summaryrefslogtreecommitdiff
path: root/cheetah/Template.py
diff options
context:
space:
mode:
Diffstat (limited to 'cheetah/Template.py')
-rw-r--r--cheetah/Template.py81
1 files changed, 42 insertions, 39 deletions
diff --git a/cheetah/Template.py b/cheetah/Template.py
index ec92208..0eba725 100644
--- a/cheetah/Template.py
+++ b/cheetah/Template.py
@@ -25,7 +25,7 @@ from types import StringType, ClassType
try:
from types import StringTypes
except ImportError:
- StringTypes = (types.StringType,types.UnicodeType)
+ StringTypes = (types.StringType, types.UnicodeType)
try:
from threading import Lock
@@ -84,15 +84,14 @@ def hashList(l):
return hash(tuple(hashedList))
def hashDict(d):
- items = d.items()
- items.sort()
+ items = sorted(d.items())
hashedList = []
for k, v in items:
if isinstance(v, dict):
v = hashDict(v)
elif isinstance(v, list):
v = hashList(v)
- hashedList.append((k,v))
+ hashedList.append((k, v))
return hash(tuple(hashedList))
@@ -106,7 +105,7 @@ def _genUniqueModuleName(baseModuleName):
finalName = baseModuleName
else:
finalName = ('cheetah_%s_%s_%s'%(baseModuleName,
- str(time.time()).replace('.','_'),
+ str(time.time()).replace('.', '_'),
str(randrange(10000, 99999))))
return finalName
@@ -276,8 +275,8 @@ class Template(Servlet):
'_getTemplateAPIClassForIncludeDirectiveCompilation',
)
_CHEETAH_requiredCheetahClassMethods = ('subclass',)
- _CHEETAH_requiredCheetahClassAttributes = ('cacheRegionClass','cacheStore',
- 'cacheStoreIdPrefix','cacheStoreClass')
+ _CHEETAH_requiredCheetahClassAttributes = ('cacheRegionClass', 'cacheStore',
+ 'cacheStoreIdPrefix', 'cacheStoreClass')
## the following are used by .compile(). Most are documented in its docstring.
_CHEETAH_cacheModuleFilesForTracebacks = False
@@ -293,6 +292,7 @@ class Template(Servlet):
_CHEETAH_defaultMainMethodName = None
_CHEETAH_compilerSettings = None
_CHEETAH_compilerClass = Compiler
+ _CHEETAH_compilerInstance = None
_CHEETAH_cacheCompilationResults = True
_CHEETAH_useCompilationCache = True
_CHEETAH_keepRefToGeneratedCode = True
@@ -314,14 +314,15 @@ class Template(Servlet):
_CHEETAH_cacheStore = None
_CHEETAH_cacheStoreIdPrefix = None
+ @classmethod
def _getCompilerClass(klass, source=None, file=None):
return klass._CHEETAH_compilerClass
- _getCompilerClass = classmethod(_getCompilerClass)
+ @classmethod
def _getCompilerSettings(klass, source=None, file=None):
return klass._CHEETAH_compilerSettings
- _getCompilerSettings = classmethod(_getCompilerSettings)
+ @classmethod
def compile(klass, source=None, file=None,
returnAClass=True,
@@ -640,7 +641,7 @@ class Template(Servlet):
if not isinstance(className, (types.NoneType, basestring)):
raise TypeError(errmsg % ('className', 'string or None'))
- className = className or moduleName
+ className = re.sub(r'^_+','', className or moduleName)
if mainMethodName is Unspecified:
mainMethodName = klass._CHEETAH_defaultMainMethodNameForTemplates
@@ -723,6 +724,7 @@ class Template(Servlet):
#@@TR: should add some logging to this
pass
outputEncoding = 'ascii'
+ compiler = None
if useCache and cacheHash and cacheHash in klass._CHEETAH_compileCache:
cacheItem = klass._CHEETAH_compileCache[cacheHash]
generatedModuleCode = cacheItem.code
@@ -780,7 +782,7 @@ class Template(Servlet):
##
try:
co = compile(generatedModuleCode, __file__, 'exec')
- exec co in mod.__dict__
+ exec(co, mod.__dict__)
except SyntaxError, e:
try:
parseError = genParserErrorFromPythonException(
@@ -818,9 +820,13 @@ class Template(Servlet):
if keepRefToGeneratedCode or cacheCompilationResults:
templateClass._CHEETAH_generatedModuleCode = generatedModuleCode
+ # If we have a compiler object, let's set it to the compiler class
+ # to help the directive analyzer code
+ if compiler:
+ templateClass._CHEETAH_compilerInstance = compiler
return templateClass
- compile = classmethod(compile)
+ @classmethod
def subclass(klass, *args, **kws):
"""Takes the same args as the .compile() classmethod and returns a
template that is a subclass of the template this method is called from.
@@ -834,8 +840,8 @@ class Template(Servlet):
else:
templateAPIClass = Template
return templateAPIClass.compile(*args, **kws)
- subclass = classmethod(subclass)
+ @classmethod
def _preprocessSource(klass, source, file, preprocessors):
"""Iterates through the .compile() classmethod's preprocessors argument
and pipes the source code through each each preprocessor.
@@ -849,8 +855,8 @@ class Template(Servlet):
preprocessor = klass._normalizePreprocessorArg(preprocessor)
source, file = preprocessor.preprocess(source, file)
return source, file
- _preprocessSource = classmethod(_preprocessSource)
+ @classmethod
def _normalizePreprocessorArg(klass, arg):
"""Used to convert the items in the .compile() classmethod's
preprocessors argument into real source preprocessors. This permits the
@@ -859,7 +865,7 @@ class Template(Servlet):
if hasattr(arg, 'preprocess'):
return arg
- elif callable(arg):
+ elif hasattr(arg, '__call__'):
class WrapperPreprocessor:
def preprocess(self, source, file):
return arg(source, file)
@@ -880,8 +886,8 @@ class Template(Servlet):
settings = klass._normalizePreprocessorSettings(settings)
return klass._CHEETAH_defaultPreprocessorClass(settings)
- _normalizePreprocessorArg = classmethod(_normalizePreprocessorArg)
+ @classmethod
def _normalizePreprocessorSettings(klass, settings):
settings.keepRefToGeneratedCode = True
@@ -902,7 +908,7 @@ class Template(Servlet):
(settings.placeholderToken,
settings.directiveToken) = normalizeTokens(settings.tokens)
- if (not getattr(settings,'compilerSettings', None)
+ if (not getattr(settings, 'compilerSettings', None)
and not getattr(settings, 'placeholderToken', None) ):
raise TypeError(
@@ -936,8 +942,8 @@ class Template(Servlet):
directiveToken=settings.directiveToken
)
return settings
- _normalizePreprocessorSettings = classmethod(_normalizePreprocessorSettings)
+ @classmethod
def _updateSettingsWithPreprocessTokens(
klass, compilerSettings, placeholderToken, directiveToken):
@@ -958,8 +964,8 @@ class Template(Servlet):
'*'+directiveToken)
if 'EOLSlurpToken' not in compilerSettings:
compilerSettings['EOLSlurpToken'] = directiveToken
- _updateSettingsWithPreprocessTokens = classmethod(_updateSettingsWithPreprocessTokens)
+ @classmethod
def _addCheetahPlumbingCodeToClass(klass, concreteTemplateClass):
"""If concreteTemplateClass is not a subclass of Cheetah.Template, add
the required cheetah methods and attributes to it.
@@ -991,7 +997,7 @@ class Template(Servlet):
or concreteTemplateClass.__str__ is object.__str__):
mainMethNameAttr = '_mainCheetahMethod_for_'+concreteTemplateClass.__name__
- mainMethName = getattr(concreteTemplateClass,mainMethNameAttr, None)
+ mainMethName = getattr(concreteTemplateClass, mainMethNameAttr, None)
if mainMethName:
def __str__(self):
rc = getattr(self, mainMethName)()
@@ -1013,7 +1019,7 @@ class Template(Servlet):
def __str__(self):
rc = None
if hasattr(self, mainMethNameAttr):
- rc = getattr(self,mainMethNameAttr)()
+ rc = getattr(self, mainMethNameAttr)()
elif hasattr(self, 'respond'):
rc = self.respond()
else:
@@ -1023,7 +1029,7 @@ class Template(Servlet):
return rc
def __unicode__(self):
if hasattr(self, mainMethNameAttr):
- return getattr(self,mainMethNameAttr)()
+ return getattr(self, mainMethNameAttr)()
elif hasattr(self, 'respond'):
return self.respond()
else:
@@ -1033,10 +1039,7 @@ class Template(Servlet):
__unicode__ = new.instancemethod(__unicode__, None, concreteTemplateClass)
setattr(concreteTemplateClass, '__str__', __str__)
setattr(concreteTemplateClass, '__unicode__', __unicode__)
-
- _addCheetahPlumbingCodeToClass = classmethod(_addCheetahPlumbingCodeToClass)
- ## end classmethods ##
def __init__(self, source=None,
@@ -1358,7 +1361,7 @@ class Template(Servlet):
"""
try:
- return valueFromSearchList(self.searchList(), varName.replace('$',''), autoCall)
+ return valueFromSearchList(self.searchList(), varName.replace('$', ''), autoCall)
except NotFound:
if default is not Unspecified:
return default
@@ -1369,7 +1372,7 @@ class Template(Servlet):
"""Test if a variable name exists in the searchList.
"""
try:
- valueFromSearchList(self.searchList(), varName.replace('$',''), autoCall)
+ valueFromSearchList(self.searchList(), varName.replace('$', ''), autoCall)
return True
except NotFound:
return False
@@ -1418,7 +1421,7 @@ class Template(Servlet):
various protocols, as PHP allows with its 'URL fopen wrapper'
"""
- fp = open(path,'r')
+ fp = open(path, 'r')
output = fp.read()
fp.close()
return output
@@ -1502,7 +1505,7 @@ class Template(Servlet):
if errorCatcher:
if isinstance(errorCatcher, basestring):
errorCatcherClass = getattr(ErrorCatchers, errorCatcher)
- elif type(errorCatcher) == ClassType:
+ elif isinstance(errorCatcher, ClassType):
errorCatcherClass = errorCatcher
self._CHEETAH__errorCatcher = ec = errorCatcherClass(self)
@@ -1559,7 +1562,7 @@ class Template(Servlet):
"""Called at runtime to handle #include directives.
"""
_includeID = srcArg
- if not self._CHEETAH__cheetahIncludes.has_key(_includeID):
+ if _includeID not in self._CHEETAH__cheetahIncludes:
if not raw:
if includeFrom == 'file':
source = None
@@ -1577,7 +1580,7 @@ class Template(Servlet):
# Template class to be used for compilation so compilerSettings
# can be changed.
compiler = self._getTemplateAPIClassForIncludeDirectiveCompilation(source, file)
- nestedTemplateClass = compiler.compile(source=source,file=file)
+ nestedTemplateClass = compiler.compile(source=source, file=file)
nestedTemplate = nestedTemplateClass(_preBuiltSearchList=self.searchList(),
_globalSetVars=self._CHEETAH__globalSetVars)
# Set the inner template filters to the initial filter of the
@@ -1819,8 +1822,8 @@ class Template(Servlet):
raise TypeError("arg 'src' invalid")
sources = source + 's'
converters = {
- '' : _Converter('string', None, default, default ),
- 'int' : _Converter('int', int, defaultInt, badInt ),
+ '': _Converter('string', None, default, default ),
+ 'int': _Converter('int', int, defaultInt, badInt ),
'float': _Converter('float', float, defaultFloat, badFloat), }
#pprint.pprint(locals()); return {}
dic = {} # Destination.
@@ -1837,7 +1840,7 @@ class Template(Servlet):
# 'dic = super(ThisClass, self).webInput(names, namesMulti, ...)'
# and then the code below.
if debug:
- print "<PRE>\n" + pprint.pformat(dic) + "\n</PRE>\n\n"
+ print("<PRE>\n" + pprint.pformat(dic) + "\n</PRE>\n\n")
self.searchList().insert(0, dic)
return dic
@@ -1862,16 +1865,16 @@ def genParserErrorFromPythonException(source, file, generatedPyCode, exception):
lines = generatedPyCode.splitlines()
prevLines = [] # (i, content)
- for i in range(1,4):
+ for i in range(1, 4):
if pyLineno-i <=0:
break
- prevLines.append( (pyLineno+1-i,lines[pyLineno-i]) )
+ prevLines.append( (pyLineno+1-i, lines[pyLineno-i]) )
nextLines = [] # (i, content)
- for i in range(1,4):
+ for i in range(1, 4):
if not pyLineno+i < len(lines):
break
- nextLines.append( (pyLineno+i,lines[pyLineno+i]) )
+ nextLines.append( (pyLineno+i, lines[pyLineno+i]) )
nextLines.reverse()
report = 'Line|Python Code\n'
report += '----|-------------------------------------------------------------\n'
@@ -1918,7 +1921,7 @@ def genParserErrorFromPythonException(source, file, generatedPyCode, exception):
message = '\n'.join(message)
reader = SourceReader(source, filename=filename)
- return ParseError(reader, message, lineno=lineno,col=col)
+ return ParseError(reader, message, lineno=lineno, col=col)
# vim: shiftwidth=4 tabstop=4 expandtab