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
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy