changeset 33:62c7a97c8340

Get the un-paginated URL of a page early and pass that around.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 19 Aug 2014 15:36:28 -0700
parents 43091c9837bf
children bdb103c57168
files piecrust/data/assetor.py piecrust/data/builder.py piecrust/uriutil.py tests/test_data_assetor.py tests/test_uriutil.py
diffstat 5 files changed, 46 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/data/assetor.py	Tue Aug 19 14:30:19 2014 -0700
+++ b/piecrust/data/assetor.py	Tue Aug 19 15:36:28 2014 -0700
@@ -1,4 +1,3 @@
-import re
 import os
 import os.path
 import logging
@@ -16,15 +15,11 @@
     base_url_format = app.env.base_asset_url_format
     rel_assets_path = rel_assets_path.replace('\\', '/')
 
-    # Remove any extension or pagination suffix from the URL, since
-    # we'll be copying assets into the 1st sub-page's folder.
+    # Remove any extension since we'll be copying assets into the 1st
+    # sub-page's folder.
     pretty = app.config.get('site/pretty_urls')
     if not pretty:
         uri, _ = os.path.splitext(uri)
-    pgn_suffix_re = app.config.get('__cache/pagination_suffix_re')
-    m = re.search(pgn_suffix_re, uri)
-    if m:
-        uri = uri[:m.start():]
 
     base_url = multi_replace(
             base_url_format,
--- a/piecrust/data/builder.py	Tue Aug 19 14:30:19 2014 -0700
+++ b/piecrust/data/builder.py	Tue Aug 19 15:36:28 2014 -0700
@@ -5,7 +5,7 @@
 from piecrust.data.debug import build_debug_info
 from piecrust.data.linker import Linker
 from piecrust.data.paginator import Paginator
-from piecrust.uriutil import get_slug
+from piecrust.uriutil import get_slug, get_first_sub_uri
 
 
 logger = logging.getLogger(__name__)
@@ -27,12 +27,13 @@
 def build_page_data(ctx):
     page = ctx.page
     app = page.app
+    first_uri = get_first_sub_uri(app, ctx.uri)
 
     pc_data = PieCrustData()
     pgn_source = ctx.pagination_source or get_default_pagination_source(page)
-    paginator = Paginator(page, pgn_source, ctx.uri, ctx.page_num,
+    paginator = Paginator(page, pgn_source, first_uri, ctx.page_num,
             ctx.pagination_filter)
-    assetor = Assetor(page, ctx.uri)
+    assetor = Assetor(page, first_uri)
     linker = Linker(page)
     data = {
             'piecrust': pc_data,
--- a/piecrust/uriutil.py	Tue Aug 19 14:30:19 2014 -0700
+++ b/piecrust/uriutil.py	Tue Aug 19 15:36:28 2014 -0700
@@ -1,4 +1,5 @@
 import re
+import os.path
 import string
 import logging
 import functools
@@ -78,3 +79,19 @@
     uri = uri[len(site_root):]
     return uri.lstrip('/')
 
+
+def get_first_sub_uri(app, uri):
+    pretty_urls = app.config.get('site/pretty_urls')
+    if not pretty_urls:
+        uri, ext = os.path.splitext(uri)
+
+    pgn_suffix_re = app.config.get('__cache/pagination_suffix_re')
+    m = re.search(pgn_suffix_re, uri)
+    if m:
+        uri = uri[:m.start()]
+
+    if not pretty_urls:
+        uri += ext
+
+    return uri
+
--- a/tests/test_data_assetor.py	Tue Aug 19 14:30:19 2014 -0700
+++ b/tests/test_data_assetor.py	Tue Aug 19 15:36:28 2014 -0700
@@ -58,19 +58,16 @@
 
 @pytest.mark.parametrize('url_format, pretty_urls, uri, expected', [
         ('%uri%', True, '/foo', '/foo/'),
-        ('%uri%', True, '/foo/2', '/foo/'),
         ('%uri%', True, '/foo.ext', '/foo.ext/'),
-        ('%uri%', True, '/foo.ext/2', '/foo.ext/'),
         ('%uri%', False, '/foo.html', '/foo/'),
-        ('%uri%', False, '/foo/2.html', '/foo/'),
+        ('%uri%', False, '/foo.ext', '/foo/'),
         ])
 def test_build_base_url(url_format, pretty_urls, uri, expected):
     app = MagicMock()
     app.env = MagicMock()
     app.env.base_asset_url_format = url_format
     app.config = {
-            'site/pretty_urls': pretty_urls,
-            '__cache/pagination_suffix_re': '/(?P<num>\\d+)$'}
+            'site/pretty_urls': pretty_urls}
     assets_path = 'foo/bar-assets'
     actual = build_base_url(app, uri, assets_path)
     assert actual == expected
--- a/tests/test_uriutil.py	Tue Aug 19 14:30:19 2014 -0700
+++ b/tests/test_uriutil.py	Tue Aug 19 15:36:28 2014 -0700
@@ -1,5 +1,6 @@
+import mock
 import pytest
-from piecrust.uriutil import UriInfo, parse_uri
+from piecrust.uriutil import UriInfo, parse_uri, get_first_sub_uri
 
 
 @pytest.mark.parametrize('routes, uri, expected', [
@@ -24,3 +25,22 @@
     actual = parse_uri(routes, uri)
     assert actual == expected
 
+
+@pytest.mark.parametrize('uri, expected, pretty_urls', [
+    ('foo/bar', 'foo/bar', True),
+    ('foo/bar/2', 'foo/bar', True),
+    ('foo/bar.ext', 'foo/bar.ext', True),
+    ('foo/bar.ext/2', 'foo/bar.ext', True),
+    ('foo/bar.html', 'foo/bar.html', False),
+    ('foo/bar/2.html', 'foo/bar.html', False),
+    ('foo/bar.ext', 'foo/bar.ext', False),
+    ('foo/bar/2.ext', 'foo/bar.ext', False)
+    ])
+def test_get_first_sub_uri(uri, expected, pretty_urls):
+    app = mock.MagicMock()
+    app.config = {
+            'site/pretty_urls': pretty_urls,
+            '__cache/pagination_suffix_re': '/(\\d+)$'}
+    actual = get_first_sub_uri(app, uri)
+    assert actual == expected
+