Skip to content

Commit

Permalink
Get the active extensions.
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt Layman committed May 14, 2015
1 parent c58b238 commit 6c11234
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 20 deletions.
7 changes: 6 additions & 1 deletion handroll/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from handroll.configuration import build_config
from handroll.director import Director
from handroll.exceptions import AbortError
from handroll.extensions.loader import ExtensionLoader
from handroll.i18n import _
from handroll.server import serve
from handroll.site import Site
Expand All @@ -30,8 +31,12 @@ def main(argv=sys.argv):
if not valid:
raise AbortError(_('Invalid site source: {0}').format(message))

loader = ExtensionLoader()
loader.load()

config = build_config(site.config_file, args)
director = Director(config, site)
extensions = loader.get_active_extensions(config)
director = Director(config, site, extensions)
director.produce()

if not args.watch:
Expand Down
3 changes: 2 additions & 1 deletion handroll/director.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,10 @@ class Director(object):
Site.CONFIG,
)

def __init__(self, config, site):
def __init__(self, config, site, extensions):
self.config = config
self.site = site
self.extensions = extensions
self.catalog = catalog.TemplateCatalog(site.path)
self.composers = Composers()

Expand Down
3 changes: 2 additions & 1 deletion handroll/extensions/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ class Extension(object):

handle_frontmatter_loaded = False

def __init__(self):
def __init__(self, config):
self._config = config
# Handler functions are put in a dictionary to keep references to them.
# Blinker behaves in strange ways without the references.
self._handlers = {}
Expand Down
9 changes: 9 additions & 0 deletions handroll/extensions/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,12 @@ def load(self):
for entry_point in iter_entry_points('handroll.extensions'):
cls = entry_point.load()
self._available_extensions[entry_point.name] = cls

def get_active_extensions(self, config):
"""Get instances of active extensions."""
extensions = []
for extension in config.active_extensions:
extension_cls = self._available_extensions.get(extension)
if extension_cls is not None:
extensions.append(extension_cls(config))
return extensions
26 changes: 13 additions & 13 deletions handroll/tests/test_director.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def test_generates_with_user_specified_outdir(self):
site = self.factory.make_site()
marker = 'marker.txt'
open(os.path.join(site.path, marker), 'w').close()
director = Director(config, site)
director = Director(config, site, [])

director.produce()

Expand All @@ -31,7 +31,7 @@ def test_skips_file_with_skip_extension(self):
site = self.factory.make_site()
skip = 'to_my_lou.swp'
open(os.path.join(site.path, skip), 'w').close()
director = Director(config, site)
director = Director(config, site, [])

director.produce()

Expand All @@ -43,7 +43,7 @@ def test_skips_file_in_skip_list(self):
site = self.factory.make_site()
skip = Site.CONFIG
open(os.path.join(site.path, skip), 'w').close()
director = Director(config, site)
director = Director(config, site, [])

director.produce()

Expand All @@ -55,7 +55,7 @@ def test_skips_templates_directory(self):
site = self.factory.make_site()
templates = os.path.join(site.path, 'templates')
os.mkdir(templates)
director = Director(config, site)
director = Director(config, site, [])

director.produce()

Expand All @@ -69,7 +69,7 @@ def test_does_timing(self):
open(os.path.join(site.path, 'fake.md'), 'w').close()
config = Configuration()
config.timing = True
director = Director(config, site)
director = Director(config, site, [])

with mock.patch('handroll.director.time.time', mock_time):
director.produce()
Expand All @@ -81,7 +81,7 @@ def test_generates_output_directory(self):
site = self.factory.make_site()
another = os.path.join(site.path, 'another')
os.mkdir(another)
director = Director(config, site)
director = Director(config, site, [])

director.produce()

Expand All @@ -92,7 +92,7 @@ def test_skips_directory(self):
dirnames = ['keep', '.sass-cache', 'another_keeper']
site = self.factory.make_site()
config = Configuration()
director = Director(config, site)
director = Director(config, site, [])

director.prune_skip_directories(dirnames)

