remove unittest2 and fix various warnings in py3

This commit is contained in:
Deniz Turgut 2013-04-13 16:36:05 -04:00
commit bc4bd773a0
10 changed files with 76 additions and 61 deletions

View file

@ -7,8 +7,7 @@ before_install:
- sudo apt-get install -qq --no-install-recommends asciidoc - sudo apt-get install -qq --no-install-recommends asciidoc
install: install:
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then ln -s /usr/share/asciidoc/asciidocapi.py ~/virtualenv/python2.7/lib/python2.7/site-packages/; fi - 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 - pip install mock --use-mirrors
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install --use-mirrors unittest2; else pip install --use-mirrors unittest2py3k; fi
- pip install . --use-mirrors - pip install . --use-mirrors
- pip install --use-mirrors Markdown - pip install --use-mirrors Markdown
script: nosetests -s pelican script: python -m unittest discover

View file

@ -22,8 +22,10 @@ try:
asciidoc = True asciidoc = True
except ImportError: except ImportError:
asciidoc = False asciidoc = False
try:
import cgi from html import escape
except ImportError:
from cgi import escape
try: try:
from html.parser import HTMLParser from html.parser import HTMLParser
except ImportError: except ImportError:
@ -122,7 +124,8 @@ class RstReader(Reader):
def _get_publisher(self, source_path): def _get_publisher(self, source_path):
extra_params = {'initial_header_level': '2', extra_params = {'initial_header_level': '2',
'syntax_highlight': 'short'} 'syntax_highlight': 'short',
'input_encoding': 'utf-8'}
pub = docutils.core.Publisher( pub = docutils.core.Publisher(
destination_class=docutils.io.StringOutput) destination_class=docutils.io.StringOutput)
pub.set_components('standalone', 'restructuredtext', 'html') pub.set_components('standalone', 'restructuredtext', 'html')
@ -229,7 +232,7 @@ class HTMLReader(Reader):
self._in_body = False self._in_body = False
self._in_top_level = True self._in_top_level = True
elif self._in_body: elif self._in_body:
self._data_buffer += '</{}>'.format(cgi.escape(tag)) self._data_buffer += '</{}>'.format(escape(tag))
def handle_startendtag(self, tag, attrs): def handle_startendtag(self, tag, attrs):
if tag == 'meta' and self._in_head: if tag == 'meta' and self._in_head:
@ -250,11 +253,11 @@ class HTMLReader(Reader):
self._data_buffer += '&#{};'.format(data) self._data_buffer += '&#{};'.format(data)
def build_tag(self, tag, attrs, close_tag): def build_tag(self, tag, attrs, close_tag):
result = '<{}'.format(cgi.escape(tag)) result = '<{}'.format(escape(tag))
for k, v in attrs: for k, v in attrs:
result += ' ' + cgi.escape(k) result += ' ' + escape(k)
if v is not None: if v is not None:
result += '="{}"'.format(cgi.escape(v)) result += '="{}"'.format(escape(v))
if close_tag: if close_tag:
return result + ' />' return result + ' />'
return result + '>' return result + '>'

View file

