Hello community,

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

Package is "python-saharaclient"

Fri Jun  5 20:15:59 2020 rev:14 rq:803607 version:3.1.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-saharaclient/python-saharaclient.changes  
2020-03-24 22:31:47.789072839 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-saharaclient.new.3606/python-saharaclient.changes
        2020-06-05 20:20:01.867829136 +0200
@@ -1,0 +2,12 @@
+Tue May 12 10:05:31 UTC 2020 - [email protected]
+
+- update to version 3.1.0
+  - Update hacking for Python3
+  - Switch to Ussuri jobs
+  - fix: typo in tox minversion option
+  - Cleanup py27 support
+  - [ussuri][goal] Drop python 2.7 support and testing
+  - Fix the "image register" command (OSC 5.2.0 regression)
+  - Update master for stable/train
+
+-------------------------------------------------------------------

Old:
----
  python-saharaclient-2.3.0.tar.gz

New:
----
  python-saharaclient-3.1.0.tar.gz

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

Other differences:
------------------
++++++ python-saharaclient.spec ++++++
--- /var/tmp/diff_new_pack.XTAqI5/_old  2020-06-05 20:20:03.375834264 +0200
+++ /var/tmp/diff_new_pack.XTAqI5/_new  2020-06-05 20:20:03.375834264 +0200
@@ -17,16 +17,16 @@
 
 
 Name:           python-saharaclient
-Version:        2.3.0
+Version:        3.1.0
 Release:        0
 Summary:        Client library for OpenStack Sahara API
 License:        Apache-2.0
 Group:          Development/Languages/Python
 URL:            https://launchpad.net/%{name}
-Source0:        
https://files.pythonhosted.org/packages/source/p/python-saharaclient/python-saharaclient-2.3.0.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/p/python-saharaclient/python-saharaclient-3.1.0.tar.gz
 BuildRequires:  openstack-macros
 BuildRequires:  python3-mock
-BuildRequires:  python3-osc-lib >= 1.11.0
+BuildRequires:  python3-osc-lib >= 2.0.0
 BuildRequires:  python3-oslo.i18n >= 3.15.3
 BuildRequires:  python3-oslo.log >= 3.36.0
 BuildRequires:  python3-oslo.serialization >= 2.18.0
@@ -48,8 +48,8 @@
 Group:          Development/Languages/Python
 Requires:       python3-Babel >= 2.3.4
 Requires:       python3-keystoneauth1 >= 3.4.0
-Requires:       python3-openstackclient >= 3.12.0
-Requires:       python3-osc-lib >= 1.11.0
+Requires:       python3-openstackclient >= 5.2.0
+Requires:       python3-osc-lib >= 2.0.0
 Requires:       python3-oslo.i18n >= 3.15.3
 Requires:       python3-oslo.log >= 3.36.0
 Requires:       python3-oslo.serialization >= 2.18.0
@@ -72,7 +72,7 @@
 Python client library for interacting with OpenStack Sahara API.
 
 %prep
-%autosetup -p1 -n python-saharaclient-2.3.0
+%autosetup -p1 -n python-saharaclient-3.1.0
 %py_req_cleanup
 
 %build
@@ -82,7 +82,7 @@
 %{py3_install}
 
 # Build HTML docs and man page
-PYTHONPATH=. PBR_VERSION=2.3.0 %sphinx_build -b html -d doc/build/doctrees 
doc/source doc/build/html
+PYTHONPATH=. PBR_VERSION=3.1.0 %sphinx_build -b html -d doc/build/doctrees 
doc/source doc/build/html
 # remove the sphinx-build leftovers
 rm -rf doc/build/html/.{doctrees,buildinfo}
 

++++++ _service ++++++
--- /var/tmp/diff_new_pack.XTAqI5/_old  2020-06-05 20:20:03.403834359 +0200
+++ /var/tmp/diff_new_pack.XTAqI5/_new  2020-06-05 20:20:03.403834359 +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/python-saharaclient/python-saharaclient.spec.j2</param>
+    <param 
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/branch/stable/ussuri/openstack/python-saharaclient/python-saharaclient.spec.j2</param>
     <param name="output-name">python-saharaclient.spec</param>
-    <param 
name="requirements">https://raw.githubusercontent.com/openstack/python-saharaclient/stable/train/requirements.txt</param>
+    <param 
name="requirements">https://opendev.org/openstack/python-saharaclient/raw/branch/stable/ussuri/requirements.txt</param>
     <param name="changelog-email">[email protected]</param>
     <param name="changelog-provider">gh,openstack,python-saharaclient</param>
   </service>

++++++ python-saharaclient-2.3.0.tar.gz -> python-saharaclient-3.1.0.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/.zuul.yaml 
new/python-saharaclient-3.1.0/.zuul.yaml
--- old/python-saharaclient-2.3.0/.zuul.yaml    2019-09-13 17:04:39.000000000 
+0200
+++ new/python-saharaclient-3.1.0/.zuul.yaml    2020-04-09 12:50:07.000000000 
+0200
@@ -2,8 +2,7 @@
     templates:
       - openstack-cover-jobs
       - openstack-lower-constraints-jobs
-      - openstack-python-jobs
-      - openstack-python3-train-jobs
+      - openstack-python3-ussuri-jobs
       - publish-openstack-docs-pti
       - check-requirements
       - release-notes-jobs-python3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/AUTHORS 
new/python-saharaclient-3.1.0/AUTHORS
--- old/python-saharaclient-2.3.0/AUTHORS       2019-09-13 17:05:41.000000000 
+0200
+++ new/python-saharaclient-3.1.0/AUTHORS       2020-04-09 12:51:47.000000000 
+0200
@@ -77,6 +77,7 @@
 daohanli <[email protected]>
 henriquetruta <[email protected]>
 jiasen.lin <[email protected]>
+kangyufei <[email protected]>
 kavithahr <[email protected]>
 llg8212 <[email protected]>
 luhuichun <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/ChangeLog 
new/python-saharaclient-3.1.0/ChangeLog
--- old/python-saharaclient-2.3.0/ChangeLog     2019-09-13 17:05:41.000000000 
+0200
+++ new/python-saharaclient-3.1.0/ChangeLog     2020-04-09 12:51:47.000000000 
+0200
@@ -1,6 +1,21 @@
 CHANGES
 =======
 
+3.1.0
+-----
+
+* Cleanup py27 support
+* Update hacking for Python3
+* Fix the "image register" command (OSC 5.2.0 regression)
+
+3.0.0
+-----
+
+* fix: typo in tox minversion option
+* [ussuri][goal] Drop python 2.7 support and testing
+* Switch to Ussuri jobs
+* Update master for stable/train
+
 2.3.0
 -----
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/PKG-INFO 
new/python-saharaclient-3.1.0/PKG-INFO
--- old/python-saharaclient-2.3.0/PKG-INFO      2019-09-13 17:05:42.000000000 
+0200
+++ new/python-saharaclient-3.1.0/PKG-INFO      2020-04-09 12:51:47.000000000 
+0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
 Name: python-saharaclient
-Version: 2.3.0
+Version: 3.1.0
 Summary: Client library for Sahara API
 Home-page: https://docs.openstack.org/python-saharaclient/latest/
 Author: OpenStack
