8000 Better Python 3 compatibility · Michels10/wp-api-python@3bcd09b · GitHub
[go: up one dir, main page]

Skip to content

Commit 3bcd09b

Browse files
author
derwentx
committed
Better Python 3 compatibility
Credit to @mvartanyan for a lot of these changes. Tested on v3.6.2 and v2.7.13 using pyenv
1 parent 8608b6e commit 3bcd09b

File tree

7 files changed

+32
-20
lines changed

7 files changed

+32
-20
lines changed

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2.7.13

requirements-test.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
-r requirements.txt
22
httmock==1.2.3
33
nose==1.3.7
4+
six

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
requests==2.7.0
22
ordereddict==1.1
33
bs4
4+
six

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
],
4848
tests_require=[
4949
'httmock',
50-
'pytest'
50+
'pytest',
51+
'six'
5152
],
5253
classifiers=[
5354
"Development Status :: 5 - Production/Stable",

tests.py

Lines changed: 15 additions & 12 deletions
< 629A tr class="diff-line-row">
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def test_with_timeout(self):
115115
def woo_test_mock(*args, **kwargs):
116116
""" URL Mock """
117117
return {'status_code': 200,
118-
'content': 'OK'}
118+
'content': b'OK'}
119119

120120
with HTTMock(woo_test_mock):
121121
# call requests
@@ -128,7 +128,7 @@ def test_get(self):
128128
def woo_test_mock(*args, **kwargs):
129129
""" URL Mock """
130130
return {'status_code': 200,
131-
'content': 'OK'}
131+
'content': b'OK'}
132132

133133
with HTTMock(woo_test_mock):
134134
# call requests
@@ -141,7 +141,7 @@ def test_post(self):
141141
def woo_test_mock(*args, **kwargs):
142142
""" URL Mock """
143143
return {'status_code': 201,
144-
'content': 'OK'}
144+
'content': b'OK'}
145145

146146
with HTTMock(woo_test_mock):
147147
# call requests
@@ -154,7 +154,7 @@ def test_put(self):
154154
def woo_test_mock(*args, **kwargs):
155155
""" URL Mock """
156156
return {'status_code': 200,
157-
'content': 'OK'}
157+
'content': b'OK'}
158158

159159
with HTTMock(woo_test_mock):
160160
# call requests
@@ -167,7 +167,7 @@ def test_delete(self):
167167
def woo_test_mock(*args, **kwargs):
168168
""" URL Mock """
169169
return {'status_code': 200,
170-
'content': 'OK'}
170+
'content': b'OK'}
171171

172172
with HTTMock(woo_test_mock):
173173
# call requests
@@ -364,7 +364,7 @@ def test_request(self):
364364
def woo_test_mock(*args, **kwargs):
365365
""" URL Mock """
366366
return {'status_code': 200,
367-
'content': 'OK'}
367+
'content': b'OK'}
368368

369369
with HTTMock(woo_test_mock):
370370
# call requests
@@ -474,7 +474,7 @@ def setUp(self):
474474
('oauth_nonce', self.rfc1_request_nonce),
475475
('oauth_callback', self.rfc1_callback),
476476
]
477-
self.rfc1_request_signature = '74KNZJeDHnMBp0EMJ9ZHt/XKycU='
477+
self.rfc1_request_signature = b'74KNZJeDHnMBp0EMJ9ZHt/XKycU='
478478

479479

480480
# # RFC EXAMPLE 3 DATA: https://tools.ietf.org/html/draft-hammer-oauth-10#section-3.4.1
@@ -553,7 +553,7 @@ def setUp(self):
553553
self.twitter_signature_base_string = r"POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521"
554554
self.twitter_token_secret = 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE'
555555
self.twitter_signing_key = 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE'
556-
self.twitter_oauth_signature = 'tnnArxj06cWHq44gCs1OSKk/jLY='
556+
self.twitter_oauth_signature = b'tnnArxj06cWHq44gCs1OSKk/jLY='
557557

558558
self.lexev_consumer_key='your_app_key'
559559
self.lexev_consumer_secret='your_app_secret'
@@ -584,7 +584,7 @@ def setUp(self):
584584
('oauth_timestamp',self.lexev_request_timestamp),
585585
('oauth_version',self.lexev_version),
586586
]
587-
self.lexev_request_signature=r"iPdHNIu4NGOjuXZ+YCdPWaRwvJY="
587+
self.lexev_request_signature=b"iPdHNIu4NGOjuXZ+YCdPWaRwvJY="
588588
self.lexev_resource_url='https://api.bitbucket.org/1.0/repositories/st4lk/django-articles-transmeta/branches'
589589

590590
# def test_get_sign(self):
@@ -675,7 +675,10 @@ def test_generate_oauth_signature(self):
675675
self.rfc1_request_target_url,
676676
'%s&' % self.rfc1_consumer_secret
677677
)
678-
self.assertEqual(rfc1_request_signature, self.rfc1_request_signature)
678+
self.assertEqual(
679+
str(rfc1_request_signature),
680+
str(self.rfc1_request_signature)
681+
)
679682

