diff piecrust/app.py @ 711:ab5c6a8ae90a

bake: Replace hard-coded taxonomy support with "generator" system. * Taxonomies are now implemented one or more `TaxonomyGenerator`s. * A `BlogArchivesGenerator` stub is there but non-functional.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 26 May 2016 19:52:47 -0700
parents 4285b2c9b872
children 6abb436fea5b
line wrap: on
line diff
--- a/piecrust/app.py	Thu May 26 19:46:28 2016 -0700
+++ b/piecrust/app.py	Thu May 26 19:52:47 2016 -0700
@@ -15,7 +15,6 @@
 from piecrust.configuration import ConfigurationError, merge_dicts
 from piecrust.routing import Route
 from piecrust.sources.base import REALM_THEME
-from piecrust.taxonomies import Taxonomy
 
 
 logger = logging.getLogger(__name__)
@@ -151,12 +150,20 @@
         return routes
 
     @cached_property
-    def taxonomies(self):
-        taxonomies = []
-        for tn, tc in self.config.get('site/taxonomies').items():
-            tax = Taxonomy(self, tn, tc)
-            taxonomies.append(tax)
-        return taxonomies
+    def generators(self):
+        defs = {}
+        for cls in self.plugin_loader.getPageGenerators():
+            defs[cls.GENERATOR_NAME] = cls
+
+        gens = []
+        for n, g in self.config.get('site/generators').items():
+            cls = defs.get(g['type'])
+            if cls is None:
+                raise ConfigurationError("No such page generator type: %s" %
+                                         g['type'])
+            gen = cls(self, n, g)
+            gens.append(gen)
+        return gens
 
     def getSource(self, source_name):
         for source in self.sources:
@@ -164,33 +171,30 @@
                 return source
         return None
 
-    def getRoutes(self, source_name, *, skip_taxonomies=False):
+    def getGenerator(self, generator_name):
+        for gen in self.generators:
+            if gen.name == generator_name:
+                return gen
+        return None
+
+    def getSourceRoutes(self, source_name):
         for route in self.routes:
             if route.source_name == source_name:
-                if not skip_taxonomies or route.taxonomy_name is None:
-                    yield route
+                yield route
 
-    def getRoute(self, source_name, route_metadata, *, skip_taxonomies=False):
-        for route in self.getRoutes(source_name,
-                                    skip_taxonomies=skip_taxonomies):
+    def getSourceRoute(self, source_name, route_metadata):
+        for route in self.getSourceRoutes(source_name):
             if (route_metadata is None or
                     route.matchesMetadata(route_metadata)):
                 return route
         return None
 
-    def getTaxonomyRoute(self, tax_name, source_name):
+    def getGeneratorRoute(self, generator_name):
         for route in self.routes:
-            if (route.taxonomy_name == tax_name and
-                    route.source_name == source_name):
+            if route.generator_name == generator_name:
                 return route
         return None
 
-    def getTaxonomy(self, tax_name):
-        for tax in self.taxonomies:
-            if tax.name == tax_name:
-                return tax
-        return None
-
     def _get_dir(self, default_rel_dir):
         abs_dir = os.path.join(self.root_dir, default_rel_dir)
         if os.path.isdir(abs_dir):