Hello community, here is the log from the commit of package python-vobject for openSUSE:Factory checked in at 2017-08-24 18:45:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-vobject (Old) and /work/SRC/openSUSE:Factory/.python-vobject.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-vobject" Thu Aug 24 18:45:18 2017 rev:2 rq:514466 version:0.9.5 Changes: -------- --- /work/SRC/openSUSE:Factory/python-vobject/python-vobject.changes 2017-06-30 18:43:28.176784334 +0200 +++ /work/SRC/openSUSE:Factory/.python-vobject.new/python-vobject.changes 2017-08-24 18:45:56.991903573 +0200 @@ -1,0 +2,14 @@ +Thu Aug 3 20:00:25 UTC 2017 - [email protected] + +- update to version 0.9.5: + * Make ics_diff.py work with Python 3 + * Huge changes to text encoding for Python 2/3 compatibility + * Autogenerate DTSTAMP if not provided + * Fix getrruleset() for Python 3 and in the case that + addRDate=True + * Update vCard property validation to match specifications + * Handle offset-naive and offset-aware datetimes in recurrence + rules + * Improved documentation for multi-value properties + +------------------------------------------------------------------- Old: ---- vobject-0.9.4.1.tar.gz New: ---- vobject-0.9.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-vobject.spec ++++++ --- /var/tmp/diff_new_pack.qLlqrc/_old 2017-08-24 18:45:57.859781373 +0200 +++ /var/tmp/diff_new_pack.qLlqrc/_new 2017-08-24 18:45:57.875779121 +0200 @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-vobject %global modname vobject -Version: 0.9.4.1 +Version: 0.9.5 Release: 0 Summary: Python package for parsing and creating iCalendar and vCard files License: Apache-2.0 ++++++ vobject-0.9.4.1.tar.gz -> vobject-0.9.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/PKG-INFO new/vobject-0.9.5/PKG-INFO --- old/vobject-0.9.4.1/PKG-INFO 2017-01-22 20:41:15.000000000 +0100 +++ new/vobject-0.9.5/PKG-INFO 2017-06-29 20:59:23.000000000 +0200 @@ -1,12 +1,12 @@ Metadata-Version: 1.1 Name: vobject -Version: 0.9.4.1 +Version: 0.9.5 Summary: A full-featured Python package for parsing and creating iCalendar and vCard files Home-page: http://eventable.github.io/vobject/ Author: Sameen Karim Author-email: [email protected] License: Apache -Download-URL: https://github.com/eventable/vobject/tarball/0.9.4.1 +Download-URL: https://github.com/eventable/vobject/tarball/0.9.5 Description: Description ----------- @@ -22,7 +22,13 @@ Recent changes -------------- - - Pickling/deepcopy hotfix + - Make ics_diff.py work with Python 3 + - Huge changes to text encoding for Python 2/3 compatibility + - Autogenerate DTSTAMP if not provided + - Fix getrruleset() for Python 3 and in the case that addRDate=True + - Update vCard property validation to match specifications + - Handle offset-naive and offset-aware datetimes in recurrence rules + - Improved documentation for multi-value properties For older changes, see - http://eventable.github.io/vobject/#release-history or diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/README.md new/vobject-0.9.5/README.md --- old/vobject-0.9.4.1/README.md 2016-12-05 18:55:53.000000000 +0100 +++ new/vobject-0.9.5/README.md 2017-06-29 19:50:48.000000000 +0200 @@ -253,6 +253,7 @@ ... BEGIN:VCARD ... VERSION:3.0 ... EMAIL;TYPE=INTERNET:[email protected] +... EMAIL;TYPE=INTERNET:[email protected] ... ORG:Open Source Applications Foundation ... FN:Jeffrey Harris ... N:Harris;Jeffrey;;; @@ -270,4 +271,7 @@ N: Jeffrey Harris >>> v.n.value.family u'Harris' +>>> v.email_list +[<EMAIL{'TYPE': ['INTERNET']}[email protected]>, + <EMAIL{'TYPE': ['INTERNET']}[email protected]>] ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/setup.cfg new/vobject-0.9.5/setup.cfg --- old/vobject-0.9.4.1/setup.cfg 2017-01-22 20:41:15.000000000 +0100 +++ new/vobject-0.9.5/setup.cfg 2017-06-29 20:59:23.000000000 +0200 @@ -1,5 +1,4 @@ [egg_info] tag_build = tag_date = 0 -tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/setup.py new/vobject-0.9.5/setup.py --- old/vobject-0.9.4.1/setup.py 2017-01-22 20:39:54.000000000 +0100 +++ new/vobject-0.9.5/setup.py 2017-06-29 20:44:49.000000000 +0200 @@ -15,7 +15,13 @@ Recent changes -------------- - - Pickling/deepcopy hotfix + - Make ics_diff.py work with Python 3 + - Huge changes to text encoding for Python 2/3 compatibility + - Autogenerate DTSTAMP if not provided + - Fix getrruleset() for Python 3 and in the case that addRDate=True + - Update vCard property validation to match specifications + - Handle offset-naive and offset-aware datetimes in recurrence rules + - Improved documentation for multi-value properties For older changes, see - http://eventable.github.io/vobject/#release-history or @@ -27,7 +33,7 @@ doclines = (__doc__ or '').splitlines() setup(name = "vobject", - version = "0.9.4.1", + version = "0.9.5", author = "Jeffrey Harris", author_email = "[email protected]", maintainer = "Sameen Karim", @@ -35,7 +41,7 @@ license = "Apache", zip_safe = True, url = "http://eventable.github.io/vobject/", - download_url = 'https://github.com/eventable/vobject/tarball/0.9.4.1', + download_url = 'https://github.com/eventable/vobject/tarball/0.9.5', bugtrack_url = "https://github.com/eventable/vobject/issues", entry_points = { 'console_scripts': [ @@ -51,6 +57,7 @@ "iCalendar and vCard files", long_description = "\n".join(doclines[2:]), keywords = ['vobject', 'icalendar', 'vcard', 'ics', 'vcs', 'hcalendar'], + test_suite="tests", classifiers = """ Development Status :: 5 - Production/Stable Environment :: Console diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/test_files/freebusy.ics new/vobject-0.9.5/test_files/freebusy.ics --- old/vobject-0.9.4.1/test_files/freebusy.ics 2016-12-05 18:55:53.000000000 +0100 +++ new/vobject-0.9.5/test_files/freebusy.ics 2017-06-29 20:44:49.000000000 +0200 @@ -2,6 +2,7 @@ UID:test DTSTART:20060216T010000Z DTEND:20060216T030000Z +DTSTAMP:20060215T000000Z FREEBUSY:20060216T010000Z/PT1H FREEBUSY:20060216T010000Z/20060216T030000Z END:VFREEBUSY diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/test_files/recurrence-offset-naive.ics new/vobject-0.9.5/test_files/recurrence-offset-naive.ics --- old/vobject-0.9.4.1/test_files/recurrence-offset-naive.ics 1970-01-01 01:00:00.000000000 +0100 +++ new/vobject-0.9.5/test_files/recurrence-offset-naive.ics 2017-06-28 21:43:21.000000000 +0200 @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130117 +DTEND;VALUE=DATE:20130118 +RRULE:FREQ=WEEKLY;UNTIL=20130330T230000Z;BYDAY=TH +SUMMARY:Meeting +END:VEVENT +END:VCALENDAR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/test_files/recurrence-without-tz.ics new/vobject-0.9.5/test_files/recurrence-without-tz.ics --- old/vobject-0.9.4.1/test_files/recurrence-without-tz.ics 1970-01-01 01:00:00.000000000 +0100 +++ new/vobject-0.9.5/test_files/recurrence-without-tz.ics 2017-06-28 21:43:21.000000000 +0200 @@ -0,0 +1,9 @@ +BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130117 +DTEND;VALUE=DATE:20130118 +RRULE:FREQ=WEEKLY;UNTIL=20130330;BYDAY=TH +SUMMARY:Meeting +END:VEVENT +END:VCALENDAR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/test_files/simple_2_0_test.ics new/vobject-0.9.5/test_files/simple_2_0_test.ics --- old/vobject-0.9.4.1/test_files/simple_2_0_test.ics 2016-12-05 18:55:53.000000000 +0100 +++ new/vobject-0.9.5/test_files/simple_2_0_test.ics 2017-06-29 20:44:49.000000000 +0200 @@ -6,5 +6,6 @@ DTSTART:20060509T000000 CREATED:20060101T180000Z DESCRIPTION:Test event +DTSTAMP:20170626T000000Z END:VEVENT END:VCALENDAR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/tests.py new/vobject-0.9.5/tests.py --- old/vobject-0.9.4.1/tests.py 2016-12-06 23:37:18.000000000 +0100 +++ new/vobject-0.9.5/tests.py 2017-06-29 20:44:49.000000000 +0200 @@ -66,6 +66,7 @@ tzinfo=dateutil.tz.tzical( "test_files/timezones.ics").get('US/Pacific')) cal.vevent.add('uid').value = "Not very random UID" + cal.vevent.add('dtstamp').value = datetime.datetime(2017, 6, 26, 0, tzinfo=tzutc()) # Note we're normalizing line endings, because no one got time for that. self.assertEqual( @@ -94,7 +95,7 @@ self.assertEqual(str(vevent), str(vevent2)) self.assertEqual( vevent.summary.value, - 'The title こんにちはキティ' + u'The title こんにちはキティ' ) def test_wrapping(self): @@ -705,6 +706,7 @@ vfb = base.newFromBehavior('VFREEBUSY') vfb.add('uid').value = 'test' + vfb.add('dtstamp').value = datetime.datetime(2006, 2, 15, 0, tzinfo=utc) vfb.add('dtstart').value = datetime.datetime(2006, 2, 16, 1, tzinfo=utc) vfb.add('dtend').value = vfb.dtstart.value + two_hours vfb.add('freebusy').value = [(vfb.dtstart.value, two_hours / 2)] @@ -800,6 +802,29 @@ [datetime.datetime(2005, 3, 18, 0, 0), datetime.datetime(2005, 3, 29, 0, 0)] ) + def test_recurrence_without_tz(self): + """ + Test recurring vevent missing any time zone definitions. + """ + test_file = get_test_file("recurrence-without-tz.ics") + cal = base.readOne(test_file) + dates = list(cal.vevent.getrruleset()) + self.assertEqual(dates[0], datetime.datetime(2013, 1, 17, 0, 0)) + self.assertEqual(dates[1], datetime.datetime(2013, 1, 24, 0, 0)) + self.assertEqual(dates[-1], datetime.datetime(2013, 3, 28, 0, 0)) + + def test_recurrence_offset_naive(self): + """ + Ensure recurring vevent missing some time zone definitions is + parsing. See isseu #75. + """ + test_file = get_test_file("recurrence-offset-naive.ics") + cal = base.readOne(test_file) + dates = list(cal.vevent.getrruleset()) + self.assertEqual(dates[0], datetime.datetime(2013, 1, 17, 0, 0)) + self.assertEqual(dates[1], datetime.datetime(2013, 1, 24, 0, 0)) + self.assertEqual(dates[-1], datetime.datetime(2013, 3, 28, 0, 0)) + class TestChangeTZ(unittest.TestCase): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject/base.py new/vobject-0.9.5/vobject/base.py --- old/vobject-0.9.4.1/vobject/base.py 2017-01-22 20:37:34.000000000 +0100 +++ new/vobject-0.9.5/vobject/base.py 2017-06-29 20:44:49.000000000 +0200 @@ -23,7 +23,7 @@ def str_(s): """ - Return string with correct encoding + Return byte string with correct encoding """ if type(s) == unicode: return s.encode('utf-8') @@ -76,11 +76,11 @@ DEBUG = False # Don't waste time on debug calls # ----------------------------------- Constants -------------------------------- -CR = '\r' -LF = '\n' -CRLF = CR + LF -SPACE = ' ' -TAB = '\t' +CR = '\r' +LF = '\n' +CRLF = CR + LF +SPACE = ' ' +TAB = '\t' SPACEORTAB = SPACE + TAB # --------------------------------- Main classes ------------------------------- @@ -339,7 +339,7 @@ if 'CHARSET' in self.params: self.value = codecs.decode(self.value.encode("utf-8"), "quoted-printable").decode(self.params['CHARSET'][0]) else: - self.value = codecs.decode(self.value.encode("utf-8"), "quoted-printable").decode() + self.value = codecs.decode(self.value.encode("utf-8"), "quoted-printable").decode('utf-8') @classmethod def duplicate(clz, copyit): @@ -360,8 +360,7 @@ def __eq__(self, other): try: - return (self.name == other.name) and (self.params == other.params)\ - and (self.value == other.value) + return (self.name == other.name) and (self.params == other.params) and (self.value == other.value) except Exception: return False @@ -428,11 +427,17 @@ return v def __str__(self): - return "<{0}{1}{2}>".format(self.name, self.params, self.valueRepr()) + try: + return "<{0}{1}{2}>".format(self.name, self.params, self.valueRepr()) + except UnicodeEncodeError as e: + return "<{0}{1}{2}>".format(self.name, self.params, self.valueRepr().encode('utf-8')) def __repr__(self): return self.__str__() + def __unicode__(self): + return u"<{0}{1}{2}>".format(self.name, self.params, self.valueRepr()) + def prettyPrint(self, level=0, tabwidth=3): pre = ' ' * level * tabwidth print(pre, self.name + ":", self.valueRepr()) @@ -473,8 +478,8 @@ self.autoBehavior() @classmethod - def duplicate(clz, copyit): - newcopy = clz() + def duplicate(cls, copyit): + newcopy = cls() newcopy.copy(copyit) return newcopy @@ -946,7 +951,7 @@ outbuf.write(bytes(input, 'UTF-8')) except Exception: # fall back on py2 syntax - outbuf.write(str_(input)) + outbuf.write(input) else: # Look for valid utf8 range and write that out @@ -1013,12 +1018,15 @@ if obj.group is not None: s.write(obj.group + '.') - s.write(obj.name.upper()) + s.write(str_(obj.name.upper())) keys = sorted(obj.params.keys()) for key in keys: paramstr = ','.join(dquoteEscape(p) for p in obj.params[key]) s.write(";{0}={1}".format(key, paramstr)) - s.write(":{0}".format(str_(obj.value))) + try: + s.write(":{0}".format(obj.value)) + except (UnicodeDecodeError, UnicodeEncodeError) as e: + s.write(":{0}".format(obj.value.encode('utf-8'))) if obj.behavior and not startedEncoded: obj.behavior.decode(obj) foldOneLine(outbuf, s.getvalue(), lineLength) @@ -1067,7 +1075,7 @@ Generate one Component at a time from a stream. """ if isinstance(streamOrString, basestring): - stream = six.StringIO(str_(streamOrString)) + stream = six.StringIO(streamOrString) else: stream = streamOrString diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject/change_tz.py new/vobject-0.9.5/vobject/change_tz.py --- old/vobject-0.9.4.1/vobject/change_tz.py 2016-12-07 17:58:08.000000000 +0100 +++ new/vobject-0.9.5/vobject/change_tz.py 2017-06-22 16:25:26.000000000 +0200 @@ -64,8 +64,9 @@ out_name = ics_file + '.converted' print("... Writing {0!s}".format(out_name)) - out = file(out_name, 'wb') - cal.serialize(out) + with open(out_name, 'wb') as out: + cal.serialize(out) + print("Done") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject/icalendar.py new/vobject-0.9.5/vobject/icalendar.py --- old/vobject-0.9.4.1/vobject/icalendar.py 2016-12-07 19:07:12.000000000 +0100 +++ new/vobject-0.9.5/vobject/icalendar.py 2017-06-29 20:44:49.000000000 +0200 @@ -398,7 +398,7 @@ Get an rruleset created from self. If addRDate is True, add an RDATE for dtstart if it's not included in - an RRULE, and count is decremented if it exists. + an RRULE or RDATE, and count is decremented if it exists. Note that for rules which don't match DTSTART, DTSTART may not appear in list(rruleset), although it should. By default, an RDATE is not @@ -415,9 +415,11 @@ if addfunc is None: addfunc = getattr(rruleset, name) + dtstart = self.dtstart.value + if name in DATENAMES: if type(line.value[0]) == datetime.datetime: - map(addfunc, line.value) + list(map(addfunc, line.value)) elif type(line.value[0]) == datetime.date: for dt in line.value: addfunc(datetime.datetime(dt.year, dt.month, dt.day)) @@ -443,8 +445,12 @@ # a Ruby iCalendar library escapes semi-colons in rrules, # so also remove any backslashes - value = str_(line.value).replace('\\', '') - rule = rrule.rrulestr(value, dtstart=dtstart) + value = line.value.replace('\\', '') + rule = rrule.rrulestr( + value, dtstart=dtstart, + # If dtstart has no time zone, `until` + # shouldn't get one, either: + ignoretz=isinstance(dtstart, datetime.date)) until = rule._until if until is not None and isinstance(dtstart, @@ -488,26 +494,36 @@ # add the rrule or exrule to the rruleset addfunc(rule) - if name == 'rrule' and addRDate: - try: - # dateutils does not work with all-day - # (datetime.date) items so we need to convert to a - # datetime.datetime (which is what dateutils - # does internally) - if not isinstance(dtstart, datetime.datetime): - adddtstart = datetime.datetime.fromordinal(dtstart.toordinal()) - else: - adddtstart = dtstart + if (name == 'rrule' or name == 'rdate') and addRDate: + # rlist = rruleset._rrule if name == 'rrule' else rruleset._rdate + try: + # dateutils does not work with all-day + # (datetime.date) items so we need to convert to a + # datetime.datetime (which is what dateutils + # does internally) + if not isinstance(dtstart, datetime.datetime): + adddtstart = datetime.datetime.fromordinal(dtstart.toordinal()) + else: + adddtstart = dtstart + + if name == 'rrule': if rruleset._rrule[-1][0] != adddtstart: rruleset.rdate(adddtstart) added = True + if rruleset._rrule[-1]._count is not None: + rruleset._rrule[-1]._count -= 1 + else: + added = False + elif name == 'rdate': + if rruleset._rdate[0] != adddtstart: + rruleset.rdate(adddtstart) + added = True else: added = False - except IndexError: - # it's conceivable that an rrule has 0 datetimes - added = False - if added and rruleset._rrule[-1]._count is not None: - rruleset._rrule[-1]._count -= 1 + except IndexError: + # it's conceivable that an rrule has 0 datetimes + added = False + return rruleset def setrruleset(self, rruleset): @@ -653,7 +669,7 @@ if encoding and encoding.upper() == cls.base64string: line.value = base64.b64encode(line.value.encode('utf-8')).decode('utf-8').replace('\n', '') else: - line.value = backslashEscape(str_(line.value)) + line.value = backslashEscape(line.value) line.encoded = True @@ -688,7 +704,7 @@ @staticmethod def generateImplicitParameters(obj): """ - Generate a UID if one does not exist. + Generate a UID and DTSTAMP if one does not exist. This is just a dummy implementation, for now. """ @@ -700,6 +716,10 @@ obj.add(ContentLine('UID', [], "{0} - {1}@{2}".format(now, rand, host))) + if not hasattr(obj, 'dtstamp'): + now = datetime.datetime.now(utc) + obj.add('dtstamp').value = now + class DateTimeBehavior(behavior.Behavior): """ @@ -913,7 +933,7 @@ @classmethod def generateImplicitParameters(cls, obj): """ - Create PRODID, VERSION, and VTIMEZONEs if needed. + Create PRODID, VERSION and VTIMEZONEs if needed. VTIMEZONEs will need to exist whenever TZID parameters exist or when datetimes with tzinfo exist. @@ -1045,7 +1065,7 @@ 'LOCATION': (0, 1, None), 'ORGANIZER': (0, 1, None), 'PRIORITY': (0, 1, None), - 'DTSTAMP': (0, 1, None), + 'DTSTAMP': (1, 1, None), # required 'SEQUENCE': (0, 1, None), 'STATUS': (0, 1, None), 'SUMMARY': (0, 1, None), @@ -1104,7 +1124,7 @@ 'ORGANIZER': (0, 1, None), 'PERCENT': (0, 1, None), 'PRIORITY': (0, 1, None), - 'DTSTAMP': (0, 1, None), + 'DTSTAMP': (1, 1, None), 'SEQUENCE': (0, 1, None), 'STATUS': (0, 1, None), 'SUMMARY': (0, 1, None), @@ -1154,7 +1174,7 @@ 'DESCRIPTION': (0, 1, None), 'LAST-MODIFIED': (0, 1, None), 'ORGANIZER': (0, 1, None), - 'DTSTAMP': (0, 1, None), + 'DTSTAMP': (1, 1, None), 'SEQUENCE': (0, 1, None), 'STATUS': (0, 1, None), 'SUMMARY': (0, 1, None), @@ -1191,7 +1211,7 @@ 'DTEND': (0, 1, None), 'DURATION': (0, 1, None), 'ORGANIZER': (0, 1, None), - 'DTSTAMP': (0, 1, None), + 'DTSTAMP': (1, 1, None), 'UID': (0, 1, None), 'URL': (0, 1, None), 'ATTENDEE': (0, None, None), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject/ics_diff.py new/vobject-0.9.5/vobject/ics_diff.py --- old/vobject-0.9.4.1/vobject/ics_diff.py 2016-12-07 19:07:12.000000000 +0100 +++ new/vobject-0.9.5/vobject/ics_diff.py 2017-06-22 16:25:26.000000000 +0200 @@ -191,8 +191,9 @@ if args: ignore_dtstamp = options.ignore ics_file1, ics_file2 = args - cal1 = readOne(file(ics_file1)) - cal2 = readOne(file(ics_file2)) + with open(ics_file1) as f, open(ics_file2) as g: + cal1 = readOne(f) + cal2 = readOne(g) deleteExtraneous(cal1, ignore_dtstamp=ignore_dtstamp) deleteExtraneous(cal2, ignore_dtstamp=ignore_dtstamp) prettyDiff(cal1, cal2) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject/vcard.py new/vobject-0.9.5/vobject/vcard.py --- old/vobject-0.9.4.1/vobject/vcard.py 2017-01-20 21:20:10.000000000 +0100 +++ new/vobject-0.9.5/vobject/vcard.py 2017-06-29 19:51:00.000000000 +0200 @@ -4,7 +4,7 @@ from . import behavior -from .base import ContentLine, registerBehavior, backslashEscape +from .base import ContentLine, registerBehavior, backslashEscape, str_ from .icalendar import stringToTextValues @@ -41,7 +41,7 @@ def __str__(self): eng_order = ('prefix', 'given', 'additional', 'family', 'suffix') out = ' '.join(self.toString(getattr(self, val)) for val in eng_order) - return out + return str_(out) def __repr__(self): return "<Name: {0!s}>".format(self.__str__()) @@ -177,8 +177,8 @@ isComponent = True sortFirst = ('version', 'prodid', 'uid') knownChildren = { - 'N': (1, 1, None), # min, max, behaviorRegistry id - 'FN': (1, 1, None), + 'N': (0, 1, None), # min, max, behaviorRegistry id + 'FN': (1, None, None), 'VERSION': (1, 1, None), # required, auto-generated 'PRODID': (0, 1, None), 'LABEL': (0, None, None), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject.egg-info/PKG-INFO new/vobject-0.9.5/vobject.egg-info/PKG-INFO --- old/vobject-0.9.4.1/vobject.egg-info/PKG-INFO 2017-01-22 20:41:15.000000000 +0100 +++ new/vobject-0.9.5/vobject.egg-info/PKG-INFO 2017-06-29 20:59:22.000000000 +0200 @@ -1,12 +1,12 @@ Metadata-Version: 1.1 Name: vobject -Version: 0.9.4.1 +Version: 0.9.5 Summary: A full-featured Python package for parsing and creating iCalendar and vCard files Home-page: http://eventable.github.io/vobject/ Author: Sameen Karim Author-email: [email protected] License: Apache -Download-URL: https://github.com/eventable/vobject/tarball/0.9.4.1 +Download-URL: https://github.com/eventable/vobject/tarball/0.9.5 Description: Description ----------- @@ -22,7 +22,13 @@ Recent changes -------------- - - Pickling/deepcopy hotfix + - Make ics_diff.py work with Python 3 + - Huge changes to text encoding for Python 2/3 compatibility + - Autogenerate DTSTAMP if not provided + - Fix getrruleset() for Python 3 and in the case that addRDate=True + - Update vCard property validation to match specifications + - Handle offset-naive and offset-aware datetimes in recurrence rules + - Improved documentation for multi-value properties For older changes, see - http://eventable.github.io/vobject/#release-history or diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject.egg-info/SOURCES.txt new/vobject-0.9.5/vobject.egg-info/SOURCES.txt --- old/vobject-0.9.4.1/vobject.egg-info/SOURCES.txt 2017-01-22 20:41:15.000000000 +0100 +++ new/vobject-0.9.5/vobject.egg-info/SOURCES.txt 2017-06-29 20:59:23.000000000 +0200 @@ -10,6 +10,8 @@ test_files/freebusy.ics test_files/journal.ics test_files/ms_tzid.ics +test_files/recurrence-offset-naive.ics +test_files/recurrence-without-tz.ics test_files/recurrence.ics test_files/ruby_rrule.ics test_files/silly_test.ics diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vobject-0.9.4.1/vobject.egg-info/pbr.json new/vobject-0.9.5/vobject.egg-info/pbr.json --- old/vobject-0.9.4.1/vobject.egg-info/pbr.json 2017-01-22 20:41:15.000000000 +0100 +++ new/vobject-0.9.5/vobject.egg-info/pbr.json 2017-06-29 20:59:23.000000000 +0200 @@ -1 +1 @@ -{"is_release": false, "git_version": "8de96c6"} \ No newline at end of file +{"is_release": false, "git_version": "bffb99c"} \ No newline at end of file
