diff options
Diffstat (limited to 'pystache/context.py')
-rw-r--r-- | pystache/context.py | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/pystache/context.py b/pystache/context.py index de22a75..cb53b88 100644 --- a/pystache/context.py +++ b/pystache/context.py @@ -61,22 +61,40 @@ def _get_value(item, key): # TODO: add some unit tests for this. -def resolve(context, name): +def resolve(context_stack, name): """ - Resolve the given name against the given context stack. + Resolve a name against a context stack. This function follows the rules outlined in the section of the spec regarding tag interpolation. + Arguments: + + context_stack: a ContextStack instance. + This function does not coerce the return value to a string. """ if name == '.': - return context.top() + return context_stack.top() + + parts = name.split('.') + + value = context_stack.get(parts[0], _NOT_FOUND) + + for part in parts[1:]: + # TODO: use EAFP here instead. + # http://docs.python.org/glossary.html#term-eafp + if value is _NOT_FOUND: + break + value = _get_value(value, part) + + # The spec says that if name resolution fails at any point, the result + # should be considered falsey, and should interpolate as the empty string. + if value is _NOT_FOUND: + return '' - # The spec says that if the name fails resolution, the result should be - # considered falsey, and should interpolate as the empty string. - return context.get(name, '') + return value class ContextStack(object): |