From b79db87fa9c789d5d89531d5d430fb97dcc18fbf Mon Sep 17 00:00:00 2001 From: Johannes Raggam Date: Mon, 18 Mar 2013 15:04:42 +0100 Subject: [PATCH] safe_unicode from Products.CMFPlone.utils --- src/icalendar/parser.py | 14 ++++++++++++++ src/icalendar/tests/test_parser.py | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/icalendar/tests/test_parser.py diff --git a/src/icalendar/parser.py b/src/icalendar/parser.py index 6ba6972..a2417e0 100644 --- a/src/icalendar/parser.py +++ b/src/icalendar/parser.py @@ -16,6 +16,20 @@ from icalendar.caselessdict import CaselessDict logger = logging.getLogger('icalendar') +def safe_unicode(value, encoding='utf-8'): + """Converts a value to unicode, even if it is already a unicode string. + + """ + if isinstance(value, unicode): + return value + elif isinstance(value, basestring): + try: + value = unicode(value, encoding) + except (UnicodeDecodeError): + value = value.decode('utf-8', 'replace') + return value + + def escape_char(text): """Format value according to iCalendar TEXT escaping rules. """ diff --git a/src/icalendar/tests/test_parser.py b/src/icalendar/tests/test_parser.py new file mode 100644 index 0000000..2cbd0d1 --- /dev/null +++ b/src/icalendar/tests/test_parser.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +import unittest +import icalendar + + +class TestCalComponent(unittest.TestCase): + + def test_cal_Component(self): + safe_unicode = icalendar.parser.safe_unicode + + self.assertEqual(safe_unicode('spam'), u'spam') + self.assertEqual(safe_unicode(u'spam'), u'spam') + self.assertEqual(safe_unicode(u'spam'.encode('utf-8')), u'spam') + self.assertEqual(safe_unicode('\xc6\xb5'), u'\u01b5') + self.assertEqual(safe_unicode(u'\xc6\xb5'.encode('iso-8859-1')), + u'\u01b5') + self.assertEqual(safe_unicode('\xc6\xb5', encoding='ascii'), u'\u01b5') + self.assertEqual(safe_unicode(1), 1) + self.assertEqual(safe_unicode(None), None)