From f27f5e46a92c0ee246a0563cc4b034beec7360d5 Mon Sep 17 00:00:00 2001 From: Max Belanger Date: Wed, 8 May 2024 16:27:20 -0700 Subject: [PATCH 1/2] remove `six`, drop support for python 2 --- dropbox/dropbox_client.py | 5 ++--- dropbox/oauth.py | 25 +++++++------------------ example/updown.py | 3 +-- requirements.txt | 1 - setup.py | 1 - 5 files changed, 10 insertions(+), 25 deletions(-) diff --git a/dropbox/dropbox_client.py b/dropbox/dropbox_client.py index 3883cf1f..3dcaa8a5 100644 --- a/dropbox/dropbox_client.py +++ b/dropbox/dropbox_client.py @@ -16,7 +16,6 @@ import time import requests -import six from datetime import datetime, timedelta from dropbox.auth import ( @@ -75,7 +74,7 @@ def __init__(self, obj_result, http_resp=None): :param requests.models.Response http_resp: A raw HTTP response. It will be used to stream the binary-body payload of the response. """ - assert isinstance(obj_result, six.string_types), \ + assert isinstance(obj_result, str), \ 'obj_result: expected string, got %r' % type(obj_result) if http_resp is not None: assert isinstance(http_resp, requests.models.Response), \ @@ -530,7 +529,7 @@ def request_json_string(self, if host not in self._host_map: raise ValueError('Unknown value for host: %r' % host) - if not isinstance(request_binary, (six.binary_type, type(None))): + if not isinstance(request_binary, (bytes, type(None))): # Disallow streams and file-like objects even though the underlying # requests library supports them. This is to prevent incorrect # behavior when a non-rewindable stream is read from, but the diff --git a/dropbox/oauth.py b/dropbox/oauth.py index eaf5d462..1c93f3c0 100644 --- a/dropbox/oauth.py +++ b/dropbox/oauth.py @@ -14,7 +14,6 @@ import base64 import os -import six import urllib import re from datetime import datetime, timedelta @@ -26,13 +25,6 @@ DEFAULT_TIMEOUT, ) -if six.PY3: - url_path_quote = urllib.parse.quote # pylint: disable=no-member,useless-suppression - url_encode = urllib.parse.urlencode # pylint: disable=no-member,useless-suppression -else: - url_path_quote = urllib.quote # pylint: disable=no-member,useless-suppression - url_encode = urllib.urlencode # pylint: disable=no-member,useless-suppression - TOKEN_ACCESS_TYPES = ['offline', 'online', 'legacy'] INCLUDE_GRANTED_SCOPES_TYPES = ['user', 'team'] PKCE_VERIFIER_LENGTH = 128 @@ -233,10 +225,7 @@ def build_path(self, target, params=None): :return: The path and parameters components of an API URL. :rtype: str """ - if six.PY2 and isinstance(target, six.text_type): - target = target.encode('utf8') - - target_path = url_path_quote(target) + target_path = urllib.parse.quote(target) params = params or {} params = params.copy() @@ -606,20 +595,20 @@ def _params_to_urlencoded(params): Returns a application/x-www-form-urlencoded :class:`str` representing the key/value pairs in :attr:`params`. - Keys are values are ``str()``'d before calling :meth:`urllib.urlencode`, with the exception of - unicode objects which are utf8-encoded. + Keys and values are coerced via ``str()``'d and encoded via UTF-8 before calling + :meth:`urllib.parse.urlencode`. """ def encode(o): - if isinstance(o, six.binary_type): + if isinstance(o, bytes): return o else: - if isinstance(o, six.text_type): + if isinstance(o, str): return o.encode('utf-8') else: return str(o).encode('utf-8') - utf8_params = {encode(k): encode(v) for k, v in six.iteritems(params)} - return url_encode(utf8_params) + utf8_params = {encode(k): encode(v) for k, v in params.items()} + return urllib.parse.urlencode(utf8_params) def _generate_pkce_code_verifier(): code_verifier = base64.urlsafe_b64encode(os.urandom(PKCE_VERIFIER_LENGTH)).decode('utf-8') diff --git a/example/updown.py b/example/updown.py index d0572490..f45db09d 100644 --- a/example/updown.py +++ b/example/updown.py @@ -9,7 +9,6 @@ import contextlib import datetime import os -import six import sys import time import unicodedata @@ -74,7 +73,7 @@ def main(): # First do all the files. for name in files: fullname = os.path.join(dn, name) - if not isinstance(name, six.text_type): + if not isinstance(name, str): name = name.decode('utf-8') nname = unicodedata.normalize('NFC', name) if name.startswith('.'): diff --git a/requirements.txt b/requirements.txt index 2b5b9a8e..42462d4e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,6 @@ # Dependencies required for installation (keep in sync with setup.py) requests<2.30 urllib3<2 -six >= 1.12.0 stone>=2,<3.3.3 # Other dependencies for development ply diff --git a/setup.py b/setup.py index 6e748976..ec441c2a 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,6 @@ install_reqs = [ 'requests<2.30', 'urllib3<2', - 'six >= 1.12.0', 'stone>=2,<3.3.3', ] From b21c8a5ec20b4417a0c0b76c16582a5e1ccb7105 Mon Sep 17 00:00:00 2001 From: Max Belanger Date: Wed, 8 May 2024 16:31:28 -0700 Subject: [PATCH 2/2] nit --- dropbox/oauth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dropbox/oauth.py b/dropbox/oauth.py index 1c93f3c0..fd89f5e0 100644 --- a/dropbox/oauth.py +++ b/dropbox/oauth.py @@ -595,7 +595,7 @@ def _params_to_urlencoded(params): Returns a application/x-www-form-urlencoded :class:`str` representing the key/value pairs in :attr:`params`. - Keys and values are coerced via ``str()``'d and encoded via UTF-8 before calling + Keys and values are coerced via ``str()`` and encoded via UTF-8 before calling :meth:`urllib.parse.urlencode`. """ def encode(o):