Hello community,

here is the log from the commit of package python-oslo.versionedobjects for 
openSUSE:Factory checked in at 2020-06-05 20:15:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.versionedobjects (Old)
 and      /work/SRC/openSUSE:Factory/.python-oslo.versionedobjects.new.3606 
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-oslo.versionedobjects"

Fri Jun  5 20:15:37 2020 rev:10 rq:803602 version:2.0.2

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-oslo.versionedobjects/python-oslo.versionedobjects.changes
        2020-03-24 22:32:22.597090327 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-oslo.versionedobjects.new.3606/python-oslo.versionedobjects.changes
      2020-06-05 20:19:39.659753615 +0200
@@ -1,0 +2,17 @@
+Tue May 12 09:50:26 UTC 2020 - [email protected]
+
+- update to version 2.0.2
+  - tox: Keeping going with docs
+  - Drop use of six
+  - Bump to hacking 2.x
+  - Use unittest.mock instead of third party mock
+  - remove outdated header
+  - Import ABCs from collections.abc
+  - [ussuri][goal] Drop python 2.7 support and testing
+  - Migrate grenade jobs to py3
+  - Provide stable getargspec() behavior for method fingerprinting
+  - Update master for stable/train
+  - Handle unregistered nested objects
+  - gitignore: Ignore reno artefacts
+
+-------------------------------------------------------------------

Old:
----
  oslo.versionedobjects-1.36.1.tar.gz

New:
----
  oslo.versionedobjects-2.0.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-oslo.versionedobjects.spec ++++++
--- /var/tmp/diff_new_pack.flb9Fo/_old  2020-06-05 20:19:40.835757613 +0200
+++ /var/tmp/diff_new_pack.flb9Fo/_new  2020-06-05 20:19:40.839757627 +0200
@@ -17,13 +17,13 @@
 
 
 Name:           python-oslo.versionedobjects
-Version:        1.36.1
+Version:        2.0.2
 Release:        0
 Summary:        Oslo Versioned Objects library
 License:        Apache-2.0
 Group:          Development/Languages/Python
 URL:            https://launchpad.net/oslo.versionedobjects
-Source0:        
https://files.pythonhosted.org/packages/source/o/oslo.versionedobjects/oslo.versionedobjects-1.36.1.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/o/oslo.versionedobjects/oslo.versionedobjects-2.0.2.tar.gz
 BuildRequires:  openstack-macros
 BuildRequires:  python3-iso8601 >= 0.1.11
 BuildRequires:  python3-jsonschema
@@ -62,7 +62,7 @@
 Requires:       python3-oslo.messaging >= 5.29.0
 Requires:       python3-oslo.serialization >= 2.18.0
 Requires:       python3-oslo.utils >= 3.33.0
-Requires:       python3-six >= 1.10.0
+Requires:       python3-six
 
 %description -n python3-oslo.versionedobjects
 oslo.versionedobjects library deals with DB schema being at different versions
@@ -84,7 +84,7 @@
 This package contains documentation files for %{name}.
 
 %prep
-%autosetup -p1 -n oslo.versionedobjects-1.36.1
+%autosetup -p1 -n oslo.versionedobjects-2.0.2
 %py_req_cleanup
 
 %build

++++++ _service ++++++
--- /var/tmp/diff_new_pack.flb9Fo/_old  2020-06-05 20:19:40.871757736 +0200
+++ /var/tmp/diff_new_pack.flb9Fo/_new  2020-06-05 20:19:40.875757750 +0200
@@ -1,8 +1,8 @@
 <services>
   <service mode="disabled" name="renderspec">
-    <param 
name="input-template">https://raw.githubusercontent.com/openstack/rpm-packaging/stable/train/openstack/oslo.versionedobjects/oslo.versionedobjects.spec.j2</param>
+    <param 
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/branch/stable/ussuri/openstack/oslo.versionedobjects/oslo.versionedobjects.spec.j2</param>
     <param name="output-name">python-oslo.versionedobjects.spec</param>
-    <param 
name="requirements">https://raw.githubusercontent.com/openstack/oslo.versionedobjects/stable/train/requirements.txt</param>
+    <param 
name="requirements">https://opendev.org/openstack/oslo.versionedobjects/raw/branch/stable/ussuri/requirements.txt</param>
     <param name="changelog-email">[email protected]</param>
     <param name="changelog-provider">gh,openstack,oslo.versionedobjects</param>
   </service>

++++++ oslo.versionedobjects-1.36.1.tar.gz -> 
oslo.versionedobjects-2.0.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/.zuul.yaml 
new/oslo.versionedobjects-2.0.2/.zuul.yaml
--- old/oslo.versionedobjects-1.36.1/.zuul.yaml 2019-09-04 16:26:00.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/.zuul.yaml  2020-04-07 12:09:53.000000000 
+0200
@@ -4,11 +4,9 @@
         - oslo.versionedobjects-src-grenade-devstack-multinode
     templates:
       - check-requirements
-      - lib-forward-testing
       - lib-forward-testing-python3
       - openstack-lower-constraints-jobs
-      - openstack-python-jobs
-      - openstack-python3-train-jobs
+      - openstack-python3-ussuri-jobs
       - periodic-stable-jobs
       - publish-openstack-docs-pti
       - release-notes-jobs-python3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/AUTHORS 
new/oslo.versionedobjects-2.0.2/AUTHORS
--- old/oslo.versionedobjects-1.36.1/AUTHORS    2019-09-04 16:26:44.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/AUTHORS     2020-04-07 12:11:12.000000000 
+0200
@@ -133,6 +133,7 @@
 Hans Lindgren <[email protected]>
 He Yongli <[email protected]>
 Hengqing Hu <[email protected]>
+HervĂ© Beraud <[email protected]>
 Hirofumi Ichihara <[email protected]>
 Hisaharu Ishii <[email protected]>
 Ian Wienand <[email protected]>
@@ -280,6 +281,7 @@
 Rick Harris <[email protected]>
 Robert Collins <[email protected]>
 Robert Pothier <[email protected]>
