Browse Source

Fix dependant resources.

Attach all post resources to all page resources.  Now `hyde gen' works.  Also
fix up a couple of the unit tests.
main
Gareth Redman 13 years ago
parent
commit
80fd3adeaa
4 changed files with 84 additions and 33 deletions
  1. +32
    -12
      hyde/ext/plugins/paginator.py
  2. +51
    -18
      hyde/tests/ext/test_paginator.py
  3. +1
    -1
      hyde/tests/sites/test_paginator/content/custom_file_pattern.txt
  4. +0
    -2
      hyde/tests/sites/test_paginator/site.yaml

+ 32
- 12
hyde/ext/plugins/paginator.py View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
Pagination plugin. Groups a sorted set of resources into pages and supplies
Paginator plugin. Groups a sorted set of resources into pages and supplies
each page to a copy of the original resource. each page to a copy of the original resource.
""" """
import os import os
@@ -30,7 +30,7 @@ class Paginator:
def _relative_url(self, source_path, number, basename, ext): def _relative_url(self, source_path, number, basename, ext):
""" """
Create a new URL for a new page. The first page keeps the same name; Create a new URL for a new page. The first page keeps the same name;
the subsequent pages are formatted according to file_pattern.
the subsequent pages are named according to file_pattern.
""" """
path = File(source_path) path = File(source_path)
if number != 1: if number != 1:
@@ -40,21 +40,37 @@ class Paginator:
path = path.parent.child(os.path.normpath(filename)) path = path.parent.child(os.path.normpath(filename))
return path return path


def _new_resource(self, base_resource, node, page):
def _new_resource(self, base_resource, node, page_number):
""" """
Create a new resource as a copy of a base_resource, with a page of Create a new resource as a copy of a base_resource, with a page of
resources associated with it. resources associated with it.
""" """
res = Resource(base_resource.source_file, node) res = Resource(base_resource.source_file, node)
res.page = page
page.resource = res
path = self._relative_url(base_resource.relative_path, path = self._relative_url(base_resource.relative_path,
page.number,
page_number,
base_resource.source_file.name_without_extension, base_resource.source_file.name_without_extension,
base_resource.source_file.extension) base_resource.source_file.extension)
res.set_relative_deploy_path(path) res.set_relative_deploy_path(path)
return res return res


@staticmethod
def _attach_page_to_resource(page, resource):
"""
Hook up a page and a resource.
"""
resource.page = page
page.resource = resource

@staticmethod
def _add_dependencies_to_resource(dependencies, resource):
"""
Add a bunch of resources as dependencies to another resource.
"""
if not hasattr(resource, 'depends'):
resource.depends = []
resource.depends.extend([dep.relative_path for dep in dependencies
if dep.relative_path not in resource.depends])

def _walk_pages_in_node(self, node): def _walk_pages_in_node(self, node):
""" """
Segregate each resource into a page. Segregate each resource into a page.
@@ -77,8 +93,16 @@ class Paginator:
""" """
added_resources = [] added_resources = []
pages = list(self._walk_pages_in_node(node)) pages = list(self._walk_pages_in_node(node))
for page in pages:
added_resources.append(self._new_resource(resource, node, page))
deps = reduce(list.__add__, [page.posts for page in pages], [])

Paginator._attach_page_to_resource(pages[0], resource)
Paginator._add_dependencies_to_resource(deps, resource)
for page in pages[1:]:
# make new resource
new_resource = self._new_resource(resource, node, page.number)
Paginator._attach_page_to_resource(page, new_resource)
new_resource.depends = resource.depends
added_resources.append(new_resource)


for prev, next in pairwalk(pages): for prev, next in pairwalk(pages):
next.previous = prev next.previous = prev
@@ -115,14 +139,10 @@ class PaginatorPlugin(Plugin):
def begin_site(self): def begin_site(self):
for node in self.site.content.walk(): for node in self.site.content.walk():
added_resources = [] added_resources = []
removed_resources = []
paged_resources = (res for res in node.resources paged_resources = (res for res in node.resources
if hasattr(res.meta, 'paginator')) if hasattr(res.meta, 'paginator'))
for resource in paged_resources: for resource in paged_resources:
paginator = Paginator(resource.meta.paginator) paginator = Paginator(resource.meta.paginator)
removed_resources.append(resource)
added_resources += paginator.walk_paged_resources(node, resource) added_resources += paginator.walk_paged_resources(node, resource)


node.resources += added_resources node.resources += added_resources
for removed in removed_resources:
node.resources.remove(removed)

+ 51
- 18
hyde/tests/ext/test_paginator.py View File

@@ -13,7 +13,7 @@ from hyde.site import Site


TEST_SITE = File(__file__).parent.parent.child_folder('_test') TEST_SITE = File(__file__).parent.parent.child_folder('_test')


class TestTagger(object):
class TestPaginator(object):


def setUp(self): def setUp(self):
TEST_SITE.make() TEST_SITE.make()
@@ -22,10 +22,10 @@ class TestTagger(object):
self.s = Site(TEST_SITE) self.s = Site(TEST_SITE)
self.deploy = TEST_SITE.child_folder('deploy') self.deploy = TEST_SITE.child_folder('deploy')


gen = Generator(self.s)
gen.load_site_if_needed()
gen.load_template_if_needed()
gen.generate_all()
self.gen = Generator(self.s)
self.gen.load_site_if_needed()
self.gen.load_template_if_needed()
self.gen.generate_all()




def tearDown(self): def tearDown(self):
@@ -42,30 +42,41 @@ class TestTagger(object):
page5 = File(self.deploy.child('page5/pages_of_one.txt')) page5 = File(self.deploy.child('page5/pages_of_one.txt'))
assert not page5.exists assert not page5.exists



def test_pages_of_one_content(self): def test_pages_of_one_content(self):
expected_page1_content = dedent('''\ expected_page1_content = dedent('''\
Another Sad Post Another Sad Post
page2/pages_of_one.txt
''')
page2/pages_of_one.txt''')
expected_page2_content = dedent('''\ expected_page2_content = dedent('''\
A Happy Post A Happy Post
page2/pages_of_one.txt
page3/pages_of_one.txt
''')
pages_of_one.txt
page3/pages_of_one.txt''')
expected_page3_content = dedent('''\ expected_page3_content = dedent('''\
An Angry Post An Angry Post
page3/pages_of_one.txt
page4/pages_of_one.txt
''')
page2/pages_of_one.txt
page4/pages_of_one.txt''')
expected_page4_content = dedent('''\ expected_page4_content = dedent('''\
A Sad Post A Sad Post
page4/pages_of_one.txt
page3/pages_of_one.txt
''') ''')


page1 = self.deploy.child('pages_of_one.txt') page1 = self.deploy.child('pages_of_one.txt')
content = File(page1).read_all() content = File(page1).read_all()
assert expected_page1_content == content assert expected_page1_content == content


page2 = self.deploy.child('page2/pages_of_one.txt')
content = File(page2).read_all()
assert expected_page2_content == content

page3 = self.deploy.child('page3/pages_of_one.txt')
content = File(page3).read_all()
assert expected_page3_content == content

page4 = self.deploy.child('page4/pages_of_one.txt')
content = File(page4).read_all()
assert expected_page4_content == content



def test_pages_of_ten(self): def test_pages_of_ten(self):
page1 = self.deploy.child('pages_of_ten.txt') page1 = self.deploy.child('pages_of_ten.txt')
@@ -75,7 +86,18 @@ class TestTagger(object):
assert not File(page2).exists assert not File(page2).exists




def test_pages_of_one_content(self):
def test_pages_of_ten_depends(self):
depends = self.gen.deps['pages_of_ten.txt']

assert depends
assert len(depends) == 4
assert 'blog/sad-post.html' in depends
assert 'blog/another-sad-post.html' in depends
assert 'blog/angry-post.html' in depends
assert 'blog/happy-post.html' in depends


def test_pages_of_ten_content(self):
expected_content = dedent('''\ expected_content = dedent('''\
Another Sad Post Another Sad Post
A Happy Post A Happy Post
@@ -88,9 +110,20 @@ class TestTagger(object):
assert expected_content == content assert expected_content == content




def text_custom_file_pattern(self):
page1 = 'custom_file_pattern.txt'
page2 = 'custom_file_pattern-2.txt'
def test_pages_of_one_depends(self):
depends = self.gen.deps['pages_of_one.txt']

assert depends
assert len(depends) == 4
assert 'blog/sad-post.html' in depends
assert 'blog/another-sad-post.html' in depends
assert 'blog/angry-post.html' in depends
assert 'blog/happy-post.html' in depends


def test_custom_file_pattern(self):
page1 = self.deploy.child('custom_file_pattern.txt')
page2 = self.deploy.child('custom_file_pattern-2.txt')


assert File(page1).exists assert File(page1).exists
assert File(page2).exists assert File(page2).exists

+ 1
- 1
hyde/tests/sites/test_paginator/content/custom_file_pattern.txt View File

@@ -2,7 +2,7 @@
paginator: paginator:
sorter: time sorter: time
size: 2 size: 2
file_pattern: $FILE-$PAGE.$EXT
file_pattern: $FILE-$PAGE$EXT
--- ---
{% for res in resource.page.posts %} {% for res in resource.page.posts %}
{{ res.meta.title }} {{ res.meta.title }}


+ 0
- 2
hyde/tests/sites/test_paginator/site.yaml View File

@@ -4,10 +4,8 @@ media_url: /media # URL where the media files are served from.
base_url: / # The base url for autogenerated links. base_url: / # The base url for autogenerated links.
plugins: plugins:
- hyde.ext.plugins.meta.MetaPlugin - hyde.ext.plugins.meta.MetaPlugin
- hyde.ext.plugins.auto_extend.AutoExtendPlugin
- hyde.ext.plugins.sorter.SorterPlugin - hyde.ext.plugins.sorter.SorterPlugin
- hyde.ext.plugins.paginator.PaginatorPlugin - hyde.ext.plugins.paginator.PaginatorPlugin
- hyde.ext.plugins.textlinks.TextlinksPlugin
meta: meta:
nodemeta: meta.yaml nodemeta: meta.yaml
created: !!timestamp 2010-01-01 00:00:00 created: !!timestamp 2010-01-01 00:00:00


Loading…
Cancel
Save