Hello community,

here is the log from the commit of package python-keyrings.alt for 
openSUSE:Factory checked in at 2019-03-04 09:21:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-keyrings.alt (Old)
 and      /work/SRC/openSUSE:Factory/.python-keyrings.alt.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-keyrings.alt"

Mon Mar  4 09:21:40 2019 rev:2 rq:679752 version:3.1.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-keyrings.alt/python-keyrings.alt.changes  
2018-12-19 13:49:50.839248928 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-keyrings.alt.new.28833/python-keyrings.alt.changes
       2019-03-04 09:21:41.604586749 +0100
@@ -1,0 +2,11 @@
+Tue Feb 26 13:42:33 UTC 2019 - John Vandenberg <[email protected]>
+
+- Remove unnecessary build dependencies like tox, flake8 and pytest-sugar
+- Activate test suite, and isolate it from python-keyring's test suite
+- Update to v3.1.1
+  * Trap AttributeError in Gnome backend as in some environments
+    it seems that will happen.
+  * Fix issue where a backslash in the service name would cause
+    errors on Registry backend on Windows.
+
+-------------------------------------------------------------------
@@ -4 +15 @@
-- initial version
+- initial version for v3.1

Old:
----
  keyrings.alt-3.1.tar.gz

New:
----
  keyrings.alt-3.1.1.tar.gz
  test_backend.py
  util.py

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

Other differences:
------------------
++++++ python-keyrings.alt.spec ++++++
--- /var/tmp/diff_new_pack.fFXULR/_old  2019-03-04 09:21:42.476586592 +0100
+++ /var/tmp/diff_new_pack.fFXULR/_new  2019-03-04 09:21:42.476586592 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-keyrings.alt
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 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
@@ -16,15 +16,21 @@
 #
 
 
+%define keyring_ver 18.0.0
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-keyrings.alt
-Version:        3.1
+Version:        3.1.1
 Release:        0
 Summary:        Alternate keyring implementations
 License:        MIT
 Group:          Development/Languages/Python
 URL:            https://github.com/jaraco/keyrings.alt
 Source:         
https://files.pythonhosted.org/packages/source/k/keyrings.alt/keyrings.alt-%{version}.tar.gz
+# The following are normally installed into the runtime environment by package 
keyring,
+# however they are removed by openSUSE packaging, and included here so that 
these tests
+# dont break whenever keyring changes.
+Source1:        
https://raw.githubusercontent.com/jaraco/keyring/18.0.0/keyring/tests/test_backend.py
+Source2:        
https://raw.githubusercontent.com/jaraco/keyring/18.0.0/keyring/tests/util.py
 BuildRequires:  %{python_module setuptools_scm >= 1.15.0}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
@@ -44,10 +50,7 @@
 BuildRequires:  %{python_module keyring >= 10.3.1}
 BuildRequires:  %{python_module pycrypto}
 BuildRequires:  %{python_module pytest >= 3.5}
-BuildRequires:  %{python_module pytest-flake8}
-BuildRequires:  %{python_module pytest-sugar >= 0.9.1}
 BuildRequires:  %{python_module six}
-BuildRequires:  %{python_module tox}
 BuildRequires:  python-backports.unittest_mock
 BuildRequires:  typelib(GnomeKeyring)
 # /SECTION
@@ -59,6 +62,9 @@
 
 %prep
 %setup -q -n keyrings.alt-%{version}
