From e725df47477df1a1bcf6f046640ec9a024d6480b Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Fri, 4 Mar 2016 14:38:07 +0100 Subject: [PATCH] metasync: Strip whitespace from values Fix #358 --- tests/test_metasync.py | 17 +++++++++++++++++ vdirsyncer/metasync.py | 13 +++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/test_metasync.py b/tests/test_metasync.py index 522bfdd..5b86972 100644 --- a/tests/test_metasync.py +++ b/tests/test_metasync.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +from hypothesis import given +import hypothesis.strategies as st + import pytest from vdirsyncer.metasync import MetaSyncConflict, metasync @@ -82,3 +85,17 @@ def test_conflict_x_wins(wins): assert a.get_meta('foo') == b.get_meta('foo') == status['foo'] == ( 'bar' if wins == 'a' else 'baz' ) + + +@given(s=st.text().filter(lambda x: x.strip() == x), key=st.text()) +def test_trailing_newline(s, key): + a = MemoryStorage() + b = MemoryStorage() + status = {} + a.set_meta(key, s + u'\n') + b.set_meta(key, s) + a.set_meta = b.set_meta = blow_up + + metasync(a, b, status, keys=[key]) + + assert status[key] == s diff --git a/vdirsyncer/metasync.py b/vdirsyncer/metasync.py index db7ce74..ae0f3a7 100644 --- a/vdirsyncer/metasync.py +++ b/vdirsyncer/metasync.py @@ -1,4 +1,5 @@ from . import exceptions, log +from .utils.compat import text_type logger = log.get(__name__) @@ -33,8 +34,8 @@ def metasync(storage_a, storage_b, status, keys, conflict_resolution=None): _b_to_a() for key in keys: - a = storage_a.get_meta(key) - b = storage_b.get_meta(key) + a = _normalize_value(storage_a.get_meta(key)) + b = _normalize_value(storage_b.get_meta(key)) s = status.get(key) logger.debug(u'Key: {}'.format(key)) logger.debug(u'A: {}'.format(a)) @@ -52,3 +53,11 @@ def metasync(storage_a, storage_b, status, keys, conflict_resolution=None): for key in set(status) - set(keys): del status[key] + + +def _normalize_value(value): + if value is None: + return value + else: + assert isinstance(value, text_type) + return value.strip()