@@ -59,8 +59,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 :: Implementation :: CPython
+Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Requires-Python: >=3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/doc/requirements.txt 
new/python-saharaclient-3.1.0/doc/requirements.txt
--- old/python-saharaclient-2.3.0/doc/requirements.txt  2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/doc/requirements.txt  2020-04-09 
12:50:07.000000000 +0200
@@ -3,5 +3,4 @@
 # process, which may cause wedges in the gate later.
 openstackdocstheme>=1.18.1 # Apache-2.0
 reno>=2.5.0 # 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,!=2.1.0,>=1.6.2;python_version>='3.4' # BSD
+sphinx!=1.6.6,!=1.6.7,!=2.1.0,>=1.6.2 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/lower-constraints.txt 
new/python-saharaclient-3.1.0/lower-constraints.txt
--- old/python-saharaclient-2.3.0/lower-constraints.txt 2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/lower-constraints.txt 2020-04-09 
12:50:07.000000000 +0200
@@ -7,14 +7,12 @@
 coverage==4.0
 cryptography==2.1
 debtcollector==1.2.0
-decorator==3.4.0
+decorator==4.4.0
 deprecation==1.0
 dogpile.cache==0.6.2
 extras==1.0.0
 fixtures==3.0.0
-flake8==2.5.5
 future==0.16.0
-hacking==0.12.0
 idna==2.6
 iso8601==0.1.11
 jmespath==0.9.0
@@ -31,10 +29,10 @@
 munch==2.1.0
 netaddr==0.7.18
 netifaces==0.10.4
-openstacksdk==0.11.2
+openstacksdk==0.36.0
 os-client-config==1.28.0
 os-service-types==1.2.0
-osc-lib==1.11.0
+osc-lib==2.0.0
 oslo.config==5.2.0
 oslo.context==2.19.2
 oslo.i18n==3.15.3
@@ -43,11 +41,9 @@
 oslo.utils==3.33.0
 oslotest==3.2.0
 pbr==2.0.0
-pep8==1.5.7
 positional==1.2.1
 prettytable==0.7.2
 pycparser==2.18
-pyflakes==0.8.1
 pyinotify==0.9.6
 pyOpenSSL==17.1.0
 pyparsing==2.1.0
@@ -58,7 +54,7 @@
 python-keystoneclient==3.8.0
 python-mimeparse==1.6.0
 python-novaclient==9.1.0
-python-openstackclient==3.12.0
+python-openstackclient==5.2.0
 python-subunit==1.0.0
 pytz==2013.6
 PyYAML==3.12
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/python_saharaclient.egg-info/PKG-INFO 
new/python-saharaclient-3.1.0/python_saharaclient.egg-info/PKG-INFO
--- old/python-saharaclient-2.3.0/python_saharaclient.egg-info/PKG-INFO 
2019-09-13 17:05:41.000000000 +0200
+++ new/python-saharaclient-3.1.0/python_saharaclient.egg-info/PKG-INFO 
2020-04-09 12:51:47.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
 Name: python-saharaclient
-Version: 2.3.0
+Version: 3.1.0
 Summary: Client library for Sahara API
 Home-page: https://docs.openstack.org/python-saharaclient/latest/
 Author: OpenStack
@@ -59,8 +59,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 :: Implementation :: CPython
+Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Requires-Python: >=3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/python_saharaclient.egg-info/SOURCES.txt 
new/python-saharaclient-3.1.0/python_saharaclient.egg-info/SOURCES.txt
--- old/python-saharaclient-2.3.0/python_saharaclient.egg-info/SOURCES.txt      
2019-09-13 17:05:42.000000000 +0200
+++ new/python-saharaclient-3.1.0/python_saharaclient.egg-info/SOURCES.txt      
2020-04-09 12:51:47.000000000 +0200
@@ -44,10 +44,12 @@
 releasenotes/notes/autogenerated-cli-docs-c1e89ec6ea66c4a9.yaml
 releasenotes/notes/cli-deprecation-da0e7b6dfe77af52.yaml
 releasenotes/notes/designate-integration-16c59a6b57dbcfa4.yaml
+releasenotes/notes/drop-py2-7-862abe2ec0c32c5f.yaml
 releasenotes/notes/event-logs-c6d286e25dc7d9b1.yaml
 releasenotes/notes/experimental-v2-support-67ccf699e056ed78.yaml
 releasenotes/notes/fields-unset-068db4c3e680c37d.yaml
 releasenotes/notes/fix-job-binary-download-py3-5592eca2345305bd.yaml
+releasenotes/notes/fix-osc-520-regression-a92dff38f04e6a57.yaml
 releasenotes/notes/implement-pagination-2ba52769d240a3ce.yaml
 releasenotes/notes/job-binary-create-optional-bc0f9ee6426c5659.yaml
 releasenotes/notes/job-create-optional-034307a6b5db2cf2.yaml
@@ -77,6 +79,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
@@ -132,7 +135,6 @@
 saharaclient/tests/hacking/__init__.py
 saharaclient/tests/hacking/checks.py
 saharaclient/tests/hacking/commit_message.py
-saharaclient/tests/hacking/import_checks.py
 saharaclient/tests/hacking/logging_checks.py
 saharaclient/tests/unit/__init__.py
 saharaclient/tests/unit/base.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/python_saharaclient.egg-info/pbr.json 
