Skip to content

Commit

Permalink
Merge pull request #473 from stripe/ob-integer-indexes
Browse files Browse the repository at this point in the history
Integer-index encode all arrays
  • Loading branch information
ob-stripe authored Sep 13, 2018
2 parents 566790e + cd413de commit c6f864b
Show file tree
Hide file tree
Showing 10 changed files with 14 additions and 142 deletions.
6 changes: 3 additions & 3 deletions stripe/api_requestor.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ def _api_encode(data):
elif hasattr(value, 'stripe_id'):
yield (key, value.stripe_id)
elif isinstance(value, list) or isinstance(value, tuple):
for sv in value:
for i, sv in enumerate(value):
if isinstance(sv, dict):
subdict = _encode_nested_dict(key, sv, fmt='%s[][%s]')
subdict = _encode_nested_dict("%s[%d]" % (key, i), sv)
for k, v in _api_encode(subdict):
yield (k, v)
else:
yield ("%s[]" % (key,), util.utf8(sv))
yield ("%s[%d]" % (key, i), util.utf8(sv))
elif isinstance(value, dict):
subdict = _encode_nested_dict(key, value)
for subkey, subvalue in _api_encode(subdict):
Expand Down
3 changes: 0 additions & 3 deletions stripe/api_resources/invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ def pay(self, idempotency_key=None, **params):
@classmethod
def upcoming(cls, api_key=None, stripe_version=None, stripe_account=None,
**params):
if "subscription_items" in params:
items = util.convert_array_to_dict(params["subscription_items"])
params["subscription_items"] = items
requestor = api_requestor.APIRequestor(api_key,
api_version=stripe_version,
account=stripe_account)
Expand Down
8 changes: 0 additions & 8 deletions stripe/api_resources/order.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,13 @@ class Order(CreateableAPIResource, UpdateableAPIResource,
ListableAPIResource):
OBJECT_NAME = 'order'

@classmethod
def create(cls, **params):
if "items" in params:
params["items"] = util.convert_array_to_dict(params["items"])
return super(Order, cls).create(**params)

def pay(self, idempotency_key=None, **params):
url = self.instance_url() + '/pay'
headers = util.populate_headers(idempotency_key)
self.refresh_from(self.request('post', url, params, headers))
return self

def return_order(self, idempotency_key=None, **params):
if "items" in params:
params["items"] = util.convert_array_to_dict(params["items"])
headers = util.populate_headers(idempotency_key)
return self.request(
'post', self.instance_url() + '/returns', params, headers)
21 changes: 1 addition & 20 deletions stripe/api_resources/subscription.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import absolute_import, division, print_function

from stripe import api_requestor, util
from stripe import api_requestor
from stripe.api_resources.abstract import CreateableAPIResource
from stripe.api_resources.abstract import DeletableAPIResource
from stripe.api_resources.abstract import UpdateableAPIResource
Expand All @@ -18,22 +18,3 @@ def delete_discount(self, **params):
url = self.instance_url() + '/discount'
_, api_key = requestor.request('delete', url, params)
self.refresh_from({'discount': None}, api_key, True)

@classmethod
def modify(cls, sid, **params):
if "items" in params:
params["items"] = util.convert_array_to_dict(params["items"])
return super(Subscription, cls).modify(sid, **params)

@classmethod
def create(cls, **params):
if "items" in params:
params["items"] = util.convert_array_to_dict(params["items"])
return super(Subscription, cls).create(**params)

def serialize(self, previous):
updated_params = super(UpdateableAPIResource, self).serialize(previous)
if "items" in updated_params:
updated_params["items"] = util.convert_array_to_dict(
updated_params["items"])
return updated_params
10 changes: 0 additions & 10 deletions stripe/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,16 +253,6 @@ def convert_to_stripe_object(resp, api_key=None, stripe_version=None,
return resp


def convert_array_to_dict(arr):
if isinstance(arr, list):
d = {}
for i, value in enumerate(arr):
d[str(i)] = value
return d
else:
return arr


def populate_headers(idempotency_key):
if idempotency_key is not None:
return {"Idempotency-Key": idempotency_key}
Expand Down
5 changes: 0 additions & 5 deletions tests/api_resources/abstract/test_api_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,6 @@ def test_convert_to_stripe_object(self):
# TODO: We should probably be stripping out this property
# self.assertRaises(AttributeError, getattr, converted.adict, 'object')

def test_convert_array_to_dict(self):
out = stripe.util.convert_array_to_dict([{"foo": "bar"}])
assert out == {"0": {"foo": "bar"}}
assert stripe.util.convert_array_to_dict({"f": "b"}) == {"f": "b"}

def test_raise_on_incorrect_id_type(self):
for obj in [None, 1, 3.14, dict(), list(), set(), tuple(), object()]:
with pytest.raises(stripe.error.InvalidRequestError):
Expand Down
22 changes: 0 additions & 22 deletions tests/api_resources/test_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,25 +72,3 @@ def test_can_upcoming(self, request_mock):
'/v1/invoices/upcoming'
)
assert isinstance(resource, stripe.Invoice)

