diff --git a/.travis.yml b/.travis.yml index a06e809..4350900 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,9 @@ language: python python: - "2.6" - "2.7" + - "3.6" -install: "pip install . --use-mirrors" +install: "pip install ." script: python setup.py nosetests diff --git a/aweber_api/__init__.py b/aweber_api/__init__.py index 2799007..ab1e8f6 100644 --- a/aweber_api/__init__.py +++ b/aweber_api/__init__.py @@ -1,5 +1,3 @@ -from urlparse import parse_qs - from aweber_api.base import ( ACCESS_TOKEN_URL, APIException, @@ -13,6 +11,11 @@ from aweber_api.oauth import OAuthAdapter from aweber_api.response import AWeberResponse +try: + from urlparse import parse_qs +except ImportError: + from urllib.parse import parse_qs + class AWeberAPI(AWeberBase): """Base class for connecting to the AWeberAPI. diff --git a/aweber_api/collection.py b/aweber_api/collection.py index b176e69..24a1e1a 100644 --- a/aweber_api/collection.py +++ b/aweber_api/collection.py @@ -1,11 +1,15 @@ from math import floor -from urlparse import parse_qs -from urllib import urlencode from aweber_api.base import API_BASE from aweber_api.entry import AWeberEntry from aweber_api.response import AWeberResponse +try: + from urlparse import parse_qs + from urllib import urlencode +except ImportError: + from urllib.parse import parse_qs, urlencode + class AWeberCollection(AWeberResponse): """Represents a collection of similar objects. @@ -122,7 +126,7 @@ def __len__(self): def __iter__(self): return self - def next(self): + def __next__(self): """Get the next entry in the collection.""" if self._current < self.total_size: self._current += 1 @@ -130,6 +134,10 @@ def next(self): self._current = 0 raise StopIteration + def next(self): + """Added for python2 compatibility""" + return self.__next__() + def __getitem__(self, offset): if offset < 0 or offset >= self._data['total_size']: raise ValueError('Offset {0} does not exist'.format(offset)) diff --git a/aweber_api/entry.py b/aweber_api/entry.py index 8e34faf..bf2571e 100644 --- a/aweber_api/entry.py +++ b/aweber_api/entry.py @@ -1,9 +1,12 @@ -from urllib import urlencode - import aweber_api from aweber_api.data_dict import DataDict from aweber_api.response import AWeberResponse +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode + class AWeberEntry(AWeberResponse): """Represents a single entry in the AWeber API data heirarchy. diff --git a/aweber_api/oauth.py b/aweber_api/oauth.py index 2c3cbde..9d0b3bc 100644 --- a/aweber_api/oauth.py +++ b/aweber_api/oauth.py @@ -1,11 +1,16 @@ -from urllib import urlencode import json import os import oauth2 as oauth +import six from aweber_api.base import APIException +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode + class OAuthAdapter(object): @@ -61,7 +66,9 @@ def request(self, method, url, data={}, response='body'): raise APIException( '{0}: {1}'.format(error_type, error_msg)) - if response == 'body' and isinstance(content, str): + if isinstance(content, six.binary_type): + content = content.decode('utf-8') + if response == 'body' and isinstance(content, six.string_types): return self._parse(content) if response == 'status': return resp['status'] diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mock_adapter.py b/tests/mock_adapter.py index 4b03f43..feeaf0d 100644 --- a/tests/mock_adapter.py +++ b/tests/mock_adapter.py @@ -1,12 +1,15 @@ import json import os -from urlparse import urlparse, parse_qs -from urllib import quote import mock -from aweber_api import AWeberUser -from aweber_api import OAuthAdapter +from aweber_api import AWeberUser, OAuthAdapter + +try: + from urllib import quote + from urlparse import urlparse, parse_qs +except ImportError: + from urllib.parse import urlparse, parse_qs, quote __all__ = ['MockAdapter'] diff --git a/tests/test_aweber_api.py b/tests/test_aweber_api.py index 7c6eb46..2064a9f 100644 --- a/tests/test_aweber_api.py +++ b/tests/test_aweber_api.py @@ -1,5 +1,5 @@ from unittest import TestCase -from mock_adapter import MockAdapter +from tests.mock_adapter import MockAdapter from mock import Mock from aweber_api import (AWeberAPI, AWeberUser, ACCESS_TOKEN_URL, AUTHORIZE_URL, REQUEST_TOKEN_URL, AWeberEntry) diff --git a/tests/test_aweber_collection.py b/tests/test_aweber_collection.py index c5601fd..c281fb4 100644 --- a/tests/test_aweber_collection.py +++ b/tests/test_aweber_collection.py @@ -3,7 +3,7 @@ from aweber_api import AWeberAPI, AWeberCollection, AWeberEntry from aweber_api.base import API_BASE, APIException -from mock_adapter import MockAdapter +from tests.mock_adapter import MockAdapter class TestAWeberCollection(TestCase): diff --git a/tests/test_aweber_entry.py b/tests/test_aweber_entry.py index eb73232..9ffed41 100644 --- a/tests/test_aweber_entry.py +++ b/tests/test_aweber_entry.py @@ -1,10 +1,14 @@ import re from unittest import TestCase -from urllib import urlencode from aweber_api import AWeberAPI, AWeberCollection, AWeberEntry from aweber_api.base import APIException -from mock_adapter import MockAdapter +from tests.mock_adapter import MockAdapter + +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode class TestAWeberEntry(TestCase): diff --git a/tox.ini b/tox.ini index 3822e35..f952b95 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ # When making changes, make sure to also edit the .travis.yml file. [tox] -envlist = py26, py27 +envlist = py26, py27, py36 [testenv] commands = python setup.py nosetests []