forked from github/pelican
Merge pull request #842 from avaris/remove-unittest2
remove unittest2 and fix various warnings in py3
This commit is contained in:
commit
87735b5215
10 changed files with 75 additions and 66 deletions
|
|
@ -7,8 +7,7 @@ before_install:
|
|||
- sudo apt-get install -qq --no-install-recommends asciidoc
|
||||
install:
|
||||
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then ln -s /usr/share/asciidoc/asciidocapi.py ~/virtualenv/python2.7/lib/python2.7/site-packages/; fi
|
||||
- pip install nose mock --use-mirrors
|
||||
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install --use-mirrors unittest2; else pip install --use-mirrors unittest2py3k; fi
|
||||
- pip install mock --use-mirrors
|
||||
- pip install . --use-mirrors
|
||||
- pip install --use-mirrors Markdown
|
||||
script: nosetests -s pelican
|
||||
script: python -m unittest discover
|
||||
|
|
|
|||
|
|
@ -22,8 +22,10 @@ try:
|
|||
asciidoc = True
|
||||
except ImportError:
|
||||
asciidoc = False
|
||||
|
||||
import cgi
|
||||
try:
|
||||
from html import escape
|
||||
except ImportError:
|
||||
from cgi import escape
|
||||
try:
|
||||
from html.parser import HTMLParser
|
||||
except ImportError:
|
||||
|
|
@ -122,7 +124,8 @@ class RstReader(Reader):
|
|||
|
||||
def _get_publisher(self, source_path):
|
||||
extra_params = {'initial_header_level': '2',
|
||||
'syntax_highlight': 'short'}
|
||||
'syntax_highlight': 'short',
|
||||
'input_encoding': 'utf-8'}
|
||||
pub = docutils.core.Publisher(
|
||||
destination_class=docutils.io.StringOutput)
|
||||
pub.set_components('standalone', 'restructuredtext', 'html')
|
||||
|
|
@ -229,7 +232,7 @@ class HTMLReader(Reader):
|
|||
self._in_body = False
|
||||
self._in_top_level = True
|
||||
elif self._in_body:
|
||||
self._data_buffer += '</{}>'.format(cgi.escape(tag))
|
||||
self._data_buffer += '</{}>'.format(escape(tag))
|
||||
|
||||
def handle_startendtag(self, tag, attrs):
|
||||
if tag == 'meta' and self._in_head:
|
||||
|
|
@ -250,11 +253,11 @@ class HTMLReader(Reader):
|
|||
self._data_buffer += '&#{};'.format(data)
|
||||
|
||||
def build_tag(self, tag, attrs, close_tag):
|
||||
result = '<{}'.format(cgi.escape(tag))
|
||||
result = '<{}'.format(escape(tag))
|
||||
for k, v in attrs:
|
||||
result += ' ' + cgi.escape(k)
|
||||
result += ' ' + escape(k)
|
||||
if v is not None:
|
||||
result += '="{}"'.format(cgi.escape(v))
|
||||
result += '="{}"'.format(escape(v))
|
||||
if close_tag:
|
||||
return result + ' />'
|
||||
return result + '>'
|
||||
|
|
|
|||
|
|
@ -3,12 +3,20 @@ from __future__ import unicode_literals, print_function
|
|||
import six
|
||||
|
||||
import copy
|
||||
import imp
|
||||
import inspect
|
||||
import os
|
||||
import locale
|
||||
import logging
|
||||
|
||||
try:
|
||||
# SourceFileLoader is the recommended way in 3.3+
|
||||
from importlib.machinery import SourceFileLoader
|
||||
load_source = lambda name, path: SourceFileLoader(name, path).load_module()
|
||||
except ImportError:
|
||||
# but it does not exist in 3.2-, so fall back to imp
|
||||
import imp
|
||||
load_source = imp.load_source
|
||||
|
||||
from os.path import isabs
|
||||
|
||||
|
||||
|
|
@ -130,7 +138,7 @@ def get_settings_from_file(path, default_settings=_DEFAULT_CONFIG):
|
|||
"""Loads settings from a file path, returning a dict."""
|
||||
|
||||
name, ext = os.path.splitext(os.path.basename(path))
|
||||
module = imp.load_source(name, path)
|
||||
module = load_source(name, path)
|
||||
return get_settings_from_module(module, default_settings=default_settings)
|
||||
|
||||
|
||||
|
|
@ -172,14 +180,14 @@ def configure_settings(settings):
|
|||
except locale.Error:
|
||||
pass
|
||||
else:
|
||||
logger.warn("LOCALE option doesn't contain a correct value")
|
||||
logger.warning("LOCALE option doesn't contain a correct value")
|
||||
|
||||
if ('SITEURL' in settings):
|
||||
# If SITEURL has a trailing slash, remove it and provide a warning
|
||||
siteurl = settings['SITEURL']
|
||||
if (siteurl.endswith('/')):
|
||||
settings['SITEURL'] = siteurl[:-1]
|
||||
logger.warn("Removed extraneous trailing slash from SITEURL.")
|
||||
logger.warning("Removed extraneous trailing slash from SITEURL.")
|
||||
# If SITEURL is defined but FEED_DOMAIN isn't,
|
||||
# set FEED_DOMAIN to SITEURL
|
||||
if not 'FEED_DOMAIN' in settings:
|
||||
|
|
@ -194,25 +202,19 @@ def configure_settings(settings):
|
|||
]
|
||||
|
||||
if any(settings.get(k) for k in feed_keys):
|
||||
if not settings.get('FEED_DOMAIN'):
|
||||
logger.warn(
|
||||
"Since feed URLs should always be absolute, you should specify"
|
||||
" FEED_DOMAIN in your settings. (e.g., 'FEED_DOMAIN = "
|
||||
"http://www.example.com')")
|
||||
|
||||
if not settings.get('SITEURL'):
|
||||
logger.warn('Feeds generated without SITEURL set properly may not'
|
||||
logger.warning('Feeds generated without SITEURL set properly may not'
|
||||
' be valid')
|
||||
|
||||
if not 'TIMEZONE' in settings:
|
||||
logger.warn(
|
||||
logger.warning(
|
||||
'No timezone information specified in the settings. Assuming'
|
||||
' your timezone is UTC for feed generation. Check '
|
||||
'http://docs.notmyidea.org/alexis/pelican/settings.html#timezone '
|
||||
'for more information')
|
||||
|
||||
if 'LESS_GENERATOR' in settings:
|
||||
logger.warn(
|
||||
logger.warning(
|
||||
'The LESS_GENERATOR setting has been removed in favor '
|
||||
'of the Webassets plugin')
|
||||
|
||||
|
|
@ -221,7 +223,7 @@ def configure_settings(settings):
|
|||
six.string_types):
|
||||
settings['OUTPUT_SOURCES_EXTENSION'] = (
|
||||
_DEFAULT_CONFIG['OUTPUT_SOURCES_EXTENSION'])
|
||||
logger.warn(
|
||||
logger.warning(
|
||||
'Detected misconfiguration with OUTPUT_SOURCES_EXTENSION, '
|
||||
'falling back to the default extension ' +
|
||||
_DEFAULT_CONFIG['OUTPUT_SOURCES_EXTENSION'])
|
||||
|
|
@ -252,7 +254,7 @@ def configure_settings(settings):
|
|||
'THEME_STATIC_PATHS',)
|
||||
for PATH_KEY in filter(lambda k: k in settings, path_keys):
|
||||
if isinstance(settings[PATH_KEY], six.string_types):
|
||||
logger.warn("Detected misconfiguration with %s setting (must "
|
||||
logger.warning("Detected misconfiguration with %s setting (must "
|
||||
"be a list), falling back to the default"
|
||||
% PATH_KEY)
|
||||
settings[PATH_KEY] = _DEFAULT_CONFIG[PATH_KEY]
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import sys
|
|||
from six import StringIO
|
||||
import logging
|
||||
from logging.handlers import BufferingHandler
|
||||
import unittest
|
||||
|
||||
from functools import wraps
|
||||
from contextlib import contextmanager
|
||||
|
|
@ -18,11 +19,6 @@ from shutil import rmtree
|
|||
from pelican.contents import Article
|
||||
from pelican.settings import _DEFAULT_CONFIG
|
||||
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
import unittest
|
||||
|
||||
|
||||
@contextmanager
|
||||
def temporary_folder():
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
['This is a super article !', 'published', 'yeah', 'article'],
|
||||
['マックOS X 10.8でパイソンとVirtualenvをインストールと設定', 'published', '指導書', 'article']
|
||||
]
|
||||
self.assertItemsEqual(articles_expected, articles)
|
||||
self.assertEqual(sorted(articles_expected), sorted(articles))
|
||||
|
||||
def test_generate_categories(self):
|
||||
|
||||
|
|
@ -99,7 +99,7 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
categories = [cat.name for cat, _ in generator.categories]
|
||||
categories_expected = ['Default', 'TestCategory', 'Yeah', 'test',
|
||||
'yeah', '指導書']
|
||||
self.assertEquals(categories, categories_expected)
|
||||
self.assertEqual(categories, categories_expected)
|
||||
|
||||
def test_do_not_use_folder_as_category(self):
|
||||
|
||||
|
|
@ -115,7 +115,7 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
generator.generate_context()
|
||||
|
||||
categories = [cat.name for cat, _ in generator.categories]
|
||||
self.assertEquals(categories, ['Default', 'Yeah', 'test', 'yeah', '指導書'])
|
||||
self.assertEqual(categories, ['Default', 'Yeah', 'test', 'yeah', '指導書'])
|
||||
|
||||
def test_direct_templates_save_as_default(self):
|
||||
|
||||
|
|
@ -172,7 +172,7 @@ class TestArticlesGenerator(unittest.TestCase):
|
|||
class TestPageGenerator(unittest.TestCase):
|
||||
# Note: Every time you want to test for a new field; Make sure the test
|
||||
# pages in "TestPages" have all the fields Add it to distilled in
|
||||
# distill_pages Then update the assertItemsEqual in test_generate_context
|
||||
# distill_pages Then update the assertEqual in test_generate_context
|
||||
# to match expected
|
||||
|
||||
def distill_pages(self, pages):
|
||||
|
|
@ -211,8 +211,8 @@ class TestPageGenerator(unittest.TestCase):
|
|||
'custom']
|
||||
]
|
||||
|
||||
self.assertItemsEqual(pages_expected, pages)
|
||||
self.assertItemsEqual(hidden_pages_expected, hidden_pages)
|
||||
self.assertEqual(sorted(pages_expected), sorted(pages))
|
||||
self.assertEqual(sorted(hidden_pages_expected), sorted(hidden_pages))
|
||||
|
||||
|
||||
class TestTemplatePagesGenerator(unittest.TestCase):
|
||||
|
|
@ -256,4 +256,4 @@ class TestTemplatePagesGenerator(unittest.TestCase):
|
|||
|
||||
# output content is correct
|
||||
with open(output_path, 'r') as output_file:
|
||||
self.assertEquals(output_file.read(), 'foo: bar')
|
||||
self.assertEqual(output_file.read(), 'foo: bar')
|
||||
|
|
|
|||
|
|
@ -36,7 +36,9 @@ class TestWordpressXmlImporter(unittest.TestCase):
|
|||
self.assertTrue(title.strip())
|
||||
|
||||
def test_can_toggle_raw_html_code_parsing(self):
|
||||
r = lambda f: open(f).read()
|
||||
def r(f):
|
||||
with open(f) as infile:
|
||||
return infile.read()
|
||||
silent_f2p = mute(True)(fields2pelican)
|
||||
|
||||
with temporary_folder() as temp:
|
||||
|
|
@ -76,7 +78,9 @@ class TestWordpressXmlImporter(unittest.TestCase):
|
|||
self.assertEqual(decode_wp_content(encoded_content, br=False), decoded_content)
|
||||
|
||||
def test_preserve_verbatim_formatting(self):
|
||||
r = lambda f: open(f).read()
|
||||
def r(f):
|
||||
with open(f) as infile:
|
||||
return infile.read()
|
||||
silent_f2p = mute(True)(fields2pelican)
|
||||
test_post = filter(lambda p: p[0].startswith("Code in List"), self.posts)
|
||||
with temporary_folder() as temp:
|
||||
|
|
@ -89,7 +93,9 @@ class TestWordpressXmlImporter(unittest.TestCase):
|
|||
self.assertTrue(for_line.rindex('for') < print_line.rindex('print'))
|
||||
|
||||
def test_code_in_list(self):
|
||||
r = lambda f: open(f).read()
|
||||
def r(f):
|
||||
with open(f) as infile:
|
||||
return infile.read()
|
||||
silent_f2p = mute(True)(fields2pelican)
|
||||
test_post = filter(lambda p: p[0].startswith("Code in List"), self.posts)
|
||||
with temporary_folder() as temp:
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class RstReaderTest(unittest.TestCase):
|
|||
}
|
||||
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
def test_article_with_filename_metadata(self):
|
||||
content, metadata = readers.read_file(
|
||||
|
|
@ -45,7 +45,7 @@ class RstReaderTest(unittest.TestCase):
|
|||
'title': 'Rst with filename metadata',
|
||||
}
|
||||
for key, value in metadata.items():
|
||||
self.assertEquals(value, expected[key], key)
|
||||
self.assertEqual(value, expected[key], key)
|
||||
|
||||
content, metadata = readers.read_file(
|
||||
_path('2012-11-29_rst_w_filename_meta#foo-bar.rst'),
|
||||
|
|
@ -59,7 +59,7 @@ class RstReaderTest(unittest.TestCase):
|
|||
'date': datetime.datetime(2012, 11, 29),
|
||||
}
|
||||
for key, value in metadata.items():
|
||||
self.assertEquals(value, expected[key], key)
|
||||
self.assertEqual(value, expected[key], key)
|
||||
|
||||
content, metadata = readers.read_file(
|
||||
_path('2012-11-29_rst_w_filename_meta#foo-bar.rst'),
|
||||
|
|
@ -77,7 +77,7 @@ class RstReaderTest(unittest.TestCase):
|
|||
'mymeta': 'foo',
|
||||
}
|
||||
for key, value in metadata.items():
|
||||
self.assertEquals(value, expected[key], key)
|
||||
self.assertEqual(value, expected[key], key)
|
||||
|
||||
def test_article_metadata_key_lowercase(self):
|
||||
# Keys of metadata should be lowercase.
|
||||
|
|
@ -86,7 +86,7 @@ class RstReaderTest(unittest.TestCase):
|
|||
_path('article_with_uppercase_metadata.rst'))
|
||||
|
||||
self.assertIn('category', metadata, 'Key should be lowercase.')
|
||||
self.assertEquals('Yeah', metadata.get('category'),
|
||||
self.assertEqual('Yeah', metadata.get('category'),
|
||||
'Value keeps case.')
|
||||
|
||||
def test_typogrify(self):
|
||||
|
|
@ -129,7 +129,7 @@ class MdReaderTest(unittest.TestCase):
|
|||
'tags': ['foo', 'bar', 'foobar'],
|
||||
}
|
||||
for key, value in metadata.items():
|
||||
self.assertEquals(value, expected[key], key)
|
||||
self.assertEqual(value, expected[key], key)
|
||||
|
||||
content, metadata = reader.read(
|
||||
_path('article_with_markdown_and_nonascii_summary.md'))
|
||||
|
|
@ -142,7 +142,7 @@ class MdReaderTest(unittest.TestCase):
|
|||
'slug': 'python-virtualenv-on-mac-osx-mountain-lion-10.8',
|
||||
}
|
||||
for key, value in metadata.items():
|
||||
self.assertEquals(value, expected[key], key)
|
||||
self.assertEqual(value, expected[key], key)
|
||||
|
||||
@unittest.skipUnless(readers.Markdown, "markdown isn't installed")
|
||||
def test_article_with_file_extensions(self):
|
||||
|
|
@ -203,7 +203,7 @@ class MdReaderTest(unittest.TestCase):
|
|||
'author': 'Alexis Métaireau',
|
||||
}
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
content, metadata = readers.read_file(
|
||||
_path('2012-11-30_md_w_filename_meta#foo-bar.md'),
|
||||
|
|
@ -216,7 +216,7 @@ class MdReaderTest(unittest.TestCase):
|
|||
'date': datetime.datetime(2012, 11, 30),
|
||||
}
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
content, metadata = readers.read_file(
|
||||
_path('2012-11-30_md_w_filename_meta#foo-bar.md'),
|
||||
|
|
@ -233,7 +233,7 @@ class MdReaderTest(unittest.TestCase):
|
|||
'mymeta': 'foo',
|
||||
}
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
|
||||
class AdReaderTest(unittest.TestCase):
|
||||
|
|
@ -258,7 +258,7 @@ class AdReaderTest(unittest.TestCase):
|
|||
}
|
||||
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
expected = {
|
||||
'category': 'Blog',
|
||||
|
|
@ -269,7 +269,7 @@ class AdReaderTest(unittest.TestCase):
|
|||
}
|
||||
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
@unittest.skipUnless(readers.asciidoc, "asciidoc isn't installed")
|
||||
def test_article_with_asc_options(self):
|
||||
|
|
@ -289,7 +289,7 @@ class HTMLReaderTest(unittest.TestCase):
|
|||
reader = readers.HTMLReader({})
|
||||
content, metadata = reader.read(_path('article_with_comments.html'))
|
||||
|
||||
self.assertEquals('''
|
||||
self.assertEqual('''
|
||||
Body content
|
||||
<!-- This comment is included (including extra whitespace) -->
|
||||
''', content)
|
||||
|
|
@ -302,7 +302,7 @@ class HTMLReaderTest(unittest.TestCase):
|
|||
}
|
||||
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
def test_article_with_metadata(self):
|
||||
reader = readers.HTMLReader({})
|
||||
|
|
@ -318,14 +318,14 @@ class HTMLReaderTest(unittest.TestCase):
|
|||
}
|
||||
|
||||
for key, value in expected.items():
|
||||
self.assertEquals(value, metadata[key], key)
|
||||
self.assertEqual(value, metadata[key], key)
|
||||
|
||||
def test_article_with_null_attributes(self):
|
||||
reader = readers.HTMLReader({})
|
||||
content, metadata = reader.read(
|
||||
_path('article_with_null_attributes.html'))
|
||||
|
||||
self.assertEquals('''
|
||||
self.assertEqual('''
|
||||
Ensure that empty attributes are copied properly.
|
||||
<input name="test" disabled style="" />
|
||||
''', content)
|
||||
|
|
@ -336,5 +336,5 @@ class HTMLReaderTest(unittest.TestCase):
|
|||
content, metadata = reader.read(
|
||||
_path('article_with_uppercase_metadata.html'))
|
||||
self.assertIn('category', metadata, 'Key should be lowercase.')
|
||||
self.assertEquals('Yeah', metadata.get('category'),
|
||||
self.assertEqual('Yeah', metadata.get('category'),
|
||||
'Value keeps cases.')
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ class TestUtils(LoggedTestCase):
|
|||
|
||||
def test_deprecated_attribute(self):
|
||||
value = self._old_attribute
|
||||
self.assertEquals(value, self._new_attribute)
|
||||
self.assertEqual(value, self._new_attribute)
|
||||
self.assertLogCountEqual(
|
||||
count=1,
|
||||
msg=('_old_attribute has been deprecated since 3.1.0 and will be '
|
||||
|
|
@ -48,7 +48,7 @@ class TestUtils(LoggedTestCase):
|
|||
'2012-11-22 22:11:10': date_hour_sec}
|
||||
|
||||
for value, expected in dates.items():
|
||||
self.assertEquals(utils.get_date(value), expected, value)
|
||||
self.assertEqual(utils.get_date(value), expected, value)
|
||||
|
||||
# invalid ones
|
||||
invalid_dates = ('2010-110-12', 'yay')
|
||||
|
|
@ -67,7 +67,7 @@ class TestUtils(LoggedTestCase):
|
|||
'da-fan-yuan-fa-4hao-ji-18ri-ye-qi-dong-he'),)
|
||||
|
||||
for value, expected in samples:
|
||||
self.assertEquals(utils.slugify(value), expected)
|
||||
self.assertEqual(utils.slugify(value), expected)
|
||||
|
||||
def test_get_relative_path(self):
|
||||
|
||||
|
|
@ -81,7 +81,7 @@ class TestUtils(LoggedTestCase):
|
|||
('/test.html', os.curdir),)
|
||||
|
||||
for value, expected in samples:
|
||||
self.assertEquals(utils.get_relative_path(value), expected)
|
||||
self.assertEqual(utils.get_relative_path(value), expected)
|
||||
|
||||
def test_process_translations(self):
|
||||
# create a bunch of articles
|
||||
|
|
@ -132,15 +132,15 @@ class TestUtils(LoggedTestCase):
|
|||
dirname = os.path.join(os.path.dirname(__file__), 'content')
|
||||
path = os.path.join(dirname, 'article_with_metadata.rst')
|
||||
changed = utils.files_changed(dirname, 'rst')
|
||||
self.assertEquals(changed, True)
|
||||
self.assertEqual(changed, True)
|
||||
|
||||
changed = utils.files_changed(dirname, 'rst')
|
||||
self.assertEquals(changed, False)
|
||||
self.assertEqual(changed, False)
|
||||
|
||||
t = time.time()
|
||||
os.utime(path, (t, t))
|
||||
changed = utils.files_changed(dirname, 'rst')
|
||||
self.assertEquals(changed, True)
|
||||
self.assertEqual(changed, True)
|
||||
self.assertAlmostEqual(utils.LAST_MTIME, t, delta=1)
|
||||
|
||||
empty_path = os.path.join(os.path.dirname(__file__), 'empty')
|
||||
|
|
|
|||
|
|
@ -106,7 +106,9 @@ def wp2fields(xml):
|
|||
'"BeautifulSoup4" and "lxml" required to import Wordpress XML files.')
|
||||
sys.exit(error)
|
||||
|
||||
xmlfile = open(xml, encoding='utf-8').read()
|
||||
|
||||
with open(xml, encoding='utf-8') as infile:
|
||||
xmlfile = infile.read()
|
||||
soup = BeautifulSoup(xmlfile, "xml")
|
||||
items = soup.rss.channel.findAll('item')
|
||||
|
||||
|
|
|
|||
|
|
@ -192,7 +192,8 @@ class pelican_open(object):
|
|||
self.filename = filename
|
||||
|
||||
def __enter__(self):
|
||||
content = open(self.filename, encoding='utf-8').read()
|
||||
with open(self.filename, encoding='utf-8') as infile:
|
||||
content = infile.read()
|
||||
if content[0] == BOM_UTF8.decode('utf8'):
|
||||
content = content[1:]
|
||||
return content
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue