diff --git a/patreon/api.py b/patreon/api.py index c4aa18b..b2072b9 100644 --- a/patreon/api.py +++ b/patreon/api.py @@ -1,12 +1,11 @@ import requests -import six from patreon.jsonapi.parser import JSONAPIParser from patreon.jsonapi.url_util import build_url from patreon.schemas import campaign from patreon.utils import user_agent_string from patreon.version_compatibility.utc_timezone import utc_timezone -from six.moves.urllib.parse import urlparse, parse_qs, urlencode +from patreon.version_compatibility.urllib_parse import urlencode, urlparse, parse_qs class API(object): @@ -70,7 +69,7 @@ def head_and_tail(path): if current_dict is None or (head is not None and tail is None): return None # Path stopped before leaf was reached - elif current_dict and type(current_dict) != six.text_type: + elif current_dict and type(current_dict) != str: raise Exception( 'Provided cursor path did not result in a link', current_dict ) diff --git a/patreon/api_spec.py b/patreon/api_spec.py index f4f235a..7a3ef85 100644 --- a/patreon/api_spec.py +++ b/patreon/api_spec.py @@ -1,20 +1,18 @@ import datetime import functools import mock -import six from patreon import api from patreon.jsonapi import url_util from patreon.jsonapi.parser import JSONAPIParser from patreon.utils import user_agent_string +from patreon.version_compatibility import urllib_parse from patreon.version_compatibility.utc_timezone import utc_timezone -from six.moves.urllib.parse import urlencode MOCK_CAMPAIGN_ID = 12 -API_ROOT_ENDPOINT = six.text_type('https://www.patreon.com/api/oauth2/api/') -MOCK_ACCESS_TOKEN = six.text_type('mock token') -MOCK_CURSOR_VALUE = six.text_type('Mock Cursor Value') - +API_ROOT_ENDPOINT = 'https://www.patreon.com/api/oauth2/api/' +MOCK_ACCESS_TOKEN = 'mock token' +MOCK_CURSOR_VALUE = 'Mock Cursor Value' DEFAULT_API_HEADERS = { 'Authorization': 'Bearer ' + MOCK_ACCESS_TOKEN, @@ -25,7 +23,7 @@ def api_url(*segments, **query): - path = six.text_type('/').join(map(six.text_type, segments)) + path = '/'.join(map(str, segments)) fields = query.get('fields', None) includes = query.get('includes', None) @@ -37,7 +35,7 @@ def api_url(*segments, **query): del query['includes'] if query: - path += '?' + urlencode(query) + path += '?' + urllib_parse.urlencode(query) return url_util.build_url( API_ROOT_ENDPOINT + path, @@ -87,10 +85,10 @@ def execute_test(method_func, *args, **kwargs): def test_extract_cursor_returns_cursor_when_provided(): assert MOCK_CURSOR_VALUE == api.API.extract_cursor( { - six.text_type('links'): + 'links': { - six.text_type('next'): - six.text_type('https://patreon.com/members?page[cursor]=') + + 'next': + 'https://patreon.com/members?page[cursor]=' + MOCK_CURSOR_VALUE, }, } @@ -100,8 +98,8 @@ def test_extract_cursor_returns_cursor_when_provided(): def test_extract_cursor_returns_None_when_no_cursor_provided(): assert None is api.API.extract_cursor( { - six.text_type('links'): { - six.text_type('next'): six.text_type('https://patreon.com/members?page[offset]=25'), + 'links': { + 'next': 'https://patreon.com/members?page[offset]=25', }, } ) @@ -109,8 +107,8 @@ def test_extract_cursor_returns_None_when_no_cursor_provided(): def test_extract_cursor_returns_None_when_link_is_not_a_string(): assert None is api.API.extract_cursor({ - six.text_type('links'): { - six.text_type('next'): None, + 'links': { + 'next': None, }, }) @@ -120,8 +118,8 @@ def test_extract_cursor_returns_None_when_link_is_malformed(): try: api.API.extract_cursor({ - six.text_type('links'): { - six.text_type('next'): 12, + 'links': { + 'next': 12, }, }) @@ -134,12 +132,12 @@ def test_extract_cursor_returns_None_when_link_is_malformed(): @api_test() def test_can_fetch_user(): - return api_url(six.text_type('current_user')), client.fetch_user() + return api_url('current_user'), client.fetch_user() @api_test() def test_can_fetch_campaign(): - expected_url = api_url(six.text_type('current_user'), six.text_type('campaigns')) + expected_url = api_url('current_user', 'campaigns') response = client.fetch_campaign() return expected_url, response @@ -149,9 +147,9 @@ def test_can_fetch_api_and_patrons(): response = client.fetch_campaign_and_patrons() expected_url = api_url( - six.text_type('current_user'), - six.text_type('campaigns'), - includes=[six.text_type('rewards'), six.text_type('creator'), six.text_type('goals'), six.text_type('pledges')], + 'current_user', + 'campaigns', + includes=['rewards', 'creator', 'goals', 'pledges'], ) return expected_url, response diff --git a/patreon/jsonapi/url_util.py b/patreon/jsonapi/url_util.py index 4cb41c5..5d97e3f 100644 --- a/patreon/jsonapi/url_util.py +++ b/patreon/jsonapi/url_util.py @@ -1,5 +1,6 @@ from collections import OrderedDict -from six.moves.urllib.parse import urlencode + +from patreon.version_compatibility.urllib_parse import urlencode def joined_or_null(arr): diff --git a/patreon/version_compatibility/urllib_parse.py b/patreon/version_compatibility/urllib_parse.py new file mode 100644 index 0000000..b956d97 --- /dev/null +++ b/patreon/version_compatibility/urllib_parse.py @@ -0,0 +1,7 @@ +try: + # python2 + from urllib import urlencode + from urlparse import urlparse, parse_qs +except ImportError: + # python3 + from urllib.parse import urlencode, urlparse, parse_qs