1
0
Fork 0
forked from github/pelican

Merge branch 'master' of github.com:getpelican/pelican

This commit is contained in:
Alexis Métaireau 2012-10-28 23:50:49 +01:00
commit 92d8208309
9 changed files with 42 additions and 20 deletions

View file

@ -21,7 +21,7 @@ How can I help?
================
There are several ways to help out. First, you can use Pelican and report any
suggestions or problems you might have via IRC or the issue tracker.
suggestions or problems you might have via IRC or the `issue tracker <https://github.com/getpelican/pelican/issues>`_.
If you want to contribute, please fork `the git repository
<https://github.com/getpelican/pelican/>`_, create a new feature branch, make

View file

@ -187,7 +187,9 @@ Note that, aside from the title, none of this metadata is mandatory: if the date
is not specified, Pelican will rely on the file's "mtime" timestamp, and the
category can be determined by the directory in which the file resides. For
example, a file located at ``python/foobar/myfoobar.rst`` will have a category of
``foobar``.
``foobar``. If you would like to organize your files in other ways where the
name of the subfolder would not be a good category name, you can set the
setting ``USE_FOLDER_AS_CATEGORY`` to ``False``.
Generate your blog
------------------

View file

@ -34,6 +34,10 @@ Setting name (default value) What doe
`DATE_FORMATS` (``{}``) If you do manage multiple languages, you can
set the date formatting here. See "Date format and locales"
section below for details.
`USE_FOLDER_AS_CATEGORY` (``True``) When you don't specify a category in your post metadata and set this
setting to ``True`` and organize your articles in subfolders, the
subfolder will become the category of your post. If set to ``False``
``DEFAULT_CATEGORY`` will be used as a fallback.
`DEFAULT_CATEGORY` (``'misc'``) The default category to fall back on.
`DEFAULT_DATE_FORMAT` (``'%a %d %B %Y'``) The default date format you want to use.
`DISPLAY_PAGES_ON_MENU` (``True``) Whether to display pages on the menu of the

View file

@ -121,7 +121,8 @@ class Page(object):
'lang': getattr(self, 'lang', 'en'),
'date': getattr(self, 'date', datetime.now()),
'author': self.author,
'category': getattr(self, 'category', 'misc'),
'category': getattr(self, 'category',
self.settings['DEFAULT_CATEGORY']),
}
def _expand_settings(self, key):

View file

@ -280,11 +280,14 @@ class ArticlesGenerator(Generator):
# if no category is set, use the name of the path as a category
if 'category' not in metadata:
if os.path.dirname(f) == article_path: # if the article is not in a subdirectory
category = self.settings['DEFAULT_CATEGORY']
else:
if (self.settings['USE_FOLDER_AS_CATEGORY']
and os.path.dirname(f) != article_path):
# if the article is in a subdirectory
category = os.path.basename(os.path.dirname(f))\
.decode('utf-8')
.decode('utf-8')
else:
# if the article is not in a subdirectory
category = self.settings['DEFAULT_CATEGORY']
if category != '':
metadata['category'] = Category(category, self.settings)

View file

@ -34,6 +34,7 @@ _DEFAULT_CONFIG = {'PATH': '.',
'PDF_GENERATOR': False,
'OUTPUT_SOURCES': False,
'OUTPUT_SOURCES_EXTENSION': '.text',
'USE_FOLDER_AS_CATEGORY': True,
'DEFAULT_CATEGORY': 'misc',
'DEFAULT_DATE': 'fs',
'WITH_FUTURE_DATES': True,

View file

@ -114,7 +114,6 @@ def mute(returns_output=False):
return decorator
def get_article(title, slug, content, lang, extra_metadata=None):
metadata = {'slug': slug, 'title': title, 'lang': lang}
if extra_metadata is not None:
@ -122,19 +121,20 @@ def get_article(title, slug, content, lang, extra_metadata=None):
return Article(content, metadata=metadata)
def skipIfNoExecutable(executable, valid_exit_code=1):
"""Tries to run an executable to make sure it's in the path, Skips the tests
if not found.
def skipIfNoExecutable(executable):
"""Skip test if `executable` is not found
Tries to run `executable` with subprocess to make sure it's in the path,
and skips the tests if not found (if subprocess raises a `OSError`).
"""
# calling with no params the command should exit with 1
with open(os.devnull, 'w') as fnull:
try:
res = subprocess.call(executable, stdout=fnull, stderr=fnull)
except OSError:
res = None
if res != valid_exit_code:
return unittest.skip('{0} compiler not found'.format(executable))
if res is None:
return unittest.skip('{0} executable not found'.format(executable))
return lambda func: func

View file

@ -86,6 +86,20 @@ class TestArticlesGenerator(unittest.TestCase):
categories_expected = ['Default', 'TestCategory', 'Yeah', 'test', 'yeah']
self.assertEquals(categories, categories_expected)
def test_do_not_use_folder_as_category(self):
settings = _DEFAULT_CONFIG.copy()
settings['ARTICLE_DIR'] = 'content'
settings['DEFAULT_CATEGORY'] = 'Default'
settings['USE_FOLDER_AS_CATEGORY'] = False
generator = ArticlesGenerator(settings.copy(), settings,
CUR_DIR, _DEFAULT_CONFIG['THEME'], None,
_DEFAULT_CONFIG['MARKUP'])
generator.generate_context()
categories = [cat.name for cat, _ in generator.categories]
self.assertEquals(categories, ['Default', 'Yeah', 'test', 'yeah'])
def test_direct_templates_save_as_default(self):
settings = _DEFAULT_CONFIG.copy()

View file

@ -3,25 +3,24 @@
import os
from pelican.tools.pelican_import import wp2fields, fields2pelican
from .support import unittest, temporary_folder, mute
from .support import unittest, temporary_folder, mute, skipIfNoExecutable
CUR_DIR = os.path.dirname(__file__)
WORDPRESS_XML_SAMPLE = os.path.join(CUR_DIR, 'content', 'wordpressexport.xml')
PANDOC = os.system('pandoc --version') == 0
try:
import BeautifulSoup
except ImportError:
BeautifulSoup = False # NOQA
@skipIfNoExecutable(['pandoc', '--version'])
@unittest.skipUnless(BeautifulSoup, 'Needs BeautifulSoup module')
class TestWordpressXmlImporter(unittest.TestCase):
def setUp(self):
self.posts = wp2fields(WORDPRESS_XML_SAMPLE)
@unittest.skipUnless(PANDOC and BeautifulSoup,
'Needs Pandoc and BeautifulSoup')
def test_ignore_empty_posts(self):
posts = list(self.posts)
@ -29,8 +28,6 @@ class TestWordpressXmlImporter(unittest.TestCase):
for title, content, fname, date, author, categ, tags, format in posts:
self.assertTrue(title.strip())
@unittest.skipUnless(PANDOC and BeautifulSoup,
'Needs Pandoc and BeautifulSoup')
def test_can_toggle_raw_html_code_parsing(self):
posts = list(self.posts)