680683
# TEST WITH RFC EXAMPLE 3 DATA
681684

@@ -735,7 +738,7 @@ def woo_api_mock(*args, **kwargs):
735738
""" URL Mock """
736739
return {
737740
'status_code': 200,
738-
'content': """
741+
'content': b"""
739742
{
740743
"name": "Wordpress",
741744
"description": "Just another WordPress site",
@@ -763,7 +766,7 @@ def woo_authentication_mock(*args, **kwargs):
763766
""" URL Mock """
764767
return {
765768
'status_code':200,
766-
'content':"""oauth_token=XXXXXXXXXXXX&oauth_token_secret=YYYYYYYYYYYY"""
769+
'content': b"""oauth_token=XXXXXXXXXXXX&oauth_token_secret=YYYYYYYYYYYY"""
767770
}
768771

769772
def test_get_sign_key(self):

wordpress/auth.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def __init__(self, requester, consumer_key, consumer_secret, **kwargs):
113113
self.force_nonce = kwargs.pop('force_nonce', None)
114114

115115
def get_sign_key(self, consumer_secret, token_secret=None):
116-
"gets consumer_secret and turns it into a string suitable for signing"
116+
"gets consumer_secret and turns it into a bytestring suitable for signing"
117117
if not consumer_secret:
118118
raise UserWarning("no consumer_secret provided")
119119
token_secret = str(token_secret) if token_secret else ''
@@ -129,7 +129,7 @@ def add_params_sign(self, method, url, params, sign_key=None, **kwargs):
129129
""" Adds the params to a given url, signs the url with sign_key if provided,
130130
otherwise generates sign_key automatically and returns a signed url """
131131
if isinstance(params, dict):
132-
params = params.items()
132+
params = list(params.items())
133133

134134
urlparse_result = urlparse(url)
135135

@@ -209,7 +209,11 @@ def generate_oauth_signature(self, method, params, url, key=None):
209209

210210
# print "\nstring_to_sign: %s" % repr(string_to_sign)
211211
# print "\nkey: %s" % repr(key)
212-
sig = HMAC(key, string_to_sign, hmac_mod)
212+
sig = HMAC(
213+
bytes(key.encode('utf-8')),
214+
bytes(string_to_sign.encode('utf-8')),
215+
hmac_mod
216+
)
213217
sig_b64 = binascii.b2a_base64(sig.digest())[:-1]
214218
# print "\nsig_b64: %s" % sig_b64
215219
return sig_b64
@@ -469,7 +473,7 @@ def get_verifier(self, request_token=None, wp_user=None, wp_pass=None):
469473
}
470474
try:
471475
login_form_action, login_form_data = self.get_form_info(login_form_response, 'loginform')
472-
except AssertionError, exc:
476+
except AssertionError as exc:
473477
self.parse_login_form_error(
474478
login_form_response, exc, **login_form_params
475479
)
@@ -490,7 +494,7 @@ def get_verifier(self, request_token=None, wp_user=None, wp_pass=None):
490494
confirmation_response = authorize_session.post(login_form_action, data=login_form_data, allow_redirects=True)
491495
try:
492496
authorize_form_action, authorize_form_data = self.get_form_info(confirmation_response, 'oauth1_authorize_form')
493-
except AssertionError, exc:
497+
except AssertionError as exc:
494498
self.parse_login_form_error(
495499
confirmation_response, exc, **login_form_params
496500
)
@@ -542,7 +546,7 @@ def store_access_creds(self):
542546
creds['access_token_secret'] = self.access_token_secret
543547
if creds:
544548
with open(self.creds_store, 'w+') as creds_store_file:
545-
json.dump(creds, creds_store_file, ensure_ascii=False, encoding='utf-8')
549+
json.dump(creds, creds_store_file, ensure_ascii=False)
546550

547551
def retrieve_access_creds(self):
548552
""" retrieve the access_token and access_token_secret stored locally. """

wordpress/helpers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@
1111
import posixpath
1212

1313
try:
14-
from urllib.parse import urlencode, quote, unquote, parse_qsl, urlparse, urlunparse
14+
from urllib.parse import urlencode, quote, unquote, parse_qs, parse_qsl, urlparse, urlunparse
1515
from urllib.parse import ParseResult as URLParseResult
1616
except ImportError:
1717
from urllib import urlencode, quote, unquote
1818
from urlparse import parse_qs, parse_qsl, urlparse, urlunparse
1919
from urlparse import ParseResult as URLParseResult
2020

2121
from collections import OrderedDict
22+
from six.moves import reduce
2223

2324
from bs4 import BeautifulSoup
2425

0 commit comments

Comments
 (0)
0