Expand All @@ -112,7 +112,7 @@ def test_process_file_ignores_files_already_in_output(self):
os.mkdir(config.outdir)
marker = os.path.join(config.outdir, 'marker.md')
open(marker, 'w').close()
director = Director(config, site)
director = Director(config, site, [])

director.process_file(marker)

Expand All @@ -128,7 +128,7 @@ def test_process_directory_ignores_directories_already_in_output(self):
os.mkdir(config.outdir)
directory = os.path.join(config.outdir, 'directory')
os.mkdir(directory)
director = Director(config, site)
director = Director(config, site, [])

director.process_directory(directory)

Expand All @@ -141,7 +141,7 @@ def test_file_in_source_and_outdir_is_ignored(self):
config.outdir = tempfile.mkdtemp()
site_path = os.path.join(config.outdir, 'site')
site = Site(site_path)
director = Director(config, site)
director = Director(config, site, [])
fake_file = os.path.join(site_path, 'fake')

is_in_output = director.is_in_output(fake_file)
Expand All @@ -152,7 +152,7 @@ def test_file_in_source_and_outdir_is_ignored(self):
def test_produce_triggers_post_composition(self, signals):
config = Configuration()
site = self.factory.make_site()
director = Director(config, site)
director = Director(config, site, [])

director.produce()

Expand All @@ -162,7 +162,7 @@ def test_produce_triggers_post_composition(self, signals):
def test_process_file_triggers_post_composition(self, signals):
config = Configuration()
site = self.factory.make_site()
director = Director(config, site)
director = Director(config, site, [])
marker = os.path.join(site.path, 'marker.txt')
open(marker, 'w').close()

Expand All @@ -174,7 +174,7 @@ def test_process_file_triggers_post_composition(self, signals):
def test_process_directory_triggers_post_composition(self, signals):
config = Configuration()
site = self.factory.make_site()
director = Director(config, site)
director = Director(config, site, [])
config.outdir = os.path.join(site.path, 'outdir')
os.mkdir(config.outdir)
directory = os.path.join(site.path, 'directory')
Expand Down
16 changes: 14 additions & 2 deletions handroll/tests/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import mock

from handroll import signals
from handroll.configuration import Configuration
from handroll.extensions.base import Extension
from handroll.extensions.blog import BlogExtension
from handroll.extensions.loader import ExtensionLoader
Expand All @@ -16,17 +17,28 @@ def test_loads_available_extensions(self):
loader.load()
self.assertEqual(BlogExtension, loader._available_extensions['blog'])

def test_gets_active_extensions(self):
config = Configuration()
config.active_extensions.add('blog')
loader = ExtensionLoader()
loader.load()

extensions = loader.get_active_extensions(config)

self.assertEqual(1, len(extensions))
self.assertTrue(isinstance(extensions[0], BlogExtension))


class TestExtension(TestCase):

@mock.patch('handroll.extensions.base.signals.frontmatter_loaded')
def test_frontmatter_loaded_connection_default(self, frontmatter_loaded):
Extension()
Extension(None)
self.assertFalse(frontmatter_loaded.connect.called)

def test_connects_to_frontmatter_loaded(self):
Extension.handle_frontmatter_loaded = True
Extension()
Extension(None)
self.assertRaises(
NotImplementedError, signals.frontmatter_loaded.send,
'a_source_file', frontmatter={})
Expand Down
2 changes: 1 addition & 1 deletion handroll/tests/test_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def setUp(self):
config = Configuration()
config.outdir = tempfile.mkdtemp()
self.site = self.factory.make_site()
self.director = Director(config, self.site)
self.director = Director(config, self.site, [])

def test_on_create_generates_output(self):
markdown = os.path.join(self.site.path, 'index.md')
Expand Down
2 changes: 1 addition & 1 deletion handroll/tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def setUp(self):
config = Configuration()
config.outdir = tempfile.mkdtemp()
self.site = self.factory.make_site()
self.director = Director(config, self.site)
self.director = Director(config, self.site, [])

@mock.patch('handroll.server.Observer')
@mock.patch('handroll.server.socketserver.TCPServer')
Expand Down

0 comments on commit 6c11234

Please sign in to comment.