1
0
Fork 0
forked from github/pelican

Compare commits

...
Sign in to create a new pull request.

7 commits

Author SHA1 Message Date
Ondrej Grover
d71bae7ee5 use also SIMPLE_THEME in test_settings.py 2014-11-05 19:45:58 +01:00
Ondrej Grover
5642f11367 fix theme path construction 2014-11-05 11:05:33 +01:00
Ondrej Grover
d88cc86df2 fix some more test still using dict 2014-11-05 10:40:49 +01:00
Ondrej Grover
ad6b483746 fix special handling of THEMES paths 2014-11-05 10:16:12 +01:00
Ondrej Grover
b22f760042 support both implicit and explicit inheritance with THEMES 2014-11-05 09:53:20 +01:00
Ondrej Grover
45945e6142 bugfix: if block with absp in THEMES was wronlgy indented
if the local absp variable was used earlier in the code, it would
override the path set in THEMES
2014-11-05 08:49:43 +01:00
th3aftermath
b00d9ef6d1 Add Multi-theme support
Adds multi-theme support using the new THEMES setting.
You can specify all the themes that you will be using in python
dicionary form. You can then inherit from the themes specified
in THEMES using the corresponding key in the dictionary.
2014-11-04 20:13:01 +01:00
8 changed files with 149 additions and 52 deletions

View file

@ -720,6 +720,12 @@ Setting name (followed by default value, if any) What does it do?
the paths defined in this settings, they will be the paths defined in this settings, they will be
progressively overwritten. progressively overwritten.
``CSS_FILE = 'main.css'`` Specify the CSS file you want to load. ``CSS_FILE = 'main.css'`` Specify the CSS file you want to load.
``THEMES = ['simple', ['!simple', 'simple']]`` Extra themes that can be inherited from, either
implicitly (just a path to the theme) or explicitly
using a prefix marker (tuple of prefix and path to
theme). They can also inherit from each other,
but only in the specified order.
See :ref:`theme_inheritance` for details.
================================================ ===================================================== ================================================ =====================================================

View file

@ -346,26 +346,48 @@ Here is a complete list of the feed variables::
TRANSLATION_FEED_ATOM TRANSLATION_FEED_ATOM
TRANSLATION_FEED_RSS TRANSLATION_FEED_RSS
.. _theme_inheritance:
Inheritance Theme inheritance
=========== =================
Since version 3.0, Pelican supports inheritance from the ``simple`` theme, so Since version 3.6, Pelican supports both implicit and explicit
you can re-use the ``simple`` theme templates in your own themes. inheritance from any theme specified in the ``THEMES`` setting. By
default the special ``simple`` theme is inherited both implicitly and
explicitly, so you can re-use its theme templates in your own themes.
If one of the mandatory files in the ``templates/`` directory of your theme is Implicit Inheritance
missing, it will be replaced by the matching template from the ``simple`` theme. --------------------
So if the HTML structure of a template in the ``simple`` theme is right for you,
If one of the mandatory files in the ``templates/`` directory of your
theme is missing, it will be replaced by a matching template from any
of the implicitly inherited themes. So if the HTML structure of a
template in the by default inherited ``simple`` theme is right for you,
you don't have to write a new template from scratch. you don't have to write a new template from scratch.
You can also extend templates from the ``simple`` theme in your own themes by Explicit Inheritance
using the ``{% extends %}`` directive as in the following example: --------------------
You explicitly extend templates from explicitly inherited themes in
your own themes by using the ``{% extends %}`` directive as in the
following example:
With the following ``THEMES`` setting which is the default plus an
extra explicitly inherited theme
.. code-block:: python
THEMES = ['simple', ['!simple', 'simple'], ['!foo', 'foo']]
You can extend parent (inherited) or sibling (your own theme) templates
.. code-block:: html+jinja .. code-block:: html+jinja
{% extends "!simple/index.html" %} <!-- extends the ``index.html`` template from the ``simple`` theme --> {% extends "!simple/index.html" %} <!-- extends the ``index.html`` template from the ``simple`` theme -->
{% extends "index.html" %} <!-- "regular" extending --> {% extends "!foo/index.html" %} <!-- extends the ``index.html`` template from the ``foo`` theme -->
{% extends "index.html" %} <!-- "regular" extending, either finds a sibling template or one in an implicitly inherited theme -->
Example Example