new/python-saharaclient-3.1.0/python_saharaclient.egg-info/pbr.json
--- old/python-saharaclient-2.3.0/python_saharaclient.egg-info/pbr.json 
2019-09-13 17:05:41.000000000 +0200
+++ new/python-saharaclient-3.1.0/python_saharaclient.egg-info/pbr.json 
2020-04-09 12:51:47.000000000 +0200
@@ -1 +1 @@
-{"git_version": "3107b45", "is_release": true}
\ No newline at end of file
+{"git_version": "830d460", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/python_saharaclient.egg-info/requires.txt 
new/python-saharaclient-3.1.0/python_saharaclient.egg-info/requires.txt
--- old/python-saharaclient-2.3.0/python_saharaclient.egg-info/requires.txt     
2019-09-13 17:05:41.000000000 +0200
+++ new/python-saharaclient-3.1.0/python_saharaclient.egg-info/requires.txt     
2020-04-09 12:51:47.000000000 +0200
@@ -1,11 +1,11 @@
 pbr!=2.1.0,>=2.0.0
 Babel!=2.4.0,>=2.3.4
 keystoneauth1>=3.4.0
-osc-lib>=1.11.0
+osc-lib>=2.0.0
 oslo.log>=3.36.0
 oslo.serialization!=2.19.1,>=2.18.0
 oslo.i18n>=3.15.3
 oslo.utils>=3.33.0
-python-openstackclient>=3.12.0
+python-openstackclient>=5.2.0
 requests>=2.14.2
 six>=1.10.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/releasenotes/notes/drop-py2-7-862abe2ec0c32c5f.yaml
 
new/python-saharaclient-3.1.0/releasenotes/notes/drop-py2-7-862abe2ec0c32c5f.yaml
--- 
old/python-saharaclient-2.3.0/releasenotes/notes/drop-py2-7-862abe2ec0c32c5f.yaml
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-saharaclient-3.1.0/releasenotes/notes/drop-py2-7-862abe2ec0c32c5f.yaml
   2020-04-09 12:50:07.000000000 +0200
@@ -0,0 +1,6 @@
+---
+upgrade:
+  - |
+    Python 2.7 support has been dropped. Last release of python-saharaclient
+    to support python 2.7 is OpenStack Train. The minimum version of Python now
+    supported by python-saharaclient is Python 3.6.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/releasenotes/notes/fix-osc-520-regression-a92dff38f04e6a57.yaml
 
new/python-saharaclient-3.1.0/releasenotes/notes/fix-osc-520-regression-a92dff38f04e6a57.yaml
--- 
old/python-saharaclient-2.3.0/releasenotes/notes/fix-osc-520-regression-a92dff38f04e6a57.yaml
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-saharaclient-3.1.0/releasenotes/notes/fix-osc-520-regression-a92dff38f04e6a57.yaml
       2020-04-09 12:50:07.000000000 +0200
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    A change in python-openstackclient 5.2.0 broke the image register command.
+    The incompatibility is now solved but the python-openstackclient
+    requirement has been bumped to 5.2.0.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/releasenotes/source/index.rst 
new/python-saharaclient-3.1.0/releasenotes/source/index.rst
--- old/python-saharaclient-2.3.0/releasenotes/source/index.rst 2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/releasenotes/source/index.rst 2020-04-09 
12:50:07.000000000 +0200
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   train
    stein
    rocky
    queens
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/releasenotes/source/train.rst 
new/python-saharaclient-3.1.0/releasenotes/source/train.rst
--- old/python-saharaclient-2.3.0/releasenotes/source/train.rst 1970-01-01 
01:00:00.000000000 +0100
+++ new/python-saharaclient-3.1.0/releasenotes/source/train.rst 2020-04-09 
12:50:07.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/python-saharaclient-2.3.0/requirements.txt 
new/python-saharaclient-3.1.0/requirements.txt
--- old/python-saharaclient-2.3.0/requirements.txt      2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/requirements.txt      2020-04-09 
12:50:07.000000000 +0200
@@ -6,11 +6,11 @@
 
 Babel!=2.4.0,>=2.3.4 # BSD
 keystoneauth1>=3.4.0 # Apache-2.0
-osc-lib>=1.11.0 # Apache-2.0
+osc-lib>=2.0.0 # Apache-2.0
 oslo.log>=3.36.0 # Apache-2.0
 oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
 oslo.i18n>=3.15.3 # Apache-2.0
 oslo.utils>=3.33.0 # Apache-2.0
-python-openstackclient>=3.12.0 # Apache-2.0
+python-openstackclient>=5.2.0 # Apache-2.0
 requests>=2.14.2 # Apache-2.0
 six>=1.10.0 # MIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/saharaclient/api/base.py 
new/python-saharaclient-3.1.0/saharaclient/api/base.py
--- old/python-saharaclient-2.3.0/saharaclient/api/base.py      2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/api/base.py      2020-04-09 
12:50:07.000000000 +0200
@@ -187,10 +187,10 @@
                 prev = meta.get('prev')
                 next = meta.get('next')
 
-            l = [self.resource_class(self, res)
-                 for res in data]
+            li = [self.resource_class(self, res)
+                  for res in data]
 
-            return Page(l, prev, next, limit)
+            return Page(li, prev, next, limit)
         else:
             self._raise_api_exception(resp)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/api/data_sources.py 
new/python-saharaclient-3.1.0/saharaclient/api/data_sources.py
--- old/python-saharaclient-2.3.0/saharaclient/api/data_sources.py      
2019-09-13 17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/api/data_sources.py      
2020-04-09 12:50:07.000000000 +0200
@@ -93,5 +93,6 @@
 class DataSourceManagerV2(DataSourceManagerV1):
     version = 2
 
+
 # NOTE(jfreud): keep this around for backwards compatibility
 DataSourceManager = DataSourceManagerV1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/saharaclient/api/images.py 
new/python-saharaclient-3.1.0/saharaclient/api/images.py
--- old/python-saharaclient-2.3.0/saharaclient/api/images.py    2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/api/images.py    2020-04-09 
12:50:07.000000000 +0200
@@ -87,5 +87,6 @@
     def delete_tags(self, image_id):
         return self._delete('/images/%s/tags' % image_id)
 
+
 # NOTE(jfreud): keep this around for backwards compatibility
 ImageManager = ImageManagerV1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/api/plugins.py 
new/python-saharaclient-3.1.0/saharaclient/api/plugins.py
--- old/python-saharaclient-2.3.0/saharaclient/api/plugins.py   2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/api/plugins.py   2020-04-09 
12:50:07.000000000 +0200
@@ -87,5 +87,6 @@
         return self._get('/plugins/%s/%s' % (plugin_name, plugin_version),
                          'plugin')
 
+
 # NOTE(jfreud): keep this around for backwards compatibility
 PluginManager = PluginManagerV1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/osc/v1/images.py 
new/python-saharaclient-3.1.0/saharaclient/osc/v1/images.py
--- old/python-saharaclient-2.3.0/saharaclient/osc/v1/images.py 2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/osc/v1/images.py 2020-04-09 
12:50:07.000000000 +0200
@@ -149,8 +149,8 @@
         client = self.app.client_manager.data_processing
         image_client = self.app.client_manager.image
 
-        image_id = osc_utils.find_resource(
-            image_client.images, parsed_args.image).id
+        image_id = image_client.find_image(parsed_args.image,
+                                           ignore_missing=False).id
 
         data = client.images.update_image(
             image_id, user_name=parsed_args.username,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/tests/hacking/checks.py 
new/python-saharaclient-3.1.0/saharaclient/tests/hacking/checks.py
--- old/python-saharaclient-2.3.0/saharaclient/tests/hacking/checks.py  
2019-09-13 17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/tests/hacking/checks.py  
2020-04-09 12:50:07.000000000 +0200
@@ -16,11 +16,8 @@
 import re
 import tokenize
 
-import pep8
-
-from saharaclient.tests.hacking import commit_message
-from saharaclient.tests.hacking import import_checks
-from saharaclient.tests.hacking import logging_checks
+from hacking import core
+import pycodestyle
 
 RE_OSLO_IMPORTS = (re.compile(r"(((from)|(import))\s+oslo\.)"),
                    re.compile(r"(from\s+oslo\s+import)"))
@@ -44,6 +41,7 @@
     return False
 
 
[email protected]
 def import_db_only_in_conductor(logical_line, filename):
     """Check that db calls are only in conductor module and in tests.
 
@@ -63,6 +61,7 @@
                   "sahara/conductor/*")
 
 
[email protected]
 def hacking_no_author_attr(logical_line, tokens):
     """__author__ should not be used.
 
@@ -74,6 +73,7 @@
                    "S362: __author__ should not be used")
 
 
[email protected]
 def check_oslo_namespace_imports(logical_line):
     """Check to prevent old oslo namespace usage.
 
@@ -90,6 +90,7 @@
               logical_line))
 
 
[email protected]
 def dict_constructor_with_list_copy(logical_line):
     """Check to prevent dict constructor with a sequence of key-value pairs.
 
@@ -100,12 +101,13 @@
                   'constructor with a sequence of key-value pairs.')
 
 
[email protected]
 def use_jsonutils(logical_line, filename):
     """Check to prevent importing json in sahara code.
 
     S375
     """
-    if pep8.noqa(logical_line):
+    if pycodestyle.noqa(logical_line):
         return
     if (RE_USE_JSONUTILS_INVALID_LINE.match(logical_line) and
             not RE_USE_JSONUTILS_VALID_LINE.match(logical_line)):
@@ -113,6 +115,7 @@
                  " of json")
 
 
