From a69f4294bc3ab27c4a54d6512962a41f26d4df7b Mon Sep 17 00:00:00 2001 From: derwinlu Date: Mon, 19 Oct 2015 16:22:43 +0200 Subject: [PATCH 1/2] Add ability to toggle log filter To test the output of warning functions it can be useful to disable the log filter, producing the expected output instead of the limited output that is used during normal operation. --- pelican/log.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pelican/log.py b/pelican/log.py index 0f4b795b..12eb7371 100644 --- a/pelican/log.py +++ b/pelican/log.py @@ -167,6 +167,12 @@ class LimitLogger(SafeLogger): def __init__(self, *args, **kwargs): super(LimitLogger, self).__init__(*args, **kwargs) + self.enable_filter() + + def disable_filter(self): + self.removeFilter(LimitLogger.limit_filter) + + def enable_filter(self): self.addFilter(LimitLogger.limit_filter) logging.setLoggerClass(LimitLogger) From 2cb2bf05dfca50afbd3400a344a4aa23f9474dfa Mon Sep 17 00:00:00 2001 From: derwinlu Date: Mon, 19 Oct 2015 16:38:07 +0200 Subject: [PATCH 2/2] replace get_summary with _get_summary When memoizing summary a dummy get_summary function was introduced to properly work. This has multiple problems: * The siteurl argument is actually not used in the function, it is only used so it properly memoizes. * It differs from how content is accessed and memoized. This commit brings summary inline with how content is accessed and processed. It also removes the old get_summary function with the unused siteurl argument. Additionally _get_summary is marked as deprecated and calls .summary instead while also issueing a warning. --- pelican/contents.py | 24 +++++++++++++----------- pelican/tests/test_contents.py | 24 +++++++++++++++++++++++- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/pelican/contents.py b/pelican/contents.py index 4d313ab8..4397d424 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -273,6 +273,9 @@ class Content(object): return hrefs.sub(replacer, content) + def get_siteurl(self): + return self._context.get('localsiteurl', '') + @memoized def get_content(self, siteurl): if hasattr(self, '_get_content'): @@ -281,22 +284,19 @@ class Content(object): content = self._content return self._update_content(content, siteurl) - def get_siteurl(self): - return self._context.get('localsiteurl', '') - @property def content(self): return self.get_content(self.get_siteurl()) - def _get_summary(self): + @memoized + def get_summary(self, siteurl): """Returns the summary of an article. This is based on the summary metadata if set, otherwise truncate the content. """ if hasattr(self, '_summary'): - return self._update_content(self._summary, - self.get_siteurl()) + return self._update_content(self._summary, siteurl) if self.settings['SUMMARY_MAX_LENGTH'] is None: return self.content @@ -304,15 +304,17 @@ class Content(object): return truncate_html_words(self.content, self.settings['SUMMARY_MAX_LENGTH']) - @memoized - def get_summary(self, siteurl): - """uses siteurl to be memoizable""" - return self._get_summary() - @property def summary(self): return self.get_summary(self.get_siteurl()) + def _get_summary(self): + """deprecated function to access summary""" + + logger.warn('_get_summary() has been deprecated since 3.6.4. ' + 'Use the summary decorator instead') + return self.summary + @summary.setter def summary(self, value): """Dummy function""" diff --git a/pelican/tests/test_contents.py b/pelican/tests/test_contents.py index 59cff844..1bceeb64 100644 --- a/pelican/tests/test_contents.py +++ b/pelican/tests/test_contents.py @@ -23,7 +23,7 @@ TEST_CONTENT = str(generate_lorem_ipsum(n=1)) TEST_SUMMARY = generate_lorem_ipsum(n=1, html=False) -class TestPage(unittest.TestCase): +class TestPage(LoggedTestCase): def setUp(self): super(TestPage, self).setUp() @@ -41,9 +41,19 @@ class TestPage(unittest.TestCase): }, 'source_path': '/path/to/file/foo.ext' } + self._disable_limit_filter() def tearDown(self): locale.setlocale(locale.LC_ALL, self.old_locale) + self._enable_limit_filter() + + def _disable_limit_filter(self): + from pelican.contents import logger + logger.disable_filter() + + def _enable_limit_filter(self): + from pelican.contents import logger + logger.enable_filter() def test_use_args(self): # Creating a page with arguments passed to the constructor should use @@ -87,6 +97,18 @@ class TestPage(unittest.TestCase): page = Page(**page_kwargs) self.assertEqual(page.summary, '') + def test_summary_get_summary_warning(self): + """calling ._get_summary() should issue a warning""" + page_kwargs = self._copy_page_kwargs() + page = Page(**page_kwargs) + self.assertEqual(page.summary, TEST_SUMMARY) + self.assertEqual(page._get_summary(), TEST_SUMMARY) + self.assertLogCountEqual( + count=1, + msg="_get_summary\(\) has been deprecated since 3\.6\.4\. " + "Use the summary decorator instead", + level=logging.WARNING) + def test_slug(self): page_kwargs = self._copy_page_kwargs() settings = get_settings()