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


Reply via email to