[email protected]
 def no_mutable_default_args(logical_line):
     """Check to prevent mutable default argument in sahara code.
 
@@ -121,18 +124,3 @@
     msg = "S360: Method's default argument shouldn't be mutable!"
     if RE_MUTABLE_DEFAULT_ARGS.match(logical_line):
         yield (0, msg)
-
-
-def factory(register):
-    register(import_db_only_in_conductor)
-    register(hacking_no_author_attr)
-    register(check_oslo_namespace_imports)
-    register(commit_message.OnceGitCheckCommitTitleBug)
-    register(commit_message.OnceGitCheckCommitTitleLength)
-    register(import_checks.hacking_import_groups)
-    register(import_checks.hacking_import_groups_together)
-    register(dict_constructor_with_list_copy)
-    register(logging_checks.no_translate_logs)
-    register(logging_checks.accepted_log_levels)
-    register(use_jsonutils)
-    register(no_mutable_default_args)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/tests/hacking/commit_message.py 
new/python-saharaclient-3.1.0/saharaclient/tests/hacking/commit_message.py
--- old/python-saharaclient-2.3.0/saharaclient/tests/hacking/commit_message.py  
2019-09-13 17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/tests/hacking/commit_message.py  
2020-04-09 12:50:07.000000000 +0200
@@ -59,8 +59,8 @@
     # Changeid|bug|blueprint
     GIT_REGEX = re.compile(
         r'(I[0-9a-f]{8,40})|'
-        '([Bb]ug|[Ll][Pp])[\s\#:]*(\d+)|'
-        '([Bb]lue[Pp]rint|[Bb][Pp])[\s\#:]*([A-Za-z0-9\\-]+)')
+        r'([Bb]ug|[Ll][Pp])[\s\#:]*(\d+)|'
+        r'([Bb]lue[Pp]rint|[Bb][Pp])[\s\#:]*([A-Za-z0-9\\-]+)')
 
     def run_once(self):
         title = self._get_commit_title()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/tests/hacking/import_checks.py 
new/python-saharaclient-3.1.0/saharaclient/tests/hacking/import_checks.py
--- old/python-saharaclient-2.3.0/saharaclient/tests/hacking/import_checks.py   
2019-09-13 17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/tests/hacking/import_checks.py   
1970-01-01 01:00:00.000000000 +0100
@@ -1,450 +0,0 @@
-#  Licensed under the Apache License, Version 2.0 (the "License"); you may
-#  not use this file except in compliance with the License. You may obtain
-#  a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#  License for the specific language governing permissions and limitations
-#  under the License.
-
-import imp
-
-from hacking import core
-
-
-# NOTE(Kezar): This checks a good enough if we have only py2.7 supported.
-# As soon as we'll get py3.x we need to drop it or rewrite. You can read more
-# about it in dev-list archive, topic: "[hacking]proposed rules drop for 1.0"
-def _find_module(module, path=None):
-    mod_base = module
-    parent_path = None
-    while '.' in mod_base:
-            first, _, mod_base = mod_base.partition('.')
-            parent_path = path
-            _, path, _ = imp.find_module(first, path)
-            path = [path]
-    try:
-        _, path, _ = imp.find_module(mod_base, path)
-    except ImportError:
-        # NOTE(bnemec): There are two reasons we might get here: 1) A
-        # non-module import and 2) an import of a namespace module that is
-        # in the same namespace as the current project, which caused us to
-        # recurse into the project namespace but fail to find the third-party
-        # module.  For 1), we won't be able to import it as a module, so we
-        # return the parent module's path, but for 2) the import below should
-        # succeed, so we re-raise the ImportError because the module was
-        # legitimately not found in this path.
-        try:
-            __import__(module)
-        except ImportError:
-            # Non-module import, return the parent path if we have it
-            if parent_path:
-                return parent_path
-            raise
-        raise
-    return path
-
-module_cache = dict()
-
-# List of all Python 2 stdlib modules - anything not in this list will be
-# allowed in either the stdlib or third-party groups to allow for Python 3
-# stdlib additions.
-# The list was generated via the following script, which is a variation on
-# the one found here:
-# 
http://stackoverflow.com/questions/6463918/how-can-i-get-a-list-of-all-the-python-standard-library-modules
-"""
-from distutils import sysconfig
-import os
-import sys
-
-std_lib = sysconfig.get_python_lib(standard_lib=True)
-prefix_len = len(std_lib) + 1
-modules = ''
-line = '['
-mod_list = []
-for top, dirs, files in os.walk(std_lib):
-    for name in files:
-        if 'site-packages' not in top:
-            if name == '__init__.py':
-                full_name = top[prefix_len:].replace('/', '.')
-                mod_list.append(full_name)
-            elif name.endswith('.py'):
-                full_name = top.replace('/', '.') + '.'
-                full_name += name[:-3]
-                full_name = full_name[prefix_len:]
-                mod_list.append(full_name)
-            elif name.endswith('.so') and top.endswith('lib-dynload'):
-                full_name = name[:-3]
-                if full_name.endswith('module'):
-                    full_name = full_name[:-6]
-                mod_list.append(full_name)
-for name in sys.builtin_module_names:
-    mod_list.append(name)
-mod_list.sort()
-for mod in mod_list:
-    if len(line + mod) + 8 > 79:
-        modules += '\n' + line
-        line = '    '
-    line += "'%s', " % mod
-print modules + ']'
-"""
-py2_stdlib = [
-    'BaseHTTPServer', 'Bastion', 'CGIHTTPServer', 'ConfigParser', 'Cookie',
-    'DocXMLRPCServer', 'HTMLParser', 'MimeWriter', 'Queue',
-    'SimpleHTTPServer', 'SimpleXMLRPCServer', 'SocketServer', 'StringIO',
-    'UserDict', 'UserList', 'UserString', '_LWPCookieJar',
-    '_MozillaCookieJar', '__builtin__', '__future__', '__main__',
-    '__phello__.foo', '_abcoll', '_ast', '_bisect', '_bsddb', '_codecs',
-    '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp',
-    '_codecs_kr', '_codecs_tw', '_collections', '_crypt', '_csv',
-    '_ctypes', '_curses', '_curses_panel', '_elementtree', '_functools',
-    '_hashlib', '_heapq', '_hotshot', '_io', '_json', '_locale',
-    '_lsprof', '_multibytecodec', '_multiprocessing', '_osx_support',
-    '_pyio', '_random', '_socket', '_sqlite3', '_sre', '_ssl',
-    '_strptime', '_struct', '_symtable', '_sysconfigdata',
-    '_threading_local', '_warnings', '_weakref', '_weakrefset', 'abc',
-    'aifc', 'antigravity', 'anydbm', 'argparse', 'array', 'ast',
-    'asynchat', 'asyncore', 'atexit', 'audiodev', 'audioop', 'base64',
-    'bdb', 'binascii', 'binhex', 'bisect', 'bsddb', 'bsddb.db',
-    'bsddb.dbobj', 'bsddb.dbrecio', 'bsddb.dbshelve', 'bsddb.dbtables',
-    'bsddb.dbutils', 'bz2', 'cPickle', 'cProfile', 'cStringIO',
-    'calendar', 'cgi', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs',
-    'codeop', 'collections', 'colorsys', 'commands', 'compileall',
-    'compiler', 'compiler.ast', 'compiler.consts', 'compiler.future',
-    'compiler.misc', 'compiler.pyassem', 'compiler.pycodegen',
-    'compiler.symbols', 'compiler.syntax', 'compiler.transformer',
-    'compiler.visitor', 'contextlib', 'cookielib', 'copy', 'copy_reg',
-    'crypt', 'csv', 'ctypes', 'ctypes._endian', 'ctypes.macholib',
-    'ctypes.macholib.dyld', 'ctypes.macholib.dylib',
-    'ctypes.macholib.framework', 'ctypes.util', 'ctypes.wintypes',
-    'curses', 'curses.ascii', 'curses.has_key', 'curses.panel',
-    'curses.textpad', 'curses.wrapper', 'datetime', 'dbhash', 'dbm',
-    'decimal', 'difflib', 'dircache', 'dis', 'distutils',
-    'distutils.archive_util', 'distutils.bcppcompiler',
-    'distutils.ccompiler', 'distutils.cmd', 'distutils.command',
-    'distutils.command.bdist', 'distutils.command.bdist_dumb',
-    'distutils.command.bdist_msi', 'distutils.command.bdist_rpm',
-    'distutils.command.bdist_wininst', 'distutils.command.build',
-    'distutils.command.build_clib', 'distutils.command.build_ext',
-    'distutils.command.build_py', 'distutils.command.build_scripts',
-    'distutils.command.check', 'distutils.command.clean',
-    'distutils.command.config', 'distutils.command.install',
-    'distutils.command.install_data',
-    'distutils.command.install_egg_info',
-    'distutils.command.install_headers', 'distutils.command.install_lib',
-    'distutils.command.install_scripts', 'distutils.command.register',
-    'distutils.command.sdist', 'distutils.command.upload',
-    'distutils.config', 'distutils.core', 'distutils.cygwinccompiler',
-    'distutils.debug', 'distutils.dep_util', 'distutils.dir_util',
-    'distutils.dist', 'distutils.emxccompiler', 'distutils.errors',
-    'distutils.extension', 'distutils.fancy_getopt',
-    'distutils.file_util', 'distutils.filelist', 'distutils.log',
-    'distutils.msvc9compiler', 'distutils.msvccompiler',
-    'distutils.spawn', 'distutils.sysconfig', 'distutils.text_file',
-    'distutils.unixccompiler', 'distutils.util', 'distutils.version',
-    'distutils.versionpredicate', 'dl', 'doctest', 'dumbdbm',
-    'dummy_thread', 'dummy_threading', 'email', 'email._parseaddr',
-    'email.base64mime', 'email.charset', 'email.encoders', 'email.errors',
-    'email.feedparser', 'email.generator', 'email.header',
-    'email.iterators', 'email.message', 'email.mime',
-    'email.mime.application', 'email.mime.audio', 'email.mime.base',
-    'email.mime.image', 'email.mime.message', 'email.mime.multipart',
-    'email.mime.nonmultipart', 'email.mime.text', 'email.parser',
-    'email.quoprimime', 'email.utils', 'encodings', 'encodings.aliases',
-    'encodings.ascii', 'encodings.base64_codec', 'encodings.big5',
-    'encodings.big5hkscs', 'encodings.bz2_codec', 'encodings.charmap',
-    'encodings.cp037', 'encodings.cp1006', 'encodings.cp1026',
-    'encodings.cp1140', 'encodings.cp1250', 'encodings.cp1251',
-    'encodings.cp1252', 'encodings.cp1253', 'encodings.cp1254',
-    'encodings.cp1255', 'encodings.cp1256', 'encodings.cp1257',
-    'encodings.cp1258', 'encodings.cp424', 'encodings.cp437',
-    'encodings.cp500', 'encodings.cp720', 'encodings.cp737',
-    'encodings.cp775', 'encodings.cp850', 'encodings.cp852',
-    'encodings.cp855', 'encodings.cp856', 'encodings.cp857',
-    'encodings.cp858', 'encodings.cp860', 'encodings.cp861',
-    'encodings.cp862', 'encodings.cp863', 'encodings.cp864',
-    'encodings.cp865', 'encodings.cp866', 'encodings.cp869',
-    'encodings.cp874', 'encodings.cp875', 'encodings.cp932',
-    'encodings.cp949', 'encodings.cp950', 'encodings.euc_jis_2004',
-    'encodings.euc_jisx0213', 'encodings.euc_jp', 'encodings.euc_kr',
-    'encodings.gb18030', 'encodings.gb2312', 'encodings.gbk',
-    'encodings.hex_codec', 'encodings.hp_roman8', 'encodings.hz',
-    'encodings.idna', 'encodings.iso2022_jp', 'encodings.iso2022_jp_1',
-    'encodings.iso2022_jp_2', 'encodings.iso2022_jp_2004',
-    'encodings.iso2022_jp_3', 'encodings.iso2022_jp_ext',
-    'encodings.iso2022_kr', 'encodings.iso8859_1', 'encodings.iso8859_10',
-    'encodings.iso8859_11', 'encodings.iso8859_13',
-    'encodings.iso8859_14', 'encodings.iso8859_15',
-    'encodings.iso8859_16', 'encodings.iso8859_2', 'encodings.iso8859_3',
-    'encodings.iso8859_4', 'encodings.iso8859_5', 'encodings.iso8859_6',
-    'encodings.iso8859_7', 'encodings.iso8859_8', 'encodings.iso8859_9',
-    'encodings.johab', 'encodings.koi8_r', 'encodings.koi8_u',
-    'encodings.latin_1', 'encodings.mac_arabic', 'encodings.mac_centeuro',
-    'encodings.mac_croatian', 'encodings.mac_cyrillic',
-    'encodings.mac_farsi', 'encodings.mac_greek', 'encodings.mac_iceland',
-    'encodings.mac_latin2', 'encodings.mac_roman',
-    'encodings.mac_romanian', 'encodings.mac_turkish', 'encodings.mbcs',
-    'encodings.palmos', 'encodings.ptcp154', 'encodings.punycode',
-    'encodings.quopri_codec', 'encodings.raw_unicode_escape',
-    'encodings.rot_13', 'encodings.shift_jis', 'encodings.shift_jis_2004',
-    'encodings.shift_jisx0213', 'encodings.string_escape',
-    'encodings.tis_620', 'encodings.undefined',
-    'encodings.unicode_escape', 'encodings.unicode_internal',
-    'encodings.utf_16', 'encodings.utf_16_be', 'encodings.utf_16_le',
-    'encodings.utf_32', 'encodings.utf_32_be', 'encodings.utf_32_le',
-    'encodings.utf_7', 'encodings.utf_8', 'encodings.utf_8_sig',
-    'encodings.uu_codec', 'encodings.zlib_codec', 'errno', 'exceptions',
-    'fcntl', 'filecmp', 'fileinput', 'fnmatch', 'formatter', 'fpformat',
-    'fractions', 'ftplib', 'functools', 'future_builtins', 'gc', 'gdbm',
-    'genericpath', 'getopt', 'getpass', 'gettext', 'glob', 'grp', 'gzip',
-    'hashlib', 'heapq', 'hmac', 'hotshot', 'hotshot.log', 'hotshot.stats',
-    'hotshot.stones', 'htmlentitydefs', 'htmllib', 'httplib', 'idlelib',
-    'idlelib.AutoComplete', 'idlelib.AutoCompleteWindow',
-    'idlelib.AutoExpand', 'idlelib.Bindings', 'idlelib.CallTipWindow',
-    'idlelib.CallTips', 'idlelib.ClassBrowser', 'idlelib.CodeContext',
-    'idlelib.ColorDelegator', 'idlelib.Debugger', 'idlelib.Delegator',
-    'idlelib.EditorWindow', 'idlelib.FileList', 'idlelib.FormatParagraph',
-    'idlelib.GrepDialog', 'idlelib.HyperParser', 'idlelib.IOBinding',
-    'idlelib.IdleHistory', 'idlelib.MultiCall', 'idlelib.MultiStatusBar',
-    'idlelib.ObjectBrowser', 'idlelib.OutputWindow', 'idlelib.ParenMatch',
-    'idlelib.PathBrowser', 'idlelib.Percolator', 'idlelib.PyParse',
-    'idlelib.PyShell', 'idlelib.RemoteDebugger',
-    'idlelib.RemoteObjectBrowser', 'idlelib.ReplaceDialog',
-    'idlelib.RstripExtension', 'idlelib.ScriptBinding',
-    'idlelib.ScrolledList', 'idlelib.SearchDialog',
-    'idlelib.SearchDialogBase', 'idlelib.SearchEngine',
-    'idlelib.StackViewer', 'idlelib.ToolTip', 'idlelib.TreeWidget',
-    'idlelib.UndoDelegator', 'idlelib.WidgetRedirector',
-    'idlelib.WindowList', 'idlelib.ZoomHeight', 'idlelib.aboutDialog',
-    'idlelib.configDialog', 'idlelib.configHandler',
-    'idlelib.configHelpSourceEdit', 'idlelib.configSectionNameDialog',
-    'idlelib.dynOptionMenuWidget', 'idlelib.idle', 'idlelib.idlever',
-    'idlelib.keybindingDialog', 'idlelib.macosxSupport', 'idlelib.rpc',
-    'idlelib.run', 'idlelib.tabbedpages', 'idlelib.textView', 'ihooks',
-    'imageop', 'imaplib', 'imghdr', 'imp', 'importlib', 'imputil',
-    'inspect', 'io', 'itertools', 'json', 'json.decoder', 'json.encoder',
-    'json.scanner', 'json.tool', 'keyword', 'lib2to3', 'lib2to3.__main__',
-    'lib2to3.btm_matcher', 'lib2to3.btm_utils', 'lib2to3.fixer_base',
-    'lib2to3.fixer_util', 'lib2to3.fixes', 'lib2to3.fixes.fix_apply',
-    'lib2to3.fixes.fix_basestring', 'lib2to3.fixes.fix_buffer',
-    'lib2to3.fixes.fix_callable', 'lib2to3.fixes.fix_dict',
-    'lib2to3.fixes.fix_except', 'lib2to3.fixes.fix_exec',
-    'lib2to3.fixes.fix_execfile', 'lib2to3.fixes.fix_exitfunc',
-    'lib2to3.fixes.fix_filter', 'lib2to3.fixes.fix_funcattrs',
-    'lib2to3.fixes.fix_future', 'lib2to3.fixes.fix_getcwdu',
-    'lib2to3.fixes.fix_has_key', 'lib2to3.fixes.fix_idioms',
-    'lib2to3.fixes.fix_import', 'lib2to3.fixes.fix_imports',
-    'lib2to3.fixes.fix_imports2', 'lib2to3.fixes.fix_input',
-    'lib2to3.fixes.fix_intern', 'lib2to3.fixes.fix_isinstance',
-    'lib2to3.fixes.fix_itertools', 'lib2to3.fixes.fix_itertools_imports',
-    'lib2to3.fixes.fix_long', 'lib2to3.fixes.fix_map',
-    'lib2to3.fixes.fix_metaclass', 'lib2to3.fixes.fix_methodattrs',
-    'lib2to3.fixes.fix_ne', 'lib2to3.fixes.fix_next',
-    'lib2to3.fixes.fix_nonzero', 'lib2to3.fixes.fix_numliterals',
-    'lib2to3.fixes.fix_operator', 'lib2to3.fixes.fix_paren',
-    'lib2to3.fixes.fix_print', 'lib2to3.fixes.fix_raise',
-    'lib2to3.fixes.fix_raw_input', 'lib2to3.fixes.fix_reduce',
-    'lib2to3.fixes.fix_renames', 'lib2to3.fixes.fix_repr',
-    'lib2to3.fixes.fix_set_literal', 'lib2to3.fixes.fix_standarderror',
-    'lib2to3.fixes.fix_sys_exc', 'lib2to3.fixes.fix_throw',
-    'lib2to3.fixes.fix_tuple_params', 'lib2to3.fixes.fix_types',
-    'lib2to3.fixes.fix_unicode', 'lib2to3.fixes.fix_urllib',
-    'lib2to3.fixes.fix_ws_comma', 'lib2to3.fixes.fix_xrange',
-    'lib2to3.fixes.fix_xreadlines', 'lib2to3.fixes.fix_zip',
-    'lib2to3.main', 'lib2to3.patcomp', 'lib2to3.pgen2',
-    'lib2to3.pgen2.conv', 'lib2to3.pgen2.driver', 'lib2to3.pgen2.grammar',
-    'lib2to3.pgen2.literals', 'lib2to3.pgen2.parse', 'lib2to3.pgen2.pgen',
-    'lib2to3.pgen2.token', 'lib2to3.pgen2.tokenize', 'lib2to3.pygram',
-    'lib2to3.pytree', 'lib2to3.refactor', 'linecache', 'linuxaudiodev',
-    'locale', 'logging', 'logging.config', 'logging.handlers', 'macpath',
-    'macurl2path', 'mailbox', 'mailcap', 'markupbase', 'marshal', 'math',
-    'md5', 'mhlib', 'mimetools', 'mimetypes', 'mimify', 'mmap',
-    'modulefinder', 'multifile', 'multiprocessing',
-    'multiprocessing.connection', 'multiprocessing.dummy',
-    'multiprocessing.dummy.connection', 'multiprocessing.forking',
-    'multiprocessing.heap', 'multiprocessing.managers',
-    'multiprocessing.pool', 'multiprocessing.process',
-    'multiprocessing.queues', 'multiprocessing.reduction',
-    'multiprocessing.sharedctypes', 'multiprocessing.synchronize',
-    'multiprocessing.util', 'mutex', 'netrc', 'new', 'nis', 'nntplib',
-    'ntpath', 'nturl2path', 'numbers', 'opcode', 'operator', 'optparse',
-    'os', 'os2emxpath', 'ossaudiodev', 'parser', 'pdb', 'pickle',
-    'pickletools', 'pipes', 'pkgutil', 'plat-linux2.CDROM',
-    'plat-linux2.DLFCN', 'plat-linux2.IN', 'plat-linux2.TYPES',
-    'platform', 'plistlib', 'popen2', 'poplib', 'posix', 'posixfile',
-    'posixpath', 'pprint', 'profile', 'pstats', 'pty', 'pwd',
-    'py_compile', 'pyclbr', 'pydoc', 'pydoc_data', 'pydoc_data.topics',
-    'pyexpat', 'quopri', 'random', 're', 'readline', 'repr', 'resource',
-    'rexec', 'rfc822', 'rlcompleter', 'robotparser', 'runpy', 'sched',
-    'select', 'sets', 'sgmllib', 'sha', 'shelve', 'shlex', 'shutil',
-    'signal', 'site', 'smtpd', 'smtplib', 'sndhdr', 'socket', 'spwd',
-    'sqlite3', 'sqlite3.dbapi2', 'sqlite3.dump', 'sre', 'sre_compile',
-    'sre_constants', 'sre_parse', 'ssl', 'stat', 'statvfs', 'string',
-    'stringold', 'stringprep', 'strop', 'struct', 'subprocess', 'sunau',
-    'sunaudio', 'symbol', 'symtable', 'sys', 'sysconfig', 'syslog',
-    'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios', 'test',
-    'test.test_support', 'textwrap', 'this', 'thread', 'threading',
-    'time', 'timeit', 'timing', 'toaiff', 'token', 'tokenize', 'trace',
-    'traceback', 'tty', 'types', 'unicodedata', 'unittest',
-    'unittest.__main__', 'unittest.case', 'unittest.loader',
-    'unittest.main', 'unittest.result', 'unittest.runner',
-    'unittest.signals', 'unittest.suite', 'unittest.test',
-    'unittest.test.dummy', 'unittest.test.support',
-    'unittest.test.test_assertions', 'unittest.test.test_break',
-    'unittest.test.test_case', 'unittest.test.test_discovery',
-    'unittest.test.test_functiontestcase', 'unittest.test.test_loader',
-    'unittest.test.test_program', 'unittest.test.test_result',
-    'unittest.test.test_runner', 'unittest.test.test_setups',
-    'unittest.test.test_skipping', 'unittest.test.test_suite',
-    'unittest.util', 'urllib', 'urllib2', 'urlparse', 'user', 'uu',
-    'uuid', 'warnings', 'wave', 'weakref', 'webbrowser', 'whichdb',
-    'wsgiref', 'wsgiref.handlers', 'wsgiref.headers',
-    'wsgiref.simple_server', 'wsgiref.util', 'wsgiref.validate', 'xdrlib',
-    'xml', 'xml.dom', 'xml.dom.NodeFilter', 'xml.dom.domreg',
-    'xml.dom.expatbuilder', 'xml.dom.minicompat', 'xml.dom.minidom',
-    'xml.dom.pulldom', 'xml.dom.xmlbuilder', 'xml.etree',
-    'xml.etree.ElementInclude', 'xml.etree.ElementPath',
-    'xml.etree.ElementTree', 'xml.etree.cElementTree', 'xml.parsers',
-    'xml.parsers.expat', 'xml.sax', 'xml.sax._exceptions',
-    'xml.sax.expatreader', 'xml.sax.handler', 'xml.sax.saxutils',
-    'xml.sax.xmlreader', 'xmllib', 'xmlrpclib', 'xxsubtype', 'zipfile', ]
-# Dynamic modules that can't be auto-discovered by the script above
-manual_stdlib = ['os.path', ]
-py2_stdlib.extend(manual_stdlib)
-
-
-def _get_import_type(module):
-    if module in module_cache:
-        return module_cache[module]
-
-    def cache_type(module_type):
-        module_cache[module] = module_type
-        return module_type
-
-    # Check static stdlib list
-    if module in py2_stdlib:
-        return cache_type('stdlib')
-
-    # Check if the module is local
-    try:
-        _find_module(module, ['.'])
-        # If the previous line succeeded then it must be a project module
-        return cache_type('project')
-    except ImportError:
-        pass
-
-    # Otherwise treat it as third-party - this means we may treat some stdlib
-    # modules as third-party, but that's okay because we are allowing
-    # third-party libs in the stdlib section.
-    return cache_type('third-party')
-
-
[email protected]
-def hacking_import_groups(logical_line, blank_before, previous_logical,
-                          indent_level, previous_indent_level, physical_line,
-                          noqa):
-    r"""Check that imports are grouped correctly.
-
-    OpenStack HACKING guide recommendation for imports:
-    imports grouped such that Python standard library imports are together,
-    third party library imports are together, and project imports are
-    together
-
-    Okay: import os\nimport sys\n\nimport six\n\nimport hacking
-    Okay: import six\nimport znon_existent_package
-    Okay: import os\nimport threading
-    S366: import mock\nimport os
-    S366: import hacking\nimport os
-    S366: import hacking\nimport nonexistent
-    S366: import hacking\nimport mock
-    """
-    if (noqa or blank_before > 0 or
-            indent_level != previous_indent_level):
-        return
-
-    normalized_line = core.import_normalize(logical_line.strip()).split()
-    normalized_previous = core.import_normalize(previous_logical.
-                                                strip()).split()
-
-    def compatible(previous, current):
-        if previous == current:
-            return True
-
-    if normalized_line and normalized_line[0] == 'import':
-        current_type = _get_import_type(normalized_line[1])
-        if normalized_previous and normalized_previous[0] == 'import':
-            previous_type = _get_import_type(normalized_previous[1])
-            if not compatible(previous_type, current_type):
-                yield(0, 'S366: imports not grouped correctly '
-                      '(%s: %s, %s: %s)' %
-                      (normalized_previous[1], previous_type,
-                       normalized_line[1], current_type))
-
-
-class ImportGroupData(object):
-    """A class to hold persistent state data for import group checks.
-
-    To verify import grouping, it is necessary to know the current group
-    for the current file.  This can not always be known solely from the
-    current and previous line, so this class can be used to keep track.
-    """
-
-    # NOTE(bnemec): *args is needed because the test code tries to run this
-    # as a flake8 check and passes an argument to it.
-    def __init__(self, *args):
-        self.current_group = None
-        self.current_filename = None
-        self.current_import = None
-
-
-together_data = ImportGroupData()
-
-
[email protected]
-def hacking_import_groups_together(logical_line, blank_lines, indent_level,
-                                   previous_indent_level, line_number,
-                                   physical_line, filename, noqa):
-    r"""Check that like imports are grouped together.
-
-    OpenStack HACKING guide recommendation for imports:
-    Imports should be grouped together by type.
-
-    Okay: import os\nimport sys
-    Okay: try:\n    import foo\nexcept ImportError:\n    pass\n\nimport six
-    Okay: import abc\nimport mock\n\nimport six
-    Okay: import eventlet\neventlet.monkey_patch()\n\nimport copy
-    S367: import mock\n\nimport six
-    S367: import os\n\nimport sys
-    S367: import mock\nimport os\n\nimport sys
-    """
-    if line_number == 1 or filename != together_data.current_filename:
-        together_data.current_group = None
-    together_data.current_filename = filename
-
-    if noqa:
-        return
-
-    def update_current_group(current):
-        together_data.current_group = current
-
-    normalized_line = core.import_normalize(logical_line.strip()).split()
-    if normalized_line:
-        if normalized_line[0] == 'import':
-            current_type = _get_import_type(normalized_line[1])
-            previous_import = together_data.current_import
-            together_data.current_import = normalized_line[1]
-            matched = current_type == together_data.current_group
-            update_current_group(current_type)
-            if (matched and indent_level == previous_indent_level and
-                    blank_lines >= 1):
-                yield(0, 'S367: like imports should be grouped together (%s '
-                      'and %s from %s are separated by whitespace)' %
-                      (previous_import,
-                       together_data.current_import,
-                       current_type))
-        else:
-            # Reset on non-import code
-            together_data.current_group = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/tests/hacking/logging_checks.py 
new/python-saharaclient-3.1.0/saharaclient/tests/hacking/logging_checks.py
--- old/python-saharaclient-2.3.0/saharaclient/tests/hacking/logging_checks.py  
2019-09-13 17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/tests/hacking/logging_checks.py  
2020-04-09 12:50:07.000000000 +0200
@@ -12,6 +12,7 @@
 
 import re
 
+from hacking import core
 
 ALL_LOG_LEVELS = "info|exception|warning|critical|error|debug"
 
@@ -23,6 +24,7 @@
     r"(.)*LOG\.(%(levels)s)\(\s*_\(" % {'levels': ALL_LOG_LEVELS})
 
 
[email protected]
 def no_translate_logs(logical_line, filename):
     """Check for 'LOG.*(_('
 
