Skip to content

Commit

Permalink
Handle frontmatter in the blog extension.
Browse files Browse the repository at this point in the history
  • Loading branch information
mblayman committed Jun 2, 2015
1 parent 3d05c8a commit b5dc21d
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
30 changes: 30 additions & 0 deletions handroll/extensions/blog.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,37 @@
# Copyright (c) 2015, Matt Layman

from handroll.exceptions import AbortError
from handroll.extensions.base import Extension
from handroll.i18n import _


class BlogPost(object):

def __init__(self, **kwargs):
self.source_file = kwargs['source_file']


class BlogExtension(Extension):
"""Track files marked as blog entries and generate a feed."""

handle_frontmatter_loaded = True
handle_post_composition = True

def __init__(self, config):
super(BlogExtension, self).__init__(config)
self.posts = []

def on_frontmatter_loaded(self, source_file, frontmatter):
"""Scan for blog posts.
If a post is found, record it.
"""
is_post = frontmatter.get('blog', False)
if type(is_post) != bool:
raise AbortError(
_('Invalid blog frontmatter (expects True or False): '
'{blog_value}').format(blog_value=is_post))
if is_post:
self.posts.append(BlogPost(
source_file=source_file,
))
39 changes: 39 additions & 0 deletions handroll/tests/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from handroll import signals
from handroll.configuration import Configuration
from handroll.exceptions import AbortError
from handroll.extensions.base import Extension
from handroll.extensions.blog import BlogExtension
from handroll.extensions.loader import ExtensionLoader
Expand All @@ -12,6 +13,11 @@

class TestExtensionLoader(TestCase):

def tearDown(self):
# Clean up any attached extension instance.
signals.frontmatter_loaded.receivers.clear()
signals.post_composition.receivers.clear()

def test_loads_available_extensions(self):
loader = ExtensionLoader()
loader.load()
Expand Down Expand Up @@ -60,3 +66,36 @@ class PostComposer(Extension):
self.assertRaises(
NotImplementedError, signals.post_composition.send, director)
signals.post_composition.receivers.clear()


class TestBlogExtension(TestCase):

def tearDown(self):
# Clean up any attached extension instance.
signals.frontmatter_loaded.receivers.clear()
signals.post_composition.receivers.clear()

def test_handles_frontmatter_loaded(self):
extension = BlogExtension(None)
self.assertTrue(extension.handle_frontmatter_loaded)

def test_handles_post_composition(self):
extension = BlogExtension(None)
self.assertTrue(extension.handle_post_composition)

def test_registers_blog_post(self):
extension = BlogExtension(None)
extension.on_frontmatter_loaded('thundercats.md', {'blog': True})
post = extension.posts[0]
self.assertEqual('thundercats.md', post.source_file)

def test_ignores_non_blog_post(self):
extension = BlogExtension(None)
extension.on_frontmatter_loaded('exosquad.md', {})
self.assertEqual(0, len(extension.posts))

def test_blog_must_be_boolean(self):
extension = BlogExtension(None)
self.assertRaises(
AbortError, extension.on_frontmatter_loaded, 'animaniacs.md',
{'blog': 'crazy'})

0 comments on commit b5dc21d

Please sign in to comment.