Hello community,

here is the log from the commit of package python-pelican for openSUSE:Factory 
checked in at 2018-12-03 10:10:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pelican (Old)
 and      /work/SRC/openSUSE:Factory/.python-pelican.new.19453 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pelican"

Mon Dec  3 10:10:55 2018 rev:3 rq:653204 version:4.0.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pelican/python-pelican.changes    
2018-11-15 12:41:44.026162313 +0100
+++ /work/SRC/openSUSE:Factory/.python-pelican.new.19453/python-pelican.changes 
2018-12-03 10:11:23.475653483 +0100
@@ -1,0 +2,9 @@
+Fri Nov 30 21:04:35 UTC 2018 - BenoĆ®t Monin <[email protected]>
+
+- update to version 4.0.1:
+  * Refactor pelican.server logging
+  * Fix bug in which all static files were processed as "draft"
+  * Bug fixes for Invoke/Makefile automation, Importer, and other
+    miscellanea
+
+-------------------------------------------------------------------

Old:
----
  pelican-4.0.0.tar.gz

New:
----
  pelican-4.0.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pelican.spec ++++++
--- /var/tmp/diff_new_pack.jD52GR/_old  2018-12-03 10:11:29.655647763 +0100
+++ /var/tmp/diff_new_pack.jD52GR/_new  2018-12-03 10:11:29.659647760 +0100
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-pelican
-Version:        4.0.0
+Version:        4.0.1
 Release:        0
 Summary:        A tool to generate a static blog from reStructuredText or 
Markdown input files
 License:        AGPL-3.0-only

++++++ pelican-4.0.0.tar.gz -> pelican-4.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/PKG-INFO new/pelican-4.0.1/PKG-INFO
--- old/pelican-4.0.0/PKG-INFO  2018-11-13 14:31:41.000000000 +0100
+++ new/pelican-4.0.1/PKG-INFO  2018-11-30 17:15:49.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: pelican
-Version: 4.0.0
+Version: 4.0.1
 Summary: Static site generator supporting reStructuredText and Markdown source 
content.
 Home-page: https://getpelican.com/
 Author: Alexis Metaireau
@@ -75,6 +75,21 @@
         Release history
         ###############
         
+        4.0.1 (2018-11-30)
+        ==================
+        
+        * Refactor ``pelican.server`` logging
+        * Fix bug in which all static files were processed as "draft"
+        * Bug fixes for Invoke/Makefile automation, Importer, and other 
miscellanea
+        
+        If upgrading from 3.7.x or earlier, please note that slug-related 
settings in
+        4.0+ use ``{slug}`` and/or ``{lang}`` rather than ``%s``. If 
``%s``-style
+        settings are encountered, Pelican will emit a warning and fall back to 
the
+        default setting. Some user-submitted themes might try to format 
setting values
+        but fail upon site build with a ``TypeError``. In such cases, the 
theme needs
+        to be updated. For example, instead of 
``TAG_FEED_ATOM|format(tag.slug)``, use
+        ``TAG_FEED_ATOM|format(slug=tag.slug)``
+        
         4.0.0 (2018-11-13)
         ==================
         
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/docs/changelog.rst 
new/pelican-4.0.1/docs/changelog.rst
--- old/pelican-4.0.0/docs/changelog.rst        2018-11-13 14:17:45.000000000 
+0100
+++ new/pelican-4.0.1/docs/changelog.rst        2018-11-29 17:26:57.000000000 
+0100
@@ -1,6 +1,21 @@
 Release history
 ###############
 
+4.0.1 (2018-11-30)
+==================
+
+* Refactor ``pelican.server`` logging
+* Fix bug in which all static files were processed as "draft"
+* Bug fixes for Invoke/Makefile automation, Importer, and other miscellanea
+
+If upgrading from 3.7.x or earlier, please note that slug-related settings in
+4.0+ use ``{slug}`` and/or ``{lang}`` rather than ``%s``. If ``%s``-style
+settings are encountered, Pelican will emit a warning and fall back to the
+default setting. Some user-submitted themes might try to format setting values
+but fail upon site build with a ``TypeError``. In such cases, the theme needs
+to be updated. For example, instead of ``TAG_FEED_ATOM|format(tag.slug)``, use
+``TAG_FEED_ATOM|format(slug=tag.slug)``
+
 4.0.0 (2018-11-13)
 ==================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican/__init__.py 