@@ -40,6 +42,7 @@
         yield (0, msg)
 
 
[email protected]
 def accepted_log_levels(logical_line, filename):
     """In Sahara we use only 5 log levels.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/tests/unit/osc/v1/test_images.py 
new/python-saharaclient-3.1.0/saharaclient/tests/unit/osc/v1/test_images.py
--- old/python-saharaclient-2.3.0/saharaclient/tests/unit/osc/v1/test_images.py 
2019-09-13 17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/tests/unit/osc/v1/test_images.py 
2020-04-09 12:50:07.000000000 +0200
@@ -176,8 +176,8 @@
         self.image_mock.update_image.return_value = mock.Mock(
             image=IMAGE_INFO.copy())
         self.app.client_manager.image = mock.Mock()
-        self.image_client = self.app.client_manager.image.images
-        self.image_client.get.return_value = mock.Mock(id='id')
+        self.image_client = self.app.client_manager.image
+        self.image_client.find_image.return_value = mock.Mock(id='id')
 
         # Command to test
         self.cmd = osc_images.RegisterImage(self.app, None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-saharaclient-2.3.0/saharaclient/tests/unit/osc/v2/test_images.py 
new/python-saharaclient-3.1.0/saharaclient/tests/unit/osc/v2/test_images.py
--- old/python-saharaclient-2.3.0/saharaclient/tests/unit/osc/v2/test_images.py 
2019-09-13 17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/saharaclient/tests/unit/osc/v2/test_images.py 
2020-04-09 12:50:07.000000000 +0200
@@ -176,8 +176,8 @@
         self.image_mock.update_image.return_value = mock.Mock(
             image=IMAGE_INFO.copy())
         self.app.client_manager.image = mock.Mock()
-        self.image_client = self.app.client_manager.image.images
-        self.image_client.get.return_value = mock.Mock(id='id')
+        self.image_client = self.app.client_manager.image
+        self.image_client.find_image.return_value = mock.Mock(id='id')
 
         # Command to test
         self.cmd = osc_images.RegisterImage(self.app, None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/setup.cfg 
new/python-saharaclient-3.1.0/setup.cfg
--- old/python-saharaclient-2.3.0/setup.cfg     2019-09-13 17:05:42.000000000 
+0200
+++ new/python-saharaclient-3.1.0/setup.cfg     2020-04-09 12:51:47.000000000 
+0200
@@ -7,6 +7,7 @@
 author = OpenStack
 author-email = [email protected]
 home-page = https://docs.openstack.org/python-saharaclient/latest/
+python-requires = >=3.6
 classifier = 
        Environment :: OpenStack
        Intended Audience :: Information Technology
@@ -14,15 +15,12 @@
        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 :: Implementation :: CPython
+       Programming Language :: Python :: 3 :: Only
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.6
        Programming Language :: Python :: 3.7
 
-[global]
-setup-hooks = pbr.hooks.setup_hook
-
 [files]
 packages = 
        saharaclient
@@ -162,9 +160,6 @@
        dataprocessing_job_binary_delete = 
saharaclient.osc.v2.job_binaries:DeleteJobBinary
        dataprocessing_job_binary_download = 
saharaclient.osc.v2.job_binaries:DownloadJobBinary
 
-[wheel]
-universal = 1
-
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/setup.py 
new/python-saharaclient-3.1.0/setup.py
--- old/python-saharaclient-2.3.0/setup.py      2019-09-13 17:04:39.000000000 
+0200
+++ new/python-saharaclient-3.1.0/setup.py      2020-04-09 12:50:07.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/python-saharaclient-2.3.0/test-requirements.txt 
new/python-saharaclient-3.1.0/test-requirements.txt
--- old/python-saharaclient-2.3.0/test-requirements.txt 2019-09-13 
17:04:39.000000000 +0200
+++ new/python-saharaclient-3.1.0/test-requirements.txt 2020-04-09 
12:50:07.000000000 +0200
@@ -2,7 +2,7 @@
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
 
-hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
+hacking>=3.0,<3.1.0 # Apache-2.0
 
 coverage!=4.4,>=4.0 # Apache-2.0
 mock>=2.0.0 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-saharaclient-2.3.0/tox.ini 
new/python-saharaclient-3.1.0/tox.ini
--- old/python-saharaclient-2.3.0/tox.ini       2019-09-13 17:04:39.000000000 
+0200
+++ new/python-saharaclient-3.1.0/tox.ini       2020-04-09 12:50:07.000000000 
+0200
@@ -1,9 +1,13 @@
 [tox]
-envlist = py27,py37,pypy,pep8,releasenotes
-minversion = 2.0
+envlist = py37,pypy,pep8,releasenotes
+minversion = 3.1.1
 skipsdist = True
+# this allows tox to infer the base python from the environment name
+# and override any basepython configured in this file
+ignore_basepython_conflict = true
 
 [testenv]
+basepython = python3
 usedevelop = True
 install_command = pip install {opts} {packages}
 setenv =
@@ -23,16 +27,11 @@
 basepython = python3
 commands = oslo_debug_helper -t saharaclient/tests/unit {posargs}
 
-[testenv:debug-py27]
-basepython = python2.7
-commands = oslo_debug_helper -t saharaclient/tests/unit {posargs}
-
 [testenv:debug-py36]
 basepython = python3.6
 commands = oslo_debug_helper -t saharaclient/tests/unit {posargs}
 
 [testenv:cover]
-basepython = python3
 setenv =
   {[testenv]setenv}
   PYTHON=coverage run --source saharaclient --parallel-mode
@@ -45,16 +44,11 @@
   coverage xml -o cover/coverage.xml
   coverage report
 
-[tox:jenkins]
-sitepackages = False
-
 [testenv:pep8]
-basepython = python3
 sitepackages = False
 commands = flake8
 
 [testenv:doc8]
-basepython = python3
 deps =
     
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
     -r{toxinidir}/requirements.txt
@@ -63,11 +57,9 @@
 commands = doc8 doc/source
 
 [testenv:venv]
-basepython = python3
 commands = {posargs}
 
 [testenv:docs]
-basepython = python3
 deps =
     
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
     -r{toxinidir}/requirements.txt
@@ -77,7 +69,6 @@
   sphinx-build -W -b html doc/source doc/build/html
 
 [testenv:releasenotes]
-basepython = python3
 deps =
     
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
     -r{toxinidir}/requirements.txt
@@ -91,11 +82,21 @@
 builtins = _
 exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools
 
-[hacking]
-local-check-factory = saharaclient.tests.hacking.checks.factory
+[flake8:local-plugins]
+extension =
+    S361 = checks:import_db_only_in_conductor
+    S362 = checks:hacking_no_author_attr
+    S363 = checks:check_oslo_namespace_imports
+    S364 = commit_message:OnceGitCheckCommitTitleBug
+    S365 = commit_message:OnceGitCheckCommitTitleLength
+    S368 = checks:dict_constructor_with_list_copy
+    S373 = logging_checks:no_translate_logs
+    S374 = logging_checks:accepted_log_levels
+    S375 = checks:use_jsonutils
+    S360 = checks:no_mutable_default_args
+paths = ./saharaclient/tests/hacking
 
 [testenv:lower-constraints]
-basepython = python3
 deps =
   -c{toxinidir}/lower-constraints.txt
   -r{toxinidir}/test-requirements.txt


Reply via email to