Skip to content

Commit

Permalink
Split resource.py
Browse files Browse the repository at this point in the history
  • Loading branch information
ob-stripe committed Oct 18, 2017
1 parent 0422c70 commit 9d0e200
Show file tree
Hide file tree
Showing 52 changed files with 1,512 additions and 1,195 deletions.
4 changes: 3 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@
author='Stripe',
author_email='support@stripe.com',
url='https://github.com/stripe/stripe-python',
packages=['stripe', 'stripe.test', 'stripe.test.resources'],
packages=['stripe', 'stripe.api_resources',
'stripe.api_resources.abstract',
'stripe.test', 'stripe.test.resources'],
package_data={'stripe': ['data/ca-certificates.crt']},
install_requires=install_requires,
test_suite='stripe.test.all',
Expand Down
42 changes: 42 additions & 0 deletions stripe/api_resources/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# flake8: noqa

from stripe.api_resources.list_object import ListObject

from stripe.api_resources.account import Account
from stripe.api_resources.alipay_account import AlipayAccount
from stripe.api_resources.apple_pay_domain import ApplePayDomain
from stripe.api_resources.application_fee import ApplicationFee
from stripe.api_resources.application_fee_refund import ApplicationFeeRefund
from stripe.api_resources.balance import Balance
from stripe.api_resources.balance_transaction import BalanceTransaction
from stripe.api_resources.bank_account import BankAccount
from stripe.api_resources.bitcoin_receiver import BitcoinReceiver
from stripe.api_resources.bitcoin_transaction import BitcoinTransaction
from stripe.api_resources.card import Card
from stripe.api_resources.charge import Charge
from stripe.api_resources.country_spec import CountrySpec
from stripe.api_resources.coupon import Coupon
from stripe.api_resources.customer import Customer
from stripe.api_resources.dispute import Dispute
from stripe.api_resources.ephemeral_key import EphemeralKey
from stripe.api_resources.event import Event
from stripe.api_resources.file_upload import FileUpload
from stripe.api_resources.invoice import Invoice
from stripe.api_resources.invoice_item import InvoiceItem
from stripe.api_resources.login_link import LoginLink
from stripe.api_resources.order import Order
from stripe.api_resources.order_return import OrderReturn
from stripe.api_resources.payout import Payout
from stripe.api_resources.plan import Plan
from stripe.api_resources.product import Product
from stripe.api_resources.recipient import Recipient
from stripe.api_resources.recipient_transfer import RecipientTransfer
from stripe.api_resources.refund import Refund
from stripe.api_resources.reversal import Reversal
from stripe.api_resources.sku import SKU
from stripe.api_resources.source import Source
from stripe.api_resources.subscription import Subscription
from stripe.api_resources.subscription_item import SubscriptionItem
from stripe.api_resources.three_d_secure import ThreeDSecure
from stripe.api_resources.token import Token
from stripe.api_resources.transfer import Transfer
20 changes: 20 additions & 0 deletions stripe/api_resources/abstract/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# flake8: noqa

from stripe.api_resources.abstract.api_resource import APIResource
from stripe.api_resources.abstract.singleton_api_resource import (
SingletonAPIResource
)

from stripe.api_resources.abstract.createable_api_resource import (
CreateableAPIResource
)
from stripe.api_resources.abstract.updateable_api_resource import (
UpdateableAPIResource
)
from stripe.api_resources.abstract.deletable_api_resource import (
DeletableAPIResource
)
from stripe.api_resources.abstract.listable_api_resource import (
ListableAPIResource
)
from stripe.api_resources.abstract.verify_mixin import VerifyMixin
44 changes: 44 additions & 0 deletions stripe/api_resources/abstract/api_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import urllib

from stripe import error, util
from stripe.stripe_object import StripeObject


class APIResource(StripeObject):

@classmethod
def retrieve(cls, id, api_key=None, **params):
instance = cls(id, api_key, **params)
instance.refresh()
return instance

def refresh(self):
self.refresh_from(self.request('get', self.instance_url()))
return self

@classmethod
def class_name(cls):
if cls == APIResource:
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()))

@classmethod
def class_url(cls):
cls_name = cls.class_name()
return "/v1/%ss" % (cls_name,)

def instance_url(self):
id = self.get('id')

if not isinstance(id, basestring):
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)
return "%s/%s" % (base, extn)
17 changes: 17 additions & 0 deletions stripe/api_resources/abstract/createable_api_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from stripe.api_resources.abstract.api_resource import APIResource
from stripe import api_requestor, util


class CreateableAPIResource(APIResource):

@classmethod
def create(cls, api_key=None, idempotency_key=None,
stripe_version=None, stripe_account=None, **params):
requestor = api_requestor.APIRequestor(api_key,
api_version=stripe_version,
account=stripe_account)
url = cls.class_url()
headers = util.populate_headers(idempotency_key)
response, api_key = requestor.request('post', url, params, headers)
return util.convert_to_stripe_object(response, api_key, stripe_version,
stripe_account)
8 changes: 8 additions & 0 deletions stripe/api_resources/abstract/deletable_api_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from stripe.api_resources.abstract.api_resource import APIResource


class DeletableAPIResource(APIResource):

def delete(self, **params):
self.refresh_from(self.request('delete', self.instance_url(), params))
return self
34 changes: 34 additions & 0 deletions stripe/api_resources/abstract/listable_api_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import warnings

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


class ListableAPIResource(APIResource):

@classmethod
def all(cls, *args, **params):
warnings.warn("The `all` class method is deprecated and will"
"be removed in future versions. Please use the "
"`list` class method instead",
DeprecationWarning)
return cls.list(*args, **params)