new/pelican-4.0.1/pelican/__init__.py
--- old/pelican-4.0.0/pelican/__init__.py       2018-11-13 14:21:47.000000000 
+0100
+++ new/pelican-4.0.1/pelican/__init__.py       2018-11-30 17:10:26.000000000 
+0100
@@ -29,7 +29,7 @@
                            folder_watcher, maybe_pluralize)
 from pelican.writers import Writer
 
-__version__ = "4.0.0"
+__version__ = "4.0.1"
 DEFAULT_CONFIG_NAME = 'pelicanconf.py'
 logger = logging.getLogger(__name__)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican/contents.py 
new/pelican-4.0.1/pelican/contents.py
--- old/pelican-4.0.0/pelican/contents.py       2018-11-12 08:19:18.000000000 
+0100
+++ new/pelican-4.0.1/pelican/contents.py       2018-11-29 16:47:50.000000000 
+0100
@@ -213,7 +213,6 @@
             'lang': getattr(self, 'lang', 'en'),
             'date': getattr(self, 'date', SafeDatetime.now()),
             'author': self.author.slug if hasattr(self, 'author') else '',
-            'tag': self.tag.slug if hasattr(self, 'tag') else '',
             'category': self.category.slug if hasattr(self, 'category') else ''
         })
         return metadata
@@ -527,7 +526,11 @@
 
 
 @python_2_unicode_compatible
-class Static(Page):
+class Static(Content):
+    mandatory_properties = ('title',)
+    default_status = 'published'
+    default_template = None
+
     def __init__(self, *args, **kwargs):
         super(Static, self).__init__(*args, **kwargs)
         self._output_location_referenced = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican/readers.py 
new/pelican-4.0.1/pelican/readers.py
--- old/pelican-4.0.0/pelican/readers.py        2018-11-12 08:19:18.000000000 
+0100
+++ new/pelican-4.0.1/pelican/readers.py        2018-11-29 16:47:50.000000000 
+0100
@@ -9,6 +9,7 @@
 import docutils
 import docutils.core
 import docutils.io
+from docutils.parsers.rst.languages import get_language as get_docutils_lang
 from docutils.writers.html4css1 import HTMLTranslator, Writer
 
 import six
@@ -218,6 +219,14 @@
     def __init__(self, *args, **kwargs):
         super(RstReader, self).__init__(*args, **kwargs)
 
+        lang_code = self.settings.get('DEFAULT_LANG', 'en')
+        if get_docutils_lang(lang_code):
+            self._language_code = lang_code
+        else:
+            logger.warning("Docutils has no localization for '%s'."
+                           " Using 'en' instead.", lang_code)
+            self._language_code = 'en'
+
     def _parse_metadata(self, document, source_path):
         """Return the dict containing document metadata"""
         formatted_fields = self.settings['FORMATTED_FIELDS']
