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 = ''
- 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):