+Rodolfo Alonso Hernandez <[email protected]>
 Roman Bogorodskiy <[email protected]>
 Roman Podoliaka <[email protected]>
 Ronald Bradford <[email protected]>
@@ -376,6 +378,7 @@
 Zhongyue Luo <[email protected]>
 andy <[email protected]>
 brian-lamar <[email protected]>
+caoyuan <[email protected]>
 danwent <danwent@dan-xs3-cs>
 [email protected] <>
 fujioka yuuichi <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/ChangeLog 
new/oslo.versionedobjects-2.0.2/ChangeLog
--- old/oslo.versionedobjects-1.36.1/ChangeLog  2019-09-04 16:26:44.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/ChangeLog   2020-04-07 12:11:12.000000000 
+0200
@@ -1,6 +1,34 @@
 CHANGES
 =======
 
+2.0.2
+-----
+
+* Use unittest.mock instead of third party mock
+
+2.0.1
+-----
+
+* remove outdated header
+
+2.0.0
+-----
+
+* Provide stable getargspec() behavior for method fingerprinting
+* Bump to hacking 2.x
+* Drop use of six
+* [ussuri][goal] Drop python 2.7 support and testing
+* Handle unregistered nested objects
+* gitignore: Ignore reno artefacts
+
+1.37.0
+------
+
+* Import ABCs from collections.abc
+* Migrate grenade jobs to py3
+* tox: Keeping going with docs
+* Update master for stable/train
+
 1.36.1
 ------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/PKG-INFO 
new/oslo.versionedobjects-2.0.2/PKG-INFO
--- old/oslo.versionedobjects-1.36.1/PKG-INFO   2019-09-04 16:26:45.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/PKG-INFO    2020-04-07 12:11:12.000000000 
+0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
 Name: oslo.versionedobjects
-Version: 1.36.1
+Version: 2.0.2
 Summary: Oslo Versioned Objects library
 Home-page: https://docs.openstack.org/oslo.versionedobjects/latest/
 Author: OpenStack
@@ -47,8 +47,9 @@
 Classifier: License :: OSI Approved :: Apache Software License
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Requires-Python: >=3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/bindep.txt 
new/oslo.versionedobjects-2.0.2/bindep.txt
--- old/oslo.versionedobjects-1.36.1/bindep.txt 2019-09-04 16:26:00.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/bindep.txt  2020-04-07 12:09:53.000000000 
+0200
@@ -2,8 +2,6 @@
 # see http://docs.openstack.org/infra/bindep/ for additional information.
 
 locales [platform:debian]
-python-dev [platform:dpkg]
-python-devel [platform:rpm]
 python3-all-dev [platform:ubuntu !platform:ubuntu-precise]
 python3-dev [platform:dpkg]
 python3-devel [platform:fedora]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/doc/requirements.txt 
new/oslo.versionedobjects-2.0.2/doc/requirements.txt
--- old/oslo.versionedobjects-1.36.1/doc/requirements.txt       2019-09-04 
16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/doc/requirements.txt        2020-04-07 
12:09:53.000000000 +0200
@@ -3,8 +3,7 @@
 # process, which may cause wedges in the gate later.
 # These are needed for docs generation
 openstackdocstheme>=1.18.1 # Apache-2.0
-sphinx!=1.6.6,!=1.6.7,>=1.6.2,<2.0.0;python_version=='2.7' # BSD
-sphinx!=1.6.6,!=1.6.7,>=1.6.2;python_version>='3.4' # BSD
+sphinx>=1.8.0,!=2.1.0 # BSD
 reno>=2.5.0 # Apache-2.0
 
 mock>=2.0.0 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/lower-constraints.txt 
new/oslo.versionedobjects-2.0.2/lower-constraints.txt
--- old/oslo.versionedobjects-1.36.1/lower-constraints.txt      2019-09-04 
16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/lower-constraints.txt       2020-04-07 
12:09:53.000000000 +0200
@@ -24,8 +24,6 @@
 linecache2==1.0.0
 MarkupSafe==1.0
 mccabe==0.2.1
-mock==2.0.0
-monotonic==0.6
 mox3==0.20.0
 msgpack-python==0.4.0
 netaddr==0.7.18
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/PKG-INFO 
new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/PKG-INFO
--- old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/PKG-INFO    
2019-09-04 16:26:44.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/PKG-INFO     
2020-04-07 12:11:12.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
 Name: oslo.versionedobjects
-Version: 1.36.1
+Version: 2.0.2
 Summary: Oslo Versioned Objects library
 Home-page: https://docs.openstack.org/oslo.versionedobjects/latest/
 Author: OpenStack
@@ -47,8 +47,9 @@
 Classifier: License :: OSI Approved :: Apache Software License
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Requires-Python: >=3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/SOURCES.txt 
new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/SOURCES.txt
--- old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/SOURCES.txt 
2019-09-04 16:26:44.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/SOURCES.txt  
2020-04-07 12:11:12.000000000 +0200
@@ -60,6 +60,7 @@
 playbooks/legacy/oslo.versionedobjects-src-grenade-devstack-multinode/post.yaml
 playbooks/legacy/oslo.versionedobjects-src-grenade-devstack-multinode/run.yaml
 releasenotes/notes/add-reno-996dd44974d53238.yaml
+releasenotes/notes/drop-python27-support-b3e377b0dcfa4f5c.yaml
 releasenotes/source/conf.py
 releasenotes/source/index.rst
 releasenotes/source/ocata.rst
@@ -67,6 +68,7 @@
 releasenotes/source/queens.rst
 releasenotes/source/rocky.rst
 releasenotes/source/stein.rst