@@ -256,7 +265,7 @@
         extra_params = {'initial_header_level': '2',
                         'syntax_highlight': 'short',
                         'input_encoding': 'utf-8',
-                        'language_code': self.settings.get('DEFAULT_LANG'),
+                        'language_code': self._language_code,
                         'halt_level': 2,
                         'traceback': True,
                         'warning_stream': StringIO(),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican/server.py 
new/pelican-4.0.1/pelican/server.py
--- old/pelican-4.0.0/pelican/server.py 2018-11-11 11:35:30.000000000 +0100
+++ new/pelican-4.0.1/pelican/server.py 2018-11-29 16:47:50.000000000 +0100
@@ -17,6 +17,9 @@
 from six.moves import SimpleHTTPServer as srvmod
 from six.moves import urllib
 
+from pelican.log import init as init_logging
+logger = logging.getLogger(__name__)
+
 
 def parse_arguments():
     parser = argparse.ArgumentParser(
@@ -71,22 +74,23 @@
         self.path = self.get_path_that_exists(original_path)
 
         if not self.path:
-            logging.warning("Unable to find `%s` or variations.",
-                            original_path)
             return
 
-        logging.info("Found `%s`.", self.path)
         srvmod.SimpleHTTPRequestHandler.do_GET(self)
 
     def get_path_that_exists(self, original_path):
         # Try to strip trailing slash
         original_path = original_path.rstrip('/')
         # Try to detect file by applying various suffixes
+        tries = []
         for suffix in self.SUFFIXES:
             path = original_path + suffix
             if os.path.exists(self.translate_path(path)):
                 return path
-            logging.info("Tried to find `%s`, but it doesn't exist.", path)
+            tries.append(path)
+        logger.warning("Unable to find `%s` or variations:\n%s",
+                       original_path,
+                       '\n'.join(tries))
         return None
 
     def guess_type(self, path):
@@ -108,11 +112,12 @@
 
 
 if __name__ == '__main__':
-    logging.warning("'python -m pelican.server' is deprecated. The "
-                    "Pelican development server should be run via "
-                    "'pelican --listen' or 'pelican -l' (this can be combined "
-                    "with regeneration as 'pelican -lr'). Rerun 'pelican-"
-                    "quickstart' to get new Makefile and tasks.py files.")
+    init_logging(level=logging.INFO)
+    logger.warning("'python -m pelican.server' is deprecated.\nThe "
+                   "Pelican development server should be run via "
+                   "'pelican --listen' or 'pelican -l'.\nThis can be combined "
+                   "with regeneration as 'pelican -lr'.\nRerun 'pelican-"
+                   "quickstart' to get new Makefile and tasks.py files.")
     args = parse_arguments()
     RootedHTTPServer.allow_reuse_address = True
     try:
@@ -123,16 +128,16 @@
                 httpd.socket, keyfile=args.key,
                 certfile=args.cert, server_side=True)
     except ssl.SSLError as e:
-        logging.error("Couldn't open certificate file %s or key file %s",
-                      args.cert, args.key)
-        logging.error("Could not listen on port %s, server %s.",
-                      args.port, args.server)
+        logger.error("Couldn't open certificate file %s or key file %s",
+                     args.cert, args.key)
+        logger.error("Could not listen on port %s, server %s.",
+                     args.port, args.server)
         sys.exit(getattr(e, 'exitcode', 1))
 
-    logging.info("Serving at port %s, server %s.",
-                 args.port, args.server)
+    logger.info("Serving at port %s, server %s.",
+                args.port, args.server)
     try:
         httpd.serve_forever()
     except KeyboardInterrupt as e:
-        logging.info("Shutting down server.")
+        logger.info("Shutting down server.")
         httpd.socket.close()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican/tests/test_contents.py 
new/pelican-4.0.1/pelican/tests/test_contents.py
--- old/pelican-4.0.0/pelican/tests/test_contents.py    2018-11-12 
08:19:18.000000000 +0100
+++ new/pelican-4.0.1/pelican/tests/test_contents.py    2018-11-29 
16:47:50.000000000 +0100
@@ -11,7 +11,7 @@
 
 import six
 
-from pelican.contents import Article, Author, Category, Page, Static, Tag
+from pelican.contents import Article, Author, Category, Page, Static
 from pelican.settings import DEFAULT_CONFIG
 from pelican.signals import content_object_init
 from pelican.tests.support import LoggedTestCase, get_context, get_settings,\
@@ -609,19 +609,6 @@
         article = Article(**article_kwargs)
         self.assertEqual(article.url, 'fedora.qa/this-week-in-fedora-qa/')
 
-    def test_slugify_tags_with_dots(self):
-        settings = get_settings()
-        settings['TAG_REGEX_SUBSTITUTIONS'] = [
-            ('Fedora QA', 'fedora.qa'),
-        ]
-        settings['ARTICLE_URL'] = '{tag}/{slug}/'
-        article_kwargs = self._copy_page_kwargs()
-        article_kwargs['metadata']['tag'] = Tag('Fedora QA', settings)
-        article_kwargs['metadata']['title'] = 'This Week in Fedora QA'
-        article_kwargs['settings'] = settings
-        article = Article(**article_kwargs)
-        self.assertEqual(article.url, 'fedora.qa/this-week-in-fedora-qa/')
-
     def test_valid_save_as_detects_breakout(self):
         settings = get_settings()
         article_kwargs = self._copy_page_kwargs()
@@ -917,3 +904,18 @@
                                    self.settings['INDEX_SAVE_AS'])) +
                          '">link</a>')
         self.assertEqual(content, expected_html)
