Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions examples/charge.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
from __future__ import absolute_import, division, print_function

import os

import stripe

stripe.api_key = 'tGN0bIwXnHdwOa85VABjPdSn8nWY7G7I'

print "Attempting charge..."
stripe.api_key = os.environ.get('STRIPE_SECRET_KEY')

print("Attempting charge...")

resp = stripe.Charge.create(
amount=200,
Expand All @@ -11,4 +16,4 @@
description='[email protected]'
)

print 'Success: %r' % (resp, )
print('Success: %r' % (resp))
2 changes: 2 additions & 0 deletions examples/oauth.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

import os

import stripe
Expand Down
38 changes: 21 additions & 17 deletions examples/proxy.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,30 @@
from __future__ import absolute_import, division, print_function

import os

import stripe


stripe.api_key = 'tGN0bIwXnHdwOa85VABjPdSn8nWY7G7I'
stripe.api_key = os.environ.get('STRIPE_SECRET_KEY')

print( "Attempting charge..." )
print("Attempting charge...")

stripe.proxy = {
"http": "http://<user>:<pass>@<proxy>:<port>",
"https": "http://<user>:<pass>@<proxy>:<port>" }

clients = (
stripe.http_client.RequestsClient(
verify_ssl_certs= stripe.verify_ssl_certs,
proxy= stripe.proxy )
,
stripe.http_client.PycurlClient(
verify_ssl_certs= stripe.verify_ssl_certs,
proxy= stripe.proxy )
,
stripe.http_client.Urllib2Client(
verify_ssl_certs= stripe.verify_ssl_certs,
proxy= stripe.proxy ) )
"https": "http://<user>:<pass>@<proxy>:<port>",
}

clients = (
stripe.http_client.RequestsClient(
verify_ssl_certs=stripe.verify_ssl_certs,
proxy=stripe.proxy),
stripe.http_client.PycurlClient(
verify_ssl_certs=stripe.verify_ssl_certs,
proxy=stripe.proxy),
stripe.http_client.Urllib2Client(
verify_ssl_certs=stripe.verify_ssl_certs,
proxy=stripe.proxy),
)

for c in clients:
stripe.default_http_client = c
Expand All @@ -30,4 +34,4 @@
card='tok_visa',
description='[email protected]'
)
print( 'Success: %s, %r' % ( c.name, resp, ) )
print('Success: %s, %r' % (c.name, resp))
3 changes: 2 additions & 1 deletion examples/webhooks.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from __future__ import print_function
from __future__ import absolute_import, division, print_function

import os

import stripe
from flask import Flask, request


stripe.api_key = os.environ.get('STRIPE_SECRET_KEY')
webhook_secret = os.environ.get('WEBHOOK_SECRET')

Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@
install_requires=install_requires,
test_suite='stripe.test.all',
tests_require=['unittest2', 'mock'],
use_2to3=True,
classifiers=[
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
Expand Down
2 changes: 2 additions & 0 deletions stripe/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

# Stripe Python bindings
# API docs at http://stripe.com/docs/api
# Authors:
Expand Down
23 changes: 12 additions & 11 deletions stripe/api_requestor.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
from __future__ import absolute_import, division, print_function

import calendar
import datetime
import platform
import time
import urllib
import urlparse
import warnings

import stripe
from stripe import error, oauth_error, http_client, version, util
from stripe import error, oauth_error, http_client, version, util, six
from stripe.multipart_data_generator import MultipartDataGenerator
from stripe.six.moves.urllib.parse import urlencode, urlsplit, urlunsplit


def _encode_datetime(dttime):
Expand All @@ -22,13 +23,13 @@ def _encode_datetime(dttime):

def _encode_nested_dict(key, data, fmt='%s[%s]'):
d = {}
for subkey, subvalue in data.iteritems():
for subkey, subvalue in six.iteritems(data):
d[fmt % (key, subkey)] = subvalue
return d


def _api_encode(data):
for key, value in data.iteritems():
for key, value in six.iteritems(data):
key = util.utf8(key)
if value is None:
continue
Expand All @@ -53,12 +54,12 @@ def _api_encode(data):


def _build_api_url(url, query):
scheme, netloc, path, base_query, fragment = urlparse.urlsplit(url)
scheme, netloc, path, base_query, fragment = urlsplit(url)

if base_query:
query = '%s&%s' % (base_query, query)

return urlparse.urlunsplit((scheme, netloc, path, query, fragment))
return urlunsplit((scheme, netloc, path, query, fragment))


class APIRequestor(object):
Expand Down Expand Up @@ -124,7 +125,7 @@ def encode(cls, d):
'If you need public access to this function, please email us '
'at [email protected].',
DeprecationWarning)
return urllib.urlencode(list(_api_encode(d)))
return urlencode(list(_api_encode(d)))

