From 34308069b315d8f7974ff82edb0eac706d3edf7b Mon Sep 17 00:00:00 2001 From: Lakshmi Vyasarajan Date: Sat, 5 Feb 2011 11:31:59 +0530 Subject: [PATCH] Now passing through ~None~ dependency to regenerate always for dynamic imports. Must replace this with a configurable depends plugin later --- hyde/ext/plugins/auto_extend.py | 4 +- hyde/ext/plugins/folders.py | 2 +- hyde/ext/templates/jinja.py | 5 ++- hyde/generator.py | 14 +++++-- hyde/site.py | 1 + hyde/tests/test_jinja2template.py | 61 +++++++++++++++++++++++++++++++ 6 files changed, 79 insertions(+), 8 deletions(-) diff --git a/hyde/ext/plugins/auto_extend.py b/hyde/ext/plugins/auto_extend.py index 27f724d..4017667 100644 --- a/hyde/ext/plugins/auto_extend.py +++ b/hyde/ext/plugins/auto_extend.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -Autoextend css plugin +Autoextend plugin """ from hyde.plugin import Plugin @@ -8,7 +8,7 @@ import re class AutoExtendPlugin(Plugin): """ - The plugin class for less css + The plugin class for extending templates using metadata. """ def __init__(self, site): diff --git a/hyde/ext/plugins/folders.py b/hyde/ext/plugins/folders.py index 6ac1f69..726645c 100644 --- a/hyde/ext/plugins/folders.py +++ b/hyde/ext/plugins/folders.py @@ -8,7 +8,7 @@ from hyde.fs import Folder class FlattenerPlugin(Plugin): """ - The plugin class for syntax text replacement. + The plugin class for flattening nested folders. """ def __init__(self, site): super(FlattenerPlugin, self).__init__(site) diff --git a/hyde/ext/templates/jinja.py b/hyde/ext/templates/jinja.py index 1133307..f3327e2 100644 --- a/hyde/ext/templates/jinja.py +++ b/hyde/ext/templates/jinja.py @@ -384,6 +384,7 @@ class Jinja2Template(Template): self.env.globals['media_url'] = media_url self.env.globals['content_url'] = content_url self.env.globals['engine'] = engine + self.env.globals['deps'] = {} self.env.filters['markdown'] = markdown self.env.filters['syntax'] = syntax @@ -411,10 +412,10 @@ class Jinja2Template(Template): from jinja2.meta import find_referenced_templates ast = self.env.parse(text) tpls = find_referenced_templates(ast) - deps = [] + deps = list(self.env.globals['deps'].get('path', [])) for dep in tpls: + deps.append(dep) if dep: - deps.append(dep) deps.extend(self.get_dependencies(dep)) return list(set(deps)) diff --git a/hyde/generator.py b/hyde/generator.py index fcf6283..a60e306 100644 --- a/hyde/generator.py +++ b/hyde/generator.py @@ -25,8 +25,8 @@ class Generator(object): self.generated_once = False self.__context__ = dict(site=site) if hasattr(site.config, 'context'): - self.__context__.update( - Context.load(site.sitepath, site.config.context)) + site.context = Context.load(site.sitepath, site.config.context) + self.__context__.update(site.context) self.template = None Plugin.load_all(site) @@ -108,6 +108,12 @@ class Generator(object): logger.info("Generation Complete") self.events.generation_complete() + def get_dependencies(self, resource): + """ + Gets the dependencies for a given resource. + """ + return self.template.get_dependencies(resource.relative_path) + def has_resource_changed(self, resource): """ Checks if the given resource has changed since the @@ -126,7 +132,7 @@ class Generator(object): if resource.source_file.is_binary or not resource.uses_template: logger.debug("No Changes found in %s" % resource) return False - deps = self.template.get_dependencies(resource.relative_path) + deps = self.get_dependencies(resource) if not deps or None in deps: logger.debug("No changes found in %s" % resource) return False @@ -134,6 +140,8 @@ class Generator(object): layout = Folder(self.site.sitepath).child_folder('layout') logger.debug("Checking for changes in dependents:%s" % deps) for dep in deps: + if not dep: + return True source = File(content.child(dep)) if not source.exists: source = File(layout.child(dep)) diff --git a/hyde/site.py b/hyde/site.py index a0ab809..f2b820c 100644 --- a/hyde/site.py +++ b/hyde/site.py @@ -348,6 +348,7 @@ class Site(object): self.config = config if config else Config(self.sitepath) self.content = RootNode(self.config.content_root_path, self) self.plugins = [] + self.context = {} def load(self): """ diff --git a/hyde/tests/test_jinja2template.py b/hyde/tests/test_jinja2template.py index 2ec13f2..27b6e1b 100644 --- a/hyde/tests/test_jinja2template.py +++ b/hyde/tests/test_jinja2template.py @@ -171,6 +171,39 @@ class TestJinjaTemplate(object): assert 'layout.html' in deps assert 'index.html' in deps + def test_depends_with_reference_tag(self): + site = Site(TEST_SITE) + JINJA2.copy_contents_to(site.content.source) + inc = File(TEST_SITE.child('content/inc.md')) + inc.write("{% refer to 'index.html' as index%}") + site.load() + gen = Generator(site) + gen.load_template_if_needed() + t = gen.template + deps = list(t.get_dependencies('inc.md')) + + assert len(deps) == 3 + + assert 'helpers.html' in deps + assert 'layout.html' in deps + assert 'index.html' in deps + + def test_cant_find_depends_with_reference_tag_var(self): + site = Site(TEST_SITE) + JINJA2.copy_contents_to(site.content.source) + inc = File(TEST_SITE.child('content/inc.md')) + inc.write("{% set ind = 'index.html' %}{% refer to ind as index %}") + site.load() + gen = Generator(site) + gen.load_template_if_needed() + t = gen.template + deps = list(t.get_dependencies('inc.md')) + + assert len(deps) == 1 + + assert not deps[0] + + def test_can_include_templates_with_processing(self): text = """ === @@ -276,6 +309,34 @@ Hyde & Jinja. text2 = """ {% refer to "inc.md" as inc %} {{ inc.html('.fulltext') }} +""" + html = assert_markdown_typogrify_processed_well(text, text2) + assert "mark" not in html + assert "reference" not in html + + + def test_refer_with_var(self): + text = """ +=== +is_processable: False +=== +
+{% filter markdown|typogrify %} +{% mark heading %} +This is a heading +================= +{% endmark %} +{% reference content %} +Hyde & Jinja. +{% endreference %} +{% endfilter %} +
+""" + + text2 = """ +{% set incu = 'inc.md' %} +{% refer to incu as inc %} +{{ inc.html('.fulltext') }} """ html = assert_markdown_typogrify_processed_well(text, text2) assert "mark" not in html