def test_can_upcoming_and_subscription_items(self, request_mock):
resource = stripe.Invoice.upcoming(
customer="cus_123",
subscription_items=[
{"plan": "foo", "quantity": 3}
]
)
request_mock.assert_requested(
'get',
'/v1/invoices/upcoming',
{
'customer': 'cus_123',
'subscription_items': {
"0": {
"plan": "foo",
"quantity": 3,
},
},
},
)
assert isinstance(resource, stripe.Invoice)
61 changes: 0 additions & 61 deletions tests/api_resources/test_subscription.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,64 +70,3 @@ def test_can_delete_discount(self, request_mock):
'delete',
'/v1/subscriptions/%s/discount' % sub.id
)

# Test create/modify methods with subscription items

def test_is_creatable_with_items(self, request_mock):
resource = stripe.Subscription.create(
customer='cus_123',
items=[{"plan": "foo", "quantity": 3}]
)
request_mock.assert_requested(
'post',
'/v1/subscriptions',
{
'customer': 'cus_123',
'items': {
"0": {
"plan": "foo",
"quantity": 3
},
},
},
)
assert isinstance(resource, stripe.Subscription)

def test_is_modifiable_with_items(self, request_mock):
resource = stripe.Subscription.modify(
TEST_RESOURCE_ID,
items=[{"id": "si", "plan": "foo"}]
)
request_mock.assert_requested(
'post',
'/v1/subscriptions/%s' % TEST_RESOURCE_ID,
{
'items': {
"0": {
"plan": "foo",
"id": "si"
},
},
},
)
assert isinstance(resource, stripe.Subscription)

def test_is_saveable_with_items(self, request_mock):
resource = stripe.Subscription.retrieve(TEST_RESOURCE_ID)
resource.items = [{"id": "si", "plan": "foo"}]
resource.save()
request_mock.assert_requested(
'post',
'/v1/subscriptions/%s' % TEST_RESOURCE_ID,
{
'items': {
"0": {
"plan": "foo",
"id": "si"
},
},
},
)
assert isinstance(resource, stripe.Subscription)

# TODO: Test serialize
16 changes: 8 additions & 8 deletions tests/test_api_requestor.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,15 +177,15 @@ class TestAPIRequestor(object):
('%s[adatetime]', 1356994800),
('%s[adict][foo]', 'bar'),
('%s[adict][boz]', 5),
('%s[alist][]', 'foo'),
('%s[alist][]', 'bar'),
('%s[atuple][]', 1),
('%s[atuple][]', 2),
('%s[alist][0]', 'foo'),
('%s[alist][1]', 'bar'),
('%s[atuple][0]', 1),
('%s[atuple][1]', 2),
],
'list': [
('%s[]', 1),
('%s[]', 'foo'),
('%s[]', 'baz'),
('%s[0]', 1),
('%s[1]', 'foo'),
('%s[2]', 'baz'),
],
'string': [('%s', 'boo')],
'unicode': [('%s', stripe.util.utf8(u'\u1234'))],
Expand Down Expand Up @@ -347,7 +347,7 @@ def test_methods_with_params_and_response(self, requestor, mock_response,
'adatetime': datetime.datetime(2013, 1, 1, tzinfo=GMT1())
}
encoded = ('adict%5Bfrobble%5D=bits&adatetime=1356994800&'
'alist%5B%5D=1&alist%5B%5D=2&alist%5B%5D=3')
'alist%5B0%5D=1&alist%5B1%5D=2&alist%5B2%5D=3')

resp, key = requestor.request(method, self.valid_path, params)
assert isinstance(resp, StripeResponse)
Expand Down
4 changes: 2 additions & 2 deletions tests/test_http_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -680,5 +680,5 @@ def test_encode_array(self):

values = [t for t in stripe.api_requestor._api_encode(body)]

assert ('foo[][dob][month]', 1) in values
assert ('foo[][name]', 'bat') in values
assert ('foo[0][dob][month]', 1) in values
assert ('foo[0][name]', 'bat') in values

0 comments on commit c6f864b

Please sign in to comment.