diff options
author | Chris Jerdonek <chris.jerdonek@gmail.com> | 2012-04-01 16:31:00 -0700 |
---|---|---|
committer | Chris Jerdonek <chris.jerdonek@gmail.com> | 2012-04-01 16:31:00 -0700 |
commit | de8aed5300026cf4865509ac08298cf0fc5ca471 (patch) | |
tree | ad82a2c45e7129a3f8e6455bf59e26b4792180dc | |
parent | 1996af1c0c53da1111bb002fd3951f2f427f5c48 (diff) | |
download | pystache-de8aed5300026cf4865509ac08298cf0fc5ca471.tar.gz |
Removed View from NestedContext example and added experimental Renderer.context property.
Also corrected some test variable names (expected -> actual). :)
-rw-r--r-- | examples/nested_context.py | 13 | ||||
-rw-r--r-- | pystache/renderer.py | 15 | ||||
-rw-r--r-- | tests/test_examples.py | 12 | ||||
-rw-r--r-- | tests/test_simple.py | 7 | ||||
-rw-r--r-- | tests/test_template_spec.py | 32 |
5 files changed, 54 insertions, 25 deletions
diff --git a/examples/nested_context.py b/examples/nested_context.py index 6fd0aea..4626ac0 100644 --- a/examples/nested_context.py +++ b/examples/nested_context.py @@ -1,7 +1,12 @@ -import pystache +from pystache import TemplateSpec -class NestedContext(pystache.View): - template_path = 'examples' +class NestedContext(TemplateSpec): + + def __init__(self, renderer): + self.renderer = renderer + + def _context_get(self, key): + return self.renderer.context.get(key) def outer_thing(self): return "two" @@ -16,6 +21,6 @@ class NestedContext(pystache.View): return [{'outer': 'car'}] def nested_context_in_view(self): - if self.context.get('outer') == self.context.get('inner'): + if self._context_get('outer') == self._context_get('inner'): return 'it works!' return '' diff --git a/pystache/renderer.py b/pystache/renderer.py index ca69dc5..a02693c 100644 --- a/pystache/renderer.py +++ b/pystache/renderer.py @@ -111,6 +111,7 @@ class Renderer(object): if isinstance(search_dirs, basestring): search_dirs = [search_dirs] + self._context = None self.decode_errors = decode_errors self.escape = escape self.file_encoding = file_encoding @@ -119,6 +120,19 @@ class Renderer(object): self.search_dirs = search_dirs self.string_encoding = string_encoding + # This is an experimental way of giving views access to the current context. + # TODO: consider another approach of not giving access via a property, + # but instead letting the caller pass the initial context to the + # main render() method by reference. This approach would probably + # be less likely to be misused. + @property + def context(self): + """ + Return the current rendering context [experimental]. + + """ + return self._context + def _to_unicode_soft(self, s): """ Convert a basestring to unicode, preserving any unicode subclass. @@ -240,6 +254,7 @@ class Renderer(object): template = self._to_unicode_hard(template) context = Context.create(*context, **kwargs) + self._context = context engine = self._make_render_engine() rendered = engine.render(template, context) diff --git a/tests/test_examples.py b/tests/test_examples.py index e4b41bf..b7df909 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -63,12 +63,18 @@ Again, Welcome!""") """) def test_nested_context(self): - self.assertEquals(NestedContext().render(), "one and foo and two") + renderer = Renderer() + actual = renderer.render(NestedContext(renderer)) + self.assertString(actual, u"one and foo and two") def test_nested_context_is_available_in_view(self): - view = NestedContext() + renderer = Renderer() + + view = NestedContext(renderer) view.template = '{{#herp}}{{#derp}}{{nested_context_in_view}}{{/derp}}{{/herp}}' - self.assertEquals(view.render(), 'it works!') + + actual = renderer.render(view) + self.assertString(actual, u'it works!') def test_partial_in_partial_has_access_to_grand_parent_context(self): view = TemplatePartial(context = {'prop': 'derp'}) diff --git a/tests/test_simple.py b/tests/test_simple.py index 0631574..aba0e89 100644 --- a/tests/test_simple.py +++ b/tests/test_simple.py @@ -14,9 +14,12 @@ from tests.common import AssertStringMixin class TestSimple(unittest.TestCase, AssertStringMixin): def test_nested_context(self): - view = NestedContext() + renderer = Renderer() + view = NestedContext(renderer) view.template = '{{#foo}}{{thing1}} and {{thing2}} and {{outer_thing}}{{/foo}}{{^foo}}Not foo!{{/foo}}' - self.assertEquals(view.render(), "one and foo and two") + + actual = renderer.render(view) + self.assertString(actual, u"one and foo and two") def test_looping_and_negation_context(self): template = '{{#item}}{{header}}: {{name}} {{/item}}{{^item}} Shouldnt see me{{/item}}' diff --git a/tests/test_template_spec.py b/tests/test_template_spec.py index 658061b..692f93e 100644 --- a/tests/test_template_spec.py +++ b/tests/test_template_spec.py @@ -88,8 +88,8 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): def test_complex(self): renderer = Renderer() - expected = renderer.render(Complex()) - self.assertString(expected, u"""\ + actual = renderer.render(Complex()) + self.assertString(actual, u"""\ <h1>Colors</h1> <ul> <li><strong>red</strong></li> @@ -99,45 +99,45 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): def test_higher_order_replace(self): renderer = Renderer() - expected = renderer.render(Lambdas()) - self.assertEquals(expected, 'bar != bar. oh, it does!') + actual = renderer.render(Lambdas()) + self.assertEquals(actual, 'bar != bar. oh, it does!') def test_higher_order_rot13(self): view = Lambdas() view.template = '{{#rot13}}abcdefghijklm{{/rot13}}' renderer = Renderer() - expected = renderer.render(view) - self.assertString(expected, u'nopqrstuvwxyz') + actual = renderer.render(view) + self.assertString(actual, u'nopqrstuvwxyz') def test_higher_order_lambda(self): view = Lambdas() view.template = '{{#sort}}zyxwvutsrqponmlkjihgfedcba{{/sort}}' renderer = Renderer() - expected = renderer.render(view) - self.assertString(expected, u'abcdefghijklmnopqrstuvwxyz') + actual = renderer.render(view) + self.assertString(actual, u'abcdefghijklmnopqrstuvwxyz') def test_partials_with_lambda(self): view = Lambdas() view.template = '{{>partial_with_lambda}}' renderer = Renderer(search_dirs=EXAMPLES_DIR) - expected = renderer.render(view) - self.assertEquals(expected, u'nopqrstuvwxyz') + actual = renderer.render(view) + self.assertEquals(actual, u'nopqrstuvwxyz') def test_hierarchical_partials_with_lambdas(self): view = Lambdas() view.template = '{{>partial_with_partial_and_lambda}}' renderer = Renderer(search_dirs=EXAMPLES_DIR) - expected = renderer.render(view) - self.assertString(expected, u'nopqrstuvwxyznopqrstuvwxyz') + actual = renderer.render(view) + self.assertString(actual, u'nopqrstuvwxyznopqrstuvwxyz') def test_inverted(self): renderer = Renderer() - expected = renderer.render(Inverted()) - self.assertString(expected, u"""one, two, three, empty list""") + actual = renderer.render(Inverted()) + self.assertString(actual, u"""one, two, three, empty list""") def test_accessing_properties_on_parent_object_from_child_objects(self): parent = Thing() @@ -150,8 +150,8 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): def test_inverted_lists(self): renderer = Renderer() - expected = renderer.render(InvertedLists()) - self.assertString(expected, u"""one, two, three, empty list""") + actual = renderer.render(InvertedLists()) + self.assertString(actual, u"""one, two, three, empty list""") class SpecLoaderTests(unittest.TestCase, AssertIsMixin, AssertStringMixin): |