@classmethod
def build_url(cls, url, params):
Expand Down Expand Up @@ -165,7 +166,7 @@ def handle_error_response(self, rbody, rcode, resp, rheaders):
# OAuth errors are a JSON object where `error` is a string. In
# contrast, in API errors, `error` is a hash with sub-keys. We use
# this property to distinguish between OAuth and API errors.
if isinstance(error_data, basestring):
if isinstance(error_data, six.string_types):
err = self.specific_oauth_error(
rbody, rcode, resp, rheaders, error_data)

Expand Down Expand Up @@ -300,7 +301,7 @@ def request_raw(self, method, url, params=None, supplied_headers=None):

abs_url = '%s%s' % (self.api_base, url)

encoded_params = urllib.urlencode(list(_api_encode(params or {})))
encoded_params = urlencode(list(_api_encode(params or {})))

if method == 'get' or method == 'delete':
if params:
Expand All @@ -326,7 +327,7 @@ def request_raw(self, method, url, params=None, supplied_headers=None):
headers = self.request_headers(my_api_key, method)

if supplied_headers is not None:
for key, value in supplied_headers.items():
for key, value in six.iteritems(supplied_headers):
headers[key] = value

util.log_info('Request to Stripe api', method=method, path=abs_url)
Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

# flake8: noqa

from stripe.api_resources.list_object import ListObject
Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/abstract/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

# flake8: noqa

from stripe.api_resources.abstract.api_resource import APIResource
Expand Down
11 changes: 6 additions & 5 deletions stripe/api_resources/abstract/api_resource.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import urllib
from __future__ import absolute_import, division, print_function

from stripe import error, util
from stripe import error, util, six
from stripe.stripe_object import StripeObject
from stripe.six.moves.urllib.parse import quote_plus


class APIResource(StripeObject):
Expand All @@ -22,7 +23,7 @@ def class_name(cls):
raise NotImplementedError(
'APIResource is an abstract class. You should perform '
'actions on its subclasses (e.g. Charge, Customer)')
return str(urllib.quote_plus(cls.__name__.lower()))
return str(quote_plus(cls.__name__.lower()))

@classmethod
def class_url(cls):
Expand All @@ -32,13 +33,13 @@ def class_url(cls):
def instance_url(self):
id = self.get('id')

if not isinstance(id, basestring):
if not isinstance(id, six.string_types):
raise error.InvalidRequestError(
'Could not determine which URL to request: %s instance '
'has invalid ID: %r, %s. ID should be of type `str` (or'
' `unicode`)' % (type(self).__name__, id, type(id)), 'id')

id = util.utf8(id)
base = self.class_url()
extn = urllib.quote_plus(id)
extn = quote_plus(id)
return "%s/%s" % (base, extn)
2 changes: 2 additions & 0 deletions stripe/api_resources/abstract/createable_api_resource.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

from stripe.api_resources.abstract.api_resource import APIResource
from stripe import api_requestor, util

Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/abstract/deletable_api_resource.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

from stripe.api_resources.abstract.api_resource import APIResource


Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/abstract/listable_api_resource.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

import warnings

from stripe import api_requestor, util
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import urllib
from __future__ import absolute_import, division, print_function

