Hello community,

here is the log from the commit of package python-keyring for openSUSE:Factory 
checked in at 2017-05-16 14:28:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-keyring (Old)
 and      /work/SRC/openSUSE:Factory/.python-keyring.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-keyring"

Tue May 16 14:28:30 2017 rev:25 rq:492693 version:10.3.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-keyring/python-keyring.changes    
2017-01-23 11:29:47.390538751 +0100
+++ /work/SRC/openSUSE:Factory/.python-keyring.new/python-keyring.changes       
2017-05-16 14:28:31.755281404 +0200
@@ -1,0 +2,18 @@
+Wed May  3 16:03:08 UTC 2017 - toddrme2...@gmail.com
+
+- Implement single-spec version.
+- Fix source URL.
+- Update to version 10.3.2
+  * #267: More leniently unescape lowercased characters as
+    they get re-cased by ConfigParser.
+- Update to version 10.3.1
+  * #266: Use private compatibity model rather than six to
+    avoid the dependency.
+- Update to version 10.3
+  * #264: Implement devpi hook for supplying a password when
+    logging in with `devpi <https://pypi.org/project/devpi>`_
+    client.
+  * #260: For macOS, added initial API support for internet
+    passwords.
+
+-------------------------------------------------------------------

Old:
----
  keyring-10.2.tar.gz

New:
----
  keyring-10.3.2.tar.gz

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

Other differences:
------------------
++++++ python-keyring.spec ++++++
--- /var/tmp/diff_new_pack.HJhbA8/_old  2017-05-16 14:28:32.315202747 +0200
+++ /var/tmp/diff_new_pack.HJhbA8/_new  2017-05-16 14:28:32.319202184 +0200
@@ -16,31 +16,34 @@
 #
 
 
+%bcond_without tests
+
+%{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-keyring
-Version:        10.2
+Version:        10.3.2
 Release:        0
 Url:            https://github.com/jaraco/keyring
 Summary:        Store and access your passwords safely
 License:        Python-2.0 and MIT
 Group:          Development/Languages/Python
-Source:         
https://pypi.io/packages/source/k/keyring/keyring-%{version}.tar.gz
+Source:         
https://files.pythonhosted.org/packages/source/k/keyring/keyring-%{version}.tar.gz
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-BuildRequires:  python-devel >= 2.7
-BuildRequires:  python-setuptools
-BuildRequires:  python-setuptools_scm >= 1.15.0
+BuildRequires:  fdupes
+BuildRequires:  python-rpm-macros
+BuildRequires:  %{python_module devel}
+BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module setuptools_scm >= 1.15.0}
+%if %{with tests}
 # Test requirements:
+BuildRequires:  %{python_module pytest}
+BuildRequires:  %{python_module SecretStorage}
+# Python 2 test requirements:
 BuildRequires:  python-mock
-BuildRequires:  python-pytest
-BuildRequires:  python-tox
-BuildRequires:  python-SecretStorage
-%if 0%{?suse_version} && 0%{?suse_version} <= 1110
-BuildRequires:  python-unittest2
 %endif
 Requires:       python-SecretStorage
 Requires:       python-setuptools
-Requires(post): update-alternatives
-Requires(postun):       update-alternatives
 BuildArch:      noarch
+%python_subpackages
 
 %description
 The Python keyring lib provides a easy way to access the system keyring service
@@ -52,36 +55,26 @@
 sed -i '/^#!/d' keyring/cli.py
 
 %build
-python setup.py build
+%python_build
 
 %install
-python setup.py install --prefix=%{_prefix} --root=%{buildroot}
-
-# update-alternatives
-mv %{buildroot}%{_bindir}/keyring %{buildroot}%{_bindir}/keyring-%{py_ver}
-mkdir -p %{buildroot}%{_sysconfdir}/alternatives
-touch %{buildroot}%{_sysconfdir}/alternatives/keyring
-ln -sf %{_sysconfdir}/alternatives/keyring %{buildroot}%{_bindir}/keyring
+%python_install
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
 
+%if %{with tests}
 %check
