mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
automatically copy linked static files
This commit is contained in:
parent
5c08af8f80
commit
048ea4dc0c
32 changed files with 424 additions and 224 deletions
7
pelican/tests/TestPages/page_with_static_links.md
Normal file
7
pelican/tests/TestPages/page_with_static_links.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
Title: Page with static links
|
||||
|
||||
My links:
|
||||
|
||||
[Link 0]({static}image0.jpg)
|
||||
|
||||
[Link 1]({attach}image1.jpg)
|
||||
|
|
@ -42,8 +42,8 @@
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
>>> from ipdb import set_trace
|
||||
>>> set_trace()
|
||||
|
|
@ -78,7 +78,7 @@
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
|
||||
<a class="readmore" href="/oh-yeah.html">read more</a>
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</article>
|
||||
</aside><!-- /#featured -->
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
>>> from ipdb import set_trace
|
||||
>>> set_trace()
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
&gt;&gt;&gt; from ipdb import set_trace
|
||||
&gt;&gt;&gt; set_trace()
|
||||
|
|
@ -17,12 +17,12 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</summary><content type="html"><div class="section" id="why-not">
|
||||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</content><category term="oh"></category><category term="bar"></category><category term="yeah"></category></entry></feed>
|
||||
|
|
@ -5,6 +5,6 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Alexis Métaireau</dc:creator><pubDate>Wed, 20 Oct 2010 10:14:00 +0000</pubDate><guid isPermaLink="false">tag:None,2010-10-20:/oh-yeah.html</guid><category>oh</category><category>bar</category><category>yeah</category></item></channel></rss>
|
||||
|
|
@ -19,8 +19,8 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
&gt;&gt;&gt; from ipdb import set_trace
|
||||
&gt;&gt;&gt; set_trace()
|
||||
|
|
@ -31,13 +31,13 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</summary><content type="html"><div class="section" id="why-not">
|
||||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</content><category term="oh"></category><category term="bar"></category><category term="yeah"></category></entry><entry><title>Unbelievable !</title><link href="/unbelievable.html" rel="alternate"></link><published>2010-10-15T20:30:00+00:00</published><updated>2010-10-15T20:30:00+00:00</updated><author><name></name></author><id>tag:None,2010-10-15:/unbelievable.html</id><summary type="html"><p>Or completely awesome. Depends the needs.</p>
|
||||
<p><a class="reference external" href="/a-markdown-powered-article.html">a root-relative link to markdown-article</a>
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
&gt;&gt;&gt; from ipdb import set_trace
|
||||
&gt;&gt;&gt; set_trace()
|
||||
|
|
@ -33,13 +33,13 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</summary><content type="html"><div class="section" id="why-not">
|
||||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</content><category term="oh"></category><category term="bar"></category><category term="yeah"></category></entry><entry><title>Unbelievable !</title><link href="/unbelievable.html" rel="alternate"></link><published>2010-10-15T20:30:00+00:00</published><updated>2010-10-15T20:30:00+00:00</updated><author><name></name></author><id>tag:None,2010-10-15:/unbelievable.html</id><summary type="html"><p>Or completely awesome. Depends the needs.</p>
|
||||
<p><a class="reference external" href="/a-markdown-powered-article.html">a root-relative link to markdown-article</a>
|
||||
|
|
|
|||
|
|
@ -3,12 +3,12 @@
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</summary><content type="html"><div class="section" id="why-not">
|
||||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</content><category term="oh"></category><category term="bar"></category><category term="yeah"></category></entry></feed>
|
||||
|
|
@ -5,8 +5,8 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
&gt;&gt;&gt; from ipdb import set_trace
|
||||
&gt;&gt;&gt; set_trace()
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
|
||||
<a class="readmore" href="/oh-yeah.html">read more</a>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
|
||||
</div><!-- /.entry-content -->
|
||||
|
|
|
|||
BIN
pelican/tests/output/basic/pictures/Sushi.jpg
Normal file
BIN
pelican/tests/output/basic/pictures/Sushi.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
BIN
pelican/tests/output/basic/pictures/Sushi_Macro.jpg
Normal file
BIN
pelican/tests/output/basic/pictures/Sushi_Macro.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
|
|
@ -90,7 +90,7 @@ as well as <strong>inline markup</strong>.</p>
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
|
||||
<a class="readmore" href="/oh-yeah.html">read more</a>
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
>>> from ipdb import set_trace
|
||||
>>> set_trace()
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
<h2>Why not ?</h2>
|
||||
<p>After all, why not ? It's pretty simple to do it, and it will allow me to write my blogposts in rst !
|
||||
YEAH !</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
</div>
|
||||
</article>
|
||||
</aside><!-- /#featured -->
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@
|
|||
<div class="section" id="this-is-a-simple-title">
|
||||
<h2>This is a simple title</h2>
|
||||
<p>And here comes the cool <a class="reference external" href="http://books.couchdb.org/relax/design-documents/views">stuff</a>.</p>
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="|filename|/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi.jpg" style="width: 600px; height: 450px;" />
|
||||
<img alt="alternate text" src="/pictures/Sushi_Macro.jpg" style="width: 600px; height: 450px;" />
|
||||
<pre class="literal-block">
|
||||
>>> from ipdb import set_trace
|
||||
>>> set_trace()
|
||||
|
|
|
|||
|
|
@ -175,6 +175,15 @@ def get_settings(**kwargs):
|
|||
return settings
|
||||
|
||||
|
||||
def get_context(settings=None, **kwargs):
|
||||
context = settings.copy() if settings else {}
|
||||
context['generated_content'] = {}
|
||||
context['static_links'] = set()
|
||||
context['static_content'] = {}
|
||||
context.update(kwargs)
|
||||
return context
|
||||
|
||||
|
||||
class LogCountHandler(BufferingHandler):
|
||||
"""Capturing and counting logged messages."""
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ from shutil import rmtree
|
|||
from tempfile import mkdtemp
|
||||
|
||||
from pelican.generators import ArticlesGenerator, PagesGenerator
|
||||
from pelican.tests.support import get_settings, unittest
|
||||
from pelican.tests.support import get_context, get_settings, unittest
|
||||
|
||||
try:
|
||||
from unittest.mock import MagicMock
|
||||
|
|
@ -29,7 +29,7 @@ class TestCache(unittest.TestCase):
|
|||
rmtree(self.temp_cache)
|
||||
|
||||
def _get_cache_enabled_settings(self):
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['CACHE_CONTENT'] = True
|
||||
settings['LOAD_CONTENT_CACHE'] = True
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
|
|
@ -42,20 +42,21 @@ class TestCache(unittest.TestCase):
|
|||
settings['PAGE_PATHS'] = ['TestPages']
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
def sorted_titles(items):
|
||||
return sorted(item.title for item in items)
|
||||
|
||||
# Articles
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
uncached_articles = sorted_titles(generator.articles)
|
||||
uncached_drafts = sorted_titles(generator.drafts)
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
cached_articles = sorted_titles(generator.articles)
|
||||
|
|
@ -66,7 +67,7 @@ class TestCache(unittest.TestCase):
|
|||
|
||||
# Pages
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
uncached_pages = sorted_titles(generator.pages)
|
||||
|
|
@ -74,7 +75,7 @@ class TestCache(unittest.TestCase):
|
|||
uncached_draft_pages = sorted_titles(generator.draft_pages)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
cached_pages = sorted_titles(generator.pages)
|
||||
|
|
@ -92,20 +93,21 @@ class TestCache(unittest.TestCase):
|
|||
settings['PAGE_PATHS'] = ['TestPages']
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
def sorted_titles(items):
|
||||
return sorted(item.title for item in items)
|
||||
|
||||
# Articles
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
uncached_articles = sorted_titles(generator.articles)
|
||||
uncached_drafts = sorted_titles(generator.drafts)
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
cached_articles = sorted_titles(generator.articles)
|
||||
|
|
@ -116,14 +118,14 @@ class TestCache(unittest.TestCase):
|
|||
|
||||
# Pages
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
uncached_pages = sorted_titles(generator.pages)
|
||||
uncached_hidden_pages = sorted_titles(generator.hidden_pages)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
cached_pages = sorted_titles(generator.pages)
|
||||
|
|
@ -139,15 +141,16 @@ class TestCache(unittest.TestCase):
|
|||
settings['CONTENT_CACHING_LAYER'] = 'generator'
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
self.assertTrue(hasattr(generator, '_cache'))
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.readers.read_file = MagicMock()
|
||||
generator.generate_context()
|
||||
|
|
@ -167,15 +170,16 @@ class TestCache(unittest.TestCase):
|
|||
"""Test raw article content caching at the reader level"""
|
||||
settings = self._get_cache_enabled_settings()
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
self.assertTrue(hasattr(generator.readers, '_cache'))
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
readers = generator.readers.readers
|
||||
for reader in readers.values():
|
||||
|
|
@ -191,9 +195,10 @@ class TestCache(unittest.TestCase):
|
|||
used in --ignore-cache or autoreload mode"""
|
||||
settings = self._get_cache_enabled_settings()
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.readers.read_file = MagicMock()
|
||||
generator.generate_context()
|
||||
|
|
@ -202,7 +207,7 @@ class TestCache(unittest.TestCase):
|
|||
|
||||
settings['LOAD_CONTENT_CACHE'] = False
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.readers.read_file = MagicMock()
|
||||
generator.generate_context()
|
||||
|
|
@ -217,15 +222,16 @@ class TestCache(unittest.TestCase):
|
|||
settings['CONTENT_CACHING_LAYER'] = 'generator'
|
||||
settings['PAGE_PATHS'] = ['TestPages']
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
self.assertTrue(hasattr(generator, '_cache'))
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.readers.read_file = MagicMock()
|
||||
generator.generate_context()
|
||||
|
|
@ -241,15 +247,16 @@ class TestCache(unittest.TestCase):
|
|||
settings = self._get_cache_enabled_settings()
|
||||
settings['PAGE_PATHS'] = ['TestPages']
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
self.assertTrue(hasattr(generator.readers, '_cache'))
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
readers = generator.readers.readers
|
||||
for reader in readers.values():
|
||||
|
|
@ -266,9 +273,10 @@ class TestCache(unittest.TestCase):
|
|||
settings = self._get_cache_enabled_settings()
|
||||
settings['PAGE_PATHS'] = ['TestPages']
|
||||
settings['READERS'] = {'asc': None}
|
||||
context = get_context(settings)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.readers.read_file = MagicMock()
|
||||
generator.generate_context()
|
||||
|
|
@ -277,7 +285,7 @@ class TestCache(unittest.TestCase):
|
|||
|
||||
settings['LOAD_CONTENT_CACHE'] = False
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.readers.read_file = MagicMock()
|
||||
generator.generate_context()
|
||||
|
|
|
|||
|
|
@ -14,7 +14,8 @@ import six
|
|||
from pelican.contents import Article, Author, Category, Page, Static, Tag
|
||||
from pelican.settings import DEFAULT_CONFIG
|
||||
from pelican.signals import content_object_init
|
||||
from pelican.tests.support import LoggedTestCase, get_settings, unittest
|
||||
from pelican.tests.support import LoggedTestCase, get_context, get_settings,\
|
||||
unittest
|
||||
from pelican.utils import SafeDatetime, path_to_url, truncate_html_words
|
||||
|
||||
|
||||
|
|
@ -264,7 +265,7 @@ class TestPage(LoggedTestCase):
|
|||
args = self.page_kwargs.copy()
|
||||
args['settings'] = get_settings()
|
||||
args['source_path'] = 'content'
|
||||
args['context']['filenames'] = {'article.rst': article}
|
||||
args['context']['generated_content'] = {'article.rst': article}
|
||||
|
||||
# Classic intrasite link via filename
|
||||
args['content'] = (
|
||||
|
|
@ -343,22 +344,24 @@ class TestPage(LoggedTestCase):
|
|||
args = self.page_kwargs.copy()
|
||||
args['settings'] = get_settings()
|
||||
args['source_path'] = 'content'
|
||||
args['context']['filenames'] = {
|
||||
'images/poster.jpg': type(
|
||||
cls_name, (object,), {'url': 'images/poster.jpg'}),
|
||||
'assets/video.mp4': type(
|
||||
cls_name, (object,), {'url': 'assets/video.mp4'}),
|
||||
'images/graph.svg': type(
|
||||
cls_name, (object,), {'url': 'images/graph.svg'}),
|
||||
'reference.rst': type(
|
||||
cls_name, (object,), {'url': 'reference.html'}),
|
||||
args['context']['static_content'] = {
|
||||
'images/poster.jpg':
|
||||
type(cls_name, (object,), {'url': 'images/poster.jpg'}),
|
||||
'assets/video.mp4':
|
||||
type(cls_name, (object,), {'url': 'assets/video.mp4'}),
|
||||
'images/graph.svg':
|
||||
type(cls_name, (object,), {'url': 'images/graph.svg'}),
|
||||
}
|
||||
args['context']['generated_content'] = {
|
||||
'reference.rst':
|
||||
type(cls_name, (object,), {'url': 'reference.html'}),
|
||||
}
|
||||
|
||||
# video.poster
|
||||
args['content'] = (
|
||||
'There is a video with poster '
|
||||
'<video controls poster="{filename}/images/poster.jpg">'
|
||||
'<source src="|filename|/assets/video.mp4" type="video/mp4">'
|
||||
'<video controls poster="{static}/images/poster.jpg">'
|
||||
'<source src="|static|/assets/video.mp4" type="video/mp4">'
|
||||
'</video>'
|
||||
)
|
||||
content = Page(**args).get_content('http://notmyidea.org')
|
||||
|
|
@ -374,7 +377,7 @@ class TestPage(LoggedTestCase):
|
|||
# object.data
|
||||
args['content'] = (
|
||||
'There is a svg object '
|
||||
'<object data="{filename}/images/graph.svg"'
|
||||
'<object data="{static}/images/graph.svg"'
|
||||
' type="image/svg+xml">'
|
||||
'</object>'
|
||||
)
|
||||
|
|
@ -409,14 +412,15 @@ class TestPage(LoggedTestCase):
|
|||
STATIC_URL='http://static.cool.site/{path}',
|
||||
ARTICLE_URL='http://blog.cool.site/{slug}.html')
|
||||
args['source_path'] = 'content'
|
||||
args['context']['filenames'] = {
|
||||
'images/poster.jpg': Static('',
|
||||
settings=args['settings'],
|
||||
source_path='images/poster.jpg'),
|
||||
'article.rst': Article('',
|
||||
settings=args['settings'],
|
||||
metadata={'slug': 'article',
|
||||
'title': 'Article'})
|
||||
args['context']['static_content'] = {
|
||||
'images/poster.jpg':
|
||||
Static('', settings=args['settings'],
|
||||
source_path='images/poster.jpg'),
|
||||
}
|
||||
args['context']['generated_content'] = {
|
||||
'article.rst':
|
||||
Article('', settings=args['settings'], metadata={
|
||||
'slug': 'article', 'title': 'Article'})
|
||||
}
|
||||
|
||||
# Article link will go to blog
|
||||
|
|
@ -441,7 +445,7 @@ class TestPage(LoggedTestCase):
|
|||
|
||||
# Image link will go to static
|
||||
args['content'] = (
|
||||
'<img src="{filename}/images/poster.jpg"/>'
|
||||
'<img src="{static}/images/poster.jpg"/>'
|
||||
)
|
||||
content = Page(**args).get_content('http://cool.site')
|
||||
self.assertEqual(
|
||||
|
|
@ -458,7 +462,7 @@ class TestPage(LoggedTestCase):
|
|||
args = self.page_kwargs.copy()
|
||||
args['settings'] = get_settings()
|
||||
args['source_path'] = 'content'
|
||||
args['context']['filenames'] = {'article spaces.rst': article}
|
||||
args['context']['generated_content'] = {'article spaces.rst': article}
|
||||
|
||||
# An intrasite link via filename with %20 as a space
|
||||
args['content'] = (
|
||||
|
|
@ -472,6 +476,55 @@ class TestPage(LoggedTestCase):
|
|||
'<a href="http://notmyidea.org/article-spaces.html">link</a>'
|
||||
)
|
||||
|
||||
def test_intrasite_link_source_and_generated(self):
|
||||
"""Test linking both to the source and the generated article
|
||||
"""
|
||||
cls_name = '_DummyAsset' if six.PY3 else b'_DummyAsset'
|
||||
|
||||
args = self.page_kwargs.copy()
|
||||
args['settings'] = get_settings()
|
||||
args['source_path'] = 'content'
|
||||
args['context']['generated_content'] = {
|
||||
'article.rst': type(cls_name, (object,), {'url': 'article.html'})}
|
||||
args['context']['static_content'] = {
|
||||
'article.rst': type(cls_name, (object,), {'url': 'article.rst'})}
|
||||
|
||||
args['content'] = (
|
||||
'A simple test, with a link to an'
|
||||
'<a href="{filename}article.rst">article</a> and its'
|
||||
'<a href="{static}article.rst">source</a>'
|
||||
)
|
||||
content = Page(**args).get_content('http://notmyidea.org')
|
||||
self.assertEqual(
|
||||
content,
|
||||
'A simple test, with a link to an'
|
||||
'<a href="http://notmyidea.org/article.html">article</a> and its'
|
||||
'<a href="http://notmyidea.org/article.rst">source</a>'
|
||||
)
|
||||
|
||||
def test_intrasite_link_to_static_content_with_filename(self):
|
||||
"""Test linking to a static resource with deprecated {filename}
|
||||
"""
|
||||
cls_name = '_DummyAsset' if six.PY3 else b'_DummyAsset'
|
||||
|
||||
args = self.page_kwargs.copy()
|
||||
args['settings'] = get_settings()
|
||||
args['source_path'] = 'content'
|
||||
args['context']['static_content'] = {
|
||||
'poster.jpg':
|
||||
type(cls_name, (object,), {'url': 'images/poster.jpg'})}
|
||||
|
||||
args['content'] = (
|
||||
'A simple test, with a link to a'
|
||||
'<a href="{filename}poster.jpg">poster</a>'
|
||||
)
|
||||
content = Page(**args).get_content('http://notmyidea.org')
|
||||
self.assertEqual(
|
||||
content,
|
||||
'A simple test, with a link to a'
|
||||
'<a href="http://notmyidea.org/images/poster.jpg">poster</a>'
|
||||
)
|
||||
|
||||
def test_multiple_authors(self):
|
||||
"""Test article with multiple authors."""
|
||||
args = self.page_kwargs.copy()
|
||||
|
|
@ -599,13 +652,13 @@ class TestStatic(LoggedTestCase):
|
|||
STATIC_URL='{path}',
|
||||
PAGE_SAVE_AS=os.path.join('outpages', '{slug}.html'),
|
||||
PAGE_URL='outpages/{slug}.html')
|
||||
self.context = self.settings.copy()
|
||||
self.context = get_context(self.settings)
|
||||
|
||||
self.static = Static(content=None, metadata={}, settings=self.settings,
|
||||
source_path=posix_join('dir', 'foo.jpg'),
|
||||
context=self.context)
|
||||
|
||||
self.context['filenames'] = {self.static.source_path: self.static}
|
||||
self.context['static_content'][self.static.source_path] = self.static
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
|
@ -674,7 +727,7 @@ class TestStatic(LoggedTestCase):
|
|||
|
||||
def test_attach_to_does_nothing_after_save_as_referenced(self):
|
||||
"""attach_to() does nothing if the save_as was already referenced.
|
||||
(For example, by a {filename} link an a document processed earlier.)
|
||||
(For example, by a {static} link an a document processed earlier.)
|
||||
"""
|
||||
original_save_as = self.static.save_as
|
||||
|
||||
|
|
@ -690,7 +743,7 @@ class TestStatic(LoggedTestCase):
|
|||
|
||||
def test_attach_to_does_nothing_after_url_referenced(self):
|
||||
"""attach_to() does nothing if the url was already referenced.
|
||||
(For example, by a {filename} link an a document processed earlier.)
|
||||
(For example, by a {static} link an a document processed earlier.)
|
||||
"""
|
||||
original_url = self.static.url
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ from tempfile import mkdtemp
|
|||
from pelican.generators import (ArticlesGenerator, Generator, PagesGenerator,
|
||||
PelicanTemplateNotFound, StaticGenerator,
|
||||
TemplatePagesGenerator)
|
||||
from pelican.tests.support import get_settings, unittest
|
||||
from pelican.tests.support import get_context, get_settings, unittest
|
||||
from pelican.writers import Writer
|
||||
|
||||
try:
|
||||
|
|
@ -178,14 +178,15 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['DEFAULT_CATEGORY'] = 'Default'
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
settings['READERS'] = {'asc': None}
|
||||
settings['CACHE_CONTENT'] = False
|
||||
context = get_context(settings)
|
||||
|
||||
cls.generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
cls.generator.generate_context()
|
||||
cls.articles = cls.distill_articles(cls.generator.articles)
|
||||
|
|
@ -299,15 +300,15 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
self.assertEqual(sorted(categories), sorted(categories_expected))
|
||||
|
||||
def test_do_not_use_folder_as_category(self):
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['DEFAULT_CATEGORY'] = 'Default'
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
settings['USE_FOLDER_AS_CATEGORY'] = False
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
settings['READERS'] = {'asc': None}
|
||||
settings['filenames'] = {}
|
||||
context = get_context(settings)
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
# test for name
|
||||
|
|
@ -328,15 +329,16 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
@unittest.skipUnless(MagicMock, 'Needs Mock module')
|
||||
def test_direct_templates_save_as_url_default(self):
|
||||
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
context = get_context(settings)
|
||||
generator = ArticlesGenerator(
|
||||
context=settings, settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=None, theme=settings['THEME'], output_path=None)
|
||||
write = MagicMock()
|
||||
generator.generate_direct_templates(write)
|
||||
write.assert_called_with("archives.html",
|
||||
generator.get_template("archives"), settings,
|
||||
generator.get_template("archives"), context,
|
||||
articles=generator.articles,
|
||||
dates=generator.dates, blog=True,
|
||||
template_name='archives',
|
||||
|
|
@ -396,13 +398,14 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
"""
|
||||
old_locale = locale.setlocale(locale.LC_ALL)
|
||||
locale.setlocale(locale.LC_ALL, str('C'))
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
|
||||
settings['YEAR_ARCHIVE_SAVE_AS'] = 'posts/{date:%Y}/index.html'
|
||||
settings['YEAR_ARCHIVE_URL'] = 'posts/{date:%Y}/'
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
context = get_context(settings)
|
||||
generator = ArticlesGenerator(
|
||||
context=settings, settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
write = MagicMock()
|
||||
|
|
@ -411,20 +414,20 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
articles = [d for d in generator.articles if d.date.year == 1970]
|
||||
self.assertEqual(len(dates), 1)
|
||||
# among other things it must have at least been called with this
|
||||
settings["period"] = (1970,)
|
||||
context["period"] = (1970,)
|
||||
write.assert_called_with("posts/1970/index.html",
|
||||
generator.get_template("period_archives"),
|
||||
settings, blog=True, articles=articles,
|
||||
context, blog=True, articles=articles,
|
||||
dates=dates, template_name='period_archives',
|
||||
url="posts/1970/")
|
||||
|
||||
del settings["period"]
|
||||
settings['MONTH_ARCHIVE_SAVE_AS'] = \
|
||||
'posts/{date:%Y}/{date:%b}/index.html'
|
||||
settings['MONTH_ARCHIVE_URL'] = \
|
||||
'posts/{date:%Y}/{date:%b}/'
|
||||
context = get_context(settings)
|
||||
generator = ArticlesGenerator(
|
||||
context=settings, settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
write = MagicMock()
|
||||
|
|
@ -434,21 +437,21 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
articles = [d for d in generator.articles
|
||||
if d.date.year == 1970 and d.date.month == 1]
|
||||
self.assertEqual(len(dates), 1)
|
||||
settings["period"] = (1970, "January")
|
||||
context["period"] = (1970, "January")
|
||||
# among other things it must have at least been called with this
|
||||
write.assert_called_with("posts/1970/Jan/index.html",
|
||||
generator.get_template("period_archives"),
|
||||
settings, blog=True, articles=articles,
|
||||
context, blog=True, articles=articles,
|
||||
dates=dates, template_name='period_archives',
|
||||
url="posts/1970/Jan/")
|
||||
|
||||
del settings["period"]
|
||||
settings['DAY_ARCHIVE_SAVE_AS'] = \
|
||||
'posts/{date:%Y}/{date:%b}/{date:%d}/index.html'
|
||||
settings['DAY_ARCHIVE_URL'] = \
|
||||
'posts/{date:%Y}/{date:%b}/{date:%d}/'
|
||||
context = get_context(settings)
|
||||
generator = ArticlesGenerator(
|
||||
context=settings, settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
write = MagicMock()
|
||||
|
|
@ -466,20 +469,21 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
d.date.day == 1
|
||||
]
|
||||
self.assertEqual(len(dates), 1)
|
||||
settings["period"] = (1970, "January", 1)
|
||||
context["period"] = (1970, "January", 1)
|
||||
# among other things it must have at least been called with this
|
||||
write.assert_called_with("posts/1970/Jan/01/index.html",
|
||||
generator.get_template("period_archives"),
|
||||
settings, blog=True, articles=articles,
|
||||
context, blog=True, articles=articles,
|
||||
dates=dates, template_name='period_archives',
|
||||
url="posts/1970/Jan/01/")
|
||||
locale.setlocale(locale.LC_ALL, old_locale)
|
||||
|
||||
def test_nonexistent_template(self):
|
||||
"""Attempt to load a non-existent template"""
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
context = get_context(settings)
|
||||
generator = ArticlesGenerator(
|
||||
context=settings, settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=None, theme=settings['THEME'], output_path=None)
|
||||
self.assertRaises(Exception, generator.get_template, "not_a_template")
|
||||
|
||||
|
|
@ -497,7 +501,7 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
self.assertEqual(sorted(authors), sorted(authors_expected))
|
||||
|
||||
def test_standard_metadata_in_default_metadata(self):
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['CACHE_CONTENT'] = False
|
||||
settings['DEFAULT_CATEGORY'] = 'Default'
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
|
|
@ -506,8 +510,9 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
# DEFAULT_CATEGORY
|
||||
('category', 'Random'),
|
||||
('tags', 'general, untagged'))
|
||||
context = get_context(settings)
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
|
||||
|
|
@ -530,13 +535,14 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
self.assertEqual(tags, tags_expected)
|
||||
|
||||
def test_article_order_by(self):
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['DEFAULT_CATEGORY'] = 'Default'
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
settings['ARTICLE_ORDER_BY'] = 'title'
|
||||
context = get_context(settings)
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
|
||||
|
|
@ -575,13 +581,14 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
self.assertEqual(articles, expected)
|
||||
|
||||
# reversed title
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['DEFAULT_CATEGORY'] = 'Default'
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
settings['ARTICLE_ORDER_BY'] = 'reversed-title'
|
||||
context = get_context(settings)
|
||||
|
||||
generator = ArticlesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CONTENT_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
|
||||
|
|
@ -605,13 +612,14 @@ class TestPageGenerator(unittest.TestCase):
|
|||
return [[page.title, page.status, page.template] for page in pages]
|
||||
|
||||
def test_generate_context(self):
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
settings['PAGE_PATHS'] = ['TestPages'] # relative to CUR_DIR
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
context = get_context(settings)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
pages = self.distill_pages(generator.pages)
|
||||
|
|
@ -624,6 +632,7 @@ class TestPageGenerator(unittest.TestCase):
|
|||
['This is a test page with a preset template', 'published',
|
||||
'custom'],
|
||||
['Page with a bunch of links', 'published', 'page'],
|
||||
['Page with static links', 'published', 'page'],
|
||||
['A Page (Test) for sorting', 'published', 'page'],
|
||||
]
|
||||
hidden_pages_expected = [
|
||||
|
|
@ -653,10 +662,11 @@ class TestPageGenerator(unittest.TestCase):
|
|||
sorted(self.distill_pages(generator.context['draft_pages'])))
|
||||
|
||||
def test_generate_sorted(self):
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['PAGE_PATHS'] = ['TestPages'] # relative to CUR_DIR
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
context = get_context(settings)
|
||||
|
||||
# default sort (filename)
|
||||
pages_expected_sorted_by_filename = [
|
||||
|
|
@ -664,11 +674,12 @@ class TestPageGenerator(unittest.TestCase):
|
|||
['This is a markdown test page', 'published', 'page'],
|
||||
['A Page (Test) for sorting', 'published', 'page'],
|
||||
['Page with a bunch of links', 'published', 'page'],
|
||||
['Page with static links', 'published', 'page'],
|
||||
['This is a test page with a preset template', 'published',
|
||||
'custom'],
|
||||
]
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
pages = self.distill_pages(generator.pages)
|
||||
|
|
@ -678,14 +689,16 @@ class TestPageGenerator(unittest.TestCase):
|
|||
pages_expected_sorted_by_title = [
|
||||
['A Page (Test) for sorting', 'published', 'page'],
|
||||
['Page with a bunch of links', 'published', 'page'],
|
||||
['Page with static links', 'published', 'page'],
|
||||
['This is a markdown test page', 'published', 'page'],
|
||||
['This is a test page', 'published', 'page'],
|
||||
['This is a test page with a preset template', 'published',
|
||||
'custom'],
|
||||
]
|
||||
settings['PAGE_ORDER_BY'] = 'title'
|
||||
context = get_context(settings)
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context.copy(), settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
pages = self.distill_pages(generator.pages)
|
||||
|
|
@ -697,12 +710,14 @@ class TestPageGenerator(unittest.TestCase):
|
|||
'custom'],
|
||||
['This is a test page', 'published', 'page'],
|
||||
['This is a markdown test page', 'published', 'page'],
|
||||
['Page with static links', 'published', 'page'],
|
||||
['Page with a bunch of links', 'published', 'page'],
|
||||
['A Page (Test) for sorting', 'published', 'page'],
|
||||
]
|
||||
settings['PAGE_ORDER_BY'] = 'reversed-title'
|
||||
context = get_context(settings)
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
pages = self.distill_pages(generator.pages)
|
||||
|
|
@ -713,21 +728,43 @@ class TestPageGenerator(unittest.TestCase):
|
|||
Test to ensure links of the form {tag}tagname and {category}catname
|
||||
are generated correctly on pages
|
||||
"""
|
||||
settings = get_settings(filenames={})
|
||||
settings = get_settings()
|
||||
settings['PAGE_PATHS'] = ['TestPages'] # relative to CUR_DIR
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
context = get_context(settings)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=settings.copy(), settings=settings,
|
||||
context=context, settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
pages_by_title = {p.title: p.content for p in generator.pages}
|
||||
pages_by_title = {p.title: p for p in generator.pages}
|
||||
|
||||
test_content = pages_by_title['Page with a bunch of links']
|
||||
test_content = pages_by_title['Page with a bunch of links'].content
|
||||
self.assertIn('<a href="/category/yeah.html">', test_content)
|
||||
self.assertIn('<a href="/tag/matsuku.html">', test_content)
|
||||
|
||||
def test_static_and_attach_links_on_generated_pages(self):
|
||||
"""
|
||||
Test to ensure links of the form {static}filename and {attach}filename
|
||||
are included in context['static_links']
|
||||
"""
|
||||
settings = get_settings()
|
||||
settings['PAGE_PATHS'] = ['TestPages/page_with_static_links.md']
|
||||
settings['CACHE_PATH'] = self.temp_cache
|
||||
settings['DEFAULT_DATE'] = (1970, 1, 1)
|
||||
context = get_context(settings)
|
||||
|
||||
generator = PagesGenerator(
|
||||
context=context, settings=settings,
|
||||
path=CUR_DIR, theme=settings['THEME'], output_path=None)
|
||||
generator.generate_context()
|
||||
|
||||
self.assertIn('pelican/tests/TestPages/image0.jpg',
|
||||
context['static_links'])
|
||||
self.assertIn('pelican/tests/TestPages/image1.jpg',
|
||||
context['static_links'])
|
||||
|
||||
|
||||
class TestTemplatePagesGenerator(unittest.TestCase):
|
||||
|
||||
|
|
@ -791,7 +828,7 @@ class TestStaticGenerator(unittest.TestCase):
|
|||
"static", "staticfile")
|
||||
self.endfile = os.path.join(self.temp_output, "static", "staticfile")
|
||||
self.generator = StaticGenerator(
|
||||
context={'filenames': {}},
|
||||
context=get_context(),
|
||||
settings=self.settings,
|
||||
path=self.temp_content,
|
||||
theme="",
|
||||
|
|
@ -808,11 +845,8 @@ class TestStaticGenerator(unittest.TestCase):
|
|||
def test_theme_static_paths_dirs(self):
|
||||
"""Test that StaticGenerator properly copies also files mentioned in
|
||||
TEMPLATE_STATIC_PATHS, not just directories."""
|
||||
settings = get_settings(
|
||||
PATH=self.content_path,
|
||||
filenames={})
|
||||
context = settings.copy()
|
||||
context['staticfiles'] = []
|
||||
settings = get_settings(PATH=self.content_path)
|
||||
context = get_context(settings, staticfiles=[])
|
||||
|
||||
StaticGenerator(
|
||||
context=context, settings=settings,
|
||||
|
|
@ -831,10 +865,8 @@ class TestStaticGenerator(unittest.TestCase):
|
|||
TEMPLATE_STATIC_PATHS, not just directories."""
|
||||
settings = get_settings(
|
||||
PATH=self.content_path,
|
||||
THEME_STATIC_PATHS=['static/css/fonts.css', 'static/fonts/'],
|
||||
filenames={})
|
||||
context = settings.copy()
|
||||
context['staticfiles'] = []
|
||||
THEME_STATIC_PATHS=['static/css/fonts.css', 'static/fonts/'],)
|
||||
context = get_context(settings, staticfiles=[])
|
||||
|
||||
StaticGenerator(
|
||||
context=context, settings=settings,
|
||||
|
|
@ -869,9 +901,8 @@ class TestStaticGenerator(unittest.TestCase):
|
|||
settings = get_settings(
|
||||
STATIC_EXCLUDES=['subdir'],
|
||||
PATH=self.content_path,
|
||||
STATIC_PATHS=[''],
|
||||
filenames={})
|
||||
context = settings.copy()
|
||||
STATIC_PATHS=[''],)
|
||||
context = get_context(settings)
|
||||
|
||||
StaticGenerator(
|
||||
context=context, settings=settings,
|
||||
|
|
@ -897,9 +928,8 @@ class TestStaticGenerator(unittest.TestCase):
|
|||
PATH=self.content_path,
|
||||
PAGE_PATHS=[''],
|
||||
STATIC_PATHS=[''],
|
||||
CACHE_CONTENT=False,
|
||||
filenames={})
|
||||
context = settings.copy()
|
||||
CACHE_CONTENT=False,)
|
||||
context = get_context(settings)
|
||||
|
||||
for generator_class in (PagesGenerator, StaticGenerator):
|
||||
generator_class(
|
||||
|
|
@ -915,8 +945,7 @@ class TestStaticGenerator(unittest.TestCase):
|
|||
"STATIC_EXCLUDE_SOURCES=True failed to exclude a markdown file")
|
||||
|
||||
settings.update(STATIC_EXCLUDE_SOURCES=False)
|
||||
context = settings.copy()
|
||||
context['filenames'] = {}
|
||||
context = get_context(settings)
|
||||
|
||||
for generator_class in (PagesGenerator, StaticGenerator):
|
||||
generator_class(
|
||||
|
|
@ -931,6 +960,40 @@ class TestStaticGenerator(unittest.TestCase):
|
|||
any(name.endswith(".md") for name in staticnames),
|
||||
"STATIC_EXCLUDE_SOURCES=False failed to include a markdown file")
|
||||
|
||||
def test_static_links(self):
|
||||
"""Test that StaticGenerator uses files in static_links
|
||||
"""
|
||||
settings = get_settings(
|
||||
STATIC_EXCLUDES=['subdir'],
|
||||
PATH=self.content_path,
|
||||
STATIC_PATHS=[],)
|
||||
context = get_context(settings)
|
||||
context['static_links'] |= {'short_page.md', 'subdir_fake_image.jpg'}
|
||||
|
||||
StaticGenerator(
|
||||
context=context, settings=settings,
|
||||
path=settings['PATH'], output_path=self.temp_output,
|
||||
theme=settings['THEME']).generate_context()
|
||||
|
||||
staticfiles_names = [
|
||||
os.path.basename(c.source_path) for c in context['staticfiles']]
|
||||
|
||||
static_content_names = [
|
||||
os.path.basename(c) for c in context['static_content']]
|
||||
|
||||
self.assertIn(
|
||||
'short_page.md', staticfiles_names,
|
||||
"StaticGenerator skipped a file that it should have included")
|
||||
self.assertIn(
|
||||
'short_page.md', static_content_names,
|
||||
"StaticGenerator skipped a file that it should have included")
|
||||
self.assertIn(
|
||||
'subdir_fake_image.jpg', staticfiles_names,
|
||||
"StaticGenerator skipped a file that it should have included")
|
||||
self.assertIn(
|
||||
'subdir_fake_image.jpg', static_content_names,
|
||||
"StaticGenerator skipped a file that it should have included")
|
||||
|
||||
def test_copy_one_file(self):
|
||||
with open(self.startfile, "w") as f:
|
||||
f.write("staticcontent")
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ class TestPelican(LoggedTestCase):
|
|||
self.assertDirsEqual(
|
||||
self.temp_path, os.path.join(OUTPUT_PATH, 'basic'))
|
||||
self.assertLogCountEqual(
|
||||
count=3,
|
||||
count=1,
|
||||
msg="Unable to find.*skipping url replacement",
|
||||
level=logging.WARNING)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue