[Python-modules-commits] [python-keyring] 01/02: Import python-keyring_10.1.orig.tar.gz

Dmitry Shachnev mitya57 at moszumanska.debian.org
Mon Dec 5 15:08:43 UTC 2016


This is an automated email from the git hooks/post-receive script.

mitya57 pushed a commit to branch master
in repository python-keyring.

commit a9b957d4bee24af5bd69a87b2f68ccf3cc25c189
Author: Dmitry Shachnev <mitya57 at gmail.com>
Date:   Mon Dec 5 18:01:33 2016 +0300

    Import python-keyring_10.1.orig.tar.gz
---
 .travis.yml                                  |  2 -
 CHANGES.rst                                  |  7 +++-
 PKG-INFO                                     |  3 +-
 README.rst                                   |  1 +
 appveyor.yml                                 | 19 ++++++++++
 docs/conf.py                                 |  2 +-
 docs/requirements.txt                        |  1 +
 keyring.egg-info/PKG-INFO                    |  3 +-
 keyring.egg-info/SOURCES.txt                 |  2 +
 keyring/backend.py                           | 12 ++++++
 keyring/backends/SecretService.py            | 16 +++++---
 keyring/backends/Windows.py                  |  6 ++-
 keyring/backends/fail.py                     |  9 +++--
 keyring/backends/kwallet.py                  | 29 +++++++++++++--
 keyring/tests/backends/test_SecretService.py |  4 +-
 keyring/tests/backends/test_Windows.py       | 15 +-------
 keyring/tests/backends/test_kwallet.py       | 12 ++++--
 keyring/tests/test_backend.py                | 55 ++++++++++++++--------------
 keyring/util/escape.py                       |  2 +-
 setup.py                                     |  2 +-
 20 files changed, 135 insertions(+), 67 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 22fb3e0..348689f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,8 +22,6 @@ script:
 branches:
   except:
   - skeleton
-before_deploy:
-- pip install https://dl.dropboxusercontent.com/u/54081/cheeseshop/setuptools_scm-1.14.1b1.tar.gz
 deploy:
   provider: pypi
   server: https://upload.pypi.org/legacy/
diff --git a/CHANGES.rst b/CHANGES.rst
index aa96303..c502906 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,5 +1,8 @@
-CHANGES
-=======
+10.1
+----
+
+* #253: Backends now expose a '.name' attribute suitable
+  for identifying each backend to users.
 
 10.0.2
 -----
diff --git a/PKG-INFO b/PKG-INFO
index a75c40c..55533d8 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: keyring
-Version: 10.0.2
+Version: 10.1
 Summary: Store and access your passwords safely.
 Home-page: https://github.com/jaraco/keyring
 Author: Jason R. Coombs
@@ -16,6 +16,7 @@ Description: .. image:: https://img.shields.io/pypi/v/keyring.svg
         .. image:: https://img.shields.io/travis/jaraco/keyring/master.svg
            :target: http://travis-ci.org/jaraco/keyring
         
+        
         =======================================
         Installing and Using Python Keyring Lib
         =======================================
diff --git a/README.rst b/README.rst
index 609adce..f0b97a1 100644
--- a/README.rst
+++ b/README.rst
@@ -8,6 +8,7 @@
 .. image:: https://img.shields.io/travis/jaraco/keyring/master.svg
    :target: http://travis-ci.org/jaraco/keyring
 