View file

@ -47,6 +47,7 @@ class Pelican(object):
self.path = settings['PATH'] self.path = settings['PATH']
self.theme = settings['THEME'] self.theme = settings['THEME']
self.themes = settings['THEMES']
self.output_path = settings['OUTPUT_PATH'] self.output_path = settings['OUTPUT_PATH']
self.ignore_files = settings['IGNORE_FILES'] self.ignore_files = settings['IGNORE_FILES']
self.delete_outputdir = settings['DELETE_OUTPUT_DIRECTORY'] self.delete_outputdir = settings['DELETE_OUTPUT_DIRECTORY']
@ -87,6 +88,10 @@ class Pelican(object):
def _handle_deprecation(self): def _handle_deprecation(self):
if self.settings['EXTRA_TEMPLATES_PATHS']:
logger.warning('`EXTRA_TEMPLATES_PATHS` is soon to be deprecated.'
' Use the `THEMES` setting for the same behaviour')
if self.settings.get('CLEAN_URLS', False): if self.settings.get('CLEAN_URLS', False):
logger.warning('Found deprecated `CLEAN_URLS` in settings.' logger.warning('Found deprecated `CLEAN_URLS` in settings.'
' Modifying the following settings for the' ' Modifying the following settings for the'
@ -154,6 +159,7 @@ class Pelican(object):
settings=self.settings, settings=self.settings,
path=self.path, path=self.path,
theme=self.theme, theme=self.theme,
themes=self.themes,
output_path=self.output_path, output_path=self.output_path,
) for cls in self.get_generator_classes() ) for cls in self.get_generator_classes()
] ]
@ -360,9 +366,13 @@ def main():
for static_path in settings.get("STATIC_PATHS", []): for static_path in settings.get("STATIC_PATHS", []):
watchers[static_path] = folder_watcher(static_path, [''], pelican.ignore_files) watchers[static_path] = folder_watcher(static_path, [''], pelican.ignore_files)
for theme in pelican.themes:
theme = theme[1] if isinstance(theme, tuple) else theme
watchers[theme] = folder_watcher(theme, [''], pelican.ignore_files)
try: try:
if args.autoreload: if args.autoreload:
print(' --- AutoReload Mode: Monitoring `content`, `theme` and' print(' --- AutoReload Mode: Monitoring `content`, `theme`, and'
' `settings` for changes. ---') ' `settings` for changes. ---')
def _ignore_cache(pelican_obj): def _ignore_cache(pelican_obj):
@ -372,7 +382,7 @@ def main():
while True: while True:
try: try:
# Check source dir for changed files ending with the given # Check source dir for changed files ending with the given
# extension in the settings. In the theme dir is no such # extension in the settings. In the theme dir there is no such
# restriction; all files are recursively checked if they # restriction; all files are recursively checked if they
# have changed, no matter what extension the filenames # have changed, no matter what extension the filenames
# have. # have.

View file