+sed -i 's/--flake8//' pytest.ini
+cp %{SOURCE1} %{SOURCE2} tests
+sed -i 's/keyring\.tests/tests/' $(ls tests/*.py | grep -Fv test_backend.py)
 
 %build
 %python_build
@@ -67,6 +73,18 @@
 %python_install
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
+%check
+# setup.py test works except it checks test dependencies which includes
+# lots of non-test related dependencies.
+
+# Three tests fail with AttributeError: 'x' object has no attribute 
'get_credential'
+# - CryptedFileKeyringTestCase
+# - EncryptedFileKeyringTestCase
+# - UncryptedFileKeyringTestCase
+%{python_expand py.test-%{$python_bin_suffix} \
+  --ignore=_build.python2 --ignore=_build.python3 -k 'not test_credential'
+}
+
 %files %{python_files}
 %doc CHANGES.rst README.rst
 %license LICENSE

++++++ keyrings.alt-3.1.tar.gz -> keyrings.alt-3.1.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/.flake8 
new/keyrings.alt-3.1.1/.flake8
--- old/keyrings.alt-3.1/.flake8        2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/.flake8      2018-12-16 20:34:43.000000000 +0100
@@ -4,3 +4,5 @@
        W191
        # W503 violates spec https://github.com/PyCQA/pycodestyle/issues/513
        W503
+       # W504 has issues 
https://github.com/OCA/maintainer-quality-tools/issues/545
+       W504
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/.travis.yml 
new/keyrings.alt-3.1.1/.travis.yml
--- old/keyrings.alt-3.1/.travis.yml    2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/.travis.yml  2018-12-16 20:34:43.000000000 +0100
@@ -1,10 +1,11 @@
-dist: trusty
+dist: xenial
 sudo: false
 language: python
 
 python:
 - 2.7
-- &latest_py3 3.6
+- 3.6
+- &latest_py3 3.7
 
 jobs:
   fast_finish: true
@@ -12,23 +13,22 @@
   - stage: deploy
     if: tag IS present
     python: *latest_py3
-    install: skip
-    script: skip
-    deploy:
-      provider: pypi
-      on:
-        tags: true
-        all_branches: true
-      user: jaraco
-      password:
-        secure: 
iRtbY9yEN8qwJ7wiycL8N5NdZhRDENT5M8Bkpm7YSN5OiM41LRwFYnHDoQhYpz9L/UdfbovgEvv1XsQX/o8XRTn5efmhXRgS/FY3cA7Ry0GG41hmk2fnAgYuivA8EGoPveS9CnbU71ikL0HjRHv93+7Pz1kyMEYXRUpbMZ16K74o1J1MLOoCdQXXlKWfYjqAV/BglWwjIkwXVmNM2JwGV7U2hJ8zjsX1Bn7XqsZdC2KB6jK1frVjEHDfbv3NLQYIzQYqGw8GMWa+9EGVfFzqPnQmUC3E5GA93rC1SceBUb2RDBfCUpyFkyin3lQ05EvyVJoIaZO56gJ9Py1XzzSinSTjylgTxvFWx4uweowv5oM9OWnV+3SsZDw5+55fW5CYiMjdqjLso83gTkc8jbDHeK73Yh0sju2+QnOejnMzKRaBtCBubUkL+TPjEzoeUYSKLgW+iVHIKNKEKNME/WLzNtEhQwEFbLD5u/0bmHMBFPt40cXv3kSz6tz7NSjCHyJbtsBnyadYWRQTTRoSPnNIt0P716feUY/R5/Am5TIo2ZHKkGbRkuqFcJoJYhKau2M24WkRA4og8uBSyliShovHkrbahe1MpbJ/ZtmIU583FQjxIlGQQtNPN4QTSnQ1fUpvyhQY89GupbSxuek7jlmxmIm9SgAy6w9PUDZ5FKuJzm4=
-      distributions: dists
-      skip_cleanup: true
-      skip_upload_docs: true
+    before_script: skip
+    env:
+    - TWINE_USERNAME=jaraco
+    # TWINE_PASSWORD
+    - secure: 
b07jU3S+8CmT8UUnxaq6A5xCPhRVKsl0b3rY3CT8Eldpud+uVNFPV68R/vW+APcAIFqmF01zIwzwC/ZdpKI5omaKfvCIKSDlM/rLlCfSF5NPCjuF4olMJg18/PWaEZ3B5+XRrmJRtd4V5VvImQjuuQWixCp5X+DpcHodEcsTdbi+67zo7JAn2AnfmUF0kIWyCjyP3bzaSi1zFqXbLUoReVVl8/k5zlz7BXDYaL5lr4HGsuqpqfN8kpDGsMtC7rHBD4z8qXDk+Blk2zwskmU9LIVpO2VzvEdwQVOjXaafWDw+O1Xm8bAhF5q2o/mnsOPNdR8S8AK4haMRUYfDcVGb8ZOiHHPbuh0A3NKWWA6Mc9Ut+IIjAUCUnTpn6q14MQhg2ZQo5zr8lZh4m4MhhXkZhO3B3Rqk6SWtNrEtcmHBGmCoYLlOqOJtdgIKiOeV6e17ElsevMrXHl31rsjmE9/o2t9AgOao6dWe7SKohva2Bt7Tuh/liDwPmQr2KU/IuzFVyJ+AeUhNT8/IYQewidJdVGcWBJ4ZwFJwYNSQECVtY80LFM44OSTvdy3NbEumfSWVQ/pe6gs21WQ+SNuQsUfoJZiNt+18Cdr1zm+p8vcW259RQ0b6Lz0yuM5NxZM3YFPCQFAc1yZcDAvqM4DzVlI6+DmolRnIwWU9rFBn1OheWoA=
+    - TOX_TESTENV_PASSENV="TWINE_USERNAME TWINE_PASSWORD"
+    script: tox -e release
 
 cache: pip
 
 install:
 - pip install tox tox-venv
 
+before_script:
+  # Disable IPv6. Ref travis-ci/travis-ci#8361
+  - if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
+      sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6';
+    fi
 script: tox
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/CHANGES.rst 
new/keyrings.alt-3.1.1/CHANGES.rst
--- old/keyrings.alt-3.1/CHANGES.rst    2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/CHANGES.rst  2018-12-16 20:34:43.000000000 +0100
@@ -1,3 +1,13 @@
+3.1.1
+=====
+
+#31: Trap AttributeError in Gnome backend as in some environments
+it seems that will happen.
+
+#30: Fix issue where a backslash in the service name would cause
+errors on Registry backend on Windows.
+
+
 3.1
 ===
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/PKG-INFO 
new/keyrings.alt-3.1.1/PKG-INFO
--- old/keyrings.alt-3.1/PKG-INFO       2018-04-26 19:35:35.000000000 +0200
+++ new/keyrings.alt-3.1.1/PKG-INFO     2018-12-16 20:35:16.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: keyrings.alt
-Version: 3.1
+Version: 3.1.1
 Summary: Alternate keyring implementations
 Home-page: https://github.com/jaraco/keyrings.alt
 Author: Jason R. Coombs
@@ -36,5 +36,5 @@
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Requires-Python: >=2.7
-Provides-Extra: docs
 Provides-Extra: testing
+Provides-Extra: docs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/docs/conf.py 
new/keyrings.alt-3.1.1/docs/conf.py
--- old/keyrings.alt-3.1/docs/conf.py   2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/docs/conf.py 2018-12-16 20:34:43.000000000 +0100
@@ -1,32 +1,26 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
-extensions = [
-       'sphinx.ext.autodoc',
-       'jaraco.packaging.sphinx',
-       'rst.linker',
-]
+extensions = ["sphinx.ext.autodoc", "jaraco.packaging.sphinx", "rst.linker"]
 
-master_doc = 'index'
+master_doc = "index"
 
 link_files = {
-       '../CHANGES.rst': dict(
-               using=dict(
-                       GH='https://github.com',
-               ),
-               replace=[
-                       dict(
-                               pattern=r'(Issue )?#(?P<issue>\d+)',
-                               url='{package_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}/',
-                       ),
-               ],
-       ),
+    "../CHANGES.rst": dict(
+        using=dict(GH="https://github.com";),
+        replace=[
+            dict(
+                pattern=r"(Issue #|\B#)(?P<issue>\d+)",
+                url="{package_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/keyrings.alt-3.1/install-pip-master.py 
new/keyrings.alt-3.1.1/install-pip-master.py
--- old/keyrings.alt-3.1/install-pip-master.py  1970-01-01 01:00:00.000000000 
+0100
+++ new/keyrings.alt-3.1.1/install-pip-master.py        2018-12-16 
20:34:43.000000000 +0100
@@ -0,0 +1,21 @@
+"""
+In order to support installation of pep517 from source,
+pip from master must be installed.
+"""
+
+import subprocess
+import sys
+
+
+def main():
+       cmd = [
+               sys.executable,
+               '-m', 'pip', 'install',
+               'git+https://github.com/pypa/pip',
+       ]
+       subprocess.run(cmd)
+       cmd[-1:] = sys.argv[1:]
+       subprocess.run(cmd)
+
+
+__name__ == '__main__' and main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/keyrings/alt/Gnome.py 
new/keyrings.alt-3.1.1/keyrings/alt/Gnome.py
--- old/keyrings.alt-3.1/keyrings/alt/Gnome.py  2018-04-26 19:34:58.000000000 
+0200
+++ new/keyrings.alt-3.1.1/keyrings/alt/Gnome.py        2018-12-16 
20:34:43.000000000 +0100
@@ -2,7 +2,7 @@
     import gi
     gi.require_version('GnomeKeyring', '1.0')
     from gi.repository import GnomeKeyring
-except (ImportError, ValueError):
+except (ImportError, ValueError, AttributeError):
     pass
 
 import six
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/keyrings/alt/Windows.py 
new/keyrings.alt-3.1.1/keyrings/alt/Windows.py
--- old/keyrings.alt-3.1/keyrings/alt/Windows.py        2018-04-26 
19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/keyrings/alt/Windows.py      2018-12-16 
20:34:43.000000000 +0100
@@ -9,27 +9,9 @@
 from . import file_base
 
 try:
-    # prefer pywin32-ctypes
-    __import__('win32ctypes.pywintypes')
-    from win32ctypes import win32cred
-    # force demand import to raise ImportError
-    win32cred.__name__
+    from six.moves import winreg
 except ImportError:
-    # fallback to pywin32
-    try:
-        __import__('pywintypes')
-        import win32cred
-    except ImportError:
-        pass
-
-try:
-    import winreg
-except ImportError:
-    try:
-        # Python 2 compatibility
-        import _winreg as winreg
-    except ImportError:
-        pass
+    pass
 
 try:
     from . import _win_crypto
@@ -37,17 +19,6 @@
     pass
 
 
-def has_pywin32():
-    """
-    Does this environment have pywin32?
-    Should return False even when Mercurial's Demand Import allowed import of
-    win32cred.
-    """
-    with ExceptionRaisedContext() as exc:
-        win32cred.__name__
-    return not bool(exc)
-
-
 def has_wincrypto():
     """
     Does this environment have wincrypto?
@@ -107,12 +78,17 @@
             raise RuntimeError("Requires ctypes")
         return 2
 
+    @staticmethod
+    def _key_for_service(service):
+        escaped = service.replace('\\', '__0x5c__')
+        return r'Software\{escaped}\Keyring'.format(**locals())
+
     def get_password(self, service, username):
         """Get password of the username for the service
         """
         try:
             # fetch the password
-            key = r'Software\%s\Keyring' % service
+            key = self._key_for_service(service)
             hkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key)
             password_saved = winreg.QueryValueEx(hkey, username)[0]
             password_base64 = password_saved.encode('ascii')
@@ -135,7 +111,7 @@
         password_saved = password_base64.decode('ascii')
 
         # store the password
-        key_name = r'Software\%s\Keyring' % service
+        key_name = self._key_for_service(service)
         hkey = winreg.CreateKey(winreg.HKEY_CURRENT_USER, key_name)
         winreg.SetValueEx(hkey, username, 0, winreg.REG_SZ, password_saved)
 
@@ -143,7 +119,7 @@
         """Delete the password for the username of the service.
         """
         try:
-            key_name = r'Software\%s\Keyring' % service
+            key_name = self._key_for_service(service)
             hkey = winreg.OpenKey(
                 winreg.HKEY_CURRENT_USER, key_name, 0,
                 winreg.KEY_ALL_ACCESS)
@@ -155,7 +131,7 @@
         self._delete_key_if_empty(service)
 
     def _delete_key_if_empty(self, service):
-        key_name = r'Software\%s\Keyring' % service
+        key_name = self._key_for_service(service)
         key = winreg.OpenKey(
             winreg.HKEY_CURRENT_USER, key_name, 0,
             winreg.KEY_ALL_ACCESS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/keyrings/alt/file_base.py 
new/keyrings.alt-3.1.1/keyrings/alt/file_base.py
--- old/keyrings.alt-3.1/keyrings/alt/file_base.py      2018-04-26 
19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/keyrings/alt/file_base.py    2018-12-16 
20:34:43.000000000 +0100
@@ -141,8 +141,8 @@
     def _generate_assoc(self, service, username):
         """Generate tamper resistant bytestring of associated data
         """
-        return (escape_for_ini(service) + '\0' +
-                escape_for_ini(username)).encode()
+        return (escape_for_ini(service) + '\0'
+                + escape_for_ini(username)).encode()
 
     def _write_config_value(self, service, key, value):
         # ensure the file exists
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/keyrings/alt/pyfs.py 
new/keyrings.alt-3.1.1/keyrings/alt/pyfs.py
--- old/keyrings.alt-3.1/keyrings/alt/pyfs.py   2018-04-26 19:34:58.000000000 
+0200
+++ new/keyrings.alt-3.1.1/keyrings/alt/pyfs.py 2018-12-16 20:34:43.000000000 
+0100
@@ -22,12 +22,12 @@
 
 def has_pyfs():
     """
-    Does this environment have pyfs installed?
+    Does this environment have pyfs 1.x installed?
     Should return False even when Mercurial's Demand Import allowed import of
     fs.*.
     """
     with errors.ExceptionRaisedContext() as exc:
-        fs.__name__
+        fs.opener.opener
     return not bool(exc)
 
 
@@ -91,8 +91,8 @@
             # NOTE: currently the MemOpener does not split off any filename
             #       which causes errors on close()
             #       so we add a dummy name and open it separately
-            if (self.filename.startswith('mem://') or
-                    self.filename.startswith('ram://')):
+            if (self.filename.startswith('mem://')
+                    or self.filename.startswith('ram://')):
                 open_file = fs.opener.fsopendir(self.filename).open('kr.cfg',
                                                                     mode)
             else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/keyrings.alt.egg-info/PKG-INFO 
new/keyrings.alt-3.1.1/keyrings.alt.egg-info/PKG-INFO
--- old/keyrings.alt-3.1/keyrings.alt.egg-info/PKG-INFO 2018-04-26 
19:35:34.000000000 +0200
+++ new/keyrings.alt-3.1.1/keyrings.alt.egg-info/PKG-INFO       2018-12-16 
20:35:15.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: keyrings.alt
-Version: 3.1
+Version: 3.1.1
 Summary: Alternate keyring implementations
 Home-page: https://github.com/jaraco/keyrings.alt
 Author: Jason R. Coombs
@@ -36,5 +36,5 @@
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Requires-Python: >=2.7
-Provides-Extra: docs
 Provides-Extra: testing
+Provides-Extra: docs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/keyrings.alt.egg-info/SOURCES.txt 
new/keyrings.alt-3.1.1/keyrings.alt.egg-info/SOURCES.txt
--- old/keyrings.alt-3.1/keyrings.alt.egg-info/SOURCES.txt      2018-04-26 
19:35:35.000000000 +0200
+++ new/keyrings.alt-3.1.1/keyrings.alt.egg-info/SOURCES.txt    2018-12-16 
20:35:16.000000000 +0100
@@ -7,6 +7,7 @@
 README.rst
 appveyor.yml
 conftest.py
+install-pip-master.py
 pyproject.toml
 pytest.ini
 setup.cfg
@@ -20,7 +21,6 @@
 keyrings.alt.egg-info/SOURCES.txt
 keyrings.alt.egg-info/dependency_links.txt
 keyrings.alt.egg-info/entry_points.txt
-keyrings.alt.egg-info/namespace_packages.txt
 keyrings.alt.egg-info/requires.txt
 keyrings.alt.egg-info/top_level.txt
 keyrings/alt/Gnome.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keyrings.alt-3.1/keyrings.alt.egg-info/namespace_packages.txt 
new/keyrings.alt-3.1.1/keyrings.alt.egg-info/namespace_packages.txt
--- old/keyrings.alt-3.1/keyrings.alt.egg-info/namespace_packages.txt   
2018-04-26 19:35:34.000000000 +0200
+++ new/keyrings.alt-3.1.1/keyrings.alt.egg-info/namespace_packages.txt 
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/keyrings.alt.egg-info/requires.txt 
new/keyrings.alt-3.1.1/keyrings.alt.egg-info/requires.txt
--- old/keyrings.alt-3.1/keyrings.alt.egg-info/requires.txt     2018-04-26 
19:35:34.000000000 +0200
+++ new/keyrings.alt-3.1.1/keyrings.alt.egg-info/requires.txt   2018-12-16 
20:35:15.000000000 +0100
@@ -6,9 +6,8 @@
 rst.linker>=1.9
 
 [testing]
-pytest>=3.5
-pytest-sugar>=0.9.1
-collective.checkdocs
+pytest!=3.7.3,>=3.5
+pytest-checkdocs
 pytest-flake8
 backports.unittest_mock
 keyring[test]>=10.3.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/pyproject.toml 
new/keyrings.alt-3.1.1/pyproject.toml
--- old/keyrings.alt-3.1/pyproject.toml 2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/pyproject.toml       2018-12-16 20:34:43.000000000 
+0100
@@ -1,2 +1,3 @@
 [build-system]
-requires = ["setuptools", "wheel", "setuptools_scm>=1.15"]
+requires = ["setuptools>=34.4", "wheel", "setuptools_scm>=1.15"]
+build-backend = 'setuptools.build_meta'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/pytest.ini 
new/keyrings.alt-3.1.1/pytest.ini
--- old/keyrings.alt-3.1/pytest.ini     2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/pytest.ini   2018-12-16 20:34:43.000000000 +0100
@@ -2,3 +2,8 @@
 norecursedirs=dist build .tox .eggs
 addopts=--doctest-modules --flake8
 doctest_optionflags=ALLOW_UNICODE ELLIPSIS
+filterwarnings=
+       ignore:Possible nested set::pycodestyle:113
+       ignore:Using or importing the ABCs::flake8:410
+       # workaround for https://sourceforge.net/p/docutils/bugs/348/
+       ignore:'U' mode is deprecated::docutils.io
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/setup.cfg 
new/keyrings.alt-3.1.1/setup.cfg
--- old/keyrings.alt-3.1/setup.cfg      2018-04-26 19:35:35.000000000 +0200
+++ new/keyrings.alt-3.1.1/setup.cfg    2018-12-16 20:35:16.000000000 +0100
@@ -1,12 +1,62 @@
-[aliases]
-release = dists upload
-dists = clean --all sdist bdist_wheel
-
 [bdist_wheel]
 universal = 1
 
 [metadata]
 license_file = LICENSE
+name = keyrings.alt
+author = Jason R. Coombs
+author_email = [email protected]
+description = Alternate keyring implementations
+long_description = file:README.rst
+url = https://github.com/jaraco/keyrings.alt
+classifiers = 
+       Development Status :: 5 - Production/Stable
+       Intended Audience :: Developers
+       License :: OSI Approved :: MIT License
+       Programming Language :: Python :: 2.7
+       Programming Language :: Python :: 3
+
+[options]
+packages = find:
+include_package_data = true
+python_requires = >=2.7
+install_requires = 
+       six
+setup_requires = setuptools_scm >= 1.15.0
+
+[options.packages.find]
+exclude = 
+       tests
+
+[options.extras_require]
+testing = 
+       pytest >= 3.5, !=3.7.3
+       pytest-checkdocs
+       pytest-flake8
+       
+       backports.unittest_mock
+       keyring[test] >= 10.3.1
+       
+       fs>=0.5,<2
+       pycrypto; sys_platform!="win32" or python_version=="2.7"
+       
+       gdata; python_version=="2.7"
+       
+       python-keyczar; python_version=="2.7"
+docs = 
+       sphinx
+       jaraco.packaging >= 3.2
+       rst.linker >= 1.9
+
+[options.entry_points]
+keyring.backends = 
+       file = keyrings.alt.file
+       Gnome = keyrings.alt.Gnome
+       Google = keyrings.alt.Google
+       keyczar = keyrings.alt.keyczar
+       multi = keyrings.alt.multi
+       pyfs = keyrings.alt.pyfs
+       Windows (alt) = keyrings.alt.Windows
 
 [egg_info]
 tag_build = 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/setup.py 
new/keyrings.alt-3.1.1/setup.py
--- old/keyrings.alt-3.1/setup.py       2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/setup.py     2018-12-16 20:34:43.000000000 +0100
@@ -2,89 +2,7 @@
 
 # Project skeleton maintained at https://github.com/jaraco/skeleton
 
-import io
-
 import setuptools
 
-with io.open('README.rst', encoding='utf-8') as readme:
-    long_description = readme.read()
-
-name = 'keyrings.alt'
-description = 'Alternate keyring implementations'
-nspkg_technique = 'native'
-"""
-Does this package use "native" namespace packages or
-pkg_resources "managed" namespace packages?
-"""
-
-params = dict(
-    name=name,
-    use_scm_version=True,
-    author="Jason R. Coombs",
-    author_email="[email protected]",
-    description=description or name,
-    long_description=long_description,
-    url="https://github.com/jaraco/"; + name,
-    packages=setuptools.find_packages(exclude=['tests']),
-    include_package_data=True,
-    namespace_packages=(
-        name.split('.')[:-1] if nspkg_technique == 'managed'
-        else []
-    ),
-    python_requires='>=2.7',
-    install_requires=[
-        'six',
-    ],
-    extras_require={
-        'testing': [
-            # upstream
-            'pytest>=3.5',
-            'pytest-sugar>=0.9.1',
-            'collective.checkdocs',
-            'pytest-flake8',
-
-            # local
-            'backports.unittest_mock',
-            'keyring[test] >= 10.3.1',
-
-            'fs>=0.5,<2',
-            'pycrypto; sys_platform!="win32" or python_version=="2.7"',
-
-            # gdata doesn't currently install on Python 3
-            # http://code.google.com/p/gdata-python-client/issues/detail?id=229
-            'gdata; python_version=="2.7"',
-
-            # keyczar doesn't currently install on Python 3.
-            # http://code.google.com/p/keyczar/issues/detail?id=125
-            'python-keyczar; python_version=="2.7"',
-        ],
-        'docs': [
-            'sphinx',
-            'jaraco.packaging>=3.2',
-            'rst.linker>=1.9',
-        ],
-    },
-    setup_requires=[
-        'setuptools_scm>=1.15.0',
-    ],
-    classifiers=[
-        "Development Status :: 5 - Production/Stable",
-        "Intended Audience :: Developers",
-        "License :: OSI Approved :: MIT License",
-        "Programming Language :: Python :: 2.7",
-        "Programming Language :: Python :: 3",
-    ],
-    entry_points={
-        'keyring.backends': [
-            'file = keyrings.alt.file',
-            'Gnome = keyrings.alt.Gnome',
-            'Google = keyrings.alt.Google',
-            'keyczar = keyrings.alt.keyczar',
-            'multi = keyrings.alt.multi',
-            'pyfs = keyrings.alt.pyfs',
-            'Windows (alt) = keyrings.alt.Windows',
-        ],
-    },
-)
-if __name__ == '__main__':
-    setuptools.setup(**params)
+if __name__ == "__main__":
+    setuptools.setup(use_scm_version=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/tests/test_Windows.py 
new/keyrings.alt-3.1.1/tests/test_Windows.py
--- old/keyrings.alt-3.1/tests/test_Windows.py  2018-04-26 19:34:58.000000000 
+0200
+++ new/keyrings.alt-3.1.1/tests/test_Windows.py        2018-12-16 
20:34:43.000000000 +0100
@@ -16,18 +16,6 @@
     return sys.platform in ['win32'] and sys.getwindowsversion()[-2] == 2
 
 
-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_win32_crypto_supported(),
                      "Need Windows")
 class Win32CryptoKeyringTestCase(FileKeyringTests, unittest.TestCase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keyrings.alt-3.1/tox.ini 
new/keyrings.alt-3.1.1/tox.ini
--- old/keyrings.alt-3.1/tox.ini        2018-04-26 19:34:58.000000000 +0200
+++ new/keyrings.alt-3.1.1/tox.ini      2018-12-16 20:34:43.000000000 +0100
@@ -5,11 +5,8 @@
 [testenv]
 deps =
        setuptools>=31.0.1
-       # workaround for yaml/pyyaml#126
-       # 
git+https://github.com/yaml/pyyaml@master#egg=pyyaml;python_version=="3.7";
 commands =
-       py.test {posargs}
-       python setup.py checkdocs
+       pytest {posargs}
 usedevelop = True
 extras = testing
 
@@ -20,3 +17,18 @@
 changedir = docs
 commands =
     python -m sphinx . {toxinidir}/build/html
+
+[testenv:release]
+skip_install = True
+# workaround for pep517 build support
+install_command = python install-pip-master.py {opts} {packages}
+deps =
+       # pull from feature branch for feature
+       git+https://github.com/pypa/pep517@feature/build-command
+       # workaround for https://github.com/pypa/twine/issues/423
+       git+https://github.com/pypa/twine
+       path.py
+commands =
+       python -c "import path; path.Path('dist').rmtree_p()"
+       python -m pep517.build .
+       python -m twine upload dist/*

++++++ test_backend.py ++++++
# coding: utf-8

"""
Common test functionality for backends.
"""

from __future__ import unicode_literals

import string

import pytest

from .util import random_string
from keyring import errors

__metaclass__ = type

# unicode only characters
# Sourced from The Quick Brown Fox... Pangrams
# http://www.columbia.edu/~fdc/utf8/
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:
    """Test for the keyring's basic functions. password_set and password_get
    """

    DIFFICULT_CHARS = string.whitespace + string.punctuation

    def setUp(self):
        self.keyring = self.init_keyring()
        self.credentials_created = set()

    def tearDown(self):
        for item in self.credentials_created:
            self.keyring.delete_password(*item)

    def set_password(self, service, username, password):
        # set the password and save the result so the test runner can clean
        #  up after if necessary.
        self.keyring.set_password(service, username, password)
        self.credentials_created.add((service, username))

    def check_set_get(self, service, username, password):
        keyring = self.keyring

        # for the non-existent password
        assert keyring.get_password(service, username) is None

        # common usage
        self.set_password(service, username, password)
        assert keyring.get_password(service, username) == password

        # for the empty password
        self.set_password(service, username, "")
        assert keyring.get_password(service, username) == ""

    def test_password_set_get(self):
        password = random_string(20)
        username = random_string(20)
        service = random_string(20)
        self.check_set_get(service, username, password)

    def test_difficult_chars(self):
        password = random_string(20, self.DIFFICULT_CHARS)
        username = random_string(20, self.DIFFICULT_CHARS)
        service = random_string(20, self.DIFFICULT_CHARS)
        self.check_set_get(service, username, password)

    def test_delete_present(self):
        password = random_string(20, self.DIFFICULT_CHARS)
        username = random_string(20, self.DIFFICULT_CHARS)
        service = random_string(20, self.DIFFICULT_CHARS)
        self.keyring.set_password(service, username, password)
        self.keyring.delete_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)
        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)
        username2 = random_string(20, self.DIFFICULT_CHARS)
        password = random_string(20, self.DIFFICULT_CHARS)
        service = random_string(20, self.DIFFICULT_CHARS)
        self.keyring.set_password(service, username1, password)
        self.set_password(service, username2, password)
        self.keyring.delete_password(service, username1)
        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)
        username = random_string(20, UNICODE_CHARS)
        service = random_string(20, UNICODE_CHARS)
        self.check_set_get(service, username, password)

    def test_unicode_and_ascii_chars(self):
        source = (random_string(10, UNICODE_CHARS) + random_string(10)
                  + random_string(10, self.DIFFICULT_CHARS))
        password = random_string(20, source)
        username = random_string(20, source)
        service = random_string(20, source)
        self.check_set_get(service, username, password)

    def test_different_user(self):
        """
        Issue #47 reports that WinVault isn't storing passwords for
        multiple users. This test exercises that test for each of the
        backends.
        """

        keyring = self.keyring
        self.set_password('service1', 'user1', 'password1')
        self.set_password('service1', 'user2', 'password2')
        assert keyring.get_password('service1', 'user1') == 'password1'
        assert keyring.get_password('service1', 'user2') == 'password2'
        self.set_password('service2', 'user3', 'password3')
        assert keyring.get_password('service1', 'user1') == 'password1'

    def test_credential(self):
        keyring = self.keyring

        cred = keyring.get_credential('service', None)
        assert cred is None

        self.set_password('service1', 'user1', 'password1')
        self.set_password('service1', 'user2', 'password2')

        cred = keyring.get_credential('service1', None)
        assert cred is None or (cred.username, cred.password) in (
            ('user1', 'password1'),
            ('user2', 'password2'),
        )

        cred = keyring.get_credential('service1', 'user2')
        assert cred is not None
        assert (cred.username, cred.password) in (
            ('user1', 'password1'),
            ('user2', 'password2'),
        )
++++++ util.py ++++++
import contextlib
import os
import sys
import random
import string

__metaclass__ = type


class ImportKiller:
    "Context manager to make an import of a given name or names fail."

    def __init__(self, *names):
        self.names = names

    def find_module(self, fullname, path=None):
        if fullname in self.names:
            return self

    def load_module(self, fullname):
        assert fullname in self.names
        raise ImportError(fullname)

    def __enter__(self):
        self.original = {}
        for name in self.names:
            self.original[name] = sys.modules.pop(name, None)
        sys.meta_path.insert(0, self)

    def __exit__(self, *args):
        sys.meta_path.remove(self)
        for key, value in self.original.items():
            if value is not None:
                sys.modules[key] = value


@contextlib.contextmanager
def NoNoneDictMutator(destination, **changes):
    """Helper context manager to make and unmake changes to a dict.

    A None is not a valid value for the destination, and so means that the
    associated name should be removed."""
    original = {}
    for key, value in changes.items():
        original[key] = destination.get(key)
        if value is None:
            if key in destination:
                del destination[key]
        else:
            destination[key] = value
    yield
    for key, value in original.items():
        if value is None:
            if key in destination:
                del destination[key]
        else:
            destination[key] = value


def Environ(**changes):
    """A context manager to temporarily change the os.environ"""
    return NoNoneDictMutator(os.environ, **changes)


ALPHABET = string.ascii_letters + string.digits


def random_string(k, source=ALPHABET):
    """Generate a random string with length <i>k</i>
    """
    result = ''
    for i in range(0, k):
        result += random.choice(source)
    return result

Reply via email to