Browse Source

Plugin protocol added

main
Lakshmi Vyasarajan 14 years ago
parent
commit
1ebfa7ba09
6 changed files with 98 additions and 25 deletions
  1. +8
    -8
      hyde/generator.py
  2. +2
    -2
      hyde/layout.py
  3. +77
    -4
      hyde/plugin.py
  4. +5
    -5
      hyde/site.py
  5. +1
    -1
      hyde/tests/test_generate.py
  6. +5
    -5
      hyde/tests/test_site.py

+ 8
- 8
hyde/generator.py View File

@@ -50,15 +50,15 @@ class Generator(object):
logger.info("Configuring the template environment") logger.info("Configuring the template environment")
self.template.configure(self.site.config) self.template.configure(self.site.config)


def rebuild_if_needed(self):
def reload_if_needed(self):
""" """
Checks if the site requries a rebuild and builds if
Checks if the site requries a reload and loads if
necessary. necessary.
""" """
#TODO: Perhaps this is better suited in Site #TODO: Perhaps this is better suited in Site
if not len(self.site.content.child_nodes): if not len(self.site.content.child_nodes):
logger.info("Reading site contents") logger.info("Reading site contents")
self.site.build()
self.site.load()


def generate_all(self): def generate_all(self):
""" """
@@ -66,7 +66,7 @@ class Generator(object):
""" """
logger.info("Reading site contents") logger.info("Reading site contents")
self.initialize_template_if_needed() self.initialize_template_if_needed()
self.rebuild_if_needed()
self.reload_if_needed()


logger.info("Generating site to [%s]" % logger.info("Generating site to [%s]" %
self.site.config.deploy_root_path) self.site.config.deploy_root_path)
@@ -78,7 +78,7 @@ class Generator(object):
generates the entire site. generates the entire site.
""" """
self.initialize_template_if_needed() self.initialize_template_if_needed()
self.rebuild_if_needed()
self.reload_if_needed()
node = None node = None
if node_path: if node_path:
node = self.site.content.node_from_path(node_path) node = self.site.content.node_from_path(node_path)
@@ -90,7 +90,7 @@ class Generator(object):
non-existent, generates the entire website. non-existent, generates the entire website.
""" """
self.initialize_template_if_needed() self.initialize_template_if_needed()
self.rebuild_if_needed()
self.reload_if_needed()
if not node: if not node:
return self.generate_all() return self.generate_all()
try: try:
@@ -104,7 +104,7 @@ class Generator(object):
generats the entire website. generats the entire website.
""" """
self.initialize_template_if_needed() self.initialize_template_if_needed()
self.rebuild_if_needed()
self.reload_if_needed()
resource = None resource = None
if resource_path: if resource_path:
resource = self.site.content.resource_from_path(resource_path) resource = self.site.content.resource_from_path(resource_path)
@@ -116,7 +116,7 @@ class Generator(object):
non-existent, generates the entire website. non-existent, generates the entire website.
""" """
self.initialize_template_if_needed() self.initialize_template_if_needed()
self.rebuild_if_needed()
self.reload_if_needed()
if not resource: if not resource:
return self.generate_all() return self.generate_all()
try: try:


+ 2
- 2
hyde/layout.py View File

@@ -16,7 +16,7 @@ class Layout(object):
""" """


@staticmethod @staticmethod
def find_layout(layout_name="basic"):
def find_layout(layout_name='basic'):
""" """
Find the layout with a given name. Find the layout with a given name.
Search order: Search order:
@@ -33,7 +33,7 @@ class Layout(object):
return layout_folder return layout_folder


@staticmethod @staticmethod
def _get_layout_folder(root, layout_name="basic"):
def _get_layout_folder(root, layout_name='basic'):
""" """
Finds the layout folder from the given root folder. Finds the layout folder from the given root folder.
If it does not exist, return None If it does not exist, return None


+ 77
- 4
hyde/plugin.py View File

@@ -1,5 +1,78 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# 1. start_node
# 2. start_resource
# 3. end_resource
# 4. end_node
"""
Contains definition for a plugin protocol and other utiltities.
"""


class Plugin(object):
"""
The plugin protocol
"""

def __init__(self, site):
super(Plugin, self).__init__()
self.site = site

def template_loaded(self, template):
"""
Called when the template for the site has been identified.
"""
pass

