diff --git a/pelican/tests/test_generators.py b/pelican/tests/test_generators.py index 2b9028c3..d8a4336d 100644 --- a/pelican/tests/test_generators.py +++ b/pelican/tests/test_generators.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import unicode_literals, print_function +from __future__ import unicode_literals import os from codecs import open @@ -10,7 +10,6 @@ from tempfile import mkdtemp from pelican.generators import (Generator, ArticlesGenerator, PagesGenerator, TemplatePagesGenerator) from pelican.writers import Writer -from pelican.settings import DEFAULT_CONFIG from pelican.tests.support import unittest, get_settings CUR_DIR = os.path.dirname(__file__) @@ -38,37 +37,19 @@ class TestGenerator(unittest.TestCase): class TestArticlesGenerator(unittest.TestCase): - def setUp(self): - super(TestArticlesGenerator, self).setUp() - self.generator = None + @classmethod + def setUpClass(cls): + settings = get_settings(filenames={}) + settings['DEFAULT_CATEGORY'] = 'Default' + settings['DEFAULT_DATE'] = (1970, 1, 1) - def get_populated_generator(self): - """ - We only need to pull all the test articles once, but read from it - for each test. - """ - if self.generator is None: - settings = get_settings(filenames={}) - settings['DEFAULT_CATEGORY'] = 'Default' - settings['DEFAULT_DATE'] = (1970, 1, 1) - self.generator = ArticlesGenerator( - context=settings.copy(), settings=settings, - path=CONTENT_DIR, theme=settings['THEME'], - output_path=None, markup=settings['MARKUP']) - self.generator.generate_context() - return self.generator - - def distill_articles(self, articles): - distilled = [] - for page in articles: - distilled.append([ - page.title, - page.status, - page.category.name, - page.template - ] - ) - return distilled + cls.generator = ArticlesGenerator( + context=settings.copy(), settings=settings, + path=CONTENT_DIR, theme=settings['THEME'], + output_path=None, markup=settings['MARKUP']) + cls.generator.generate_context() + cls.articles = [[page.title, page.status, page.category.name, + page.template] for page in cls.generator.articles] def test_generate_feeds(self): settings = get_settings() @@ -91,8 +72,6 @@ class TestArticlesGenerator(unittest.TestCase): def test_generate_context(self): - generator = self.get_populated_generator() - articles = self.distill_articles(generator.articles) articles_expected = [ ['Article title', 'published', 'Default', 'article'], ['Article with markdown and summary metadata single', 'published', @@ -116,38 +95,37 @@ class TestArticlesGenerator(unittest.TestCase): ['Article with markdown containing footnotes', 'published', 'Default', 'article'] ] - self.assertEqual(sorted(articles_expected), sorted(articles)) + self.assertEqual(sorted(articles_expected), sorted(self.articles)) def test_generate_categories(self): - generator = self.get_populated_generator() # test for name # categories are grouped by slug; if two categories have the same slug # but different names they will be grouped together, the first one in # terms of process order will define the name for that category - categories = [cat.name for cat, _ in generator.categories] + categories = [cat.name for cat, _ in self.generator.categories] categories_alternatives = ( sorted(['Default', 'TestCategory', 'Yeah', 'test', '指導書']), sorted(['Default', 'TestCategory', 'yeah', 'test', '指導書']), ) self.assertIn(sorted(categories), categories_alternatives) # test for slug - categories = [cat.slug for cat, _ in generator.categories] + categories = [cat.slug for cat, _ in self.generator.categories] categories_expected = ['default', 'testcategory', 'yeah', 'test', 'zhi-dao-shu'] self.assertEqual(sorted(categories), sorted(categories_expected)) def test_do_not_use_folder_as_category(self): - settings = DEFAULT_CONFIG.copy() + settings = get_settings(filenames={}) settings['DEFAULT_CATEGORY'] = 'Default' settings['DEFAULT_DATE'] = (1970, 1, 1) settings['USE_FOLDER_AS_CATEGORY'] = False settings['filenames'] = {} generator = ArticlesGenerator( context=settings.copy(), settings=settings, - path=CONTENT_DIR, theme=DEFAULT_CONFIG['THEME'], - output_path=None, markup=DEFAULT_CONFIG['MARKUP']) + path=CONTENT_DIR, theme=settings['THEME'], + output_path=None, markup=settings['MARKUP']) generator.generate_context() # test for name # categories are grouped by slug; if two categories have the same slug @@ -174,8 +152,8 @@ class TestArticlesGenerator(unittest.TestCase): write = MagicMock() generator.generate_direct_templates(write) write.assert_called_with("archives.html", - generator.get_template("archives"), settings, - blog=True, paginated={}, page_name='archives') + generator.get_template("archives"), settings, + blog=True, paginated={}, page_name='archives') def test_direct_templates_save_as_modified(self): @@ -189,8 +167,9 @@ class TestArticlesGenerator(unittest.TestCase): write = MagicMock() generator.generate_direct_templates(write) write.assert_called_with("archives/index.html", - generator.get_template("archives"), settings, - blog=True, paginated={}, page_name='archives/index') + generator.get_template("archives"), settings, + blog=True, paginated={}, + page_name='archives/index') def test_direct_templates_save_as_false(self): @@ -209,14 +188,12 @@ class TestArticlesGenerator(unittest.TestCase): """ Custom template articles get the field but standard/unset are None """ - generator = self.get_populated_generator() - articles = self.distill_articles(generator.articles) custom_template = ['Article with template', 'published', 'Default', 'custom'] standard_template = ['This is a super article !', 'published', 'Yeah', 'article'] - self.assertIn(custom_template, articles) - self.assertIn(standard_template, articles) + self.assertIn(custom_template, self.articles) + self.assertIn(standard_template, self.articles) class TestPageGenerator(unittest.TestCase): @@ -226,15 +203,7 @@ class TestPageGenerator(unittest.TestCase): # to match expected def distill_pages(self, pages): - distilled = [] - for page in pages: - distilled.append([ - page.title, - page.status, - page.template - ] - ) - return distilled + return [[page.title, page.status, page.template] for page in pages] def test_generate_context(self): settings = get_settings(filenames={}) @@ -301,8 +270,7 @@ class TestTemplatePagesGenerator(unittest.TestCase): writer = Writer(self.temp_output, settings=settings) generator.generate_output(writer) - output_path = os.path.join( - self.temp_output, 'generated', 'file.html') + output_path = os.path.join(self.temp_output, 'generated', 'file.html') # output file has been generated self.assertTrue(os.path.exists(output_path)) diff --git a/pelican/utils.py b/pelican/utils.py index b1524036..054c1f40 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -2,20 +2,21 @@ from __future__ import unicode_literals, print_function import six +import codecs +import errno +import fnmatch +import locale +import logging import os -import re import pytz +import re import shutil import traceback -import logging -import errno -import locale -import fnmatch -from collections import Hashable -from functools import partial -from codecs import open, BOM_UTF8 +from collections import Hashable +from contextlib import contextmanager from datetime import datetime +from functools import partial from itertools import groupby from jinja2 import Markup from operator import attrgetter @@ -215,20 +216,15 @@ def get_date(string): raise ValueError('{0!r} is not a valid date'.format(string)) -class pelican_open(object): +@contextmanager +def pelican_open(filename): """Open a file and return its content""" - def __init__(self, filename): - self.filename = filename - def __enter__(self): - with open(self.filename, encoding='utf-8') as infile: - content = infile.read() - if content[0] == BOM_UTF8.decode('utf8'): - content = content[1:] - return content - - def __exit__(self, exc_type, exc_value, traceback): - pass + with codecs.open(filename, encoding='utf-8') as infile: + content = infile.read() + if content[0] == codecs.BOM_UTF8.decode('utf8'): + content = content[1:] + yield content def slugify(value, substitutions=()):