Mercurial > piecrust2
view piecrust/data/base.py @ 1136:5f97b5b59dfe
bake: Optimize cache handling for the baking process.
- Get rid of the 2-level pipeline runs... handle a single set of passes.
- Go back to load/render segments/layout passes for pages.
- Add descriptions of what each job batch does.
- Improve the taxonomy pipeline so it doesn't re-bake terms that don't need
to be re-baked.
- Simplify some of the code.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 23 Apr 2018 21:47:49 -0700 |
parents | 501bd4ab7e06 |
children |
line wrap: on
line source
import time import collections.abc class MergedMapping(collections.abc.Mapping): """ Provides a dictionary-like object that's really the aggregation of multiple dictionary-like objects. """ def __init__(self, dicts, path=''): self._dicts = dicts self._path = path def __getattr__(self, name): try: return self[name] except KeyError: raise AttributeError("No such attribute: %s" % self._subp(name)) def __getitem__(self, name): values = [] for d in self._dicts: try: val = getattr(d, name) values.append(val) continue except AttributeError: pass try: val = d[name] values.append(val) continue except KeyError: pass if len(values) == 0: raise KeyError("No such item: %s" % self._subp(name)) if len(values) == 1: return values[0] for val in values: if not isinstance(val, (dict, collections.abc.Mapping)): raise Exception( "Template data for '%s' contains an incompatible mix " "of data: %s" % ( self._subp(name), ', '.join([str(type(v)) for v in values]))) return MergedMapping(values, self._subp(name)) def __iter__(self): keys = set() for d in self._dicts: keys |= set(d.keys()) return iter(keys) def __len__(self): keys = set() for d in self._dicts: keys |= set(d.keys()) return len(keys) def _subp(self, name): return '%s/%s' % (self._path, name) def _prependMapping(self, d): self._dicts.insert(0, d) def _appendMapping(self, d): self._dicts.append(d)