Hello community, here is the log from the commit of package python-keyring for openSUSE:Factory checked in at 2017-01-23 11:29:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-keyring (Old) and /work/SRC/openSUSE:Factory/.python-keyring.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-keyring" Changes: -------- --- /work/SRC/openSUSE:Factory/python-keyring/python-keyring.changes 2016-11-17 12:23:37.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.python-keyring.new/python-keyring.changes 2017-01-23 11:29:47.390538751 +0100 @@ -1,0 +2,15 @@ +Mon Jan 16 18:18:33 UTC 2017 - michael@stroeder.com + +- update copyright year +- update to 10.2 (requires python-setuptools_scm>=1.15.0) + +10.2 +---- +* #259: Allow to set a custom application attribute for + SecretService backend. +10.1 +---- +* #253: Backends now expose a '.name' attribute suitable + for identifying each backend to users. + +------------------------------------------------------------------- Old: ---- keyring-10.0.2.tar.gz New: ---- keyring-10.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-keyring.spec ++++++ --- /var/tmp/diff_new_pack.UWfMzp/_old 2017-01-23 11:29:47.770484883 +0100 +++ /var/tmp/diff_new_pack.UWfMzp/_new 2017-01-23 11:29:47.770484883 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-keyring # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: python-keyring -Version: 10.0.2 +Version: 10.2 Release: 0 Url: https://github.com/jaraco/keyring Summary: Store and access your passwords safely @@ -27,7 +27,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: python-devel >= 2.7 BuildRequires: python-setuptools -BuildRequires: python-setuptools_scm >= 1.9 +BuildRequires: python-setuptools_scm >= 1.15.0 # Test requirements: BuildRequires: python-mock BuildRequires: python-pytest ++++++ keyring-10.0.2.tar.gz -> keyring-10.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/.travis.yml new/keyring-10.2/.travis.yml --- old/keyring-10.0.2/.travis.yml 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/.travis.yml 2017-01-11 05:33:06.000000000 +0100 @@ -22,8 +22,6 @@ branches: except: - skeleton -before_deploy: -- pip install https://dl.dropboxusercontent.com/u/54081/cheeseshop/setuptools_scm-1.14.1b1... deploy: provider: pypi server: https://upload.pypi.org/legacy/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/CHANGES.rst new/keyring-10.2/CHANGES.rst --- old/keyring-10.0.2/CHANGES.rst 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/CHANGES.rst 2017-01-11 05:33:06.000000000 +0100 @@ -1,5 +1,14 @@ -CHANGES -======= +10.2 +---- + +* #259: Allow to set a custom application attribute for + SecretService backend. + +10.1 +---- + +* #253: Backends now expose a '.name' attribute suitable + for identifying each backend to users. 10.0.2 ----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/PKG-INFO new/keyring-10.2/PKG-INFO --- old/keyring-10.0.2/PKG-INFO 2016-10-20 19:24:20.000000000 +0200 +++ new/keyring-10.2/PKG-INFO 2017-01-11 05:33:50.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: keyring -Version: 10.0.2 +Version: 10.2 Summary: Store and access your passwords safely. Home-page: https://github.com/jaraco/keyring Author: Jason R. Coombs @@ -16,6 +16,7 @@ .. image:: https://img.shields.io/travis/jaraco/keyring/master.svg :target: http://travis-ci.org/jaraco/keyring + ======================================= Installing and Using Python Keyring Lib ======================================= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/README.rst new/keyring-10.2/README.rst --- old/keyring-10.0.2/README.rst 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/README.rst 2017-01-11 05:33:06.000000000 +0100 @@ -8,6 +8,7 @@ .. image:: https://img.shields.io/travis/jaraco/keyring/master.svg :target: http://travis-ci.org/jaraco/keyring + ======================================= Installing and Using Python Keyring Lib ======================================= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/appveyor.yml new/keyring-10.2/appveyor.yml --- old/keyring-10.0.2/appveyor.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/keyring-10.2/appveyor.yml 2017-01-11 05:33:06.000000000 +0100 @@ -0,0 +1,19 @@ +environment: + + APPVEYOR: true + + matrix: + - PYTHON: "C:\\Python35-x64" + - PYTHON: "C:\\Python27-x64" + +install: + # symlink python from a directory with a space + - "mklink /d \"C:\\Program Files\\Python\" %PYTHON%" + - "SET PYTHON=\"C:\\Program Files\\Python\"" + - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" + +build: off + +test_script: + - "python -m pip install tox" + - "tox -- -rs -v" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/docs/conf.py new/keyring-10.2/docs/conf.py --- old/keyring-10.0.2/docs/conf.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/docs/conf.py 2017-01-11 05:33:06.000000000 +0100 @@ -20,7 +20,7 @@ master_doc = 'index' link_files = { - 'CHANGES.rst': dict( + '../CHANGES.rst': dict( using=dict( GH='https://github.com', project=project, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/docs/requirements.txt new/keyring-10.2/docs/requirements.txt --- old/keyring-10.0.2/docs/requirements.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/keyring-10.2/docs/requirements.txt 2017-01-11 05:33:06.000000000 +0100 @@ -0,0 +1 @@ +rst.linker diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/backend.py new/keyring-10.2/keyring/backend.py --- old/keyring-10.0.2/keyring/backend.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/backend.py 2017-01-11 05:33:06.000000000 +0100 @@ -66,6 +66,18 @@ cls.priority return not bool(exc) + @properties.ClassProperty + @classmethod + def name(cls): + """ + The keyring name, suitable for display. + + The name is derived from module and class name. + """ + parent, sep, mod_name = cls.__module__.rpartition('.') + mod_name = mod_name.replace('_', ' ') + return ' '.join([mod_name, cls.__name__]) + @abc.abstractmethod def get_password(self, service, username): """Get password of the username for the service diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/backends/SecretService.py new/keyring-10.2/keyring/backends/SecretService.py --- old/keyring-10.0.2/keyring/backends/SecretService.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/backends/SecretService.py 2017-01-11 05:33:06.000000000 +0100 @@ -15,6 +15,7 @@ class Keyring(KeyringBackend): """Secret Service Keyring""" + appid = "python-keyring" @properties.ClassProperty @classmethod @@ -33,10 +34,16 @@ "Unable to initialize SecretService: %s" % e) return 5 - def get_default_collection(self): + def get_preferred_collection(self): + """If self.preferred_collection contains a D-Bus path, the collection + at that address is returned. Otherwise, the default collection is returned. + """ bus = secretstorage.dbus_init() try: - collection = secretstorage.get_default_collection(bus) + if hasattr(self, 'preferred_collection'): + collection = secretstorage.Collection(bus, self.preferred_collection) + else: + collection = secretstorage.get_default_collection(bus) except exceptions.SecretStorageException as e: raise InitError("Failed to create the collection: %s." % e) if collection.is_locked(): @@ -48,7 +55,7 @@ def get_password(self, service, username): """Get password of the username for the service """ - collection = self.get_default_collection() + collection = self.get_preferred_collection() items = collection.search_items( {"username": username, "service": service}) for item in items: @@ -60,9 +67,9 @@ def set_password(self, service, username, password): """Set password for the username of the service """ - collection = self.get_default_collection() + collection = self.get_preferred_collection() attributes = { - "application": "python-keyring", + "application": self.appid, "service": service, "username": username } @@ -72,7 +79,7 @@ def delete_password(self, service, username): """Delete the stored password (only the first one) """ - collection = self.get_default_collection() + collection = self.get_preferred_collection() items = collection.search_items( {"username": username, "service": service}) for item in items: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/backends/Windows.py new/keyring-10.2/keyring/backends/Windows.py --- old/keyring-10.0.2/keyring/backends/Windows.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/backends/Windows.py 2017-01-11 05:33:06.000000000 +0100 @@ -1,7 +1,9 @@ +from __future__ import unicode_literals + import functools from ..py27compat import unicode_str -from ..util import escape, properties +from ..util import properties from ..backend import KeyringBackend from ..errors import PasswordDeleteError, ExceptionRaisedContext @@ -60,7 +62,7 @@ @staticmethod def _compound_name(username, service): - return escape.u('%(username)s@%(service)s') % vars() + return '%(username)s@%(service)s' % vars() def get_password(self, service, username): # first attempt to get the password under the service name diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/backends/fail.py new/keyring-10.2/keyring/backends/fail.py --- old/keyring-10.0.2/keyring/backends/fail.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/backends/fail.py 2017-01-11 05:33:06.000000000 +0100 @@ -15,8 +15,11 @@ priority = 0 def get_password(self, service, username, password=None): - raise RuntimeError("No recommended backend was available. Install the " - "keyrings.alt package if you want to use the non-" - "recommended backends. See README.rst for details.") + msg = ( + "No recommended backend was available. Install the " + "keyrings.alt package if you want to use the non-" + "recommended backends. See README.rst for details." + ) + raise RuntimeError(msg) set_password = delete_pasword = get_password diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/backends/kwallet.py new/keyring-10.2/keyring/backends/kwallet.py --- old/keyring-10.0.2/keyring/backends/kwallet.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/backends/kwallet.py 2017-01-11 05:33:06.000000000 +0100 @@ -12,9 +12,14 @@ class DBusKeyring(KeyringBackend): - """KDE KWallet via D-Bus""" + """ + KDE KWallet 5 via D-Bus + """ appid = 'Python program' + wallet = None + bus_name = 'org.kde.kwalletd5' + object_path = '/modules/kwalletd5' @properties.ClassProperty @classmethod @@ -26,9 +31,11 @@ except dbus.DBusException as exc: raise RuntimeError(exc.get_dbus_message()) try: - bus.get_object('org.kde.kwalletd5', '/modules/kwalletd5') + bus.get_object(cls.bus_name, cls.object_path) except dbus.DBusException: - raise RuntimeError('cannot connect to org.kde.kwalletd5') + tmpl = 'cannot connect to {bus_name}' + msg = tmpl.format(bus_name=cls.bus_name) + raise RuntimeError(msg) return 4.9 def __init__(self, *arg, **kw): @@ -63,7 +70,7 @@ bus = dbus.SessionBus() wId = 0 try: - remote_obj = bus.get_object('org.kde.kwalletd5', '/modules/kwalletd5') + remote_obj = bus.get_object(self.bus_name, self.object_path) self.iface = dbus.Interface(remote_obj, 'org.kde.KWallet') self.handle = self.iface.open( self.iface.networkWallet(), wId, self.appid) @@ -104,3 +111,17 @@ if not self.iface.hasEntry(self.handle, service, username, self.appid): raise PasswordDeleteError("Password not found") self.iface.removeEntry(self.handle, service, username, self.appid) + + +class DBusKeyringKWallet4(DBusKeyring): + """ + KDE KWallet 4 via D-Bus + """ + + bus_name = 'org.kde.kwalletd' + object_path = '/modules/kwalletd' + + @properties.ClassProperty + @classmethod + def priority(cls): + return super(DBusKeyringKWallet4, cls).priority - 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/tests/backends/test_SecretService.py new/keyring-10.2/keyring/tests/backends/test_SecretService.py --- old/keyring-10.0.2/keyring/tests/backends/test_SecretService.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/tests/backends/test_SecretService.py 2017-01-11 05:33:06.000000000 +0100 @@ -12,7 +12,9 @@ def init_keyring(self): print("Testing SecretServiceKeyring; the following " "password prompts are for this keyring") - return SecretService.Keyring() + keyring = SecretService.Keyring() + keyring.preferred_collection = '/org/freedesktop/secrets/collection/session' + return keyring class SecretServiceKeyringUnitTests(unittest.TestCase): def test_supported_no_secretstorage(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/tests/backends/test_Windows.py new/keyring-10.2/keyring/tests/backends/test_Windows.py --- old/keyring-10.0.2/keyring/tests/backends/test_Windows.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/tests/backends/test_Windows.py 2017-01-11 05:33:06.000000000 +0100 @@ -6,20 +6,9 @@ import keyring.backends.Windows from ..test_backend import BackendBasicTests -def is_winvault_supported(): - try: - __import__('win32cred') - has_pywin32 = True - except ImportError: - has_pywin32 = False - return ( - sys.platform in ['win32'] and sys.getwindowsversion().major >= 6 - and has_pywin32 - ) - -@unittest.skipUnless(is_winvault_supported(), - "Need WinVault") +@unittest.skipUnless(keyring.backends.Windows.WinVaultKeyring.viable, + "Needs Windows") class WinVaultKeyringTestCase(BackendBasicTests, unittest.TestCase): def tearDown(self): # clean up any credentials created diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/tests/backends/test_kwallet.py new/keyring-10.2/keyring/tests/backends/test_kwallet.py --- old/keyring-10.0.2/keyring/tests/backends/test_kwallet.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/tests/backends/test_kwallet.py 2017-01-11 05:33:06.000000000 +0100 @@ -1,11 +1,10 @@ -import string import unittest from keyring.backends import kwallet -from ..util import random_string from ..test_backend import BackendBasicTests -@unittest.skipUnless(kwallet.DBusKeyring.viable, "Need DBus") + +@unittest.skipUnless(kwallet.DBusKeyring.viable, "KWallet5 unavailable") class DBusKWalletTestCase(BackendBasicTests, unittest.TestCase): # Remove '@' from service name as this is not supported in service names @@ -66,3 +65,10 @@ ret_password, None, "Not 'None' password returned for username: '%s' on service: '%s'. '%s' != '%s'. Passwords from old folder should be deleted during migration." % (service, username, ret_password, None)) + + +@unittest.skipUnless(kwallet.DBusKeyringKWallet4.viable, + "KWallet4 unavailable") +class DBusKWallet4TestCase(DBusKWalletTestCase): + def init_keyring(self): + return kwallet.DBusKeyringKWallet4() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/tests/test_backend.py new/keyring-10.2/keyring/tests/test_backend.py --- old/keyring-10.0.2/keyring/tests/test_backend.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/tests/test_backend.py 2017-01-11 05:33:06.000000000 +0100 @@ -1,32 +1,34 @@ -# -*- coding: utf-8 -*- -""" -test_backend.py - -Test case for keyring basic function +# coding: utf-8 -created by Kang Zhang 2009-07-14 """ -from __future__ import with_statement +Common test functionality for backends. +""" + +from __future__ import unicode_literals import string -from keyring.util import escape +import pytest + from .util import random_string from keyring import errors # unicode only characters # Sourced from The Quick Brown Fox... Pangrams # http://www.columbia.edu/~fdc/utf8/ -UNICODE_CHARS = escape.u( - """זהכיףסתםלשמועאיךתנצחקרפדעץטובבגן""" - """ξεσκεπάζωτηνψυχοφθόραβδελυγμία""" - """Съешьжеещёэтихмягкихфранцузскихбулокдавыпейчаю""" - """Жълтатадюлябешещастливачепухъткойтоцъфназамръзнакатогьон""" +UNICODE_CHARS = ( + "זהכיףסתםלשמועאיךתנצחקרפדעץטובבגן" + "ξεσκεπάζωτηνψυχοφθόραβδελυγμία" + "Съешьжеещёэтихмягкихфранцузскихбулокдавыпейчаю" + "Жълтатадюлябешещастливачепухъткойтоцъфназамръзнакатогьон" ) # ensure no-ascii chars slip by - watch your editor! assert min(ord(char) for char in UNICODE_CHARS) > 127 +def is_ascii_printable(s): + return all(32 <= ord(c) < 127 for c in s) + class BackendBasicTests(object): """Test for the keyring's basic functions. password_set and password_get """ @@ -51,15 +53,15 @@ keyring = self.keyring # for the non-existent password - self.assertEqual(keyring.get_password(service, username), None) + assert keyring.get_password(service, username) is None # common usage self.set_password(service, username, password) - self.assertEqual(keyring.get_password(service, username), password) + assert keyring.get_password(service, username) == password # for the empty password self.set_password(service, username, "") - self.assertEqual(keyring.get_password(service, username), "") + assert keyring.get_password(service, username) == "" def test_password_set_get(self): password = random_string(20) @@ -79,13 +81,13 @@ service = random_string(20, self.DIFFICULT_CHARS) self.keyring.set_password(service, username, password) self.keyring.delete_password(service, username) - self.assertIsNone(self.keyring.get_password(service, username)) + assert self.keyring.get_password(service, username) is None def test_delete_not_present(self): username = random_string(20, self.DIFFICULT_CHARS) service = random_string(20, self.DIFFICULT_CHARS) - self.assertRaises(errors.PasswordDeleteError, - self.keyring.delete_password, service, username) + with pytest.raises(errors.PasswordDeleteError): + self.keyring.delete_password(service, username) def test_delete_one_in_group(self): username1 = random_string(20, self.DIFFICULT_CHARS) @@ -95,8 +97,10 @@ self.keyring.set_password(service, username1, password) self.set_password(service, username2, password) self.keyring.delete_password(service, username1) - self.assertEqual(self.keyring.get_password( - service, username2), password) + assert self.keyring.get_password(service, username2) == password + + def test_name_property(self): + assert is_ascii_printable(self.keyring.name) def test_unicode_chars(self): password = random_string(20, UNICODE_CHARS) @@ -122,10 +126,7 @@ keyring = self.keyring self.set_password('service1', 'user1', 'password1') self.set_password('service1', 'user2', 'password2') - self.assertEqual(keyring.get_password('service1', 'user1'), - 'password1') - self.assertEqual(keyring.get_password('service1', 'user2'), - 'password2') + assert keyring.get_password('service1', 'user1') == 'password1' + assert keyring.get_password('service1', 'user2') == 'password2' self.set_password('service2', 'user3', 'password3') - self.assertEqual(keyring.get_password('service1', 'user1'), - 'password1') + assert keyring.get_password('service1', 'user1') == 'password1' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring/util/escape.py new/keyring-10.2/keyring/util/escape.py --- old/keyring-10.0.2/keyring/util/escape.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/keyring/util/escape.py 2017-01-11 05:33:06.000000000 +0100 @@ -19,7 +19,7 @@ return chr(c) else: def u(s): - return unicode(s, "unicode_escape") + return s.decode('utf-8') def _unichr(c): return unichr(c) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring.egg-info/PKG-INFO new/keyring-10.2/keyring.egg-info/PKG-INFO --- old/keyring-10.0.2/keyring.egg-info/PKG-INFO 2016-10-20 19:24:20.000000000 +0200 +++ new/keyring-10.2/keyring.egg-info/PKG-INFO 2017-01-11 05:33:50.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: keyring -Version: 10.0.2 +Version: 10.2 Summary: Store and access your passwords safely. Home-page: https://github.com/jaraco/keyring Author: Jason R. Coombs @@ -16,6 +16,7 @@ .. image:: https://img.shields.io/travis/jaraco/keyring/master.svg :target: http://travis-ci.org/jaraco/keyring + ======================================= Installing and Using Python Keyring Lib ======================================= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/keyring.egg-info/SOURCES.txt new/keyring-10.2/keyring.egg-info/SOURCES.txt --- old/keyring-10.0.2/keyring.egg-info/SOURCES.txt 2016-10-20 19:24:20.000000000 +0200 +++ new/keyring-10.2/keyring.egg-info/SOURCES.txt 2017-01-11 05:33:50.000000000 +0100 @@ -3,6 +3,7 @@ .travis.yml CHANGES.rst README.rst +appveyor.yml conftest.py hook-keyring.backend.py pytest.ini @@ -12,6 +13,7 @@ docs/conf.py docs/history.rst docs/index.rst +docs/requirements.txt keyring/__init__.py keyring/__main__.py keyring/backend.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-10.0.2/setup.py new/keyring-10.2/setup.py --- old/keyring-10.0.2/setup.py 2016-10-20 19:23:35.000000000 +0200 +++ new/keyring-10.2/setup.py 2017-01-11 05:33:06.000000000 +0100 @@ -38,7 +38,7 @@ ], }, setup_requires=[ - 'setuptools_scm>=1.9,!=1.13.1,!=1.14.0', + 'setuptools_scm>=1.15.0', ] + wheel, classifiers=[ "Development Status :: 5 - Production/Stable",