diff --git a/pelican/tests/test_importer.py b/pelican/tests/test_importer.py index 743cea8c6b..f0923bf9cc 100644 --- a/pelican/tests/test_importer.py +++ b/pelican/tests/test_importer.py @@ -2,6 +2,7 @@ import os import re from posixpath import join as posix_join +from unittest.mock import patch from pelican.settings import DEFAULT_CONFIG from pelican.tests.support import (mute, skipIfNoExecutable, temporary_folder, @@ -10,7 +11,8 @@ build_markdown_header, decode_wp_content, download_attachments, fields2pelican, - get_attachments, wp2fields) + get_attachments, wp2fields, + tumblr2fields) from pelican.utils import path_to_file_url, slugify CUR_DIR = os.path.abspath(os.path.dirname(__file__)) @@ -477,3 +479,53 @@ def test_download_attachments(self): self.assertTrue( directory.endswith(posix_join('content', 'article.rst')), directory) + + +class TestTumblrImporter(unittest.TestCase): + def setUp(self): + self.old_locale = locale.setlocale(locale.LC_ALL) + locale.setlocale(locale.LC_ALL, 'C') + + def tearDown(self): + locale.setlocale(locale.LC_ALL, self.old_locale) + + @patch("pelican.tools.pelican_import._get_tumblr_posts") + def test_posts(self, get): + def get_posts(api_key, blogname, offset=0): + if offset > 0: + return [] + + return [ + { + "type": "photo", + "blog_name": "testy", + "date": "2019-11-07 21:26:40 GMT", + "timestamp": 1573162000, + "format": "html", + "slug": "a-slug", + "tags": [ + "economics" + ], + "state": "published", + + "photos": [ + { + "caption": "", + "original_size": { + "url": "https://..fccdc2360ba7182a.jpg", + "width": 634, + "height": 789 + }, + }] + } + ] + get.side_effect = get_posts + + posts = list(tumblr2fields("api_key", "blogname")) + self.assertEqual( + [('Photo', + '\n', + '2019-11-07-a-slug', '2019-11-07 15:26:40', 'testy', ['photo'], + ['economics'], 'published', 'article', 'html')], + posts, + posts) diff --git a/pelican/tools/RELEASE.md b/pelican/tools/RELEASE.md new file mode 100644 index 0000000000..5bcce06a90 --- /dev/null +++ b/pelican/tools/RELEASE.md @@ -0,0 +1,3 @@ +Release type: patch + +Remove addition of newline when iterating posts of type 'photo' (fixes #3178) diff --git a/pelican/tools/pelican_import.py b/pelican/tools/pelican_import.py index cd643ec62c..474b5cba0c 100755 --- a/pelican/tools/pelican_import.py +++ b/pelican/tools/pelican_import.py @@ -390,22 +390,22 @@ def dc2fields(file): post_format) -def tumblr2fields(api_key, blogname): - """ Imports Tumblr posts (API v2)""" +def _get_tumblr_posts(api_key, blogname, offset=0): import json import urllib.request as urllib_request + url = ("https://api.tumblr.com/v2/blog/%s.tumblr.com/" + "posts?api_key=%s&offset=%d&filter=raw") % ( + blogname, api_key, offset) + request = urllib_request.Request(url) + handle = urllib_request.urlopen(request) + posts = json.loads(handle.read().decode('utf-8')) + return posts.get('response').get('posts') - def get_tumblr_posts(api_key, blogname, offset=0): - url = ("https://api.tumblr.com/v2/blog/%s.tumblr.com/" - "posts?api_key=%s&offset=%d&filter=raw") % ( - blogname, api_key, offset) - request = urllib_request.Request(url) - handle = urllib_request.urlopen(request) - posts = json.loads(handle.read().decode('utf-8')) - return posts.get('response').get('posts') +def tumblr2fields(api_key, blogname): + """ Imports Tumblr posts (API v2)""" offset = 0 - posts = get_tumblr_posts(api_key, blogname, offset) + posts = _get_tumblr_posts(api_key, blogname, offset) subs = DEFAULT_CONFIG['SLUG_REGEX_SUBSTITUTIONS'] while len(posts) > 0: for post in posts: @@ -428,12 +428,10 @@ def get_tumblr_posts(api_key, blogname, offset=0): fmtstr = '![%s](%s)' else: fmtstr = '%s' - content = '' - for photo in post.get('photos'): - content += '\n'.join( - fmtstr % (photo.get('caption'), - photo.get('original_size').get('url'))) - content += '\n\n' + post.get('caption') + content = '\n'.join( + fmtstr % (photo.get('caption'), + photo.get('original_size').get('url')) + for photo in post.get('photos')) elif type == 'quote': if format == 'markdown': fmtstr = '\n\n— %s' @@ -483,7 +481,7 @@ def get_tumblr_posts(api_key, blogname, offset=0): tags, status, kind, format) offset += len(posts) - posts = get_tumblr_posts(api_key, blogname, offset) + posts = _get_tumblr_posts(api_key, blogname, offset) def feed2fields(file):