From 577a3d116efeb5f54bd163deb5b740769ee4f2ae Mon Sep 17 00:00:00 2001 From: Simon Conseil Date: Sat, 15 Jun 2013 23:00:08 +0200 Subject: [PATCH 1/3] Replace get_populated_generator with setUpClass --- pelican/tests/test_generators.py | 39 ++++++++++++-------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/pelican/tests/test_generators.py b/pelican/tests/test_generators.py index 2b9028c3..ed337ecc 100644 --- a/pelican/tests/test_generators.py +++ b/pelican/tests/test_generators.py @@ -38,25 +38,17 @@ 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 + cls.generator = ArticlesGenerator( + context=settings.copy(), settings=settings, + path=CONTENT_DIR, theme=settings['THEME'], + output_path=None, markup=settings['MARKUP']) + cls.generator.generate_context() def distill_articles(self, articles): distilled = [] @@ -91,8 +83,7 @@ class TestArticlesGenerator(unittest.TestCase): def test_generate_context(self): - generator = self.get_populated_generator() - articles = self.distill_articles(generator.articles) + articles = self.distill_articles(self.generator.articles) articles_expected = [ ['Article title', 'published', 'Default', 'article'], ['Article with markdown and summary metadata single', 'published', @@ -120,19 +111,18 @@ class TestArticlesGenerator(unittest.TestCase): 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)) @@ -209,8 +199,7 @@ 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) + articles = self.distill_articles(self.generator.articles) custom_template = ['Article with template', 'published', 'Default', 'custom'] standard_template = ['This is a super article !', 'published', 'Yeah', From 4ffa34544e2ee064aa350fb02a431f60ac0b108a Mon Sep 17 00:00:00 2001 From: Simon Conseil Date: Sun, 16 Jun 2013 00:14:55 +0200 Subject: [PATCH 2/3] More refactoring for test_generators - list comprehensions for distill_articles/pages - distill articles only once - pep8 --- pelican/tests/test_generators.py | 53 ++++++++++---------------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/pelican/tests/test_generators.py b/pelican/tests/test_generators.py index ed337ecc..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__) @@ -49,18 +48,8 @@ class TestArticlesGenerator(unittest.TestCase): path=CONTENT_DIR, theme=settings['THEME'], output_path=None, markup=settings['MARKUP']) cls.generator.generate_context() - - def distill_articles(self, articles): - distilled = [] - for page in articles: - distilled.append([ - page.title, - page.status, - page.category.name, - page.template - ] - ) - return distilled + 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() @@ -83,7 +72,6 @@ class TestArticlesGenerator(unittest.TestCase): def test_generate_context(self): - articles = self.distill_articles(self.generator.articles) articles_expected = [ ['Article title', 'published', 'Default', 'article'], ['Article with markdown and summary metadata single', 'published', @@ -107,7 +95,7 @@ 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): @@ -129,15 +117,15 @@ class TestArticlesGenerator(unittest.TestCase): 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 @@ -164,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): @@ -179,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): @@ -199,13 +188,12 @@ class TestArticlesGenerator(unittest.TestCase): """ Custom template articles get the field but standard/unset are None """ - articles = self.distill_articles(self.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): @@ -215,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={}) @@ -290,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)) From 41970cb2c65ec5fe51beb9c649ea542c24702f2e Mon Sep 17 00:00:00 2001 From: Simon Conseil Date: Tue, 21 May 2013 17:16:55 +0200 Subject: [PATCH 3/3] Refactor pelican_open using contextmanager --- pelican/utils.py | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) 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=()):