changeset 267:f512905ae812

sources: Generate proper slugs in the `autoconfig` and `ordered` sources.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 25 Feb 2015 13:06:41 -0800
parents 2f4412745db2
children f8601540caff
files piecrust/sources/autoconfig.py tests/test_sources_autoconfig.py
diffstat 2 files changed, 26 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/sources/autoconfig.py	Wed Feb 25 08:31:30 2015 -0800
+++ b/piecrust/sources/autoconfig.py	Wed Feb 25 13:06:41 2015 -0800
@@ -82,7 +82,19 @@
         return name
 
     def _makeSlug(self, rel_path):
-        raise NotImplementedError()
+        slug = rel_path.replace('\\', '/')
+        slug = self._cleanSlug(slug)
+        slug, ext = os.path.splitext(slug)
+        if ext.lstrip('.') not in self.supported_extensions:
+            slug += ext
+        if slug.startswith('./'):
+            slug = slug[2:]
+        if slug == '_index':
+            slug = ''
+        return slug
+
+    def _cleanSlug(self, slug):
+        return slug
 
     def _extractConfigFragment(self, rel_path):
         raise NotImplementedError()
@@ -105,12 +117,6 @@
         self.supported_extensions = list(
                 app.config.get('site/auto_formats').keys())
 
-    def _makeSlug(self, rel_path):
-        slug, ext = os.path.splitext(os.path.basename(rel_path))
-        if ext.lstrip('.') not in self.supported_extensions:
-            slug += ext
-        return slug
-
     def _extractConfigFragment(self, rel_path):
         if rel_path == '.':
             values = []
@@ -169,6 +175,9 @@
                     items.append((False, name, fac))
         return items
 
+    def _cleanSlug(self, slug):
+        return os.path.basename(slug)
+
 
 class OrderedPageSource(AutoConfigSourceBase):
     """ A page source that assigns an "order" to its pages based on a
@@ -277,12 +286,8 @@
                     items.append((False, clean_name, fac))
         return items
 
-    def _makeSlug(self, rel_path):
-        slug, ext = os.path.splitext(rel_path)
-        if ext.lstrip('.') not in self.supported_extensions:
-            slug += ext
-        slug = self.re_pattern.sub(r'\1', slug)
-        return slug
+    def _cleanSlug(self, slug):
+        return self.re_pattern.sub(r'\1', slug)
 
     def _extractConfigFragment(self, rel_path):
         values = []
--- a/tests/test_sources_autoconfig.py	Wed Feb 25 08:31:30 2015 -0800
+++ b/tests/test_sources_autoconfig.py	Wed Feb 25 13:06:41 2015 -0800
@@ -7,6 +7,10 @@
         'fs, src_config, expected_paths, expected_metadata',
         [
             (mock_fs(), {}, [], []),
+            (mock_fs().withPage('test/_index.md'),
+                {},
+                ['_index.md'],
+                [{'slug': '', 'config': {'foo': []}}]),
             (mock_fs().withPage('test/something.md'),
                 {},
                 ['something.md'],
@@ -86,6 +90,10 @@
         'fs, expected_paths, expected_metadata',
         [
             (mock_fs(), [], []),
+            (mock_fs().withPage('test/_index.md'),
+                ['_index.md'],
+                [{'slug': '',
+                    'config': {'foo': 0, 'foo_trail': [0]}}]),
             (mock_fs().withPage('test/something.md'),
                 ['something.md'],
                 [{'slug': 'something',