+
 =======================================
 Installing and Using Python Keyring Lib
 =======================================
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..47da287
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,19 @@
+environment:
+
+  APPVEYOR: true
+
+  matrix:
+    - PYTHON: "C:\\Python35-x64"
+    - PYTHON: "C:\\Python27-x64"
+
+install:
+  # symlink python from a directory with a space
+  - "mklink /d \"C:\\Program Files\\Python\" %PYTHON%"
+  - "SET PYTHON=\"C:\\Program Files\\Python\""
+  - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
+
+build: off
+
+test_script:
+  - "python -m pip install tox"
+  - "tox -- -rs -v"
diff --git a/docs/conf.py b/docs/conf.py
index 5b425d1..7066288 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -20,7 +20,7 @@ release = version
 master_doc = 'index'
 
 link_files = {
-    'CHANGES.rst': dict(
+    '../CHANGES.rst': dict(
         using=dict(
             GH='https://github.com',
             project=project,
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..442df9f
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1 @@
+rst.linker
diff --git a/keyring.egg-info/PKG-INFO b/keyring.egg-info/PKG-INFO
index a75c40c..55533d8 100644
--- a/keyring.egg-info/PKG-INFO
+++ b/keyring.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: keyring
-Version: 10.0.2
+Version: 10.1
 Summary: Store and access your passwords safely.
 Home-page: https://github.com/jaraco/keyring
 Author: Jason R. Coombs
@@ -16,6 +16,7 @@ Description: .. image:: https://img.shields.io/pypi/v/keyring.svg
         .. image:: https://img.shields.io/travis/jaraco/keyring/master.svg
            :target: http://travis-ci.org/jaraco/keyring
         
+        
         =======================================
         Installing and Using Python Keyring Lib
         =======================================
diff --git a/keyring.egg-info/SOURCES.txt b/keyring.egg-info/SOURCES.txt
index 10296a4..9d4c2bb 100644
--- a/keyring.egg-info/SOURCES.txt
+++ b/keyring.egg-info/SOURCES.txt
@@ -3,6 +3,7 @@
 .travis.yml
 CHANGES.rst
 README.rst
+appveyor.yml
 conftest.py
 hook-keyring.backend.py
 pytest.ini
@@ -12,6 +13,7 @@ tox.ini
 docs/conf.py
 docs/history.rst
 docs/index.rst
+docs/requirements.txt
 keyring/__init__.py
 keyring/__main__.py
 keyring/backend.py
diff --git a/keyring/backend.py b/keyring/backend.py
index 496173a..75e65da 100644
--- a/keyring/backend.py
+++ b/keyring/backend.py
@@ -66,6 +66,18 @@ class KeyringBackend(object):
             cls.priority
         return not bool(exc)
 
+    @properties.ClassProperty
+    @classmethod
+    def name(cls):
+        """
+        The keyring name, suitable for display.
+
+        The name is derived from module and class name.
+        """
+        parent, sep, mod_name = cls.__module__.rpartition('.')
+        mod_name = mod_name.replace('_', ' ')
+        return ' '.join([mod_name, cls.__name__])
+
     @abc.abstractmethod
     def get_password(self, service, username):
         """Get password of the username for the service
diff --git a/keyring/backends/SecretService.py b/keyring/backends/SecretService.py
index ca646aa..9f7fe74 100644
--- a/keyring/backends/SecretService.py
+++ b/keyring/backends/SecretService.py
@@ -33,10 +33,16 @@ class Keyring(KeyringBackend):
                 "Unable to initialize SecretService: %s" % e)
         return 5
 
-    def get_default_collection(self):
+    def get_preferred_collection(self):
+        """If self.preferred_collection contains a D-Bus path, the collection
+        at that address is returned. Otherwise, the default collection is returned.
+        """
         bus = secretstorage.dbus_init()
         try:
-            collection = secretstorage.get_default_collection(bus)
+            if hasattr(self, 'preferred_collection'):
+                collection = secretstorage.Collection(bus, self.preferred_collection)
+            else:
+                collection = secretstorage.get_default_collection(bus)
         except exceptions.SecretStorageException as e:
             raise InitError("Failed to create the collection: %s." % e)
         if collection.is_locked():
@@ -48,7 +54,7 @@ class Keyring(KeyringBackend):
     def get_password(self, service, username):
         """Get password of the username for the service
         """
-        collection = self.get_default_collection()
+        collection = self.get_preferred_collection()
         items = collection.search_items(
             {"username": username, "service": service})
         for item in items:
@@ -60,7 +66,7 @@ class Keyring(KeyringBackend):
     def set_password(self, service, username, password):
         """Set password for the username of the service
         """
-        collection = self.get_default_collection()
+        collection = self.get_preferred_collection()
         attributes = {
             "application": "python-keyring",
             "service": service,
@@ -72,7 +78,7 @@ class Keyring(KeyringBackend):
     def delete_password(self, service, username):
         """Delete the stored password (only the first one)
         """
-        collection = self.get_default_collection()
+        collection = self.get_preferred_collection()
         items = collection.search_items(
             {"username": username, "service": service})
         for item in items:
diff --git a/keyring/backends/Windows.py b/keyring/backends/Windows.py
index 02df353..5acda28 100644
--- a/keyring/backends/Windows.py
+++ b/keyring/backends/Windows.py
@@ -1,7 +1,9 @@
+from __future__ import unicode_literals
+
 import functools
 
 from ..py27compat import unicode_str
-from ..util import escape, properties
+from ..util import properties
 from ..backend import KeyringBackend
 from ..errors import PasswordDeleteError, ExceptionRaisedContext
 
@@ -60,7 +62,7 @@ class WinVaultKeyring(KeyringBackend):
 
     @staticmethod
     def _compound_name(username, service):
-        return escape.u('%(username)s@%(service)s') % vars()
+        return '%(username)s@%(service)s' % vars()
 
     def get_password(self, service, username):
         # first attempt to get the password under the service name
diff --git a/keyring/backends/fail.py b/keyring/backends/fail.py
index 5b06aec..0659c45 100644
--- a/keyring/backends/fail.py
+++ b/keyring/backends/fail.py
@@ -15,8 +15,11 @@ class Keyring(KeyringBackend):
     priority = 0
 
     def get_password(self, service, username, password=None):
-        raise RuntimeError("No recommended backend was available. Install the "
-                           "keyrings.alt package if you want to use the non-"
-                           "recommended backends. See README.rst for details.")
+        msg = (
+            "No recommended backend was available. Install the "
+            "keyrings.alt package if you want to use the non-"
+            "recommended backends. See README.rst for details."
+        )
+        raise RuntimeError(msg)
 
     set_password = delete_pasword = get_password
diff --git a/keyring/backends/kwallet.py b/keyring/backends/kwallet.py
index becf87d..21a2309 100644
--- a/keyring/backends/kwallet.py
+++ b/keyring/backends/kwallet.py
@@ -12,9 +12,14 @@ except ImportError:
 
 
 class DBusKeyring(KeyringBackend):
-    """KDE KWallet via D-Bus"""
+    """
+    KDE KWallet 5 via D-Bus
+    """
 
     appid = 'Python program'
+    wallet = None
+    bus_name = 'org.kde.kwalletd5'
+    object_path = '/modules/kwalletd5'
 
     @properties.ClassProperty
     @classmethod
@@ -26,9 +31,11 @@ class DBusKeyring(KeyringBackend):
         except dbus.DBusException as exc:
             raise RuntimeError(exc.get_dbus_message())
         try:
-            bus.get_object('org.kde.kwalletd5', '/modules/kwalletd5')
+            bus.get_object(cls.bus_name, cls.object_path)
         except dbus.DBusException:
-            raise RuntimeError('cannot connect to org.kde.kwalletd5')
+            tmpl = 'cannot connect to {bus_name}'
+            msg = tmpl.format(bus_name=cls.bus_name)
+            raise RuntimeError(msg)
         return 4.9
 
     def __init__(self, *arg, **kw):
@@ -63,7 +70,7 @@ class DBusKeyring(KeyringBackend):
         bus = dbus.SessionBus()
         wId = 0
         try:
-            remote_obj = bus.get_object('org.kde.kwalletd5', '/modules/kwalletd5')
+            remote_obj = bus.get_object(self.bus_name, self.object_path)
             self.iface = dbus.Interface(remote_obj, 'org.kde.KWallet')
             self.handle = self.iface.open(
                         self.iface.networkWallet(), wId, self.appid)
@@ -104,3 +111,17 @@ class DBusKeyring(KeyringBackend):
         if not self.iface.hasEntry(self.handle, service, username, self.appid):
             raise PasswordDeleteError("Password not found")
         self.iface.removeEntry(self.handle, service, username, self.appid)
+
+
+class DBusKeyringKWallet4(DBusKeyring):
+    """
+    KDE KWallet 4 via D-Bus
+    """
+
+    bus_name = 'org.kde.kwalletd'
+    object_path = '/modules/kwalletd'
+
+    @properties.ClassProperty
+    @classmethod
+    def priority(cls):
+        return super(DBusKeyringKWallet4, cls).priority - 1
diff --git a/keyring/tests/backends/test_SecretService.py b/keyring/tests/backends/test_SecretService.py
index 202b014..1287dc0 100644
--- a/keyring/tests/backends/test_SecretService.py
+++ b/keyring/tests/backends/test_SecretService.py
@@ -12,7 +12,9 @@ class SecretServiceKeyringTestCase(BackendBasicTests, unittest.TestCase):
     def init_keyring(self):
         print("Testing SecretServiceKeyring; the following "
             "password prompts are for this keyring")
-        return SecretService.Keyring()
+        keyring = SecretService.Keyring()
+        keyring.preferred_collection = '/org/freedesktop/secrets/collection/session'
+        return keyring
 
 class SecretServiceKeyringUnitTests(unittest.TestCase):
     def test_supported_no_secretstorage(self):
diff --git a/keyring/tests/backends/test_Windows.py b/keyring/tests/backends/test_Windows.py
index fa5289c..24cce66 100644
--- a/keyring/tests/backends/test_Windows.py
+++ b/keyring/tests/backends/test_Windows.py
@@ -6,20 +6,9 @@ import unittest
 import keyring.backends.Windows
 from ..test_backend import BackendBasicTests
 
-def is_winvault_supported():
-    try:
-        __import__('win32cred')
-        has_pywin32 = True
-    except ImportError:
-        has_pywin32 = False
-    return (
-        sys.platform in ['win32'] and sys.getwindowsversion().major >= 6
-        and has_pywin32
-    )
 
-
- at unittest.skipUnless(is_winvault_supported(),
-                     "Need WinVault")
+ at unittest.skipUnless(keyring.backends.Windows.WinVaultKeyring.viable,
+    "Needs Windows")
 class WinVaultKeyringTestCase(BackendBasicTests, unittest.TestCase):
     def tearDown(self):
         # clean up any credentials created
diff --git a/keyring/tests/backends/test_kwallet.py b/keyring/tests/backends/test_kwallet.py
index 851a309..0aca6da 100644
--- a/keyring/tests/backends/test_kwallet.py
+++ b/keyring/tests/backends/test_kwallet.py
@@ -1,11 +1,10 @@
-import string
 import unittest
 
 from keyring.backends import kwallet
-from ..util import random_string
 from ..test_backend import BackendBasicTests
 
- at unittest.skipUnless(kwallet.DBusKeyring.viable, "Need DBus")
+
+ at unittest.skipUnless(kwallet.DBusKeyring.viable, "KWallet5 unavailable")
 class DBusKWalletTestCase(BackendBasicTests, unittest.TestCase):
 
     # Remove '@' from service name as this is not supported in service names
@@ -66,3 +65,10 @@ class DBusKWalletTestCase(BackendBasicTests, unittest.TestCase):
                 ret_password, None,
                 "Not 'None' password returned for username: '%s' on service: '%s'. '%s' != '%s'. Passwords from old folder should be deleted during migration."
                 % (service, username, ret_password, None))
+
+
+ at unittest.skipUnless(kwallet.DBusKeyringKWallet4.viable,
+    "KWallet4 unavailable")
+class DBusKWallet4TestCase(DBusKWalletTestCase):
+    def init_keyring(self):
+        return kwallet.DBusKeyringKWallet4()
diff --git a/keyring/tests/test_backend.py b/keyring/tests/test_backend.py
index 2fa12bc..e4fd568 100644
--- a/keyring/tests/test_backend.py
+++ b/keyring/tests/test_backend.py
@@ -1,32 +1,34 @@
-# -*- coding: utf-8 -*-
-"""
-test_backend.py
-
-Test case for keyring basic function
+# coding: utf-8
 
-created by Kang Zhang 2009-07-14
 """
-from __future__ import with_statement
+Common test functionality for backends.
+"""
+
+from __future__ import unicode_literals
 
 import string
 
-from keyring.util import escape
+import pytest
+
 from .util import random_string
 from keyring import errors
 
 # unicode only characters
 # Sourced from The Quick Brown Fox... Pangrams
 # http://www.columbia.edu/~fdc/utf8/
-UNICODE_CHARS = escape.u(
-    """זהכיףסתםלשמועאיךתנצחקרפדעץטובבגן"""
-    """ξεσκεπάζωτηνψυχοφθόραβδελυγμία"""
-    """Съешьжеещёэтихмягкихфранцузскихбулокдавыпейчаю"""
-    """Жълтатадюлябешещастливачепухъткойтоцъфназамръзнакатогьон"""
+UNICODE_CHARS = (
+    "זהכיףסתםלשמועאיךתנצחקרפדעץטובבגן"
+    "ξεσκεπάζωτηνψυχοφθόραβδελυγμία"
+    "Съешьжеещёэтихмягкихфранцузскихбулокдавыпейчаю"
+    "Жълтатадюлябешещастливачепухъткойтоцъфназамръзнакатогьон"
 )
 
 # ensure no-ascii chars slip by - watch your editor!
 assert min(ord(char) for char in UNICODE_CHARS) > 127
 
+def is_ascii_printable(s):
+    return all(32 <= ord(c) < 127 for c in s)
+
 class BackendBasicTests(object):
     """Test for the keyring's basic functions. password_set and password_get
     """
@@ -51,15 +53,15 @@ class BackendBasicTests(object):
         keyring = self.keyring
 
         # for the non-existent password
-        self.assertEqual(keyring.get_password(service, username), None)
+        assert keyring.get_password(service, username) is None
 
         # common usage
         self.set_password(service, username, password)
-        self.assertEqual(keyring.get_password(service, username), password)
+        assert keyring.get_password(service, username) == password
 
         # for the empty password
         self.set_password(service, username, "")
-        self.assertEqual(keyring.get_password(service, username), "")
+        assert keyring.get_password(service, username) == ""
 
     def test_password_set_get(self):
         password = random_string(20)
@@ -79,13 +81,13 @@ class BackendBasicTests(object):
         service = random_string(20, self.DIFFICULT_CHARS)
         self.keyring.set_password(service, username, password)
         self.keyring.delete_password(service, username)
-        self.assertIsNone(self.keyring.get_password(service, username))
+        assert self.keyring.get_password(service, username) is None
 
     def test_delete_not_present(self):
         username = random_string(20, self.DIFFICULT_CHARS)
         service = random_string(20, self.DIFFICULT_CHARS)
-        self.assertRaises(errors.PasswordDeleteError,
-            self.keyring.delete_password, service, username)
+        with pytest.raises(errors.PasswordDeleteError):
+            self.keyring.delete_password(service, username)
 
     def test_delete_one_in_group(self):
         username1 = random_string(20, self.DIFFICULT_CHARS)
@@ -95,8 +97,10 @@ class BackendBasicTests(object):
         self.keyring.set_password(service, username1, password)
         self.set_password(service, username2, password)
         self.keyring.delete_password(service, username1)
-        self.assertEqual(self.keyring.get_password(
-           service, username2), password)
+        assert self.keyring.get_password(service, username2) == password
+
+    def test_name_property(self):
+        assert is_ascii_printable(self.keyring.name)
 
     def test_unicode_chars(self):
         password = random_string(20, UNICODE_CHARS)
@@ -122,10 +126,7 @@ class BackendBasicTests(object):
         keyring = self.keyring
         self.set_password('service1', 'user1', 'password1')
         self.set_password('service1', 'user2', 'password2')
-        self.assertEqual(keyring.get_password('service1', 'user1'),
-            'password1')
-        self.assertEqual(keyring.get_password('service1', 'user2'),
-            'password2')
+        assert keyring.get_password('service1', 'user1') == 'password1'
+        assert keyring.get_password('service1', 'user2') == 'password2'
         self.set_password('service2', 'user3', 'password3')
-        self.assertEqual(keyring.get_password('service1', 'user1'),
-            'password1')
+        assert keyring.get_password('service1', 'user1') == 'password1'
diff --git a/keyring/util/escape.py b/keyring/util/escape.py
index 41dd439..cbfd32a 100644
--- a/keyring/util/escape.py
+++ b/keyring/util/escape.py
@@ -19,7 +19,7 @@ if PY3:
         return chr(c)
 else:
     def u(s):
-        return unicode(s, "unicode_escape")
+        return s.decode('utf-8')
     def _unichr(c):
         return unichr(c)
 
diff --git a/setup.py b/setup.py
index 8833efb..05f9ed6 100644
--- a/setup.py
+++ b/setup.py
@@ -38,7 +38,7 @@ setup_params = dict(
         ],
     },
     setup_requires=[
-        'setuptools_scm>=1.9,!=1.13.1,!=1.14.0',
+        'setuptools_scm>=1.15.0',
     ] + wheel,
     classifiers=[
         "Development Status :: 5 - Production/Stable",

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-keyring.git



More information about the Python-modules-commits mailing list