-export PYTHONPATH="%{buildroot}%{python_sitelib}:$PYTHONPATH"
-py.test
-
-%post
-update-alternatives \
-        --install %{_bindir}/keyring keyring %{_bindir}/keyring-%{py_ver} 20
-
-%postun
-if [ $1 -eq 0 ] ; then
-        update-alternatives --remove keyring %{_bindir}/keyring-%{py_ver}
-fi
+pushd docs
+%{python_expand export PYTHONPATH="%{buildroot}%{$python_sitelib}"
+py.test-%{$python_bin_suffix} --pyargs keyring.tests
+}
+popd
+%endif
 
-%files
+%files %{python_files}
 %defattr(-,root,root)
 %doc README.rst CHANGES.rst
-%ghost %{_sysconfdir}/alternatives/keyring
-%{_bindir}/keyring
-%{_bindir}/keyring-%{py_ver}
-%{python_sitelib}/*
+%python3_only %{_bindir}/keyring
+%{python_sitelib}/keyring-%{version}-py*.egg-info
+%{python_sitelib}/keyring/
 
 %changelog

++++++ keyring-10.2.tar.gz -> keyring-10.3.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/.travis.yml 
new/keyring-10.3.2/.travis.yml
--- old/keyring-10.2/.travis.yml        2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/.travis.yml      2017-04-10 01:52:47.000000000 +0200
@@ -1,14 +1,12 @@
 language: python
+python:
+  - 2.7
+  - 3.3
+  - 3.4
+  - 3.5
+  - 3.6
 matrix:
   include:
-  - os: linux
-    python: 2.7
-  - os: linux
-    python: 3.3
-  - os: linux
-    python: 3.4
-  - os: linux
-    python: 3.5
   - os: osx
     language: generic
 
@@ -28,8 +26,9 @@
   on:
     tags: true
     all_branches: true
-    python: 3.5
+    python: 3.6
   user: jaraco
   password:
     secure: 
aDqlVdm6FZ8pqLkoDRR2LH3TEz7pBvKH2HhOlSy7OEmopN/36ncql/KvfE0ccpaOES9Xm31a51bUfNjcwb1HVKjfW544C+IoSHctkG1rI5bp3q4rW+4RbQcBZVHUUKR9yQf9ZyikEmoYXi3g+JKcOf9rj+v/32PAfUDzSpFbWik=
   distributions: dists
+  skip_upload_docs: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/CHANGES.rst 
new/keyring-10.3.2/CHANGES.rst
--- old/keyring-10.2/CHANGES.rst        2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/CHANGES.rst      2017-04-10 01:52:47.000000000 +0200
@@ -1,3 +1,25 @@
+10.3.2
+------
+
+* #267: More leniently unescape lowercased characters as
+  they get re-cased by ConfigParser.
+
+10.3.1
+------
+
+* #266: Use private compatibity model rather than six to
+  avoid the dependency.
+
+10.3
+----
+
+* #264: Implement devpi hook for supplying a password when
+  logging in with `devpi <https://pypi.org/project/devpi>`_
+  client.
+
+* #260: For macOS, added initial API support for internet
+  passwords.
+
 10.2
 ----
 
@@ -75,6 +97,9 @@
   users will be prompted to authorize the system Python
   executable and also new Python executables, such as
   those created by virtualenv.
+  #260: No longer does the keyring honor the ``store``
+  attribute on the keyring. Only application passwords
+  are accessible.
 
 8.7
 ---
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/PKG-INFO new/keyring-10.3.2/PKG-INFO
--- old/keyring-10.2/PKG-INFO   2017-01-11 05:33:50.000000000 +0100
+++ new/keyring-10.3.2/PKG-INFO 2017-04-10 01:53:36.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: keyring
-Version: 10.2
+Version: 10.3.2
 Summary: Store and access your passwords safely.
 Home-page: https://github.com/jaraco/keyring
 Author: Jason R. Coombs
@@ -151,6 +151,17 @@
             default-keyring=simplekeyring.SimpleKeyring
             keyring-path=/home/kang/pyworkspace/python-keyring-lib/demo/
         
+        Third-Party Backends
+        ====================
+        
+        In addition to the backends provided by the core keyring package for
+        the most common and secure use cases, there
+        are additional keyring backend implementations available for other
+        use-cases. Simply install them to make them available:
+        
+        - `keyrings.alt <https://pypi.org/project/keyrings.alt>`_ - 
"alternate",
+          less common backends, originally part of the core package, but now
+          available for opt-in.
         
         Write your own keyring backend
         ==============================
@@ -162,6 +173,18 @@
         
         See the ``backend`` module for more detail on the interface of this 
class.
         
+        Keyring employs entry points to allow any third-party package to 
implement
+        backends without any modification to the keyring itself. Those 
interested in
+        creating new backends are encouraged to create new, third-party 
packages
+        in the ``keyrings`` namespace, in a manner modeled by the `keyrings.alt
+        package <https://github.com/jaraco/keyrings.alt>`_. See the 
``setup.py`` file
+        in that project for a hint on how to create the requisite entry points.
+        Backends that prove essential may be considered for inclusion in the 
core
+        library, although the ease of installing these third-party packages 
should
+        mean that extensions may be readily available.
+        
+        If you've created an extension for Keyring, please submit a pull 
request to
+        have your extension mentioned as an available extension.
         
         Set the keyring in runtime
         ==========================
@@ -331,3 +354,4 @@
 Classifier: Programming Language :: Python :: 3.3
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/README.rst new/keyring-10.3.2/README.rst
--- old/keyring-10.2/README.rst 2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/README.rst       2017-04-10 01:52:47.000000000 +0200
@@ -143,6 +143,17 @@
     default-keyring=simplekeyring.SimpleKeyring
     keyring-path=/home/kang/pyworkspace/python-keyring-lib/demo/
 
+Third-Party Backends
+====================
+
+In addition to the backends provided by the core keyring package for
+the most common and secure use cases, there
+are additional keyring backend implementations available for other
+use-cases. Simply install them to make them available:
+
+- `keyrings.alt <https://pypi.org/project/keyrings.alt>`_ - "alternate",
+  less common backends, originally part of the core package, but now
+  available for opt-in.
 
 Write your own keyring backend
 ==============================
@@ -154,6 +165,18 @@
 
 See the ``backend`` module for more detail on the interface of this class.
 
+Keyring employs entry points to allow any third-party package to implement
+backends without any modification to the keyring itself. Those interested in
+creating new backends are encouraged to create new, third-party packages
+in the ``keyrings`` namespace, in a manner modeled by the `keyrings.alt
+package <https://github.com/jaraco/keyrings.alt>`_. See the ``setup.py`` file
+in that project for a hint on how to create the requisite entry points.
+Backends that prove essential may be considered for inclusion in the core
+library, although the ease of installing these third-party packages should
+mean that extensions may be readily available.
+
+If you've created an extension for Keyring, please submit a pull request to
+have your extension mentioned as an available extension.
 
 Set the keyring in runtime
 ==========================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/appveyor.yml 
new/keyring-10.3.2/appveyor.yml
--- old/keyring-10.2/appveyor.yml       2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/appveyor.yml     2017-04-10 01:52:47.000000000 +0200
@@ -17,3 +17,7 @@
 test_script:
   - "python -m pip install tox"
   - "tox -- -rs -v"
+
+branches:
+  except:
+    - skeleton
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/conftest.py 
new/keyring-10.3.2/conftest.py
--- old/keyring-10.2/conftest.py        2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/conftest.py      2017-04-10 01:52:47.000000000 +0200
@@ -1,3 +1,10 @@
+import platform
+
 collect_ignore = [
     "hook-keyring.backend.py",
 ]
+
+if platform.system() != 'Darwin':
+       collect_ignore.append('keyring/backends/_OS_X_API.py')
+
+collect_ignore.append('keyring/devpi_client.py')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/docs/conf.py 
new/keyring-10.3.2/docs/conf.py
--- old/keyring-10.2/docs/conf.py       2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/docs/conf.py     2017-04-10 01:52:47.000000000 +0200
@@ -1,7 +1,12 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
-import pkg_resources
+import os
+import sys
+import subprocess
+
+if 'check_output' not in dir(subprocess):
+       import subprocess32 as subprocess
 
 extensions = [
     'sphinx.ext.autodoc',
@@ -9,31 +14,41 @@
 ]
 
 # General information about the project.
-project = 'keyring'
-copyright = '2015-2016 Jason R. Coombs'
 
-# The short X.Y version.
-version = pkg_resources.require(project)[0].version
+root = os.path.join(os.path.dirname(__file__), '..')
+setup_script = os.path.join(root, 'setup.py')
+fields = ['--name', '--version', '--url', '--author']
+dist_info_cmd = [sys.executable, setup_script] + fields
+output_bytes = subprocess.check_output(dist_info_cmd, cwd=root)
+project, version, url, author = 
output_bytes.decode('utf-8').strip().split('\n')
+
+copyright = '2016 ' + author
+
 # The full version, including alpha/beta/rc tags.
 release = version
 
 master_doc = 'index'
 
 link_files = {
-    '../CHANGES.rst': dict(
-        using=dict(
-            GH='https://github.com',
-            project=project,
-        ),
-        replace=[
-            dict(
-                pattern=r"(Issue )?#(?P<issue>\d+)",
-                url='{GH}/jaraco/{project}/issues/{issue}',
-            ),
-            dict(
-                pattern=r"^(?m)((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n",
-                with_scm="{text}\n{rev[timestamp]:%d %b %Y}\n",
-            ),
-        ],
-    ),
+       '../CHANGES.rst': dict(
+               using=dict(
+                       GH='https://github.com',
+                       project=project,
+                       url=url,
+               ),
+               replace=[
+                       dict(
+                               pattern=r"(Issue )?#(?P<issue>\d+)",
+                               url='{url}/issues/{issue}',
+                       ),
+                       dict(
+                               
pattern=r"^(?m)((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n",
+                               with_scm="{text}\n{rev[timestamp]:%d %b %Y}\n",
+                       ),
+                       dict(
+                               pattern=r"PEP[- ](?P<pep_number>\d+)",
+                               
url='https://www.python.org/dev/peps/pep-{pep_number:0>4}/',
+                       ),
+               ],
+       ),
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring/backends/Windows.py 
new/keyring-10.3.2/keyring/backends/Windows.py
--- old/keyring-10.2/keyring/backends/Windows.py        2017-01-11 
05:33:06.000000000 +0100
+++ new/keyring-10.3.2/keyring/backends/Windows.py      2017-04-10 
01:52:47.000000000 +0200
@@ -2,7 +2,7 @@
 
 import functools
 
-from ..py27compat import unicode_str
+from ..py27compat import text_type
 from ..util import properties
 from ..backend import KeyringBackend
 from ..errors import PasswordDeleteError, ExceptionRaisedContext
@@ -96,7 +96,7 @@
             target = self._compound_name(existing_username, service)
             self._set_password(target, existing_username,
                 existing_pw['CredentialBlob'].decode('utf-16'))
-        self._set_password(service, username, unicode_str(password))
+        self._set_password(service, username, text_type(password))
 
     def _set_password(self, target, username, password):
         credential = dict(Type=win32cred.CRED_TYPE_GENERIC,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring/backends/_OS_X_API.py 
new/keyring-10.3.2/keyring/backends/_OS_X_API.py
--- old/keyring-10.2/keyring/backends/_OS_X_API.py      2017-01-11 
05:33:06.000000000 +0100
+++ new/keyring-10.3.2/keyring/backends/_OS_X_API.py    2017-04-10 
01:52:47.000000000 +0200
@@ -1,7 +1,11 @@
 import contextlib
 import ctypes
+import struct
 from ctypes import c_void_p, c_uint16, c_uint32, c_int32, c_char_p, POINTER
 
+from keyring.py27compat import string_types, add_metaclass
+
+
 sec_keychain_ref = sec_keychain_item_ref = c_void_p
 OS_status = c_int32
 
@@ -109,14 +113,95 @@
     c_uint32,  # pathLength
     c_char_p,  # path
     c_uint16,  # port
-    c_void_p,  # SecProtocolType protocol,
-    c_void_p,  # SecAuthenticationType authenticationType,
+    c_uint32,  # SecProtocolType protocol,
+    c_uint32,  # SecAuthenticationType authenticationType,
     POINTER(c_uint32),  # passwordLength
     POINTER(c_void_p),  # passwordData
     POINTER(sec_keychain_item_ref),  # itemRef
 )
 SecKeychainFindInternetPassword.restype = OS_status
 
+
+class PackedAttributes(type):
+    """
+    Take the attributes which use magic words
+    to represent enumerated constants and generate
+    the constants.
+    """
+    def __new__(cls, name, bases, dict):
+        dict.update(
+            (key, cls.unpack(val))
+            for key, val in dict.items()
+            if not key.startswith('_')
+        )
+        return super(PackedAttributes, cls).__new__(cls, name, bases, dict)
+
+    @staticmethod
+    def unpack(word):
+        r"""
+        >>> PackedAttributes.unpack(0)
+        0
+        >>> PackedAttributes.unpack('\x00\x00\x00\x01')
+        1
+        >>> PackedAttributes.unpack('abcd')
+        1633837924
+        """
+        if not isinstance(word, string_types):
+            return word
+        val, = struct.unpack('!I', word.encode('ascii'))
+        return val
+
+
+@add_metaclass(PackedAttributes)
+class SecProtocolType(object):
+    kSecProtocolTypeHTTP = 'http'
+    kSecProtocolTypeHTTPS = 'htps'
+    kSecProtocolTypeFTP = 'ftp '
+
+
+@add_metaclass(PackedAttributes)
+class SecAuthenticationType(object):
+    """
+    >>> SecAuthenticationType.kSecAuthenticationTypeDefault
+    1684434036
+    """
+    kSecAuthenticationTypeDefault = 'dflt'
+    kSecAuthenticationTypeAny = 0
+
+
+def find_internet_password(kc_name, service, username):
+        username = username.encode('utf-8')
+        domain = None
+        service = service.encode('utf-8')
+        path = None
+        port = 0
+
+        with open(kc_name) as keychain:
+            length = c_uint32()
+            data = c_void_p()
+            status = SecKeychainFindInternetPassword(
+                keychain,
+                len(service), service,
+                0, domain,
+                len(username), username,
+                0, path,
+                port,
+                SecProtocolType.kSecProtocolTypeHTTPS,
+                SecAuthenticationType.kSecAuthenticationTypeAny,
+                length,
+                data,
+                None,
+            )
+
+        msg = "Can't fetch password from system"
+        NotFound.raise_for_status(status, msg)
+
+        password = ctypes.create_string_buffer(length.value)
+        ctypes.memmove(password, data.value, length.value)
+        SecKeychainItemFreeContent(None, data)
+        return password.raw.decode('utf-8')
+
+
 SecKeychainAddGenericPassword = _sec.SecKeychainAddGenericPassword
 SecKeychainAddGenericPassword.argtypes = (
     sec_keychain_ref,
@@ -156,6 +241,52 @@
 
         NotFound.raise_for_status(status, "Unable to set password")
 
+
+SecKeychainAddInternetPassword = _sec.SecKeychainAddInternetPassword
+SecKeychainAddInternetPassword.argtypes = (
+    sec_keychain_ref, # keychainOrArray
+    c_uint32,  # serverNameLength
+    c_char_p,  # serverName
+    c_uint32,  # securityDomainLength
+    c_char_p,  # securityDomain
+    c_uint32,  # accountNameLength
+    c_char_p,  # accountName
+    c_uint32,  # pathLength
+    c_char_p,  # path
+    c_uint16,  # port
+    c_uint32,  # SecProtocolType protocol,
+    c_uint32,  # SecAuthenticationType authenticationType,
+    c_uint32,  # passwordLength
+    c_void_p,  # passwordData
+    POINTER(sec_keychain_item_ref),  # itemRef
+)
+SecKeychainAddInternetPassword.restype = OS_status
+
+
+def set_internet_password(name, service, username, password):
+    username = username.encode('utf-8')
+    domain = None
+    service = service.encode('utf-8')
+    password = password.encode('utf-8')
+    path = None
+    port = 0
+    with open(name) as keychain:
+        # TODO: Use update or set technique as seen in set_generic_password
+        status = SecKeychainAddInternetPassword(
+            keychain,
+            len(service), service,
+            0, domain,
+            len(username), username,
+            0, path,
+            port,
+            SecProtocolType.kSecProtocolTypeHTTPS,
+            SecAuthenticationType.kSecAuthenticationTypeAny,
+            len(password), password,
+            None,
+        )
+
+        NotFound.raise_for_status(status, "Unable to set password")
+
 
 SecKeychainItemModifyAttributesAndData = 
_sec.SecKeychainItemModifyAttributesAndData
 SecKeychainItemModifyAttributesAndData.argtypes = (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring/devpi_client.py 
new/keyring-10.3.2/keyring/devpi_client.py
--- old/keyring-10.2/keyring/devpi_client.py    1970-01-01 01:00:00.000000000 
+0100
+++ new/keyring-10.3.2/keyring/devpi_client.py  2017-04-10 01:52:47.000000000 
+0200
@@ -0,0 +1,10 @@
+from pluggy import HookimplMarker
+
+import keyring
+
+
+hookimpl = HookimplMarker("devpiclient")
+
+@hookimpl()
+def devpiclient_get_password(url, username):
+       return keyring.get_password(url, username)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring/py27compat.py 
new/keyring-10.3.2/keyring/py27compat.py
--- old/keyring-10.2/keyring/py27compat.py      2017-01-11 05:33:06.000000000 
+0100
+++ new/keyring-10.3.2/keyring/py27compat.py    2017-04-10 01:52:47.000000000 
+0200
@@ -13,9 +13,11 @@
     input = input
 
 try:
-    unicode_str = unicode
+    text_type = unicode
+    string_types = unicode, str
 except NameError:
-    unicode_str = str
+    text_type = str
+    string_types = str,
 
 try:
     import cPickle as pickle
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring/util/escape.py 
new/keyring-10.3.2/keyring/util/escape.py
--- old/keyring-10.2/keyring/util/escape.py     2017-01-11 05:33:06.000000000 
+0100
+++ new/keyring-10.3.2/keyring/util/escape.py   2017-04-10 01:52:47.000000000 
+0200
@@ -55,6 +55,6 @@
     """
     re_esc = re.compile(
         # the pattern must be bytes to operate on bytes
-        ESCAPE_FMT.replace('%02X', '(?P<code>[0-9A-F]{2})').encode('ascii')
+        ESCAPE_FMT.replace('%02X', '(?P<code>[0-9A-Fa-f]{2})').encode('ascii')
     )
     return re_esc.sub(_unescape_code, value.encode('ascii')).decode('utf-8')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring.egg-info/PKG-INFO 
new/keyring-10.3.2/keyring.egg-info/PKG-INFO
--- old/keyring-10.2/keyring.egg-info/PKG-INFO  2017-01-11 05:33:50.000000000 
+0100
+++ new/keyring-10.3.2/keyring.egg-info/PKG-INFO        2017-04-10 
01:53:36.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: keyring
-Version: 10.2
+Version: 10.3.2
 Summary: Store and access your passwords safely.
 Home-page: https://github.com/jaraco/keyring
 Author: Jason R. Coombs
@@ -151,6 +151,17 @@
             default-keyring=simplekeyring.SimpleKeyring
             keyring-path=/home/kang/pyworkspace/python-keyring-lib/demo/
         
+        Third-Party Backends
+        ====================
+        
+        In addition to the backends provided by the core keyring package for
+        the most common and secure use cases, there
+        are additional keyring backend implementations available for other
+        use-cases. Simply install them to make them available:
+        
+        - `keyrings.alt <https://pypi.org/project/keyrings.alt>`_ - 
"alternate",
+          less common backends, originally part of the core package, but now
+          available for opt-in.
         
         Write your own keyring backend
         ==============================
@@ -162,6 +173,18 @@
         
         See the ``backend`` module for more detail on the interface of this 
class.
         
+        Keyring employs entry points to allow any third-party package to 
implement
+        backends without any modification to the keyring itself. Those 
interested in
+        creating new backends are encouraged to create new, third-party 
packages
+        in the ``keyrings`` namespace, in a manner modeled by the `keyrings.alt
+        package <https://github.com/jaraco/keyrings.alt>`_. See the 
``setup.py`` file
+        in that project for a hint on how to create the requisite entry points.
+        Backends that prove essential may be considered for inclusion in the 
core
+        library, although the ease of installing these third-party packages 
should
+        mean that extensions may be readily available.
+        
+        If you've created an extension for Keyring, please submit a pull 
request to
+        have your extension mentioned as an available extension.
         
         Set the keyring in runtime
         ==========================
@@ -331,3 +354,4 @@
 Classifier: Programming Language :: Python :: 3.3
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring.egg-info/SOURCES.txt 
new/keyring-10.3.2/keyring.egg-info/SOURCES.txt
--- old/keyring-10.2/keyring.egg-info/SOURCES.txt       2017-01-11 
05:33:50.000000000 +0100
+++ new/keyring-10.3.2/keyring.egg-info/SOURCES.txt     2017-04-10 
01:53:36.000000000 +0200
@@ -20,6 +20,7 @@
 keyring/cli.py
 keyring/core.py
 keyring/credentials.py
+keyring/devpi_client.py
 keyring/errors.py
 keyring/getpassbackend.py
 keyring/http.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/keyring.egg-info/entry_points.txt 
new/keyring-10.3.2/keyring.egg-info/entry_points.txt
--- old/keyring-10.2/keyring.egg-info/entry_points.txt  2017-01-11 
05:33:50.000000000 +0100
+++ new/keyring-10.3.2/keyring.egg-info/entry_points.txt        2017-04-10 
01:53:36.000000000 +0200
@@ -1,3 +1,6 @@
 [console_scripts]
 keyring = keyring.cli:main
 
+[devpi_client]
+keyring = keyring.devpi_client
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/pytest.ini new/keyring-10.3.2/pytest.ini
--- old/keyring-10.2/pytest.ini 2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/pytest.ini       2017-04-10 01:52:47.000000000 +0200
@@ -1,4 +1,4 @@
 [pytest]
 norecursedirs=dist build .tox
-addopts=--doctest-modules --ignore keyring/backends/_OS_X_API.py
+addopts=--doctest-modules
 doctest_optionflags=ALLOW_UNICODE ELLIPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/setup.cfg new/keyring-10.3.2/setup.cfg
--- old/keyring-10.2/setup.cfg  2017-01-11 05:33:50.000000000 +0100
+++ new/keyring-10.3.2/setup.cfg        2017-04-10 01:53:36.000000000 +0200
@@ -5,9 +5,6 @@
 [wheel]
 universal = 1
 
-[upload]
-repository = https://upload.pypi.org/legacy/
-
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/setup.py new/keyring-10.3.2/setup.py
--- old/keyring-10.2/setup.py   2017-01-11 05:33:06.000000000 +0100
+++ new/keyring-10.3.2/setup.py 2017-04-10 01:52:47.000000000 +0200
@@ -3,20 +3,16 @@
 # Project skeleton maintained at https://github.com/jaraco/skeleton
 
 import io
-import sys
 
 import setuptools
 
 with io.open('README.rst', encoding='utf-8') as readme:
     long_description = readme.read()
 
-needs_wheel = {'release', 'bdist_wheel', 'dists'}.intersection(sys.argv)
-wheel = ['wheel'] if needs_wheel else []
-
 name = 'keyring'
 description = 'Store and access your passwords safely.'
 
-setup_params = dict(
+params = dict(
     name=name,
     use_scm_version=True,
     author="Kang Zhang",
@@ -39,7 +35,7 @@
     },
     setup_requires=[
         'setuptools_scm>=1.15.0',
-    ] + wheel,
+    ],
     classifiers=[
         "Development Status :: 5 - Production/Stable",
         "Intended Audience :: Developers",
@@ -49,12 +45,16 @@
         "Programming Language :: Python :: 3.3",
         "Programming Language :: Python :: 3.4",
         "Programming Language :: Python :: 3.5",
+        "Programming Language :: Python :: 3.6",
     ],
     entry_points={
         'console_scripts': [
             'keyring=keyring.cli:main',
         ],
+        'devpi_client': [
+            'keyring = keyring.devpi_client',
+        ],
     },
 )
 if __name__ == '__main__':
-    setuptools.setup(**setup_params)
+       setuptools.setup(**params)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyring-10.2/tests/requirements.txt 
new/keyring-10.3.2/tests/requirements.txt
--- old/keyring-10.2/tests/requirements.txt     2017-01-11 05:33:06.000000000 
+0100
+++ new/keyring-10.3.2/tests/requirements.txt   2017-04-10 01:52:47.000000000 
+0200
@@ -1 +1,2 @@
 pytest >= 2.8
+subprocess32; python_version=="2.6"


Reply via email to