[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