+releasenotes/source/train.rst
 releasenotes/source/unreleased.rst
 releasenotes/source/_static/.placeholder
 releasenotes/source/_templates/.placeholder
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/pbr.json 
new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/pbr.json
--- old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/pbr.json    
2019-09-04 16:26:44.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/pbr.json     
2020-04-07 12:11:12.000000000 +0200
@@ -1 +1 @@
-{"git_version": "14ee7e0", "is_release": true}
\ No newline at end of file
+{"git_version": "4d2310b", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/requires.txt 
new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/requires.txt
--- 
old/oslo.versionedobjects-1.36.1/oslo.versionedobjects.egg-info/requires.txt    
    2019-09-04 16:26:44.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo.versionedobjects.egg-info/requires.txt 
2020-04-07 12:11:12.000000000 +0200
@@ -1,4 +1,3 @@
-six>=1.10.0
 oslo.concurrency>=3.26.0
 oslo.config>=5.2.0
 oslo.context>=2.19.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/base.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/base.py
--- old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/base.py      
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/base.py       
2020-04-07 12:09:53.000000000 +0200
@@ -16,15 +16,15 @@
 
 import abc
 import collections
+from collections import abc as collections_abc
 import copy
+import functools
 import logging
 import warnings
 
 import oslo_messaging as messaging
-from oslo_utils import encodeutils
 from oslo_utils import excutils
 from oslo_utils import versionutils as vutils
-import six
 
 from oslo_versionedobjects._i18n import _
 from oslo_versionedobjects import exception
@@ -167,7 +167,7 @@
 # requested action and the result will be returned here.
 def remotable_classmethod(fn):
     """Decorator for remotable classmethods."""
-    @six.wraps(fn)
+    @functools.wraps(fn)
     def wrapper(cls, context, *args, **kwargs):
         if cls.indirection_api:
             version_manifest = obj_tree_get_versions(cls.obj_name())
@@ -199,7 +199,7 @@
 # "orphaned" and remotable methods cannot be called.
 def remotable(fn):
     """Decorator for remotable object methods."""
-    @six.wraps(fn)
+    @functools.wraps(fn)
     def wrapper(self, *args, **kwargs):
         ctxt = self._context
         if ctxt is None:
@@ -314,8 +314,6 @@
                                   field.stringify(getattr(self, name)) or
                                   '<?>'))
                       for name, field in sorted(self.fields.items())]))
-        if six.PY2:
-            repr_str = encodeutils.safe_encode(repr_str, incoming='utf-8')
         return repr_str
 
     def __contains__(self, name):
@@ -743,33 +741,16 @@
                     name in self.obj_extra_fields):
                 yield name
 
-    iterkeys = __iter__
+    keys = __iter__
 
-    def itervalues(self):
+    def values(self):
         for name in self:
             yield getattr(self, name)
 
-    def iteritems(self):
+    def items(self):
         for name in self:
             yield name, getattr(self, name)
 
-    if six.PY3:
-        # NOTE(haypo): Python 3 dictionaries don't have iterkeys(),
-        # itervalues() or iteritems() methods. These methods are provided to
-        # ease the transition from Python 2 to Python 3.
-        keys = iterkeys
-        values = itervalues
-        items = iteritems
-    else:
-        def keys(self):
-            return list(self.iterkeys())
-
-        def values(self):
-            return list(self.itervalues())
-
-        def items(self):
-            return list(self.iteritems())
-
     def __getitem__(self, name):
         return getattr(self, name)
 
@@ -790,7 +771,7 @@
             setattr(self, key, value)
 
 
-class ObjectListBase(collections.Sequence):
+class ObjectListBase(collections_abc.Sequence):
     """Mixin class for lists of objects.
 
     This mixin class can be added as a base class for an object that
@@ -978,8 +959,7 @@
         return entity
 
 
[email protected]_metaclass(abc.ABCMeta)
-class VersionedObjectIndirectionAPI(object):
+class VersionedObjectIndirectionAPI(object, metaclass=abc.ABCMeta):
     def object_action(self, context, objinst, objmethod, args, kwargs):
         """Perform an action on a VersionedObject instance.
 
@@ -1167,7 +1147,11 @@
         else:
             continue
 
-        obj_tree_get_versions(child_cls, tree=tree)
+        try:
+            obj_tree_get_versions(child_cls, tree=tree)
+        except IndexError:
+            raise exception.UnregisteredSubobject(
+                child_objname=child_cls, parent_objname=objname)
     return tree
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/examples/iot_bulb.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/examples/iot_bulb.py
--- old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/examples/iot_bulb.py 
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/examples/iot_bulb.py  
2020-04-07 12:09:53.000000000 +0200
@@ -40,6 +40,7 @@
         'manufactured_on': obj_fields.DateTimeField(),
     }
 
+
 # Now do some basic operations on a light bulb.
 bulb = IOTLightbulb(serial='abc-123', manufactured_on=datetime.now())
 print("The __str__() output of this new object: %s" % bulb)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/exception.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/exception.py
--- old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/exception.py 
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/exception.py  
2020-04-07 12:09:53.000000000 +0200
@@ -22,13 +22,12 @@
 
 """
 
+import functools
 import inspect
 import logging
-import sys
 
 from oslo_config import cfg
 from oslo_utils import excutils
-import six
 import webob.exc
 
 from oslo_versionedobjects._i18n import _
@@ -81,7 +80,7 @@
                         payload.update({'args': cleansed})
 
                         # If f has multiple decorators, they must use
-                        # six.wraps to ensure the name is
+                        # functools.wraps to ensure the name is
                         # propagated.
                         event_type = f.__name__
 
@@ -89,7 +88,7 @@
                                                            event_type,
                                                            payload)
 
-        return six.wraps(f)(wrapped)
+        return functools.wraps(f)(wrapped)
     return inner
 
 
@@ -118,9 +117,7 @@
         if not message:
             try:
                 message = self.msg_fmt % kwargs
-
             except Exception:
-                exc_info = sys.exc_info()
                 # kwargs doesn't match a variable in the message
                 # log the issue and the kwargs
                 LOG.exception('Exception in string format operation')
@@ -128,7 +125,7 @@
                     LOG.error("%s: %s" % (name, value))    # noqa
 
                 if CONF.oslo_versionedobjects.fatal_exception_format_errors:
-                    raise six.reraise(*exc_info)
+                    raise
                 else:
                     # at least get the core message out if something happened
                     message = self.msg_fmt
@@ -189,3 +186,8 @@
 
 class TargetBeforeSubobjectExistedException(VersionedObjectsException):
     msg_fmt = _("No subobject existed at version %(target_version)s")
+
+
+class UnregisteredSubobject(VersionedObjectsException):
+    msg_fmt = _("%(child_objname)s is referenced by %(parent_objname)s but "
+                "is not registered")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/fields.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/fields.py
--- old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/fields.py    
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/fields.py     
2020-04-07 12:09:53.000000000 +0200
@@ -13,14 +13,7 @@
 #    under the License.
 
 import abc
-# TODO(smcginnis) update this once six has support for collections.abc
-# (https://github.com/benjaminp/six/pull/241) or clean up once we drop py2.7.
-try:
-    from collections.abc import Iterable
-    from collections.abc import Mapping
-except ImportError:
-    from collections import Iterable
-    from collections import Mapping
+from collections import abc as collections_abc
 import datetime
 from distutils import versionpredicate
 import re
@@ -32,7 +25,6 @@
 import netaddr
 from oslo_utils import strutils
 from oslo_utils import timeutils
-import six
 
 from oslo_versionedobjects._i18n import _
 from oslo_versionedobjects import _utils
@@ -61,8 +53,7 @@
                    })
 
 
[email protected]_metaclass(abc.ABCMeta)
-class AbstractFieldType(object):
+class AbstractFieldType(object, metaclass=abc.ABCMeta):
     @abc.abstractmethod
     def coerce(self, obj, attr, value):
         """This is called to coerce (if possible) a value on assignment.
