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"