@classmethod
def auto_paging_iter(cls, *args, **params):
return cls.list(*args, **params).auto_paging_iter()

@classmethod
def list(cls, api_key=None, stripe_version=None, stripe_account=None,
**params):
requestor = api_requestor.APIRequestor(api_key,
api_base=cls.api_base(),
api_version=stripe_version,
account=stripe_account)
url = cls.class_url()
response, api_key = requestor.request('get', url, params)
stripe_object = util.convert_to_stripe_object(response, api_key,
stripe_version,
stripe_account)
stripe_object._retrieve_params = params
return stripe_object
16 changes: 16 additions & 0 deletions stripe/api_resources/abstract/singleton_api_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from stripe.api_resources.abstract.api_resource import APIResource


class SingletonAPIResource(APIResource):

@classmethod
def retrieve(cls, **params):
return super(SingletonAPIResource, cls).retrieve(None, **params)

@classmethod
def class_url(cls):
cls_name = cls.class_name()
return "/v1/%s" % (cls_name,)

def instance_url(self):
return self.class_url()
34 changes: 34 additions & 0 deletions stripe/api_resources/abstract/updateable_api_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import urllib

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


class UpdateableAPIResource(APIResource):

@classmethod
def _modify(cls, url, api_key=None, idempotency_key=None,
stripe_version=None, stripe_account=None, **params):
requestor = api_requestor.APIRequestor(api_key,
api_version=stripe_version,
account=stripe_account)
headers = util.populate_headers(idempotency_key)
response, api_key = requestor.request('post', url, params, headers)
return util.convert_to_stripe_object(response, api_key, stripe_version,
stripe_account)

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

def save(self, idempotency_key=None):
updated_params = self.serialize(None)
headers = util.populate_headers(idempotency_key)

if updated_params:
self.refresh_from(self.request('post', self.instance_url(),
updated_params, headers))
else:
util.logger.debug("Trying to save already saved object %r", self)
return self
10 changes: 10 additions & 0 deletions stripe/api_resources/abstract/verify_mixin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from stripe import util


class VerifyMixin(object):

def verify(self, idempotency_key=None, **params):
url = self.instance_url() + '/verify'
headers = util.populate_headers(idempotency_key)
self.refresh_from(self.request('post', url, params, headers))
return self
57 changes: 57 additions & 0 deletions stripe/api_resources/account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import urllib

from stripe import oauth, util
from stripe.api_resources.abstract import CreateableAPIResource
from stripe.api_resources.abstract import DeletableAPIResource
from stripe.api_resources.abstract import UpdateableAPIResource
from stripe.api_resources.abstract import ListableAPIResource


class Account(CreateableAPIResource, ListableAPIResource,
UpdateableAPIResource, DeletableAPIResource):
OBJECT_NAME = 'account'

@classmethod
def retrieve(cls, id=None, api_key=None, **params):
instance = cls(id, api_key, **params)
instance.refresh()
return instance

@classmethod
def modify(cls, id=None, **params):
return cls._modify(cls._build_instance_url(id), **params)

@classmethod
def _build_instance_url(cls, sid):
if not sid:
return "/v1/account"
sid = util.utf8(sid)
base = cls.class_url()
extn = urllib.quote_plus(sid)
return "%s/%s" % (base, extn)

def instance_url(self):
return self._build_instance_url(self.get('id'))

def reject(self, reason=None, idempotency_key=None):
url = self.instance_url() + '/reject'
headers = util.populate_headers(idempotency_key)
if reason:
params = {"reason": reason}
else:
params = {}
self.refresh_from(
self.request('post', url, params, headers)
)
return self

def deauthorize(self, **params):
params['stripe_user_id'] = self.id
return oauth.OAuth.deauthorize(**params)

@classmethod
def modify_external_account(cls, sid, external_account_id, **params):
url = "%s/%s/external_accounts/%s" % (
cls.class_url(), urllib.quote_plus(util.utf8(sid)),
urllib.quote_plus(util.utf8(external_account_id)))
return cls._modify(url, **params)
36 changes: 36 additions & 0 deletions stripe/api_resources/alipay_account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import urllib

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


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)
customer = util.utf8(customer)

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

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

def instance_url(self):
return self._build_instance_url(self.customer, self.id)

@classmethod
def modify(cls, customer, id, **params):
url = cls._build_instance_url(customer, id)
return cls._modify(url, **params)

@classmethod
def retrieve(cls, id, api_key=None, stripe_version=None,
stripe_account=None, **params):
raise NotImplementedError(
"Can't retrieve an Alipay account without a customer ID. "
"Use customer.sources.retrieve('alipay_account_id') instead.")
12 changes: 12 additions & 0 deletions stripe/api_resources/apple_pay_domain.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from stripe.api_resources.abstract import CreateableAPIResource
from stripe.api_resources.abstract import DeletableAPIResource
from stripe.api_resources.abstract import ListableAPIResource


class ApplePayDomain(CreateableAPIResource, ListableAPIResource,
DeletableAPIResource):
OBJECT_NAME = 'apple_pay_domain'

@classmethod
def class_url(cls):
return '/v1/apple_pay/domains'
16 changes: 16 additions & 0 deletions stripe/api_resources/application_fee.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from stripe import util
from stripe.api_resources.abstract import ListableAPIResource


class ApplicationFee(ListableAPIResource):
OBJECT_NAME = 'application_fee'

@classmethod
def class_name(cls):
return 'application_fee'

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

0 comments on commit 9d0e200

Please sign in to comment.