From 575d270e066bbefd9797b0b4b46f5b9161abb43a Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Fri, 10 Apr 2015 18:10:53 +0200 Subject: [PATCH] Use FingerprintAdapter from req-toolbelt Fix #187 --- .travis.yml | 2 +- CHANGELOG.rst | 2 ++ setup.py | 2 +- tests/storage/test_http.py | 7 +++---- vdirsyncer/storage/http.py | 11 +++++++---- vdirsyncer/utils/__init__.py | 24 +++++++++++++++++------- 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index e3273fd..a50bfdf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ env: # Radicale with filesystem storage (default) - BUILD=test DAV_SERVER=radicale RADICALE_BACKEND=filesystem REQUIREMENTS=release - PKGS='lxml==3.0 requests==2.4.1 requests_toolbelt==0.3.0 click==3.1' + PKGS='lxml==3.0 requests==2.4.1 requests_toolbelt==0.4.0 click==3.1' # Minimal requirements #- BUILD=test DAV_SERVER=radicale RADICALE_BACKEND=filesystem REQUIREMENTS=devel diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 061fc0d..0900f45 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,8 @@ Version 0.5.0 *yet to be released* +- Raise version of required requests-toolbelt to ``0.4.0``. + Version 0.4.4 ============= diff --git a/setup.py b/setup.py index 8ce0882..10a3ad9 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ setup( 'requests', 'lxml>=3.0', # https://github.com/sigmavirus24/requests-toolbelt/pull/28 - 'requests_toolbelt>=0.3.0', + 'requests_toolbelt>=0.4.0', 'atomicwrites' ], extras_require={'keyring': ['keyring']} diff --git a/tests/storage/test_http.py b/tests/storage/test_http.py index b6a508f..ecae7b0 100644 --- a/tests/storage/test_http.py +++ b/tests/storage/test_http.py @@ -100,13 +100,12 @@ def test_prepare_auth(): @pytest.mark.parametrize('auth', (None, 'guess')) def test_prepare_auth_guess(monkeypatch, auth): - import requests_toolbelt + import requests_toolbelt.auth.guess assert isinstance(prepare_auth(auth, 'user', 'pwd'), - requests_toolbelt.GuessAuth) + requests_toolbelt.auth.guess.GuessAuth) - if hasattr(requests_toolbelt, 'GuessAuth'): - monkeypatch.delattr(requests_toolbelt, 'GuessAuth') + monkeypatch.delattr(requests_toolbelt.auth.guess, 'GuessAuth') with pytest.raises(RuntimeError) as excinfo: prepare_auth(auth, 'user', 'pwd') diff --git a/vdirsyncer/storage/http.py b/vdirsyncer/storage/http.py index 2159a10..1284297 100644 --- a/vdirsyncer/storage/http.py +++ b/vdirsyncer/storage/http.py @@ -17,11 +17,14 @@ def prepare_auth(auth, username, password): from requests.auth import HTTPDigestAuth return HTTPDigestAuth(username, password) elif auth == 'guess' or auth is None: - import requests_toolbelt - if not hasattr(requests_toolbelt, 'GuessAuth'): + try: + from requests_toolbelt.auth.guess import GuessAuth + except ImportError: raise RuntimeError('Your version of requests_toolbelt is too ' - 'old.') - return requests_toolbelt.GuessAuth(username, password) + 'old for `guess` authentication. At least ' + 'version 0.4.0 is required.') + else: + return GuessAuth(username, password) else: raise ValueError('Unknown authentication method: {}'.format(auth)) elif auth: diff --git a/vdirsyncer/utils/__init__.py b/vdirsyncer/utils/__init__.py index 3c4917e..fcf22be 100644 --- a/vdirsyncer/utils/__init__.py +++ b/vdirsyncer/utils/__init__.py @@ -201,6 +201,20 @@ VERIFY_FINGERPRINT_WORKS = _verify_fingerprint_works() del _verify_fingerprint_works +def _install_fingerprint_adapter(session, fingerprint): + prefix = 'https://' + try: + from requests_toolbelt.adapters.fingerprint import \ + FingerprintAdapter + except ImportError: + raise RuntimeError('`verify_fingerprint` can only be used with ' + 'requests-toolbelt versions >= 0.4.0') + + if not isinstance(session.adapters[prefix], FingerprintAdapter): + fingerprint_adapter = FingerprintAdapter(fingerprint) + session.mount(prefix, fingerprint_adapter) + + def request(method, url, session=None, latin1_fallback=True, verify_fingerprint=None, **kwargs): ''' @@ -223,14 +237,10 @@ def request(method, url, session=None, latin1_fallback=True, if verify_fingerprint is not None: if not VERIFY_FINGERPRINT_WORKS: - raise ValueError('`verify_fingerprint` can only be used with ' - 'requests versions >= 2.4.1') + raise RuntimeError('`verify_fingerprint` can only be used with ' + 'requests versions >= 2.4.1') + _install_fingerprint_adapter(session, verify_fingerprint) kwargs['verify'] = False - https_prefix = 'https://' - - if not isinstance(session.adapters[https_prefix], _FingerprintAdapter): - fingerprint_adapter = _FingerprintAdapter(verify_fingerprint) - session.mount(https_prefix, fingerprint_adapter) func = session.request