| @@ -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 | |||
| @@ -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): | |||
| @@ -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( | |||
| @@ -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: | |||
| @@ -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 | |||
| @@ -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()] | |||
| @@ -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() | |||