@ -33,12 +33,13 @@ logger = logging.getLogger(__name__)
class Generator(object): class Generator(object):
"""Baseclass generator""" """Baseclass generator"""
def __init__(self, context, settings, path, theme, output_path, def __init__(self, context, settings, path, theme, themes, output_path,
readers_cache_name='', **kwargs): readers_cache_name='', **kwargs):
self.context = context self.context = context
self.settings = settings self.settings = settings
self.path = path self.path = path
self.theme = theme self.theme = theme
self.themes = themes
self.output_path = output_path self.output_path = output_path
for arg, value in kwargs.items(): for arg, value in kwargs.items():
@ -53,18 +54,27 @@ class Generator(object):
os.path.join(self.theme, 'templates'))) os.path.join(self.theme, 'templates')))
self._templates_path += self.settings['EXTRA_TEMPLATES_PATHS'] self._templates_path += self.settings['EXTRA_TEMPLATES_PATHS']
theme_path = os.path.dirname(os.path.abspath(__file__)) explicit_themes = {}
themes = [FileSystemLoader(self._templates_path)]
for theme in self.themes:
if isinstance(theme, list): # explicit inheritance
prefix, theme_path = theme
templates_path = os.path.join(theme_path, "templates")
logger.debug('Template path for prefix %s: %s', prefix,
templates_path)
explicit_themes[prefix] = FileSystemLoader(templates_path)
else: # implicit inheritance
templates_path = os.path.join(theme, "templates")
logger.debug('Implicit template path: %s', templates_path)
themes.append(FileSystemLoader(templates_path))
themes.append(PrefixLoader(explicit_themes))
loader=ChoiceLoader(themes)
simple_loader = FileSystemLoader(os.path.join(theme_path,
"themes", "simple", "templates"))
self.env = Environment( self.env = Environment(
trim_blocks=True, trim_blocks=True,
lstrip_blocks=True, lstrip_blocks=True,
loader=ChoiceLoader([ loader=loader,
FileSystemLoader(self._templates_path),
simple_loader, # implicit inheritance
PrefixLoader({'!simple': simple_loader}) # explicit one
]),
extensions=self.settings['JINJA_EXTENSIONS'], extensions=self.settings['JINJA_EXTENSIONS'],
) )
@ -717,6 +727,13 @@ class StaticGenerator(Generator):
self._copy_paths(self.settings['THEME_STATIC_PATHS'], self.theme, self._copy_paths(self.settings['THEME_STATIC_PATHS'], self.theme,
self.settings['THEME_STATIC_DIR'], self.output_path, self.settings['THEME_STATIC_DIR'], self.output_path,
os.curdir) os.curdir)
for theme in self.themes:
theme = theme[1] if isinstance(theme, list) else theme
self._copy_paths(self.settings['THEME_STATIC_PATHS'], theme,
self.settings['THEME_STATIC_DIR'], self.output_path,
os.curdir)
# copy all Static files # copy all Static files
for sc in self.context['staticfiles']: for sc in self.context['staticfiles']:
source_path = os.path.join(self.path, sc.source_path) source_path = os.path.join(self.path, sc.source_path)

View file