+
+    def test_not_save_as_draft(self):
+        """Static.save_as is not affected by draft status."""
+
+        static = Static(
+            content=None,
+            metadata=dict(status='draft',),
+            settings=self.settings,
+            source_path=os.path.join('dir', 'foo.jpg'),
+            context=self.settings.copy())
+
+        expected_save_as = os.path.join('dir', 'foo.jpg')
+        self.assertEqual(static.status, 'draft')
+        self.assertEqual(static.save_as, expected_save_as)
+        self.assertEqual(static.url, path_to_url(expected_save_as))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican/tests/test_importer.py 
new/pelican-4.0.1/pelican/tests/test_importer.py
--- old/pelican-4.0.0/pelican/tests/test_importer.py    2018-11-11 
11:35:30.000000000 +0100
+++ new/pelican-4.0.1/pelican/tests/test_importer.py    2018-11-29 
16:47:50.000000000 +0100
@@ -44,7 +44,7 @@
     def setUp(self):
         self.old_locale = locale.setlocale(locale.LC_ALL)
         locale.setlocale(locale.LC_ALL, str('C'))
-        self.posts = list(blogger2fields(BLOGGER_XML_SAMPLE))
+        self.posts = blogger2fields(BLOGGER_XML_SAMPLE)
 
     def tearDown(self):
         locale.setlocale(locale.LC_ALL, self.old_locale)
@@ -53,14 +53,15 @@
         """Check that importer only outputs pages, articles and comments,
         that these are correctly identified and that titles are correct.
         """
-        kinds = {x[8] for x in self.posts}
+        test_posts = list(self.posts)
+        kinds = {x[8] for x in test_posts}
         self.assertEqual({'page', 'article', 'comment'}, kinds)
-        page_titles = {x[0] for x in self.posts if x[8] == 'page'}
+        page_titles = {x[0] for x in test_posts if x[8] == 'page'}
         self.assertEqual({'Test page', 'Test page 2'}, page_titles)
-        article_titles = {x[0] for x in self.posts if x[8] == 'article'}
+        article_titles = {x[0] for x in test_posts if x[8] == 'article'}
         self.assertEqual({'Black as Egypt\'s Night', 'The Steel Windpipe'},
                          article_titles)
-        comment_titles = {x[0] for x in self.posts if x[8] == 'comment'}
+        comment_titles = {x[0] for x in test_posts if x[8] == 'comment'}
         self.assertEqual({'Mishka, always a pleasure to read your '
                           'adventures!...'},
                          comment_titles)
@@ -69,15 +70,16 @@
         """Check that importerer outputs only statuses 'published' and 'draft',
         that these are correctly identified and that filenames are correct.
         """
-        statuses = {x[7] for x in self.posts}
+        test_posts = list(self.posts)
+        statuses = {x[7] for x in test_posts}
         self.assertEqual({'published', 'draft'}, statuses)
 
-        draft_filenames = {x[2] for x in self.posts if x[7] == 'draft'}
+        draft_filenames = {x[2] for x in test_posts if x[7] == 'draft'}
         # draft filenames are id-based
         self.assertEqual({'page-4386962582497458967',
                           'post-1276418104709695660'}, draft_filenames)
 