@ -3,12 +3,20 @@ from __future__ import unicode_literals, print_function
import six import six
import copy import copy
import imp
import inspect import inspect
import os import os
import locale import locale
import logging 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 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.""" """Loads settings from a file path, returning a dict."""
name, ext = os.path.splitext(os.path.basename(path)) 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) return get_settings_from_module(module, default_settings=default_settings)
@ -172,14 +180,14 @@ def configure_settings(settings):
except locale.Error: except locale.Error:
pass pass
else: 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' in settings):
# If SITEURL has a trailing slash, remove it and provide a warning # If SITEURL has a trailing slash, remove it and provide a warning
siteurl = settings['SITEURL'] siteurl = settings['SITEURL']
if (siteurl.endswith('/')): if (siteurl.endswith('/')):
settings['SITEURL'] = siteurl[:-1] 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, # If SITEURL is defined but FEED_DOMAIN isn't,
# set FEED_DOMAIN to SITEURL # set FEED_DOMAIN to SITEURL
if not 'FEED_DOMAIN' in settings: if not 'FEED_DOMAIN' in settings:
@ -195,24 +203,24 @@ def configure_settings(settings):
if any(settings.get(k) for k in feed_keys): if any(settings.get(k) for k in feed_keys):
if not settings.get('FEED_DOMAIN'): if not settings.get('FEED_DOMAIN'):
logger.warn( logger.warning(
"Since feed URLs should always be absolute, you should specify" "Since feed URLs should always be absolute, you should specify"
" FEED_DOMAIN in your settings. (e.g., 'FEED_DOMAIN = " " FEED_DOMAIN in your settings. (e.g., 'FEED_DOMAIN = "
"http://www.example.com')") "http://www.example.com')")
if not settings.get('SITEURL'): 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') ' be valid')
if not 'TIMEZONE' in settings: if not 'TIMEZONE' in settings:
logger.warn( logger.warning(
'No timezone information specified in the settings. Assuming' 'No timezone information specified in the settings. Assuming'
' your timezone is UTC for feed generation. Check ' ' your timezone is UTC for feed generation. Check '
'http://docs.notmyidea.org/alexis/pelican/settings.html#timezone ' 'http://docs.notmyidea.org/alexis/pelican/settings.html#timezone '
'for more information') 'for more information')
if 'LESS_GENERATOR' in settings: if 'LESS_GENERATOR' in settings:
logger.warn( logger.warning(
'The LESS_GENERATOR setting has been removed in favor ' 'The LESS_GENERATOR setting has been removed in favor '
'of the Webassets plugin') 'of the Webassets plugin')
@ -221,7 +229,7 @@ def configure_settings(settings):
six.string_types): six.string_types):
settings['OUTPUT_SOURCES_EXTENSION'] = ( settings['OUTPUT_SOURCES_EXTENSION'] = (
_DEFAULT_CONFIG['OUTPUT_SOURCES_EXTENSION']) _DEFAULT_CONFIG['OUTPUT_SOURCES_EXTENSION'])
logger.warn( logger.warning(
'Detected misconfiguration with OUTPUT_SOURCES_EXTENSION, ' 'Detected misconfiguration with OUTPUT_SOURCES_EXTENSION, '
'falling back to the default extension ' + 'falling back to the default extension ' +
_DEFAULT_CONFIG['OUTPUT_SOURCES_EXTENSION']) _DEFAULT_CONFIG['OUTPUT_SOURCES_EXTENSION'])
@ -252,7 +260,7 @@ def configure_settings(settings):
'THEME_STATIC_PATHS',) 'THEME_STATIC_PATHS',)
for PATH_KEY in filter(lambda k: k in settings, path_keys): for PATH_KEY in filter(lambda k: k in settings, path_keys):
if isinstance(settings[PATH_KEY], six.string_types): 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" "be a list), falling back to the default"
% PATH_KEY) % PATH_KEY)
settings[PATH_KEY] = _DEFAULT_CONFIG[PATH_KEY] settings[PATH_KEY] = _DEFAULT_CONFIG[PATH_KEY]

View file

@ -9,6 +9,7 @@ import sys
from six import StringIO from six import StringIO
import logging import logging
from logging.handlers import BufferingHandler from logging.handlers import BufferingHandler
import unittest
from functools import wraps from functools import wraps
from contextlib import contextmanager from contextlib import contextmanager
@ -18,11 +19,6 @@ from shutil import rmtree
from pelican.contents import Article from pelican.contents import Article
from pelican.settings import _DEFAULT_CONFIG from pelican.settings import _DEFAULT_CONFIG
try:
import unittest2 as unittest
except ImportError:
import unittest
@contextmanager @contextmanager
def temporary_folder(): def temporary_folder():

View file

@ -91,7 +91,7 @@ class TestArticlesGenerator(unittest.TestCase):
['This is a super article !', 'published', 'yeah', 'article'], ['This is a super article !', 'published', 'yeah', 'article'],
['マックOS X 10.8でパイソンとVirtualenvをインストールと設定', 'published', '指導書', '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): def test_generate_categories(self):
@ -99,7 +99,7 @@ class TestArticlesGenerator(unittest.TestCase):
categories = [cat.name for cat, _ in generator.categories] categories = [cat.name for cat, _ in generator.categories]
categories_expected = ['Default', 'TestCategory', 'Yeah', 'test', categories_expected = ['Default', 'TestCategory', 'Yeah', 'test',
'yeah', '指導書'] 'yeah', '指導書']
self.assertEquals(categories, categories_expected) self.assertEqual(categories, categories_expected)
def test_do_not_use_folder_as_category(self): def test_do_not_use_folder_as_category(self):
@ -115,7 +115,7 @@ class TestArticlesGenerator(unittest.TestCase):
generator.generate_context() generator.generate_context()
categories = [cat.name for cat, _ in generator.categories] 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): def test_direct_templates_save_as_default(self):
@ -172,7 +172,7 @@ class TestArticlesGenerator(unittest.TestCase):
class TestPageGenerator(unittest.TestCase): class TestPageGenerator(unittest.TestCase):
# Note: Every time you want to test for a new field; Make sure the test # 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 # 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 # to match expected
def distill_pages(self, pages): def distill_pages(self, pages):
@ -211,8 +211,8 @@ class TestPageGenerator(unittest.TestCase):
'custom'] 'custom']
] ]
self.assertItemsEqual(pages_expected, pages) self.assertEqual(sorted(pages_expected), sorted(pages))
self.assertItemsEqual(hidden_pages_expected, hidden_pages) self.assertEqual(sorted(hidden_pages_expected), sorted(hidden_pages))
class TestTemplatePagesGenerator(unittest.TestCase): class TestTemplatePagesGenerator(unittest.TestCase):
@ -256,4 +256,4 @@ class TestTemplatePagesGenerator(unittest.TestCase):
# output content is correct # output content is correct
with open(output_path, 'r') as output_file: with open(output_path, 'r') as output_file:
self.assertEquals(output_file.read(), 'foo: bar') self.assertEqual(output_file.read(), 'foo: bar')

View file

@ -36,7 +36,9 @@ class TestWordpressXmlImporter(unittest.TestCase):
self.assertTrue(title.strip()) self.assertTrue(title.strip())
def test_can_toggle_raw_html_code_parsing(self): 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) silent_f2p = mute(True)(fields2pelican)
with temporary_folder() as temp: with temporary_folder() as temp:
@ -76,7 +78,9 @@ class TestWordpressXmlImporter(unittest.TestCase):
self.assertEqual(decode_wp_content(encoded_content, br=False), decoded_content) self.assertEqual(decode_wp_content(encoded_content, br=False), decoded_content)
def test_preserve_verbatim_formatting(self): 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) silent_f2p = mute(True)(fields2pelican)
test_post = filter(lambda p: p[0].startswith("Code in List"), self.posts) test_post = filter(lambda p: p[0].startswith("Code in List"), self.posts)
with temporary_folder() as temp: with temporary_folder() as temp:
@ -89,7 +93,9 @@ class TestWordpressXmlImporter(unittest.TestCase):
self.assertTrue(for_line.rindex('for') < print_line.rindex('print')) self.assertTrue(for_line.rindex('for') < print_line.rindex('print'))
def test_code_in_list(self): 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) silent_f2p = mute(True)(fields2pelican)
test_post = filter(lambda p: p[0].startswith("Code in List"), self.posts) test_post = filter(lambda p: p[0].startswith("Code in List"), self.posts)
with temporary_folder() as temp: with temporary_folder() as temp:

View file

@ -33,7 +33,7 @@ class RstReaderTest(unittest.TestCase):
} }
for key, value in expected.items(): 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): def test_article_with_filename_metadata(self):
content, metadata = readers.read_file( content, metadata = readers.read_file(
@ -45,7 +45,7 @@ class RstReaderTest(unittest.TestCase):
'title': 'Rst with filename metadata', 'title': 'Rst with filename metadata',
} }
for key, value in metadata.items(): for key, value in metadata.items():
self.assertEquals(value, expected[key], key) self.assertEqual(value, expected[key], key)
content, metadata = readers.read_file( content, metadata = readers.read_file(
_path('2012-11-29_rst_w_filename_meta#foo-bar.rst'), _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), 'date': datetime.datetime(2012, 11, 29),
} }
for key, value in metadata.items(): for key, value in metadata.items():
self.assertEquals(value, expected[key], key) self.assertEqual(value, expected[key], key)
content, metadata = readers.read_file( content, metadata = readers.read_file(
_path('2012-11-29_rst_w_filename_meta#foo-bar.rst'), _path('2012-11-29_rst_w_filename_meta#foo-bar.rst'),
@ -77,7 +77,7 @@ class RstReaderTest(unittest.TestCase):
'mymeta': 'foo', 'mymeta': 'foo',
} }
for key, value in metadata.items(): 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): def test_article_metadata_key_lowercase(self):
# Keys of metadata should be lowercase. # Keys of metadata should be lowercase.
@ -86,7 +86,7 @@ class RstReaderTest(unittest.TestCase):
_path('article_with_uppercase_metadata.rst')) _path('article_with_uppercase_metadata.rst'))
self.assertIn('category', metadata, 'Key should be lowercase.') self.assertIn('category', metadata, 'Key should be lowercase.')
self.assertEquals('Yeah', metadata.get('category'), self.assertEqual('Yeah', metadata.get('category'),
'Value keeps case.') 'Value keeps case.')
def test_typogrify(self): def test_typogrify(self):
@ -129,7 +129,7 @@ class MdReaderTest(unittest.TestCase):
'tags': ['foo', 'bar', 'foobar'], 'tags': ['foo', 'bar', 'foobar'],
} }
for key, value in metadata.items(): for key, value in metadata.items():
self.assertEquals(value, expected[key], key) self.assertEqual(value, expected[key], key)
content, metadata = reader.read( content, metadata = reader.read(
_path('article_with_markdown_and_nonascii_summary.md')) _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', 'slug': 'python-virtualenv-on-mac-osx-mountain-lion-10.8',
} }
for key, value in metadata.items(): 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") @unittest.skipUnless(readers.Markdown, "markdown isn't installed")
def test_article_with_file_extensions(self): def test_article_with_file_extensions(self):
@ -203,7 +203,7 @@ class MdReaderTest(unittest.TestCase):
'author': 'Alexis Métaireau', 'author': 'Alexis Métaireau',
} }
for key, value in expected.items(): for key, value in expected.items():
self.assertEquals(value, metadata[key], key) self.assertEqual(value, metadata[key], key)
content, metadata = readers.read_file( content, metadata = readers.read_file(
_path('2012-11-30_md_w_filename_meta#foo-bar.md'), _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), 'date': datetime.datetime(2012, 11, 30),
} }
for key, value in expected.items(): for key, value in expected.items():
self.assertEquals(value, metadata[key], key) self.assertEqual(value, metadata[key], key)
content, metadata = readers.read_file( content, metadata = readers.read_file(
_path('2012-11-30_md_w_filename_meta#foo-bar.md'), _path('2012-11-30_md_w_filename_meta#foo-bar.md'),
@ -233,7 +233,7 @@ class MdReaderTest(unittest.TestCase):
'mymeta': 'foo', 'mymeta': 'foo',
} }
for key, value in expected.items(): for key, value in expected.items():
self.assertEquals(value, metadata[key], key) self.assertEqual(value, metadata[key], key)
class AdReaderTest(unittest.TestCase): class AdReaderTest(unittest.TestCase):
@ -258,7 +258,7 @@ class AdReaderTest(unittest.TestCase):
} }
for key, value in expected.items(): for key, value in expected.items():
self.assertEquals(value, metadata[key], key) self.assertEqual(value, metadata[key], key)
expected = { expected = {
'category': 'Blog', 'category': 'Blog',
@ -269,7 +269,7 @@ class AdReaderTest(unittest.TestCase):
} }
for key, value in expected.items(): 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") @unittest.skipUnless(readers.asciidoc, "asciidoc isn't installed")
def test_article_with_asc_options(self): def test_article_with_asc_options(self):
@ -289,7 +289,7 @@ class HTMLReaderTest(unittest.TestCase):
reader = readers.HTMLReader({}) reader = readers.HTMLReader({})
content, metadata = reader.read(_path('article_with_comments.html')) content, metadata = reader.read(_path('article_with_comments.html'))
self.assertEquals(''' self.assertEqual('''
Body content Body content
<!-- This comment is included (including extra whitespace) --> <!-- This comment is included (including extra whitespace) -->
''', content) ''', content)
@ -302,7 +302,7 @@ class HTMLReaderTest(unittest.TestCase):
} }
for key, value in expected.items(): for key, value in expected.items():
self.assertEquals(value, metadata[key], key) self.assertEqual(value, metadata[key], key)
def test_article_with_metadata(self): def test_article_with_metadata(self):
reader = readers.HTMLReader({}) reader = readers.HTMLReader({})
@ -318,14 +318,14 @@ class HTMLReaderTest(unittest.TestCase):
} }
for key, value in expected.items(): 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): def test_article_with_null_attributes(self):
reader = readers.HTMLReader({}) reader = readers.HTMLReader({})
content, metadata = reader.read( content, metadata = reader.read(
_path('article_with_null_attributes.html')) _path('article_with_null_attributes.html'))
self.assertEquals(''' self.assertEqual('''
Ensure that empty attributes are copied properly. Ensure that empty attributes are copied properly.
<input name="test" disabled style="" /> <input name="test" disabled style="" />
''', content) ''', content)
@ -336,5 +336,5 @@ class HTMLReaderTest(unittest.TestCase):
content, metadata = reader.read( content, metadata = reader.read(
_path('article_with_uppercase_metadata.html')) _path('article_with_uppercase_metadata.html'))
self.assertIn('category', metadata, 'Key should be lowercase.') self.assertIn('category', metadata, 'Key should be lowercase.')
self.assertEquals('Yeah', metadata.get('category'), self.assertEqual('Yeah', metadata.get('category'),
'Value keeps cases.') 'Value keeps cases.')

View file

@ -22,7 +22,7 @@ class TestUtils(LoggedTestCase):
def test_deprecated_attribute(self): def test_deprecated_attribute(self):
value = self._old_attribute value = self._old_attribute
self.assertEquals(value, self._new_attribute) self.assertEqual(value, self._new_attribute)
self.assertLogCountEqual( self.assertLogCountEqual(
count=1, count=1,
msg=('_old_attribute has been deprecated since 3.1.0 and will be ' 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} '2012-11-22 22:11:10': date_hour_sec}
for value, expected in dates.items(): 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 ones
invalid_dates = ('2010-110-12', 'yay') invalid_dates = ('2010-110-12', 'yay')
@ -67,7 +67,7 @@ class TestUtils(LoggedTestCase):
'da-fan-yuan-fa-4hao-ji-18ri-ye-qi-dong-he'),) 'da-fan-yuan-fa-4hao-ji-18ri-ye-qi-dong-he'),)
for value, expected in samples: for value, expected in samples:
self.assertEquals(utils.slugify(value), expected) self.assertEqual(utils.slugify(value), expected)
def test_get_relative_path(self): def test_get_relative_path(self):
@ -81,7 +81,7 @@ class TestUtils(LoggedTestCase):
('/test.html', os.curdir),) ('/test.html', os.curdir),)
for value, expected in samples: 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): def test_process_translations(self):
# create a bunch of articles # create a bunch of articles
@ -132,15 +132,15 @@ class TestUtils(LoggedTestCase):
dirname = os.path.join(os.path.dirname(__file__), 'content') dirname = os.path.join(os.path.dirname(__file__), 'content')
path = os.path.join(dirname, 'article_with_metadata.rst') path = os.path.join(dirname, 'article_with_metadata.rst')
changed = utils.files_changed(dirname, 'rst') changed = utils.files_changed(dirname, 'rst')
self.assertEquals(changed, True) self.assertEqual(changed, True)
changed = utils.files_changed(dirname, 'rst') changed = utils.files_changed(dirname, 'rst')
self.assertEquals(changed, False) self.assertEqual(changed, False)
t = time.time() t = time.time()
os.utime(path, (t, t)) os.utime(path, (t, t))
changed = utils.files_changed(dirname, 'rst') changed = utils.files_changed(dirname, 'rst')
self.assertEquals(changed, True) self.assertEqual(changed, True)
self.assertAlmostEqual(utils.LAST_MTIME, t, delta=1) self.assertAlmostEqual(utils.LAST_MTIME, t, delta=1)
empty_path = os.path.join(os.path.dirname(__file__), 'empty') empty_path = os.path.join(os.path.dirname(__file__), 'empty')

View file

@ -102,7 +102,9 @@ def wp2fields(xml):
'"BeautifulSoup4" and "lxml" required to import Wordpress XML files.') '"BeautifulSoup4" and "lxml" required to import Wordpress XML files.')
sys.exit(error) 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") soup = BeautifulSoup(xmlfile, "xml")
items = soup.rss.channel.findAll('item') items = soup.rss.channel.findAll('item')

View file

@ -192,7 +192,8 @@ class pelican_open(object):
self.filename = filename self.filename = filename
def __enter__(self): 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'): if content[0] == BOM_UTF8.decode('utf8'):
content = content[1:] content = content[1:]
return content return content