forked from github/pelican
Compare commits
7 commits
main
...
add_multi_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d71bae7ee5 | ||
|
|
5642f11367 | ||
|
|
d88cc86df2 | ||
|
|
ad6b483746 | ||
|
|
b22f760042 | ||
|
|
45945e6142 | ||
|
|
b00d9ef6d1 |
8 changed files with 149 additions and 52 deletions
|
|
@ -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.
|
||||||
================================================ =====================================================
|
================================================ =====================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue