From dd8fae1cbc1de3f98193661055cd25f03d8a2b5b Mon Sep 17 00:00:00 2001
From: Lakshmi Vyasarajan <lakshmi.vyas@gmail.com>
Date: Mon, 20 Jun 2011 01:24:02 +0530
Subject: [PATCH] Ensured providers work in the same way as context data and
 metadata (Issue #29)

---
 hyde/model.py               |  4 +--
 hyde/tests/test_generate.py | 57 +++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/hyde/model.py b/hyde/model.py
index ed73191..7a1e671 100644
--- a/hyde/model.py
+++ b/hyde/model.py
@@ -45,7 +45,7 @@ class Expando(object):
         Sets the expando attribute after
         transforming the value.
         """
-        setattr(self, key.encode('utf-8'), self.transform(value))
+        setattr(self, str(key).encode('utf-8'), self.transform(value))
 
     def transform(self, primitive):
         """
@@ -91,7 +91,7 @@ class Context(object):
             for provider_name, resource_name in ctx.providers.__dict__.items():
                 res = File(Folder(sitepath).child(resource_name))
                 if res.exists:
-                    context[provider_name] = yaml.load(res.read_all())
+                    context[provider_name] = Expando(yaml.load(res.read_all()))
         except AttributeError:
             # No context data found
             pass
diff --git a/hyde/tests/test_generate.py b/hyde/tests/test_generate.py
index b4692fc..b190e6d 100644
--- a/hyde/tests/test_generate.py
+++ b/hyde/tests/test_generate.py
@@ -161,3 +161,60 @@ main:
         assert "home" in out
         assert "articles" in out
         assert "projects" in out
+
+    def test_context_providers_equivalence(self):
+        import yaml
+        events = """
+    2011:
+        -
+            title: "one event"
+            location: "a city"
+        -
+            title: "one event"
+            location: "a city"
+
+    2010:
+        -
+            title: "one event"
+            location: "a city"
+        -
+            title: "one event"
+            location: "a city"
+"""
+        events_dict = yaml.load(events)
+        config_dict = dict(context=dict(
+            data=dict(events1=events_dict),
+            providers=dict(events2="events.yaml")
+        ))
+        text = """
+{%% extends "base.html" %%}
+
+{%% block main %%}
+    <ul>
+    {%% for year, eventlist in %s %%}
+        <li>
+            <h1>{{ year }}</h1>
+            <ul>
+                {%% for event in eventlist %%}
+                <li>{{ event.title }}-{{ event.location }}</li>
+                {%% endfor %%}
+            </ul>
+        </li>
+    {%% endfor %%}
+    </ul>
+{%% endblock %%}
+"""
+
+        File(TEST_SITE.child('events.yaml')).write(events)
+        f1 = File(TEST_SITE.child('content/text1.html'))
+        f2 = File(TEST_SITE.child('content/text2.html'))
+        f1.write(text % "events1")
+        f2.write(text % "events2")
+        site = Site(TEST_SITE, Config(TEST_SITE, config_dict=config_dict))
+        site.load()
+        gen = Generator(site)
+        gen.generate_all()
+        left = File(site.config.deploy_root_path.child(f1.name)).read_all()
+        right = File(site.config.deploy_root_path.child(f2.name)).read_all()
+        assert left == right
+