-        published_filenames = {x[2] for x in self.posts if x[7] == 'published'}
+        published_filenames = {x[2] for x in test_posts if x[7] == 'published'}
         # published filenames are url-based, except comments
         self.assertEqual({'the-steel-windpipe',
                           'test-page',
@@ -91,8 +93,8 @@
     def setUp(self):
         self.old_locale = locale.setlocale(locale.LC_ALL)
         locale.setlocale(locale.LC_ALL, str('C'))
-        self.posts = list(wp2fields(WORDPRESS_XML_SAMPLE))
-        self.custposts = list(wp2fields(WORDPRESS_XML_SAMPLE, True))
+        self.posts = wp2fields(WORDPRESS_XML_SAMPLE)
+        self.custposts = wp2fields(WORDPRESS_XML_SAMPLE, True)
 
     def tearDown(self):
         locale.setlocale(locale.LC_ALL, self.old_locale)
@@ -242,6 +244,8 @@
             self.assertFalse(out_name.endswith(filename))
 
     def test_can_toggle_raw_html_code_parsing(self):
+        test_posts = list(self.posts)
+
         def r(f):
             with open(f, encoding='utf-8') as infile:
                 return infile.read()
@@ -250,16 +254,16 @@
         with temporary_folder() as temp:
 
             rst_files = (r(f) for f
-                         in silent_f2p(self.posts, 'markdown', temp))
+                         in silent_f2p(test_posts, 'markdown', temp))
             self.assertTrue(any('<iframe' in rst for rst in rst_files))
             rst_files = (r(f) for f
-                         in silent_f2p(self.posts, 'markdown',
+                         in silent_f2p(test_posts, 'markdown',
                                        temp, strip_raw=True))
             self.assertFalse(any('<iframe' in rst for rst in rst_files))
             # no effect in rst
-            rst_files = (r(f) for f in silent_f2p(self.posts, 'rst', temp))
+            rst_files = (r(f) for f in silent_f2p(test_posts, 'rst', temp))
             self.assertFalse(any('<iframe' in rst for rst in rst_files))
-            rst_files = (r(f) for f in silent_f2p(self.posts, 'rst', temp,
+            rst_files = (r(f) for f in silent_f2p(test_posts, 'rst', temp,
                          strip_raw=True))
             self.assertFalse(any('<iframe' in rst for rst in rst_files))
 
@@ -417,20 +421,22 @@
         self.assertTrue(self.attachments)
         for post in self.attachments.keys():
             if post is None:
-                expected = ('https://upload.wikimedia.org/wikipedia/commons/'
-                            'thumb/2/2c/Pelican_lakes_entrance02.jpg/'
-                            '240px-Pelican_lakes_entrance02.jpg')
-                self.assertEqual(self.attachments[post][0], expected)
+                expected = {
+                    ('https://upload.wikimedia.org/wikipedia/commons/'
+                     'thumb/2/2c/Pelican_lakes_entrance02.jpg/'
+                     '240px-Pelican_lakes_entrance02.jpg')
+                }
+                self.assertEqual(self.attachments[post], expected)
             elif post == 'with-excerpt':
                 expected_invalid = ('http://thisurlisinvalid.notarealdomain/'
                                     'not_an_image.jpg')
                 expected_pelikan = ('http://en.wikipedia.org/wiki/'
                                     'File:Pelikan_Walvis_Bay.jpg')
-                self.assertEqual(self.attachments[post][0], expected_invalid)
-                self.assertEqual(self.attachments[post][1], expected_pelikan)
+                self.assertEqual(self.attachments[post],
+                                 {expected_invalid, expected_pelikan})
             elif post == 'with-tags':
                 expected_invalid = ('http://thisurlisinvalid.notarealdomain')
-                self.assertEqual(self.attachments[post][0], expected_invalid)
+                self.assertEqual(self.attachments[post], {expected_invalid})
             else:
                 self.fail('all attachments should match to a '
                           'filename or None, {}'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican/tools/pelican_import.py 
new/pelican-4.0.1/pelican/tools/pelican_import.py
--- old/pelican-4.0.0/pelican/tools/pelican_import.py   2018-11-11 
11:35:30.000000000 +0100
+++ new/pelican-4.0.1/pelican/tools/pelican_import.py   2018-11-29 
16:47:50.000000000 +0100
@@ -131,11 +131,11 @@
     return soup
 
 
-def get_filename(filename, post_id):
-    if filename is not None:
-        return filename
-    else:
+def get_filename(post_name, post_id):
+    if post_name is None or post_name.isspace():
         return post_id
+    else:
+        return post_name
 
 
 def wp2fields(xml, wp_custpost=False):
@@ -154,9 +154,9 @@
                 title = 'No title [%s]' % item.find('post_name').string
                 logger.warning('Post "%s" is lacking a proper title', title)
 
-            filename = item.find('post_name').string
+            post_name = item.find('post_name').string
             post_id = item.find('post_id').string
-            filename = get_filename(filename, post_id)
+            filename = get_filename(post_name, post_id)
 
             content = item.find('encoded').string
             raw_date = item.find('post_date').string
@@ -690,16 +690,16 @@
 
     for item in items:
         kind = item.find('post_type').string
-        filename = item.find('post_name').string
+        post_name = item.find('post_name').string
         post_id = item.find('post_id').string
 
         if kind == 'attachment':
             attachments.append((item.find('post_parent').string,
                                 item.find('attachment_url').string))
         else:
-            filename = get_filename(filename, post_id)
+            filename = get_filename(post_name, post_id)
             names[post_id] = filename
-    attachedposts = defaultdict(list)
+    attachedposts = defaultdict(set)
     for parent, url in attachments:
         try:
             parent_name = names[parent]
@@ -707,7 +707,7 @@
             # attachment's parent is not a valid post
             parent_name = None
 
-        attachedposts[parent_name].append(url)
+        attachedposts[parent_name].add(url)
     return attachedposts
 
 
@@ -739,9 +739,8 @@
     return locations
 
 
-def is_pandoc_needed(fields):
-    in_markup_idx = 9
-    return filter(lambda f: f[in_markup_idx] in ('html', 'wp-html'), fields)
+def is_pandoc_needed(in_markup):
+    return in_markup in ('html', 'wp-html')
 
 
 def get_pandoc_version():
@@ -772,11 +771,7 @@
         wp_custpost=False, wp_attach=False, attachments=None):
 
     pandoc_version = get_pandoc_version()
-
-    if is_pandoc_needed(fields) and not pandoc_version:
-        error = ('Pandoc must be installed to complete the '
-                 'requested import action.')
-        exit(error)
+    posts_require_pandoc = []
 
     settings = read_settings()
     slug_subs = settings['SLUG_REGEX_SUBSTITUTIONS']
@@ -785,6 +780,9 @@
             kind, in_markup) in fields:
         if filter_author and filter_author != author:
             continue
+        if is_pandoc_needed(in_markup) and not pandoc_version:
+            posts_require_pandoc.append(filename)
+
         slug = not disable_slugs and filename or None
 
         if wp_attach and attachments:
@@ -869,6 +867,11 @@
 
         with open(out_filename, 'w', encoding='utf-8') as fs:
             fs.write(header + content)
+
+    if posts_require_pandoc:
+        logger.error("Pandoc must be installed to import the following posts:"
+                     "\n  {}".format("\n  ".join(posts_require_pandoc)))
+
     if wp_attach and attachments and None in attachments:
         print("downloading attachments that don't have a parent post")
         urls = attachments[None]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pelican-4.0.0/pelican/tools/templates/Makefile.jinja2 
new/pelican-4.0.1/pelican/tools/templates/Makefile.jinja2
--- old/pelican-4.0.0/pelican/tools/templates/Makefile.jinja2   2018-07-22 
11:20:16.000000000 +0200
+++ new/pelican-4.0.1/pelican/tools/templates/Makefile.jinja2   2018-11-29 
16:47:50.000000000 +0100
@@ -123,7 +123,7 @@
 ssh_upload: publish
        scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* 
$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)
 
-{%- set upload = upload + ["rsync_upload"] -%}
+{% set upload = upload + ["rsync_upload"] %}
 rsync_upload: publish
        rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --cvs-exclude --delete 
$(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pelican-4.0.0/pelican/tools/templates/tasks.py.jinja2 
new/pelican-4.0.1/pelican/tools/templates/tasks.py.jinja2
--- old/pelican-4.0.0/pelican/tools/templates/tasks.py.jinja2   2018-11-11 
11:35:30.000000000 +0100
+++ new/pelican-4.0.1/pelican/tools/templates/tasks.py.jinja2   2018-11-29 
16:47:50.000000000 +0100
@@ -4,14 +4,10 @@
 import shutil
 import sys
 import datetime
-try:
-    import socketserver
-except ImportError:
-    import SocketServer as socketserver
 
 from invoke import task
 from invoke.util import cd
-from pelican.server import ComplexHTTPRequestHandler
+from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer
 
 CONFIG = {
     # Local path configuration (can be absolute or relative to tasks.py)
@@ -61,12 +57,12 @@
 @task
 def serve(c):
     """Serve site at http://localhost:8000/""";
-    os.chdir(CONFIG['deploy_path'])
 
-    class AddressReuseTCPServer(socketserver.TCPServer):
+    class AddressReuseTCPServer(RootedHTTPServer):
         allow_reuse_address = True
 
     server = AddressReuseTCPServer(
+        CONFIG['deploy_path'],
         ('', CONFIG['port']),
         ComplexHTTPRequestHandler)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/pelican.egg-info/PKG-INFO 
new/pelican-4.0.1/pelican.egg-info/PKG-INFO
--- old/pelican-4.0.0/pelican.egg-info/PKG-INFO 2018-11-13 14:31:40.000000000 
+0100
+++ new/pelican-4.0.1/pelican.egg-info/PKG-INFO 2018-11-30 17:15:48.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: pelican
-Version: 4.0.0
+Version: 4.0.1
 Summary: Static site generator supporting reStructuredText and Markdown source 
content.
 Home-page: https://getpelican.com/
 Author: Alexis Metaireau
@@ -75,6 +75,21 @@
         Release history
         ###############
         
+        4.0.1 (2018-11-30)
+        ==================
+        
+        * Refactor ``pelican.server`` logging
+        * Fix bug in which all static files were processed as "draft"
+        * Bug fixes for Invoke/Makefile automation, Importer, and other 
miscellanea
+        
+        If upgrading from 3.7.x or earlier, please note that slug-related 
settings in
+        4.0+ use ``{slug}`` and/or ``{lang}`` rather than ``%s``. If 
``%s``-style
+        settings are encountered, Pelican will emit a warning and fall back to 
the
+        default setting. Some user-submitted themes might try to format 
setting values
+        but fail upon site build with a ``TypeError``. In such cases, the 
theme needs
+        to be updated. For example, instead of 
``TAG_FEED_ATOM|format(tag.slug)``, use
+        ``TAG_FEED_ATOM|format(slug=tag.slug)``
+        
         4.0.0 (2018-11-13)
         ==================
         
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pelican-4.0.0/setup.py new/pelican-4.0.1/setup.py
--- old/pelican-4.0.0/setup.py  2018-11-13 14:22:36.000000000 +0100
+++ new/pelican-4.0.1/setup.py  2018-11-30 17:10:53.000000000 +0100
@@ -28,7 +28,7 @@
 
 setup(
     name='pelican',
-    version='4.0.0',
+    version='4.0.1',
     url='https://getpelican.com/',
     author='Alexis Metaireau',
     maintainer='Justin Mayer',


Reply via email to