diff --git a/LICENSE b/LICENSE index 7481c70..1cad62e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2009 - 2010 Lakshmi Vyasarajan, Ringce.com +Copyright (c) 2009 - 2011 Lakshmi Vyasarajan, Ringce.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/hyde/ext/plugins/sorter.py b/hyde/ext/plugins/sorter.py index 0bd7449..4b28df9 100644 --- a/hyde/ext/plugins/sorter.py +++ b/hyde/ext/plugins/sorter.py @@ -21,18 +21,21 @@ def filter_method(item, settings=None): Returns true if all the filters in the given settings evaluate to True. """ - - all_match = item.is_processable - if all_match and settings and hasattr(settings, 'filters'): - filters = settings.filters - for field, value in filters.__dict__.items(): - try: - res = attrgetter(field)(item) - except: - res = None - if res != value: - all_match = False - break + all_match = True + default_filters = {} + filters = {} + if hasattr(settings, 'filters'): + filters.update(default_filters) + filters.update(settings.filters.__dict__) + + for field, value in filters.items(): + try: + res = attrgetter(field)(item) + except: + res = None + if res != value: + all_match = False + break return all_match def sort_method(node, settings=None): diff --git a/hyde/ext/templates/jinja.py b/hyde/ext/templates/jinja.py index c8649d1..eaa42c7 100644 --- a/hyde/ext/templates/jinja.py +++ b/hyde/ext/templates/jinja.py @@ -5,7 +5,7 @@ Jinja template utilties from hyde.fs import File, Folder from hyde.template import HtmlWrap, Template -from hyde.util import getLoggerWithNullHandler +from hyde.util import getLoggerWithNullHandler, getLoggerWithConsoleHandler from jinja2 import contextfunction, Environment, FileSystemLoader from jinja2 import environmentfilter, Markup, Undefined, nodes @@ -276,8 +276,7 @@ class HydeLoader(FileSystemLoader): """ Calls the plugins to preprocess prior to returning the source. """ - hlogger = getLoggerWithNullHandler('HydeLoader') - hlogger.debug("Loading template [%s] and preprocessing" % template) + logger.debug("Loading template [%s] and preprocessing" % template) (contents, filename, date) = super(HydeLoader, self).get_source( diff --git a/hyde/server.py b/hyde/server.py index 03120be..c22e101 100644 --- a/hyde/server.py +++ b/hyde/server.py @@ -16,6 +16,8 @@ from hyde.exceptions import HydeException from hyde.util import getLoggerWithNullHandler logger = getLoggerWithNullHandler('hyde.server') +from datetime import datetime + class HydeRequestHandler(SimpleHTTPRequestHandler): """ Serves files by regenerating the resource (or) @@ -24,11 +26,12 @@ class HydeRequestHandler(SimpleHTTPRequestHandler): def do_GET(self): """ - Idenitfy the requested path. If the query string + Identify the requested path. If the query string contains `refresh`, regenerat the entire site. Otherwise, regenerate only the requested resource and serve. """ + self.server.request_time = datetime.now() logger.info("Processing request:[%s]" % self.path) result = urlparse.urlparse(self.path) query = urlparse.parse_qs(result.query) @@ -41,10 +44,7 @@ class HydeRequestHandler(SimpleHTTPRequestHandler): logger.info('Redirecting...[%s]' % new_url) self.redirect(new_url) else: - try: - SimpleHTTPRequestHandler.do_GET(self) - except HydeException: - self.do_404() + SimpleHTTPRequestHandler.do_GET(self) def translate_path(self, path): @@ -55,7 +55,7 @@ class HydeRequestHandler(SimpleHTTPRequestHandler): path = SimpleHTTPRequestHandler.translate_path(self, path) site = self.server.site result = urlparse.urlparse(self.path) - logger.info("Trying to load file based on request:[%s]" % result.path) + logger.debug("Trying to load file based on request:[%s]" % result.path) path = result.path.lstrip('/') if path.strip() == "" or File(path).kind.strip() == "": return site.config.deploy_root_path.child(path) @@ -64,18 +64,19 @@ class HydeRequestHandler(SimpleHTTPRequestHandler): if not res: - # Cannot find the source file using the given path. - # Check if the target file exists in the deploy folder. + # Check if its a new request + if self.server.request_time > self.server.regeneration_time: + # Cannot find the source file using the given path. + # Check if the target file exists in the deploy folder. - # this file is probably new or being generated by a plugin. - # lets not try too hard, just regenerate - logger.info("Attempting regeneration for:[%s]" % path) - self.server.regenerate() - res = site.content.resource_from_relative_deploy_path(path) - if not res: - # Nothing much we can do. - logger.error("Cannot load file:[%s]" % path) - raise HydeException("Cannot load file: [%s]" % path) + # this file is probably new or being generated by a plugin. + # lets not try too hard, just regenerate + logger.info("Attempting regeneration for:[%s]" % path) + self.server.regenerate() + res = site.content.resource_from_relative_deploy_path(path) + if not res: + # Nothing much we can do. + logger.error("Cannot load file:[%s]" % path) return site.config.deploy_root_path.child(path) else: @@ -125,7 +126,8 @@ class HydeWebServer(HTTPServer): self.site = site self.site.load() self.generator = Generator(self.site) - + self.request_time = datetime.strptime('1-1-1999', '%m-%d-%Y') + self.regeneration_time = datetime.strptime('1-1-1998', '%m-%d-%Y') HTTPServer.__init__(self, (address, port), HydeRequestHandler) @@ -135,6 +137,7 @@ class HydeWebServer(HTTPServer): """ try: logger.info('Regenerating the entire site') + self.regeneration_time = datetime.now() self.site.load() self.generator.generate_all() except Exception, exception: diff --git a/hyde/site.py b/hyde/site.py index 902a0de..08e35a5 100644 --- a/hyde/site.py +++ b/hyde/site.py @@ -65,6 +65,11 @@ class Resource(Processable): """ return self.source_file.get_relative_path(self.node.root.source_folder) + @property + def slug(self): + #TODO: Add a more sophisticated slugify method + return self.source.name_without_extension + def get_relative_deploy_path(self): """ Gets the path where the file will be created diff --git a/hyde/tests/ext/test_sorter.py b/hyde/tests/ext/test_sorter.py index b5930b8..329379f 100644 --- a/hyde/tests/ext/test_sorter.py +++ b/hyde/tests/ext/test_sorter.py @@ -16,7 +16,7 @@ from operator import attrgetter TEST_SITE = File(__file__).parent.parent.child_folder('_test') -class TestMeta(object): +class TestSorter(object): def setUp(self): TEST_SITE.make() @@ -136,7 +136,7 @@ class TestMeta(object): File(p).parent.name]))] assert pages == expected_sorted - def test_walk_resources_sorted_default_is_processable(self): + def test_walk_resources_sorted_no_default_is_processable(self): s = Site(TEST_SITE) cfg = """ plugins: @@ -153,7 +153,7 @@ class TestMeta(object): SorterPlugin(s).begin_site() assert hasattr(s.content, 'walk_resources_sorted_by_kind2') - expected = ["about.html", "merry-christmas.html"] + expected = ["404.html", "about.html", "merry-christmas.html"] pages = [page.name for page in s.content.walk_resources_sorted_by_kind2()] diff --git a/hyde/tests/test_site.py b/hyde/tests/test_site.py index 75e62c5..b5d0baa 100644 --- a/hyde/tests/test_site.py +++ b/hyde/tests/test_site.py @@ -118,6 +118,15 @@ def test_get_resource(): resource = node.get_resource('merry-christmas.html') assert resource == s.content.resource_from_relative_path(Folder(path).child('merry-christmas.html')) +def test_resource_slug(): + s = Site(TEST_SITE_ROOT) + s.load() + path = 'blog/2010/december' + node = s.content.node_from_relative_path(path) + resource = node.get_resource('merry-christmas.html') + assert resource.slug == 'merry-christmas' + + def test_get_resource_from_relative_deploy_path(): s = Site(TEST_SITE_ROOT) s.load()