@ -27,6 +27,11 @@ logger = logging.getLogger(__name__)
DEFAULT_THEME = os.path.join(os.path.dirname(os.path.abspath(__file__)), DEFAULT_THEME = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'themes', 'notmyidea') 'themes', 'notmyidea')
SIMPLE_THEME = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'themes', 'simple')
DEFAULT_CONFIG = { DEFAULT_CONFIG = {
'PATH': os.curdir, 'PATH': os.curdir,
'ARTICLE_PATHS': [''], 'ARTICLE_PATHS': [''],
@ -34,6 +39,7 @@ DEFAULT_CONFIG = {
'PAGE_PATHS': ['pages'], 'PAGE_PATHS': ['pages'],
'PAGE_EXCLUDES': [], 'PAGE_EXCLUDES': [],
'THEME': DEFAULT_THEME, 'THEME': DEFAULT_THEME,
'THEMES': [SIMPLE_THEME, ['!simple', SIMPLE_THEME]],
'OUTPUT_PATH': 'output', 'OUTPUT_PATH': 'output',
'READERS': {}, 'READERS': {},
'STATIC_PATHS': ['images'], 'STATIC_PATHS': ['images'],
@ -164,6 +170,18 @@ def read_settings(path=None, override=None):
elif local_settings['PLUGIN_PATHS'] is not None: elif local_settings['PLUGIN_PATHS'] is not None:
local_settings['PLUGIN_PATHS'] = [os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(path), pluginpath))) local_settings['PLUGIN_PATHS'] = [os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(path), pluginpath)))
if not isabs(pluginpath) else pluginpath for pluginpath in local_settings['PLUGIN_PATHS']] if not isabs(pluginpath) else pluginpath for pluginpath in local_settings['PLUGIN_PATHS']]
if 'THEMES' in local_settings and local_settings['THEMES']:
for i, p in enumerate(local_settings['THEMES']):
explicit = isinstance(p, list)
p = p[1] if explicit else p
if not isabs(p):
absp = os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(path), p)))
if os.path.exists(absp):
if explicit:
local_settings['THEMES'][i][1] = absp
else:
local_settings['THEMES'][i] = absp
else: else:
local_settings = copy.deepcopy(DEFAULT_CONFIG) local_settings = copy.deepcopy(DEFAULT_CONFIG)
@ -223,6 +241,22 @@ def configure_settings(settings):
raise Exception("Could not find the theme %s" raise Exception("Could not find the theme %s"
% settings['THEME']) % settings['THEME'])
for i, theme in enumerate(settings['THEMES']):
explicit = isinstance(theme, list)
theme = theme[1] if explicit else theme
if not os.path.isdir(theme):
theme_path = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'themes', theme)
if os.path.exists(theme_path):
if explicit:
settings['THEMES'][i][1] = theme_path
else:
settings['THEMES'][i] = theme_path
else:
raise Exception("Could not find the theme %s"
% theme)
# make paths selected for writing absolute if necessary # make paths selected for writing absolute if necessary
settings['WRITE_SELECTED'] = [ settings['WRITE_SELECTED'] = [
os.path.abspath(path) for path in os.path.abspath(path) for path in

View file

@ -28,7 +28,7 @@ class TestGenerator(unittest.TestCase):
self.settings = get_settings() self.settings = get_settings()
self.settings['READERS'] = {'asc': None} self.settings['READERS'] = {'asc': None}
self.generator = Generator(self.settings.copy(), self.settings, self.generator = Generator(self.settings.copy(), self.settings,
CUR_DIR, self.settings['THEME'], None) CUR_DIR, self.settings['THEME'], self.settings['THEMES'], None)
def tearDown(self): def tearDown(self):
locale.setlocale(locale.LC_ALL, self.old_locale) locale.setlocale(locale.LC_ALL, self.old_locale)
@ -48,7 +48,8 @@ class TestGenerator(unittest.TestCase):
generator = Generator(context=self.settings.copy(), generator = Generator(context=self.settings.copy(),
settings=self.settings, settings=self.settings,
path=os.path.join(CUR_DIR, 'nested_content'), path=os.path.join(CUR_DIR, 'nested_content'),
theme=self.settings['THEME'], output_path=None) theme=self.settings['THEME'], themes=self.settings['THEMES'],
output_path=None)
filepaths = generator.get_files(paths=['maindir']) filepaths = generator.get_files(paths=['maindir'])
found_files = {os.path.basename(f) for f in filepaths} found_files = {os.path.basename(f) for f in filepaths}
@ -86,7 +87,7 @@ class TestArticlesGenerator(unittest.TestCase):
cls.generator = ArticlesGenerator( cls.generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
cls.generator.generate_context() cls.generator.generate_context()
cls.articles = cls.distill_articles(cls.generator.articles) cls.articles = cls.distill_articles(cls.generator.articles)
@ -106,7 +107,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['CACHE_PATH'] = self.temp_cache settings['CACHE_PATH'] = self.temp_cache
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=settings, context=settings, settings=settings,
path=None, theme=settings['THEME'], output_path=None) path=None, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
writer = MagicMock() writer = MagicMock()
generator.generate_feeds(writer) generator.generate_feeds(writer)
writer.write_feed.assert_called_with([], settings, writer.write_feed.assert_called_with([], settings,
@ -114,7 +115,7 @@ class TestArticlesGenerator(unittest.TestCase):
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=get_settings(FEED_ALL_ATOM=None), context=settings, settings=get_settings(FEED_ALL_ATOM=None),
path=None, theme=settings['THEME'], output_path=None) path=None, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
writer = MagicMock() writer = MagicMock()
generator.generate_feeds(writer) generator.generate_feeds(writer)
self.assertFalse(writer.write_feed.called) self.assertFalse(writer.write_feed.called)
@ -187,7 +188,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['filenames'] = {} settings['filenames'] = {}
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
# test for name # test for name
# categories are grouped by slug; if two categories have the same slug # categories are grouped by slug; if two categories have the same slug
@ -210,7 +211,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['CACHE_PATH'] = self.temp_cache settings['CACHE_PATH'] = self.temp_cache
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=settings, context=settings, settings=settings,
path=None, theme=settings['THEME'], output_path=None) path=None, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
write = MagicMock() write = MagicMock()
generator.generate_direct_templates(write) generator.generate_direct_templates(write)
write.assert_called_with("archives.html", write.assert_called_with("archives.html",
@ -225,7 +226,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['CACHE_PATH'] = self.temp_cache settings['CACHE_PATH'] = self.temp_cache
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=settings, context=settings, settings=settings,
path=None, theme=settings['THEME'], output_path=None) path=None, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
write = MagicMock() write = MagicMock()
generator.generate_direct_templates(write) generator.generate_direct_templates(write)
write.assert_called_with("archives/index.html", write.assert_called_with("archives/index.html",
@ -241,7 +242,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['CACHE_PATH'] = self.temp_cache settings['CACHE_PATH'] = self.temp_cache
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=settings, context=settings, settings=settings,
path=None, theme=settings['THEME'], output_path=None) path=None, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
write = MagicMock() write = MagicMock()
generator.generate_direct_templates(write) generator.generate_direct_templates(write)
self.assertEqual(write.call_count, 0) self.assertEqual(write.call_count, 0)
@ -268,7 +269,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['CACHE_PATH'] = self.temp_cache settings['CACHE_PATH'] = self.temp_cache
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=settings, context=settings, settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
write = MagicMock() write = MagicMock()
generator.generate_period_archives(write) generator.generate_period_archives(write)
@ -285,7 +286,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['MONTH_ARCHIVE_SAVE_AS'] = 'posts/{date:%Y}/{date:%b}/index.html' settings['MONTH_ARCHIVE_SAVE_AS'] = 'posts/{date:%Y}/{date:%b}/index.html'
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=settings, context=settings, settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
write = MagicMock() write = MagicMock()
generator.generate_period_archives(write) generator.generate_period_archives(write)
@ -303,7 +304,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['DAY_ARCHIVE_SAVE_AS'] = 'posts/{date:%Y}/{date:%b}/{date:%d}/index.html' settings['DAY_ARCHIVE_SAVE_AS'] = 'posts/{date:%Y}/{date:%b}/{date:%d}/index.html'
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings, settings=settings, context=settings, settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
write = MagicMock() write = MagicMock()
generator.generate_period_archives(write) generator.generate_period_archives(write)
@ -337,13 +338,13 @@ class TestArticlesGenerator(unittest.TestCase):
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
self.assertTrue(hasattr(generator, '_cache')) self.assertTrue(hasattr(generator, '_cache'))
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.readers.read_file = MagicMock() generator.readers.read_file = MagicMock()
generator.generate_context() generator.generate_context()
generator.readers.read_file.assert_called_count == 0 generator.readers.read_file.assert_called_count == 0
@ -356,13 +357,13 @@ class TestArticlesGenerator(unittest.TestCase):
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
self.assertTrue(hasattr(generator.readers, '_cache')) self.assertTrue(hasattr(generator.readers, '_cache'))
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
readers = generator.readers.readers readers = generator.readers.readers
for reader in readers.values(): for reader in readers.values():
reader.read = MagicMock() reader.read = MagicMock()
@ -380,7 +381,7 @@ class TestArticlesGenerator(unittest.TestCase):
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.readers.read_file = MagicMock() generator.readers.read_file = MagicMock()
generator.generate_context() generator.generate_context()
self.assertTrue(hasattr(generator, '_cache_open')) self.assertTrue(hasattr(generator, '_cache_open'))
@ -389,7 +390,7 @@ class TestArticlesGenerator(unittest.TestCase):
settings['LOAD_CONTENT_CACHE'] = False settings['LOAD_CONTENT_CACHE'] = False
generator = ArticlesGenerator( generator = ArticlesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.readers.read_file = MagicMock() generator.readers.read_file = MagicMock()
generator.generate_context() generator.generate_context()
generator.readers.read_file.assert_called_count == orig_call_count generator.readers.read_file.assert_called_count == orig_call_count
@ -418,7 +419,7 @@ class TestPageGenerator(unittest.TestCase):
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CUR_DIR, theme=settings['THEME'], output_path=None) path=CUR_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
pages = self.distill_pages(generator.pages) pages = self.distill_pages(generator.pages)
hidden_pages = self.distill_pages(generator.hidden_pages) hidden_pages = self.distill_pages(generator.hidden_pages)
@ -449,13 +450,13 @@ class TestPageGenerator(unittest.TestCase):
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
self.assertTrue(hasattr(generator, '_cache')) self.assertTrue(hasattr(generator, '_cache'))
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.readers.read_file = MagicMock() generator.readers.read_file = MagicMock()
generator.generate_context() generator.generate_context()
generator.readers.read_file.assert_called_count == 0 generator.readers.read_file.assert_called_count == 0
@ -468,13 +469,13 @@ class TestPageGenerator(unittest.TestCase):
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.generate_context() generator.generate_context()
self.assertTrue(hasattr(generator.readers, '_cache')) self.assertTrue(hasattr(generator.readers, '_cache'))
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
readers = generator.readers.readers readers = generator.readers.readers
for reader in readers.values(): for reader in readers.values():
reader.read = MagicMock() reader.read = MagicMock()
@ -492,7 +493,7 @@ class TestPageGenerator(unittest.TestCase):
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.readers.read_file = MagicMock() generator.readers.read_file = MagicMock()
generator.generate_context() generator.generate_context()
self.assertTrue(hasattr(generator, '_cache_open')) self.assertTrue(hasattr(generator, '_cache_open'))
@ -501,7 +502,7 @@ class TestPageGenerator(unittest.TestCase):
settings['LOAD_CONTENT_CACHE'] = False settings['LOAD_CONTENT_CACHE'] = False
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CONTENT_DIR, theme=settings['THEME'], output_path=None) path=CONTENT_DIR, theme=settings['THEME'], themes=settings['THEMES'], output_path=None)
generator.readers.read_file = MagicMock() generator.readers.read_file = MagicMock()
generator.generate_context() generator.generate_context()
generator.readers.read_file.assert_called_count == orig_call_count generator.readers.read_file.assert_called_count == orig_call_count
@ -522,7 +523,8 @@ class TestPageGenerator(unittest.TestCase):
] ]
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CUR_DIR, theme=settings['THEME'], output_path=None) path=CUR_DIR, theme=settings['THEME'], themes=settings['THEMES'],
output_path=None)
generator.generate_context() generator.generate_context()
pages = self.distill_pages(generator.pages) pages = self.distill_pages(generator.pages)
self.assertEqual(pages_expected_sorted_by_filename, pages) self.assertEqual(pages_expected_sorted_by_filename, pages)
@ -538,7 +540,8 @@ class TestPageGenerator(unittest.TestCase):
settings['PAGE_ORDER_BY'] = 'title' settings['PAGE_ORDER_BY'] = 'title'
generator = PagesGenerator( generator = PagesGenerator(
context=settings.copy(), settings=settings, context=settings.copy(), settings=settings,
path=CUR_DIR, theme=settings['THEME'], output_path=None) path=CUR_DIR, theme=settings['THEME'], themes=settings['THEMES'],
output_path=None)
generator.generate_context() generator.generate_context()
pages = self.distill_pages(generator.pages) pages = self.distill_pages(generator.pages)
self.assertEqual(pages_expected_sorted_by_title, pages) self.assertEqual(pages_expected_sorted_by_title, pages)
@ -570,7 +573,7 @@ class TestTemplatePagesGenerator(unittest.TestCase):
generator = TemplatePagesGenerator( generator = TemplatePagesGenerator(
context={'foo': 'bar'}, settings=settings, context={'foo': 'bar'}, settings=settings,
path=self.temp_content, theme='', output_path=self.temp_output) path=self.temp_content, theme='', themes=settings['THEMES'], output_path=self.temp_output)
# create a dummy template file # create a dummy template file
template_dir = os.path.join(self.temp_content, 'template') template_dir = os.path.join(self.temp_content, 'template')
@ -607,6 +610,7 @@ class TestStaticGenerator(unittest.TestCase):
StaticGenerator(context=context, settings=settings, StaticGenerator(context=context, settings=settings,
path=settings['PATH'], output_path=None, path=settings['PATH'], output_path=None,
themes=settings['THEMES'],
theme=settings['THEME']).generate_context() theme=settings['THEME']).generate_context()
staticnames = [os.path.basename(c.source_path) staticnames = [os.path.basename(c.source_path)
@ -631,6 +635,7 @@ class TestStaticGenerator(unittest.TestCase):
for generator_class in (PagesGenerator, StaticGenerator): for generator_class in (PagesGenerator, StaticGenerator):
generator_class(context=context, settings=settings, generator_class(context=context, settings=settings,
path=settings['PATH'], output_path=None, path=settings['PATH'], output_path=None,
themes=settings['THEMES'],
theme=settings['THEME']).generate_context() theme=settings['THEME']).generate_context()
staticnames = [os.path.basename(c.source_path) staticnames = [os.path.basename(c.source_path)
@ -648,6 +653,7 @@ class TestStaticGenerator(unittest.TestCase):
for generator_class in (PagesGenerator, StaticGenerator): for generator_class in (PagesGenerator, StaticGenerator):
generator_class(context=context, settings=settings, generator_class(context=context, settings=settings,
path=settings['PATH'], output_path=None, path=settings['PATH'], output_path=None,
themes=settings['THEMES'],
theme=settings['THEME']).generate_context() theme=settings['THEME']).generate_context()
staticnames = [os.path.basename(c.source_path) staticnames = [os.path.basename(c.source_path)

View file

@ -6,7 +6,7 @@ import locale
from os.path import dirname, abspath, join from os.path import dirname, abspath, join
from pelican.settings import (read_settings, configure_settings, from pelican.settings import (read_settings, configure_settings,
DEFAULT_CONFIG, DEFAULT_THEME) DEFAULT_CONFIG, DEFAULT_THEME, SIMPLE_THEME)
from pelican.tests.support import unittest from pelican.tests.support import unittest
@ -73,6 +73,7 @@ class TestSettingsConfiguration(unittest.TestCase):
# These 4 settings are required to run configure_settings # These 4 settings are required to run configure_settings
'PATH': '.', 'PATH': '.',
'THEME': DEFAULT_THEME, 'THEME': DEFAULT_THEME,
'THEMES': [SIMPLE_THEME, ['!simple', SIMPLE_THEME]],
'SITEURL': 'http://blog.notmyidea.org/', 'SITEURL': 'http://blog.notmyidea.org/',
'LOCALE': '', 'LOCALE': '',
} }
@ -90,6 +91,7 @@ class TestSettingsConfiguration(unittest.TestCase):
'LOCALE': '', 'LOCALE': '',
'PATH': os.curdir, 'PATH': os.curdir,
'THEME': DEFAULT_THEME, 'THEME': DEFAULT_THEME,
'THEMES': [SIMPLE_THEME, ['!simple', SIMPLE_THEME]],
} }
configure_settings(settings) configure_settings(settings)
# SITEURL should not have a trailing slash # SITEURL should not have a trailing slash

View file

@ -497,7 +497,7 @@ class TestDateFormatter(unittest.TestCase):
generator = TemplatePagesGenerator( generator = TemplatePagesGenerator(
{'date': self.date}, settings, {'date': self.date}, settings,
self.temp_content, '', self.temp_output) self.temp_content, '', '', self.temp_output)
generator.env.filters.update({'strftime': utils.DateFormatter()}) generator.env.filters.update({'strftime': utils.DateFormatter()})
writer = Writer(self.temp_output, settings=settings) writer = Writer(self.temp_output, settings=settings)
@ -526,7 +526,7 @@ class TestDateFormatter(unittest.TestCase):
generator = TemplatePagesGenerator( generator = TemplatePagesGenerator(
{'date': self.date}, settings, {'date': self.date}, settings,
self.temp_content, '', self.temp_output) self.temp_content, '', '', self.temp_output)
generator.env.filters.update({'strftime': utils.DateFormatter()}) generator.env.filters.update({'strftime': utils.DateFormatter()})
writer = Writer(self.temp_output, settings=settings) writer = Writer(self.temp_output, settings=settings)