Browse Source

Added advanced checks for change detection

main
Lakshmi Vyasarajan 14 years ago
parent
commit
8022471928
8 changed files with 99 additions and 9 deletions
  1. +1
    -1
      hyde/engine.py
  2. +15
    -0
      hyde/ext/templates/jinja.py
  3. +24
    -1
      hyde/generator.py
  4. +3
    -3
      hyde/server.py
  5. +7
    -0
      hyde/template.py
  6. +21
    -1
      hyde/tests/test_generate.py
  7. +27
    -2
      hyde/tests/test_jinja2template.py
  8. +1
    -1
      hyde/util.py

+ 1
- 1
hyde/engine.py View File

@@ -16,7 +16,7 @@ import yaml

HYDE_LAYOUTS = "HYDE_LAYOUTS"

logger = getLoggerWithConsoleHandler('hyde.engine')
logger = getLoggerWithConsoleHandler('hyde')

class Engine(Application):
"""


+ 15
- 0
hyde/ext/templates/jinja.py View File

@@ -104,6 +104,21 @@ class Jinja2Template(Template):
jinja2_filters.register(self.env)


def get_dependencies(self, text):
"""
Finds dependencies hierarchically based on the included
files.
"""
from jinja2.meta import find_referenced_templates
ast = self.env.parse(text)
tpls = find_referenced_templates(ast)
deps = []
for dep in tpls:
deps.append(dep)
source = self.env.loader.get_source(self.env, dep)[0]
deps.extend(self.get_dependencies(source))
return list(set(deps))

@property
def exception_class(self):
return TemplateError


+ 24
- 1
hyde/generator.py View File

@@ -2,7 +2,7 @@
The generator class and related utility functions.
"""
from hyde.exceptions import HydeException
from hyde.fs import File
from hyde.fs import File, Folder
from hyde.plugin import Plugin
from hyde.template import Template

@@ -110,6 +110,29 @@ class Generator(object):
logger.info("Generation Complete")
self.events.generation_complete()

def has_resource_changed(self, resource):
target = File(self.site.config.deploy_root_path.child(
resource.relative_deploy_path))
if not target.exists or target.older_than(resource.source_file):
return True
if resource.source_file.is_binary:
return False
deps = self.template.get_dependencies(resource.source_file.read_all())
if not deps or None in deps:
return True
content = self.site.content.source_folder
layout = Folder(self.site.sitepath).child_folder('layout')
for dep in deps:
source = File(content.child(dep))
if not source.exists:
source = File(layout.child(dep))
if not source.exists:
return True
if target.older_than(source):
return True

return False

def generate_all(self):
"""
Generates the entire website


+ 3
- 3
hyde/server.py View File

@@ -10,9 +10,9 @@ from BaseHTTPServer import HTTPServer
from hyde.fs import File, Folder
from hyde.site import Site
from hyde.generator import Generator
from hyde.util import getLoggerWithConsoleHandler

logger = getLoggerWithConsoleHandler('hyde.engine')
from hyde.util import getLoggerWithNullHandler
logger = getLoggerWithNullHandler('hyde.server')

class HydeRequestHandler(SimpleHTTPRequestHandler):
"""
@@ -131,7 +131,7 @@ class HydeWebServer(HTTPServer):
"""
target = self.site.config.deploy_root_path.child(
resource.relative_deploy_path)
if File(target).older_than(resource.source_file):
if self.generator.has_resource_changed(resource):
try:
logger.info('Generating resource [%s]' % resource)
self.generator.generate_resource(resource)


+ 7
- 0
hyde/template.py View File

@@ -25,6 +25,13 @@ class Template(object):
"""

abstract
def get_dependencies(self, text):
"""
Finds the dependencies based on the included
files.
"""
return None

def render(self, text, context):
"""


+ 21
- 1
hyde/tests/test_generate.py View File

@@ -73,4 +73,24 @@ def test_generate_resource_from_path_with_deploy_override():
assert about.exists
text = about.read_all()
q = PyQuery(text)
assert resource.name in q("div#main").text()
assert resource.name in q("div#main").text()

@with_setup(create_test_site, delete_test_site)
def test_has_resource_changed():
site = Site(TEST_SITE)
site.load()
resource = site.content.resource_from_path(TEST_SITE.child('content/about.html'))
gen = Generator(site)
gen.generate_all()
assert not gen.has_resource_changed(resource)
import time
time.sleep(1)
text = resource.source_file.read_all()
resource.source_file.write(text)
assert gen.has_resource_changed(resource)
gen.generate_all()
assert not gen.has_resource_changed(resource)
time.sleep(1)
l = File(TEST_SITE.child('layout/root.html'))
l.write(l.read_all())
assert gen.has_resource_changed(resource)

+ 27
- 2
hyde/tests/test_jinja2template.py View File

@@ -73,6 +73,31 @@ def test_render():
assert actual("div.article p.meta").length == 20
assert actual("div.article div.text").length == 20

def test_depends():
t = Jinja2Template(JINJA2.path)
t.configure(None)
source = File(JINJA2.child('index.html')).read_all()
deps = list(t.get_dependencies(source))

assert len(deps) == 2

assert 'helpers.html' in deps
assert 'layout.html' in deps

def test_depends_multi_level():
t = Jinja2Template(JINJA2.path)
t.configure(None)

source = "{% extends 'index.html' %}"
deps = list(t.get_dependencies(source))

assert len(deps) == 3

assert 'helpers.html' in deps
assert 'layout.html' in deps
assert 'index.html' in deps


def test_typogrify():
source = """
{%filter typogrify%}
@@ -94,12 +119,12 @@ def test_markdown():
t.configure(None)
html = t.render(source, {}).strip()
assert html == u'<h3>Heading 3</h3>'
def test_markdown_with_extensions():
source = """
{%markdown%}
### Heading 3
{%endmarkdown%}
"""
t = Jinja2Template(JINJA2.path)


+ 1
- 1
hyde/util.py View File

@@ -18,7 +18,7 @@ except:
pass

def getLoggerWithConsoleHandler(logger_name):
logger = logging.getLogger('hyde.server')
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
formatter = ColorFormatter(fmt="$COLOR%(levelname)s "


Loading…
Cancel
Save