@@ -153,9 +144,13 @@
 
     def __repr__(self):
         if isinstance(self._default, set):
+            # TODO(stephenfin): Drop this when we switch from
+            # 'inspect.getargspec' to 'inspect.getfullargspec', since our
+            # hashes will have to change anyway
             # make a py27 and py35 compatible representation. See bug 1771804
-            default = 'set([%s])' % ','.join(sorted([six.text_type(v)
-                                                     for v in self._default]))
+            default = 'set([%s])' % ','.join(
+                sorted([str(v) for v in self._default])
+            )
         else:
             default = str(self._default)
         return '%s(default=%s,nullable=%s)' % (self._type.__class__.__name__,
@@ -269,14 +264,13 @@
     @staticmethod
     def coerce(obj, attr, value):
         # FIXME(danms): We should really try to avoid the need to do this
-        accepted_types = six.integer_types + (float, six.string_types,
-                                              datetime.datetime)
+        accepted_types = (int, float, str, datetime.datetime)
         if isinstance(value, accepted_types):
-            return six.text_type(value)
-        else:
-            raise ValueError(_('A string is required in field %(attr)s, '
-                               'not a %(type)s') %
-                             {'attr': attr, 'type': type(value).__name__})
+            return str(value)
+
+        raise ValueError(_('A string is required in field %(attr)s, '
+                           'not a %(type)s') %
+                         {'attr': attr, 'type': type(value).__name__})
 
     @staticmethod
     def stringify(value):
@@ -391,7 +385,7 @@
 
     @staticmethod
     def coerce(obj, attr, value):
-        if isinstance(value, six.string_types):
+        if isinstance(value, str):
             lowered = value.lower().replace('-', ':')
             if MACAddress._REGEX.match(lowered):
                 return lowered
@@ -405,7 +399,7 @@
 
     @staticmethod
     def coerce(obj, attr, value):
-        if isinstance(value, six.string_types):
+        if isinstance(value, str):
             newvalue = value.lower()
             if PCIAddress._REGEX.match(newvalue):
                 return newvalue
@@ -474,7 +468,7 @@
         super(DateTime, self).__init__(*args, **kwargs)
 
     def coerce(self, obj, attr, value):
-        if isinstance(value, six.string_types):
+        if isinstance(value, str):
             # NOTE(danms): Being tolerant of isotime strings here will help us
             # during our objects transition
             value = timeutils.parse_isotime(value)
@@ -513,7 +507,7 @@
         try:
             return netaddr.IPAddress(value)
         except netaddr.AddrFormatError as e:
-            raise ValueError(six.text_type(e))
+            raise ValueError(str(e))
 
     def from_primitive(self, obj, attr, value):
         return self.coerce(obj, attr, value)
@@ -572,7 +566,7 @@
         try:
             return netaddr.IPNetwork(value)
         except netaddr.AddrFormatError as e:
-            raise ValueError(six.text_type(e))
+            raise ValueError(str(e))
 
 
 class IPV4Network(IPNetwork):
@@ -586,7 +580,7 @@
         try:
             return netaddr.IPNetwork(value, version=4)
         except netaddr.AddrFormatError as e:
-            raise ValueError(six.text_type(e))
+            raise ValueError(str(e))
 
 
 class IPV6Network(IPNetwork):
@@ -600,7 +594,7 @@
         try:
             return netaddr.IPNetwork(value, version=6)
         except netaddr.AddrFormatError as e:
-            raise ValueError(six.text_type(e))
+            raise ValueError(str(e))
 
     def _create_pattern(self):
         ipv6seg = '[0-9a-fA-F]{1,4}'
@@ -651,8 +645,8 @@
 class List(CompoundFieldType):
     def coerce(self, obj, attr, value):
 
-        if (not isinstance(value, Iterable) or
-           isinstance(value, six.string_types + (Mapping,))):
+        if (not isinstance(value, collections_abc.Iterable) or
+                isinstance(value, (str, collections_abc.Mapping))):
             raise ValueError(_('A list is required in field %(attr)s, '
                                'not a %(type)s') %
                              {'attr': attr, 'type': type(value).__name__})
@@ -719,7 +713,7 @@
     This will take care of the conversion while the dict field will make sure
     that we store the raw json-serializable data on the object.
 
-    key_type should return a type that unambiguously responds to six.text_type
+    key_type should return a type that unambiguously responds to str
     so that calling key_type on it yields the same thing.
     """
     def __init__(self, dict_field_name, key_type=int):
@@ -738,8 +732,7 @@
         if val is None:
             setattr(obj, self._fld_name, val)
         else:
-            setattr(obj, self._fld_name,
-                    {six.text_type(k): v for k, v in val.items()})
+            setattr(obj, self._fld_name, {str(k): v for k, v in val.items()})
 
 
 class Set(CompoundFieldType):
@@ -1262,8 +1255,7 @@
         super(CoercedList, self).append(self._coerce_item(len(self) + 1, x))
 
     def extend(self, t):
-        l = len(self)
-        coerced_items = [self._coerce_item(l + index, item)
+        coerced_items = [self._coerce_item(len(self) + index, item)
                          for index, item in enumerate(t)]
         super(CoercedList, self).extend(coerced_items)
 
@@ -1271,8 +1263,7 @@
         super(CoercedList, self).insert(i, self._coerce_item(i, x))
 
     def __iadd__(self, y):
-        l = len(self)
-        coerced_items = [self._coerce_item(l + index, item)
+        coerced_items = [self._coerce_item(len(self) + index, item)
                          for index, item in enumerate(y)]
         return super(CoercedList, self).__iadd__(coerced_items)
 
@@ -1296,12 +1287,8 @@
         return res
 
     def _coerce_item(self, key, item):
-        if not isinstance(key, six.string_types):
-            # NOTE(guohliu) In order to keep compatibility with python3
-            # we need to use six.string_types rather than basestring here,
-            # since six.string_types is a tuple, so we need to pass the
-            # real type in.
-            raise KeyTypeError(six.string_types[0], key)
+        if not isinstance(key, str):
+            raise KeyTypeError(str, key)
         if hasattr(self, "_element_type") and self._element_type is not None:
             att_name = "%s[%s]" % (self._field, key)
             return self._element_type.coerce(self._obj, att_name, item)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/fixture.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/fixture.py
--- old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/fixture.py   
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/fixture.py    
2020-04-07 12:09:53.000000000 +0200
@@ -20,17 +20,18 @@
 
 """
 
+from collections import namedtuple
 from collections import OrderedDict
 import copy
 import datetime
 import hashlib
 import inspect
 import logging
-import mock
-from oslo_utils import versionutils as vutils
-import six
+from unittest import mock
 
 import fixtures
+from oslo_utils import versionutils as vutils
+
 from oslo_versionedobjects import base
 from oslo_versionedobjects import fields
 
@@ -131,7 +132,7 @@
         objinst = self._ser.deserialize_entity(
             context, self._ser.serialize_entity(
                 context, objinst))
-        objmethod = six.text_type(objmethod)
+        objmethod = str(objmethod)
         args, kwargs = self._canonicalize_args(context, args, kwargs)
         original = objinst.obj_clone()
         with mock.patch('oslo_versionedobjects.base.VersionedObject.'
@@ -143,9 +144,9 @@
 
     def object_class_action(self, context, objname, objmethod, objver,
                             args, kwargs):
-        objname = six.text_type(objname)
-        objmethod = six.text_type(objmethod)
-        objver = six.text_type(objver)
+        objname = str(objname)
+        objmethod = str(objmethod)
+        objver = str(objver)
         args, kwargs = self._canonicalize_args(context, args, kwargs)
         cls = base.VersionedObject.obj_class_from_name(objname, objver)
         with mock.patch('oslo_versionedobjects.base.VersionedObject.'
@@ -158,10 +159,9 @@
 
     def object_class_action_versions(self, context, objname, objmethod,
                                      object_versions, args, kwargs):
-        objname = six.text_type(objname)
-        objmethod = six.text_type(objmethod)
-        object_versions = {six.text_type(o): six.text_type(v)
-                           for o, v in object_versions.items()}
+        objname = str(objname)
+        objmethod = str(objmethod)
+        object_versions = {str(o): str(v) for o, v in object_versions.items()}
         args, kwargs = self._canonicalize_args(context, args, kwargs)
         objver = object_versions[objname]
         cls = base.VersionedObject.obj_class_from_name(objname, objver)
@@ -198,6 +198,31 @@
             ','.join(set(self.expected.keys() + self.actual.keys())))
 
 
+CompatArgSpec = namedtuple(
+    'ArgSpec', ('args', 'varargs', 'keywords', 'defaults'))
+
+
+def get_method_spec(method):
+    """Get a stable and compatible method spec.
+
+    Newer features in Python3 (kw-only arguments and annotations) are
+    not supported or representable with inspect.getargspec() but many
+    object hashes are already recorded using that method. This attempts
+    to return something compatible with getargspec() when possible (i.e.
+    when those features are not used), and otherwise just returns the
+    newer getfullargspec() representation.
+    """
+    fullspec = inspect.getfullargspec(method)
+    if any([fullspec.kwonlyargs, fullspec.kwonlydefaults,
+            fullspec.annotations]):
+        # Method uses newer-than-getargspec() features, so return the
+        # newer full spec
+        return fullspec
+    else:
+        return CompatArgSpec(fullspec.args, fullspec.varargs,
+                             fullspec.varkw, fullspec.defaults)
+
+
 class ObjectVersionChecker(object):
     def __init__(self, obj_classes=base.VersionedObjectRegistry.obj_classes()):
         self.obj_classes = obj_classes
@@ -229,7 +254,7 @@
                or isinstance(thing, classmethod):
                 method = self._find_remotable_method(obj_class, thing)
                 if method:
-                    methods.append((name, inspect.getargspec(method)))
+                    methods.append((name, get_method_spec(method)))
         methods.sort()
         # NOTE(danms): Things that need a version bump are any fields
         # and their types, or the signatures of any remotable methods.
@@ -247,7 +272,7 @@
             relevant_data += extra_data_func(obj_class)
 
         fingerprint = '%s-%s' % (obj_class.VERSION, hashlib.md5(
-            six.binary_type(repr(relevant_data).encode())).hexdigest())
+            bytes(repr(relevant_data).encode())).hexdigest())
         return fingerprint
 
     def get_hashes(self, extra_data_func=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/test.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/test.py
--- old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/test.py      
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/test.py       
2020-04-07 12:09:53.000000000 +0200
@@ -23,16 +23,16 @@
 import eventlet  # noqa
 eventlet.monkey_patch(os=False)  # noqa
 
+import functools
 import inspect
-import mock
 import os
+from unittest import mock
 
 import fixtures
 from oslo_concurrency import lockutils
 from oslo_config import cfg
 from oslo_config import fixture as config_fixture
 from oslo_log.fixture import logging_error
-import six
 import testtools
 
 from oslo_versionedobjects.tests import obj_fixtures
@@ -54,7 +54,7 @@
         condition = self.condition
         reason = self.reason
         if inspect.isfunction(func_or_cls):
-            @six.wraps(func_or_cls)
+            @functools.wraps(func_or_cls)
             def wrapped(*args, **kwargs):
                 if condition:
                     raise testtools.TestCase.skipException(reason)
@@ -64,7 +64,7 @@
         elif inspect.isclass(func_or_cls):
             orig_func = getattr(func_or_cls, 'setUp')
 
-            @six.wraps(orig_func)
+            @functools.wraps(orig_func)
             def new_func(self, *args, **kwargs):
                 if condition:
                     raise testtools.TestCase.skipException(reason)
@@ -95,6 +95,7 @@
     mock.Mock.__getattr__ = raise_for_invalid_assert_calls(
         mock.Mock.__getattr__)
 
+
 # NOTE(gibi): needs to be called only once at import time
 # to patch the mock lib
 _patch_mock_to_raise_for_invalid_assert_calls()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_exception.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_exception.py
--- 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_exception.py  
    2019-09-04 16:26:00.000000000 +0200
+++ 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_exception.py   
    2020-04-07 12:09:53.000000000 +0200
@@ -11,13 +11,11 @@
 #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 #    License for the specific language governing permissions and limitations
 #    under the License.
+from unittest import mock
 
 from oslo_versionedobjects import exception
 from oslo_versionedobjects import test
 
-import mock
-
-
 notifier = mock.Mock()
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_fields.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_fields.py
--- old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_fields.py 
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_fields.py  
2020-04-07 12:09:53.000000000 +0200
@@ -14,12 +14,11 @@
 #    under the License.
 
 import datetime
+from unittest import mock
 import warnings
 
 import iso8601
-import mock
 import netaddr
-import six
 import testtools
 
 from oslo_versionedobjects import _utils
@@ -159,8 +158,6 @@
         self.field = fields.StringField()
         self.coerce_good_values = [
             ('foo', 'foo'), (1, '1'), (1.0, '1.0'), (True, 'True')]
-        if six.PY2:
-            self.coerce_good_values += [(long(1), '1')]  # noqa
         self.coerce_bad_values = [None]
         self.to_primitive_values = self.coerce_good_values[0:1]
         self.from_primitive_values = self.coerce_good_values[0:1]
@@ -1061,7 +1058,7 @@
         ex = self.assertRaises(ValueError, self.field.coerce,
                                'obj', 'attr', [{}])
         self.assertEqual('An object of type TestableObject is required '
-                         'in field attr, not a list', six.text_type(ex))
+                         'in field attr, not a list', str(ex))
 
     def test_get_schema(self):
         self.assertEqual(
@@ -1231,7 +1228,7 @@
             self.assertNotRegex(str(invalid_val), pattern)
 
 
-class FakeCounter(six.Iterator):
+class FakeCounter(object):
     def __init__(self):
         self.n = 0
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_fixture.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_fixture.py
--- 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_fixture.py    
    2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_fixture.py 
2020-04-07 12:09:53.000000000 +0200
@@ -16,10 +16,10 @@
 import copy
 import datetime
 import hashlib
+import inspect
+from unittest import mock
 
 import iso8601
-import mock
-import six
 
 from oslo_versionedobjects import base
 from oslo_versionedobjects import exception
@@ -530,7 +530,7 @@
         MyObject.VERSION = '1.1'
         argspec = 'vulpix'
 
-        with mock.patch('inspect.getargspec') as mock_gas:
+        with mock.patch.object(fixture, 'get_method_spec') as mock_gas:
             mock_gas.return_value = argspec
             fp = self.ovc._get_fingerprint(MyObject.__name__)
 
@@ -538,7 +538,7 @@
         exp_methods = sorted([('remotable_method', argspec),
                               ('remotable_classmethod', argspec)])
         expected_relevant_data = (exp_fields, exp_methods)
-        expected_hash = hashlib.md5(six.binary_type(repr(
+        expected_hash = hashlib.md5(bytes(repr(
             expected_relevant_data).encode())).hexdigest()
         expected_fp = '%s-%s' % (MyObject.VERSION, expected_hash)
 
@@ -553,7 +553,7 @@
         MyObject.child_versions = child_versions
         argspec = 'onix'
 
-        with mock.patch('inspect.getargspec') as mock_gas:
+        with mock.patch.object(fixture, 'get_method_spec') as mock_gas:
             mock_gas.return_value = argspec
             fp = self.ovc._get_fingerprint(MyObject.__name__)
 
@@ -564,7 +564,7 @@
             child_versions.items()))
         exp_relevant_data = (exp_fields, exp_methods, exp_child_versions)
 
-        expected_hash = hashlib.md5(six.binary_type(repr(
+        expected_hash = hashlib.md5(bytes(repr(
             exp_relevant_data).encode())).hexdigest()
         expected_fp = '%s-%s' % (MyObject.VERSION, expected_hash)
 
@@ -594,7 +594,7 @@
         exp_extra_data = ExtraDataObj
         exp_relevant_data = (exp_fields, exp_methods, exp_extra_data)
 
-        expected_hash = hashlib.md5(six.binary_type(repr(
+        expected_hash = hashlib.md5(bytes(repr(
             exp_relevant_data).encode())).hexdigest()
         expected_fp = '%s-%s' % (ExtraDataObj.VERSION, expected_hash)
 
@@ -737,3 +737,29 @@
             self.assertEqual(
                 ['a', 'z'],
                 obj.obj_to_primitive()['versioned_object.changes'])
+
+
+class TestMethodSpec(test.TestCase):
+    def setUp(self):
+        super(TestMethodSpec, self).setUp()
+
+        def test_method1(a, b, kw1=123, **kwargs):
+            pass
+
+        def test_method2(a, b, *args):
+            pass
+
+        def test_method3(a, b, *args, kw1=123, **kwargs):
+            pass
+
+        self._test_method1 = test_method1
+        self._test_method2 = test_method2
+        self._test_method3 = test_method3
+
+    def test_method_spec_compat(self):
+        self.assertEqual(inspect.getargspec(self._test_method1),
+                         fixture.get_method_spec(self._test_method1))
+        self.assertEqual(inspect.getargspec(self._test_method2),
+                         fixture.get_method_spec(self._test_method2))
+        self.assertEqual(inspect.getfullargspec(self._test_method3),
+                         fixture.get_method_spec(self._test_method3))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_objects.py 
new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_objects.py
--- 
old/oslo.versionedobjects-1.36.1/oslo_versionedobjects/tests/test_objects.py    
    2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/oslo_versionedobjects/tests/test_objects.py 
2020-04-07 12:09:53.000000000 +0200
@@ -17,9 +17,8 @@
 import jsonschema
 import logging
 import pytz
-import six
+from unittest import mock
 
-import mock
 from oslo_context import context
 from oslo_serialization import jsonutils
 from oslo_utils import timeutils
@@ -858,16 +857,10 @@
                          ['bar', 'foo'])
         self.assertEqual(sorted(obj.keys()),
                          ['bar', 'foo'])
-        self.assertEqual(sorted(obj.iterkeys()),
-                         ['bar', 'foo'])
         self.assertEqual(sorted(obj.values(), key=str),
                          [123, u'text'])
-        self.assertEqual(sorted(obj.itervalues(), key=str),
-                         [123, u'text'])
         self.assertEqual(sorted(obj.items()),
                          [('bar', u'text'), ('foo', 123)])
-        self.assertEqual(sorted(list(obj.iteritems())),
-                         [('bar', u'text'), ('foo', 123)])
         self.assertEqual(dict(obj),
                          {'foo': 123, 'bar': u'text'})
 
@@ -1204,16 +1197,10 @@
     def test_obj_repr_unicode(self):
         obj = MyObj(bar=u'\u0191\u01A1\u01A1')
         # verify the unicode string has been encoded as ASCII if on python 2
-        if six.PY2:
-            self.assertEqual("MyObj(bar='\xc6\x91\xc6\xa1\xc6\xa1',foo=<?>,"
-                             "missing=<?>,mutable_default=<?>,readonly=<?>,"
-                             "rel_object=<?>,rel_objects=<?>,timestamp=<?>)",
-                             repr(obj))
-        else:
-            self.assertEqual("MyObj(bar='\u0191\u01A1\u01A1',foo=<?>,"
-                             "missing=<?>,mutable_default=<?>,readonly=<?>,"
-                             "rel_object=<?>,rel_objects=<?>,timestamp=<?>)",
-                             repr(obj))
+        self.assertEqual("MyObj(bar='\u0191\u01A1\u01A1',foo=<?>,"
+                         "missing=<?>,mutable_default=<?>,readonly=<?>,"
+                         "rel_object=<?>,rel_objects=<?>,timestamp=<?>)",
+                         repr(obj))
 
     def test_obj_make_obj_compatible_with_relationships(self):
         subobj = MyOwnedObject(baz=1)
@@ -1996,11 +1983,11 @@
         thing = {'key': obj}
         primitive = ser.serialize_entity(self.context, thing)
         self.assertEqual(1, len(primitive))
-        for item in six.itervalues(primitive):
+        for item in primitive.values():
             self.assertNotIsInstance(item, base.VersionedObject)
         thing2 = ser.deserialize_entity(self.context, primitive)
         self.assertEqual(1, len(thing2))
-        for item in six.itervalues(thing2):
+        for item in thing2.values():
             self.assertIsInstance(item, MyObj)
 
         # object-action updates dict case
@@ -2354,6 +2341,22 @@
                           'TestChildTwo': '4.56'},
                          tree)
 
+    def test_missing_referenced(self):
+        """Ensure a missing child object is highlighted."""
+        @base.VersionedObjectRegistry.register
+        class TestObjectFoo(base.VersionedObject):
+            VERSION = '1.23'
+            fields = {
+                # note that this object does not exist
+                'child': fields.ObjectField('TestChildBar'),
+            }
+
+        exc = self.assertRaises(exception.UnregisteredSubobject,
+                                base.obj_tree_get_versions,
+                                'TestObjectFoo')
+        self.assertIn('TestChildBar is referenced by TestObjectFoo',
+                      exc.format_message())
+
 
 class TestListObjectConcat(test.TestCase):
     def test_list_object_concat(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/playbooks/legacy/oslo.versionedobjects-src-grenade-devstack-multinode/run.yaml
 
new/oslo.versionedobjects-2.0.2/playbooks/legacy/oslo.versionedobjects-src-grenade-devstack-multinode/run.yaml
--- 
old/oslo.versionedobjects-1.36.1/playbooks/legacy/oslo.versionedobjects-src-grenade-devstack-multinode/run.yaml
     2019-09-04 16:26:00.000000000 +0200
+++ 
new/oslo.versionedobjects-2.0.2/playbooks/legacy/oslo.versionedobjects-src-grenade-devstack-multinode/run.yaml
      2020-04-07 12:09:53.000000000 +0200
@@ -32,6 +32,7 @@
           export PYTHONUNBUFFERED=true
           export DEVSTACK_GATE_TEMPEST=1
           export DEVSTACK_GATE_GRENADE=pullup
+          export DEVSTACK_GATE_USE_PYTHON3=True
           export BRANCH_OVERRIDE=default
           if [ "$BRANCH_OVERRIDE" != "default" ] ; then
               export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/releasenotes/notes/drop-python27-support-b3e377b0dcfa4f5c.yaml
 
new/oslo.versionedobjects-2.0.2/releasenotes/notes/drop-python27-support-b3e377b0dcfa4f5c.yaml
--- 
old/oslo.versionedobjects-1.36.1/releasenotes/notes/drop-python27-support-b3e377b0dcfa4f5c.yaml
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/oslo.versionedobjects-2.0.2/releasenotes/notes/drop-python27-support-b3e377b0dcfa4f5c.yaml
      2020-04-07 12:09:53.000000000 +0200
@@ -0,0 +1,5 @@
+---
+upgrade:
+  - |
+    Support for Python 2.7 has been dropped. The minimum version of Python now
+    supported is Python 3.6.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/releasenotes/source/index.rst 
new/oslo.versionedobjects-2.0.2/releasenotes/source/index.rst
--- old/oslo.versionedobjects-1.36.1/releasenotes/source/index.rst      
2019-09-04 16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/releasenotes/source/index.rst       
2020-04-07 12:09:53.000000000 +0200
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   train
    stein
    rocky
    queens
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.versionedobjects-1.36.1/releasenotes/source/train.rst 
new/oslo.versionedobjects-2.0.2/releasenotes/source/train.rst
--- old/oslo.versionedobjects-1.36.1/releasenotes/source/train.rst      
1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.versionedobjects-2.0.2/releasenotes/source/train.rst       
2020-04-07 12:09:53.000000000 +0200
@@ -0,0 +1,6 @@
+==========================
+Train Series Release Notes
+==========================
+
+.. release-notes::
+   :branch: stable/train
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/requirements.txt 
new/oslo.versionedobjects-2.0.2/requirements.txt
--- old/oslo.versionedobjects-1.36.1/requirements.txt   2019-09-04 
16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/requirements.txt    2020-04-07 
12:09:53.000000000 +0200
@@ -1,7 +1,6 @@
 # The order of packages is significant, because pip processes them in the order
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
-six>=1.10.0 # MIT
 oslo.concurrency>=3.26.0 # Apache-2.0
 oslo.config>=5.2.0 # Apache-2.0
 oslo.context>=2.19.2 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/setup.cfg 
new/oslo.versionedobjects-2.0.2/setup.cfg
--- old/oslo.versionedobjects-1.36.1/setup.cfg  2019-09-04 16:26:45.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/setup.cfg   2020-04-07 12:11:12.000000000 
+0200
@@ -6,6 +6,7 @@
 author = OpenStack
 author-email = [email protected]
 home-page = https://docs.openstack.org/oslo.versionedobjects/latest/
+python-requires = >=3.6
 classifier = 
        Environment :: OpenStack
        Intended Audience :: Information Technology
@@ -13,11 +14,11 @@
        License :: OSI Approved :: Apache Software License
        Operating System :: POSIX :: Linux
        Programming Language :: Python
-       Programming Language :: Python :: 2
-       Programming Language :: Python :: 2.7
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.6
        Programming Language :: Python :: 3.7
+       Programming Language :: Python :: 3 :: Only
+       Programming Language :: Python :: Implementation :: CPython
 
 [files]
 packages = 
@@ -41,9 +42,6 @@
 mapping_file = babel.cfg
 output_file = oslo_versionedobjects/locale/oslo_versionedobjects.pot
 
-[bdist_wheel]
-universal = true
-
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/setup.py 
new/oslo.versionedobjects-2.0.2/setup.py
--- old/oslo.versionedobjects-1.36.1/setup.py   2019-09-04 16:26:00.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/setup.py    2020-04-07 12:09:53.000000000 
+0200
@@ -13,17 +13,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
 import setuptools
 
-# In python < 2.7.4, a lazy loading of package `pbr` will break
-# setuptools if some other modules registered functions in `atexit`.
-# solution from: http://bugs.python.org/issue15881#msg170215
-try:
-    import multiprocessing  # noqa
-except ImportError:
-    pass
-
 setuptools.setup(
     setup_requires=['pbr>=2.0.0'],
     pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/test-requirements.txt 
new/oslo.versionedobjects-2.0.2/test-requirements.txt
--- old/oslo.versionedobjects-1.36.1/test-requirements.txt      2019-09-04 
16:26:00.000000000 +0200
+++ new/oslo.versionedobjects-2.0.2/test-requirements.txt       2020-04-07 
12:09:53.000000000 +0200
@@ -1,14 +1,13 @@
 # The order of packages is significant, because pip processes them in the order
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
-hacking>=1.1.0,<1.2.0 # Apache-2.0
+hacking>=2.0.0,<2.1.0 # Apache-2.0
 oslotest>=3.2.0 # Apache-2.0
 testtools>=2.2.0 # MIT
 coverage!=4.4,>=4.0 # Apache-2.0
 jsonschema>=2.6.0 # MIT
 stestr>=2.0.0 # Apache-2.0
 
-mock>=2.0.0 # BSD
 fixtures>=3.0.0 # Apache-2.0/BSD
 
 # Bandit security code scanner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.versionedobjects-1.36.1/tox.ini 
new/oslo.versionedobjects-2.0.2/tox.ini
--- old/oslo.versionedobjects-1.36.1/tox.ini    2019-09-04 16:26:00.000000000 
+0200
+++ new/oslo.versionedobjects-2.0.2/tox.ini     2020-04-07 12:09:53.000000000 
+0200
@@ -1,6 +1,6 @@
 [tox]
-minversion = 3.1
-envlist = py27,py37,pep8
+minversion = 3.1.1
+envlist = py37,pep8
 basepython = python3
 ignore_basepython_conflict = true
 
@@ -23,14 +23,20 @@
 commands = python setup.py test --coverage 
--coverage-package-name=oslo_versionedobjects --testr-args='{posargs}'
 
 [testenv:docs]
+whitelist_externals = rm
 deps =
   
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
   -r{toxinidir}/doc/requirements.txt
-commands = sphinx-build -W -b html doc/source doc/build/html
+commands =
+  rm -fr doc/build
+  sphinx-build -W --keep-going -b html doc/source doc/build/html
 
 [testenv:releasenotes]
+whitelist_externals = rm
 deps = {[testenv:docs]deps}
-commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html 
releasenotes/source releasenotes/build/html
+commands =
+  rm -rf releasenotes/build
+  sphinx-build -a -E -W -d releasenotes/build/doctrees --keep-going -b html 
releasenotes/source releasenotes/build/html
 
 [testenv:lower-constraints]
 deps =
@@ -40,8 +46,9 @@
 
 [flake8]
 # E123, E125 skipped as they are invalid PEP-8.
+# W504 skipped as you must choose this or W503
 show-source = True
-ignore = E123,E125
+ignore = E123,E125,W504
 builtins = _
 exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
 


Reply via email to