from stripe import api_requestor, util
from stripe.six.moves.urllib.parse import quote_plus


def nested_resource_class_methods(resource, path=None, operations=None):
Expand All @@ -11,10 +12,10 @@ def nested_resource_class_methods(resource, path=None, operations=None):

def wrapper(cls):
def nested_resource_url(cls, id, nested_id=None):
url = "%s/%s/%s" % (cls.class_url(), urllib.quote_plus(id),
urllib.quote_plus(path))
url = "%s/%s/%s" % (cls.class_url(), quote_plus(id),
quote_plus(path))
if nested_id is not None:
url += "/%s" % urllib.quote_plus(nested_id)
url += "/%s" % quote_plus(nested_id)
return url
resource_url_method = "%ss_url" % resource
setattr(cls, resource_url_method, classmethod(nested_resource_url))
Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/abstract/singleton_api_resource.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

from stripe.api_resources.abstract.api_resource import APIResource


Expand Down
5 changes: 3 additions & 2 deletions stripe/api_resources/abstract/updateable_api_resource.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import urllib
from __future__ import absolute_import, division, print_function

from stripe import api_requestor, util
from stripe.api_resources.abstract.api_resource import APIResource
from stripe.six.moves.urllib.parse import quote_plus


class UpdateableAPIResource(APIResource):
Expand All @@ -19,7 +20,7 @@ def _modify(cls, url, api_key=None, idempotency_key=None,

@classmethod
def modify(cls, sid, **params):
url = "%s/%s" % (cls.class_url(), urllib.quote_plus(util.utf8(sid)))
url = "%s/%s" % (cls.class_url(), quote_plus(util.utf8(sid)))
return cls._modify(url, **params)

def save(self, idempotency_key=None):
Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/abstract/verify_mixin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

from stripe import util


Expand Down
6 changes: 4 additions & 2 deletions stripe/api_resources/account.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import urllib
from __future__ import absolute_import, division, print_function

from stripe import oauth, util
from stripe.api_resources.abstract import CreateableAPIResource
Expand All @@ -7,6 +7,8 @@
from stripe.api_resources.abstract import ListableAPIResource
from stripe.api_resources.abstract import nested_resource_class_methods

from stripe.six.moves.urllib.parse import quote_plus


@nested_resource_class_methods(
'external_account',
Expand All @@ -33,7 +35,7 @@ def _build_instance_url(cls, sid):
return "/v1/account"
sid = util.utf8(sid)
base = cls.class_url()
extn = urllib.quote_plus(sid)
extn = quote_plus(sid)
return "%s/%s" % (base, extn)

def instance_url(self):
Expand Down
8 changes: 5 additions & 3 deletions stripe/api_resources/alipay_account.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
import urllib
from __future__ import absolute_import, division, print_function

from stripe import util
from stripe.api_resources.customer import Customer
from stripe.api_resources.abstract import DeletableAPIResource
from stripe.api_resources.abstract import UpdateableAPIResource

from stripe.six.moves.urllib.parse import quote_plus


class AlipayAccount(UpdateableAPIResource, DeletableAPIResource):
OBJECT_NAME = 'alipay_account'

@classmethod
def _build_instance_url(cls, customer, sid):
token = util.utf8(sid)
extn = urllib.quote_plus(token)
extn = quote_plus(token)
customer = util.utf8(customer)

base = Customer.class_url()
owner_extn = urllib.quote_plus(customer)
owner_extn = quote_plus(customer)

return "%s/%s/sources/%s" % (base, owner_extn, extn)

Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/apple_pay_domain.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

from stripe.api_resources.abstract import CreateableAPIResource
from stripe.api_resources.abstract import DeletableAPIResource
from stripe.api_resources.abstract import ListableAPIResource
Expand Down
2 changes: 2 additions & 0 deletions stripe/api_resources/application_fee.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function

from stripe import util
from stripe.api_resources.abstract import ListableAPIResource
from stripe.api_resources.abstract import nested_resource_class_methods
Expand Down
Loading