def has_changed(self): """Check wether the entry has changed using the following conditions: - cache file does not exist -> has changed - cache file does not contain required filter intermediate -> has changed - entry's file is newer than the cache's one -> has changed - otherwise -> not changed""" # with new-style classes we can't delete/overwrite @property-ied methods, # so we try to return a fixed value otherwise continue try: return self._has_changed except AttributeError: pass path = join(cache.cache_dir, self.md5) deps = [] for fxs in self.filters.iter(self.context): # extend filter dependencies deps.extend(fxs) if not cache.has_key(path, md5(*deps)): return True else: return self.lastmodified > cache.getmtime(path)
def modified(self): changed = self.lastmodified > cache.getmtime(self.cachefilename) # skip resource check if changed is true if not changed and self.hasproperty('copy'): # using ascii record separator between paths, ignore empty list pv = cache.get(self.cachefilename, 'resources') if pv: return self.resources != pv.split('\x1e') else: # flag as modified if resource list is not empty and cache is return (not self.resources) == False return changed
def content(self): """Returns the processed content. This one of the core functions of acrylamid: it compiles incrementally the filter chain using a tree representation and saves final output or intermediates to cache, so we can rapidly re-compile the whole content. The cache is rather dumb: Acrylamid can not determine wether it differs only in a single character. Thus, to minimize the overhead the cache object is zlib-compressed.""" # previous value pv = None # this is our cache filename path = self.cachefilename # remove *all* intermediates when entry has been modified if cache.getmtime(path) > 0.0 and self.modified: cache.remove(path) if self.hasproperty('copy'): res = self.resources if res: # use ascii record separator between paths, ignore empty list cache.set(path, 'resources', '\x1e'.join(res)) # growing dependencies of the filter chain deps = [] for fxs in self.filters.iter(context=self.context): # extend dependencies deps.extend(fxs) # key where we save this filter chain key = hash(*deps) try: rv = cache.get(path, key) if rv is None: res = self.source if pv is None else pv for f in fxs: res = f.transform(res, self, *f.args) pv = cache.set(path, key, res) else: pv = rv except (IndexError, AttributeError): # jinja2 will ignore these Exceptions, better to catch them before traceback.print_exc(file=sys.stdout) return pv
def has_changed(self): """Check wether the entry has changed using the following conditions: - cache file does not exist -> has changed - cache file does not contain required filter intermediate -> has changed - entry's file is newer than the cache's one -> has changed - otherwise -> not changed """ path = join(cache.cache_dir, self.md5) deps = [] for fxs in self.filters.iter(self.context): # extend filter dependencies deps.extend(fxs) if not cache.has_key(path, md5(*deps)): return True else: return getmtime(self.filename) > cache.getmtime(path)
def modified(self): return self.lastmodified > cache.getmtime(hex(hash(self))[2:])