def prepare_site(self):
"""
Called when generation is about to take place.
"""
pass

def site_load_complete(self):
"""
Called when the site is built complete. This implies that all the
nodes and resources have been identified and are accessible in the
site variable.
"""
pass

def prepare_node(self, node):
"""
Called when a node is about to be processed for generation.
"""
pass

def prepare_resource(self, resource, text):
"""
Called when a resource is about to be processed for generation.
The `text` parameter contains the, resource text at this point
in its lifecycle. It is the text that has been loaded and any
plugins that are higher in the order may have tampered with it.
But the text has not been processed by the template yet.

If this function returns a value, it is used as the text for further
processing.
"""
return text

def process_resource(self, resource, text):
"""
Called when a resource has been processed by the template.
The `text` parameter contains the, resource text at this point
in its lifecycle. It is the text that has been processed by the
template and any plugins that are higher in the order may have
tampered with it.

If this function returns a value, it is used as the text for further
processing.
"""
return text

def node_complete(self, node):
"""
Called when all the resources in the node have been processed.
"""
pass

def site_complete(self):
"""
Called when the entire site has been processed.
"""
pass

+ 5
- 5
hyde/site.py View File

@@ -243,9 +243,9 @@ class RootNode(Node):
(resource.relative_path, self.source_folder)) (resource.relative_path, self.source_folder))
return resource return resource


def build(self):
def load(self):
""" """
Walks the `source_folder` and builds the sitemap.
Walks the `source_folder` and loads the sitemap.
Creates nodes and resources, reads metadata and injects attributes. Creates nodes and resources, reads metadata and injects attributes.
This is the model for hyde. This is the model for hyde.
""" """
@@ -276,9 +276,9 @@ class Site(object):
self.config = config if config else Config(self.sitepath) self.config = config if config else Config(self.sitepath)
self.content = RootNode(self.config.content_root_path, self) self.content = RootNode(self.config.content_root_path, self)


def build(self):
def load(self):
""" """
Walks the content and media folders to build up the sitemap.
Walks the content and media folders to load up the sitemap.
""" """


self.content.build()
self.content.load()

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

@@ -27,7 +27,7 @@ def delete_test_site():
@with_setup(create_test_site, delete_test_site) @with_setup(create_test_site, delete_test_site)
def test_generate_resource_from_path(): def test_generate_resource_from_path():
site = Site(TEST_SITE) site = Site(TEST_SITE)
site.build()
site.load()
gen = Generator(site) gen = Generator(site)
gen.generate_resource_at_path(TEST_SITE.child('content/about.html')) gen.generate_resource_at_path(TEST_SITE.child('content/about.html'))
about = File(Folder(site.config.deploy_root_path).child('about.html')) about = File(Folder(site.config.deploy_root_path).child('about.html'))


+ 5
- 5
hyde/tests/test_site.py View File

@@ -52,9 +52,9 @@ def test_node_relative_path():
c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december')) c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december'))
assert c.relative_path == 'blog/2010/december' assert c.relative_path == 'blog/2010/december'


def test_build():
def test_load():
s = Site(TEST_SITE_ROOT) s = Site(TEST_SITE_ROOT)
s.build()
s.load()
path = 'blog/2010/december' path = 'blog/2010/december'
node = s.content.node_from_relative_path(path) node = s.content.node_from_relative_path(path)
assert node assert node
@@ -67,7 +67,7 @@ def test_build():


def test_walk_resources(): def test_walk_resources():
s = Site(TEST_SITE_ROOT) s = Site(TEST_SITE_ROOT)
s.build()
s.load()
pages = [page.name for page in s.content.walk_resources()] pages = [page.name for page in s.content.walk_resources()]
expected = ["404.html", expected = ["404.html",
"about.html", "about.html",
@@ -98,9 +98,9 @@ class TestSiteWithConfig(object):
def teardown_class(cls): def teardown_class(cls):
cls.SITE_PATH.delete() cls.SITE_PATH.delete()


def test_build_with_config(self):
def test_load_with_config(self):
s = Site(self.SITE_PATH, config = self.config) s = Site(self.SITE_PATH, config = self.config)
s.build()
s.load()
path = 'blog/2010/december' path = 'blog/2010/december'
node = s.content.node_from_relative_path(path) node = s.content.node_from_relative_path(path)
assert node assert node


Loading…
Cancel
Save