diff options
Diffstat (limited to 'cheetah/Template.py')
-rw-r--r-- | cheetah/Template.py | 81 |
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 |