summaryrefslogtreecommitdiff
path: root/python-dwollav2.spec
diff options
context:
space:
mode:
Diffstat (limited to 'python-dwollav2.spec')
-rw-r--r--python-dwollav2.spec770
1 files changed, 770 insertions, 0 deletions
diff --git a/python-dwollav2.spec b/python-dwollav2.spec
new file mode 100644
index 0000000..7ef9821
--- /dev/null
+++ b/python-dwollav2.spec
@@ -0,0 +1,770 @@
+%global _empty_manifest_terminate_build 0
+Name: python-dwollav2
+Version: 2.2.1
+Release: 1
+Summary: Official Dwolla V2 API client
+License: MIT
+URL: https://docsv2.dwolla.com
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/8f/86/85719d0a2aceaa4058b73d94c1e946440ca25d55078da958908218b0235a/dwollav2-2.2.1.tar.gz
+BuildArch: noarch
+
+Requires: python3-requests
+Requires: python3-future
+
+%description
+# DwollaV2
+
+Dwolla V2 Python client.
+
+[API Documentation](https://docsv2.dwolla.com)
+
+## Installation
+
+`dwollav2` is available on [PyPi](https://pypi.python.org/pypi/dwollav2), and therefore can be installed automagically via [pip](https://pip.pypa.io/en/stable/installing/).
+
+```
+pip install dwollav2
+```
+
+## `dwollav2.Client`
+
+### Basic usage
+
+Create a client using your application's consumer key and secret found on the applications page
+([Sandbox][apsandbox], [Production][approd]).
+
+[apsandbox]: https://dashboard-sandbox.dwolla.com/applications
+[approd]: https://dashboard.dwolla.com/applications
+
+```python
+client = dwollav2.Client(
+ key = os.environ['DWOLLA_APP_KEY'],
+ secret = os.environ['DWOLLA_APP_SECRET'],
+ environment = 'sandbox', # defaults to 'production'
+ requests = {'timeout': 0.001}
+)
+```
+
+### Configure an `on_grant` callback (optional)
+
+An `on_grant` callback is useful for storing new tokens when they are granted. The `on_grant`
+callback is called with the `Token` that was just granted by the server.
+
+```python
+client = dwollav2.Client(
+ key = os.environ['DWOLLA_APP_KEY'],
+ secret = os.environ['DWOLLA_APP_SECRET'],
+ on_grant = lambda t: save(t)
+)
+```
+
+It is highly recommended that you encrypt any token data you store.
+
+### Integrations Authorization
+
+Check out our [Integrations Authorization Guide](https://developers.dwolla.com/integrations/authorization).
+
+## `Token`
+
+Tokens can be used to make requests to the Dwolla V2 API.
+
+### Application tokens
+
+Application access tokens are used to authenticate against the API on behalf of a consumer application. Application tokens can be used to access resources in the API that either belong to the application itself (`webhooks`, `events`, `webhook-subscriptions`) or the partner Account that owns the consumer application (`accounts`, `customers`, `funding-sources`, etc.). Application tokens are obtained by using the [`client_credentials`][client_credentials] OAuth grant type:
+
+[client_credentials]: https://tools.ietf.org/html/rfc6749#section-4.4
+
+```python
+application_token = client.Auth.client()
+```
+
+_Application tokens do not include a `refresh_token`. When an application token expires, generate
+a new one using `client.Auth.client()`._
+
+### Initializing pre-existing tokens:
+
+`Token`s can be initialized with the following attributes:
+
+```python
+client.Token(access_token = '...',
+ expires_in = 123)
+```
+
+## Requests
+
+`Token`s can make requests using the `#get`, `#post`, and `#delete` methods.
+
+```python
+# GET api.dwolla.com/resource?foo=bar
+token.get('resource', foo = 'bar')
+
+# POST api.dwolla.com/resource {"foo":"bar"}
+token.post('resource', foo = 'bar')
+
+# POST api.dwolla.com/resource multipart/form-data foo=...
+token.post('resource', foo = ('mclovin.jpg', open('mclovin.jpg', 'rb'), 'image/jpeg'))
+
+# PUT api.dwolla.com/resource {"foo":"bar"}
+token.put('resource', foo = 'bar')
+
+# DELETE api.dwolla.com/resource
+token.delete('resource')
+```
+
+#### Setting headers
+
+To set additional headers on a request you can pass a `dict` of headers as the 3rd argument.
+
+For example:
+
+```python
+token.post('customers', { 'firstName': 'John', 'lastName': 'Doe', 'email': 'jd@doe.com' },
+ { 'Idempotency-Key': 'a52fcf63-0730-41c3-96e8-7147b5d1fb01' })
+```
+
+## Responses
+
+Requests return a `Response`.
+
+```python
+res = token.get('/')
+
+res.status
+# => 200
+
+res.headers
+# => {'server'=>'cloudflare-nginx', 'date'=>'Mon, 28 Mar 2016 15:30:23 GMT', 'content-type'=>'application/vnd.dwolla.v1.hal+json; charset=UTF-8', 'content-length'=>'150', 'connection'=>'close', 'set-cookie'=>'__cfduid=d9dcd0f586c166d36cbd45b992bdaa11b1459179023; expires=Tue, 28-Mar-17 15:30:23 GMT; path=/; domain=.dwolla.com; HttpOnly', 'x-request-id'=>'69a4e612-5dae-4c52-a6a0-2f921e34a88a', 'cf-ray'=>'28ac1f81875941e3-MSP'}
+
+res.body['_links']['events']['href']
+# => 'https://api-sandbox.dwolla.com/events'
+```
+
+## Errors
+
+If the server returns an error, a `dwollav2.Error` (or one of its subclasses) will be raised.
+`dwollav2.Error`s are similar to `Response`s.
+
+```python
+try:
+ token.get('/not-found')
+except dwollav2.NotFoundError as e:
+ e.status
+ # => 404
+
+ e.headers
+ # => {"server"=>"cloudflare-nginx", "date"=>"Mon, 28 Mar 2016 15:35:32 GMT", "content-type"=>"application/vnd.dwolla.v1.hal+json; profile=\"http://nocarrier.co.uk/profiles/vnd.error/\"; charset=UTF-8", "content-length"=>"69", "connection"=>"close", "set-cookie"=>"__cfduid=da1478bfdf3e56275cd8a6a741866ccce1459179332; expires=Tue, 28-Mar-17 15:35:32 GMT; path=/; domain=.dwolla.com; HttpOnly", "access-control-allow-origin"=>"*", "x-request-id"=>"667fca74-b53d-43db-bddd-50426a011881", "cf-ray"=>"28ac270abca64207-MSP"}
+
+ e.body.code
+ # => "NotFound"
+except dwollav2.Error:
+ # ...
+```
+
+### `dwollav2.Error` subclasses:
+
+_See https://docsv2.dwolla.com/#errors for more info._
+
+- `dwollav2.AccessDeniedError`
+- `dwollav2.InvalidCredentialsError`
+- `dwollav2.NotFoundError`
+- `dwollav2.BadRequestError`
+- `dwollav2.InvalidGrantError`
+- `dwollav2.RequestTimeoutError`
+- `dwollav2.ExpiredAccessTokenError`
+- `dwollav2.InvalidRequestError`
+- `dwollav2.ServerError`
+- `dwollav2.ForbiddenError`
+- `dwollav2.InvalidResourceStateError`
+- `dwollav2.TemporarilyUnavailableError`
+- `dwollav2.InvalidAccessTokenError`
+- `dwollav2.InvalidScopeError`
+- `dwollav2.UnauthorizedClientError`
+- `dwollav2.InvalidAccountStatusError`
+- `dwollav2.InvalidScopesError`
+- `dwollav2.UnsupportedGrantTypeError`
+- `dwollav2.InvalidApplicationStatusError`
+- `dwollav2.InvalidVersionError`
+- `dwollav2.UnsupportedResponseTypeError`
+- `dwollav2.InvalidClientError`
+- `dwollav2.MethodNotAllowedError`
+- `dwollav2.ValidationError`
+- `dwollav2.TooManyRequestsError`
+- `dwollav2.ConflictError`
+
+## Development
+
+After checking out the repo, run `pip install -r requirements.txt` to install dependencies.
+Then, run `python setup.py test` to run the tests.
+
+To install this gem onto your local machine, run `pip install -e .`.
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/Dwolla/dwolla-v2-python.
+
+## License
+
+The package is available as open source under the terms of the [MIT License](https://github.com/Dwolla/dwolla-v2-python).
+
+## Changelog
+
+- **2.2.1**
+ - Add extra check in URL's to ensure they are clean. [#36](https://github.com/Dwolla/dwolla-v2-python/pull/36).
+- **2.2.0**
+ - Update JSON request bodies to serialize via `simplejson` so datatypes like `Decimal` still
+ serialize like they did pre `2.0.0`
+- **2.1.0**
+ - Do not share `requests.session()` across instances of `dwollav2.Client`
+- **2.0.0**
+ - JSON request bodies now contain sorted keys to ensure the same request body for a given set of
+ arguments, no matter the order they are passed to `dwolla.post`. This ensures the
+ [`Idempotency-Key`][] header will work as intended without additional effort by developers.
+ - **NOTE**: Because this change alters the formatting of JSON request bodies, we are releasing it
+ as a major new version. The request body of a request made with `1.6.0` will not match the
+ request body of the same request made in `2.0.0`. This will nullify the effect of the
+ [`Idempotency-Key`][] header when upgrading, so please take this into account.
+ If you have any questions please [reach out to us](https://discuss.dwolla.com/)!
+ There are no other changes since `1.6.0`.
+- **1.6.0** Allow configuration of `requests` options on `dwollav2.Client`.
+- **1.5.0** Add integrations auth functionality
+- **1.4.0** ~~Pass kwargs from `get`, `post`, and `delete` methods to underlying requests methods.~~ (Removed in v1.6)
+- **1.3.0** Change token URLs, update dependencies.
+- **1.2.4** Create a new session for each Token.
+- **1.2.3** Check if IOBase when checking to see if something is a file.
+- **1.2.2** Strip domain from URLs provided to token.\* methods.
+- **1.2.1** Update sandbox URLs from uat => sandbox.
+- **1.2.0** Refer to Client id as key.
+- **1.1.8** Support `verified_account` and `dwolla_landing` auth flags
+- **1.1.7** Use session over connections for [performance improvement](http://docs.python-requests.org/en/master/user/advanced/#session-objects) ([#8](https://github.com/Dwolla/dwolla-v2-python/pull/8) - Thanks @bfeeser!)
+- **1.1.5** Fix file upload bug when using with Python 2 ([#6](https://github.com/Dwolla/dwolla-v2-python/issues/6))
+- **1.1.2** Add `TooManyRequestsError` and `ConflictError`
+- **1.1.1** Add MANIFEST.in
+- **1.1.0** Support per-request headers
+
+[`idempotency-key`]: https://docs.dwolla.com/#idempotency-key
+
+
+
+
+%package -n python3-dwollav2
+Summary: Official Dwolla V2 API client
+Provides: python-dwollav2
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-dwollav2
+# DwollaV2
+
+Dwolla V2 Python client.
+
+[API Documentation](https://docsv2.dwolla.com)
+
+## Installation
+
+`dwollav2` is available on [PyPi](https://pypi.python.org/pypi/dwollav2), and therefore can be installed automagically via [pip](https://pip.pypa.io/en/stable/installing/).
+
+```
+pip install dwollav2
+```
+
+## `dwollav2.Client`
+
+### Basic usage
+
+Create a client using your application's consumer key and secret found on the applications page
+([Sandbox][apsandbox], [Production][approd]).
+
+[apsandbox]: https://dashboard-sandbox.dwolla.com/applications
+[approd]: https://dashboard.dwolla.com/applications
+
+```python
+client = dwollav2.Client(
+ key = os.environ['DWOLLA_APP_KEY'],
+ secret = os.environ['DWOLLA_APP_SECRET'],
+ environment = 'sandbox', # defaults to 'production'
+ requests = {'timeout': 0.001}
+)
+```
+
+### Configure an `on_grant` callback (optional)
+
+An `on_grant` callback is useful for storing new tokens when they are granted. The `on_grant`
+callback is called with the `Token` that was just granted by the server.
+
+```python
+client = dwollav2.Client(
+ key = os.environ['DWOLLA_APP_KEY'],
+ secret = os.environ['DWOLLA_APP_SECRET'],
+ on_grant = lambda t: save(t)
+)
+```
+
+It is highly recommended that you encrypt any token data you store.
+
+### Integrations Authorization
+
+Check out our [Integrations Authorization Guide](https://developers.dwolla.com/integrations/authorization).
+
+## `Token`
+
+Tokens can be used to make requests to the Dwolla V2 API.
+
+### Application tokens
+
+Application access tokens are used to authenticate against the API on behalf of a consumer application. Application tokens can be used to access resources in the API that either belong to the application itself (`webhooks`, `events`, `webhook-subscriptions`) or the partner Account that owns the consumer application (`accounts`, `customers`, `funding-sources`, etc.). Application tokens are obtained by using the [`client_credentials`][client_credentials] OAuth grant type:
+
+[client_credentials]: https://tools.ietf.org/html/rfc6749#section-4.4
+
+```python
+application_token = client.Auth.client()
+```
+
+_Application tokens do not include a `refresh_token`. When an application token expires, generate
+a new one using `client.Auth.client()`._
+
+### Initializing pre-existing tokens:
+
+`Token`s can be initialized with the following attributes:
+
+```python
+client.Token(access_token = '...',
+ expires_in = 123)
+```
+
+## Requests
+
+`Token`s can make requests using the `#get`, `#post`, and `#delete` methods.
+
+```python
+# GET api.dwolla.com/resource?foo=bar
+token.get('resource', foo = 'bar')
+
+# POST api.dwolla.com/resource {"foo":"bar"}
+token.post('resource', foo = 'bar')
+
+# POST api.dwolla.com/resource multipart/form-data foo=...
+token.post('resource', foo = ('mclovin.jpg', open('mclovin.jpg', 'rb'), 'image/jpeg'))
+
+# PUT api.dwolla.com/resource {"foo":"bar"}
+token.put('resource', foo = 'bar')
+
+# DELETE api.dwolla.com/resource
+token.delete('resource')
+```
+
+#### Setting headers
+
+To set additional headers on a request you can pass a `dict` of headers as the 3rd argument.
+
+For example:
+
+```python
+token.post('customers', { 'firstName': 'John', 'lastName': 'Doe', 'email': 'jd@doe.com' },
+ { 'Idempotency-Key': 'a52fcf63-0730-41c3-96e8-7147b5d1fb01' })
+```
+
+## Responses
+
+Requests return a `Response`.
+
+```python
+res = token.get('/')
+
+res.status
+# => 200
+
+res.headers
+# => {'server'=>'cloudflare-nginx', 'date'=>'Mon, 28 Mar 2016 15:30:23 GMT', 'content-type'=>'application/vnd.dwolla.v1.hal+json; charset=UTF-8', 'content-length'=>'150', 'connection'=>'close', 'set-cookie'=>'__cfduid=d9dcd0f586c166d36cbd45b992bdaa11b1459179023; expires=Tue, 28-Mar-17 15:30:23 GMT; path=/; domain=.dwolla.com; HttpOnly', 'x-request-id'=>'69a4e612-5dae-4c52-a6a0-2f921e34a88a', 'cf-ray'=>'28ac1f81875941e3-MSP'}
+
+res.body['_links']['events']['href']
+# => 'https://api-sandbox.dwolla.com/events'
+```
+
+## Errors
+
+If the server returns an error, a `dwollav2.Error` (or one of its subclasses) will be raised.
+`dwollav2.Error`s are similar to `Response`s.
+
+```python
+try:
+ token.get('/not-found')
+except dwollav2.NotFoundError as e:
+ e.status
+ # => 404
+
+ e.headers
+ # => {"server"=>"cloudflare-nginx", "date"=>"Mon, 28 Mar 2016 15:35:32 GMT", "content-type"=>"application/vnd.dwolla.v1.hal+json; profile=\"http://nocarrier.co.uk/profiles/vnd.error/\"; charset=UTF-8", "content-length"=>"69", "connection"=>"close", "set-cookie"=>"__cfduid=da1478bfdf3e56275cd8a6a741866ccce1459179332; expires=Tue, 28-Mar-17 15:35:32 GMT; path=/; domain=.dwolla.com; HttpOnly", "access-control-allow-origin"=>"*", "x-request-id"=>"667fca74-b53d-43db-bddd-50426a011881", "cf-ray"=>"28ac270abca64207-MSP"}
+
+ e.body.code
+ # => "NotFound"
+except dwollav2.Error:
+ # ...
+```
+
+### `dwollav2.Error` subclasses:
+
+_See https://docsv2.dwolla.com/#errors for more info._
+
+- `dwollav2.AccessDeniedError`
+- `dwollav2.InvalidCredentialsError`
+- `dwollav2.NotFoundError`
+- `dwollav2.BadRequestError`
+- `dwollav2.InvalidGrantError`
+- `dwollav2.RequestTimeoutError`
+- `dwollav2.ExpiredAccessTokenError`
+- `dwollav2.InvalidRequestError`
+- `dwollav2.ServerError`
+- `dwollav2.ForbiddenError`
+- `dwollav2.InvalidResourceStateError`
+- `dwollav2.TemporarilyUnavailableError`
+- `dwollav2.InvalidAccessTokenError`
+- `dwollav2.InvalidScopeError`
+- `dwollav2.UnauthorizedClientError`
+- `dwollav2.InvalidAccountStatusError`
+- `dwollav2.InvalidScopesError`
+- `dwollav2.UnsupportedGrantTypeError`
+- `dwollav2.InvalidApplicationStatusError`
+- `dwollav2.InvalidVersionError`
+- `dwollav2.UnsupportedResponseTypeError`
+- `dwollav2.InvalidClientError`
+- `dwollav2.MethodNotAllowedError`
+- `dwollav2.ValidationError`
+- `dwollav2.TooManyRequestsError`
+- `dwollav2.ConflictError`
+
+## Development
+
+After checking out the repo, run `pip install -r requirements.txt` to install dependencies.
+Then, run `python setup.py test` to run the tests.
+
+To install this gem onto your local machine, run `pip install -e .`.
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/Dwolla/dwolla-v2-python.
+
+## License
+
+The package is available as open source under the terms of the [MIT License](https://github.com/Dwolla/dwolla-v2-python).
+
+## Changelog
+
+- **2.2.1**
+ - Add extra check in URL's to ensure they are clean. [#36](https://github.com/Dwolla/dwolla-v2-python/pull/36).
+- **2.2.0**
+ - Update JSON request bodies to serialize via `simplejson` so datatypes like `Decimal` still
+ serialize like they did pre `2.0.0`
+- **2.1.0**
+ - Do not share `requests.session()` across instances of `dwollav2.Client`
+- **2.0.0**
+ - JSON request bodies now contain sorted keys to ensure the same request body for a given set of
+ arguments, no matter the order they are passed to `dwolla.post`. This ensures the
+ [`Idempotency-Key`][] header will work as intended without additional effort by developers.
+ - **NOTE**: Because this change alters the formatting of JSON request bodies, we are releasing it
+ as a major new version. The request body of a request made with `1.6.0` will not match the
+ request body of the same request made in `2.0.0`. This will nullify the effect of the
+ [`Idempotency-Key`][] header when upgrading, so please take this into account.
+ If you have any questions please [reach out to us](https://discuss.dwolla.com/)!
+ There are no other changes since `1.6.0`.
+- **1.6.0** Allow configuration of `requests` options on `dwollav2.Client`.
+- **1.5.0** Add integrations auth functionality
+- **1.4.0** ~~Pass kwargs from `get`, `post`, and `delete` methods to underlying requests methods.~~ (Removed in v1.6)
+- **1.3.0** Change token URLs, update dependencies.
+- **1.2.4** Create a new session for each Token.
+- **1.2.3** Check if IOBase when checking to see if something is a file.
+- **1.2.2** Strip domain from URLs provided to token.\* methods.
+- **1.2.1** Update sandbox URLs from uat => sandbox.
+- **1.2.0** Refer to Client id as key.
+- **1.1.8** Support `verified_account` and `dwolla_landing` auth flags
+- **1.1.7** Use session over connections for [performance improvement](http://docs.python-requests.org/en/master/user/advanced/#session-objects) ([#8](https://github.com/Dwolla/dwolla-v2-python/pull/8) - Thanks @bfeeser!)
+- **1.1.5** Fix file upload bug when using with Python 2 ([#6](https://github.com/Dwolla/dwolla-v2-python/issues/6))
+- **1.1.2** Add `TooManyRequestsError` and `ConflictError`
+- **1.1.1** Add MANIFEST.in
+- **1.1.0** Support per-request headers
+
+[`idempotency-key`]: https://docs.dwolla.com/#idempotency-key
+
+
+
+
+%package help
+Summary: Development documents and examples for dwollav2
+Provides: python3-dwollav2-doc
+%description help
+# DwollaV2
+
+Dwolla V2 Python client.
+
+[API Documentation](https://docsv2.dwolla.com)
+
+## Installation
+
+`dwollav2` is available on [PyPi](https://pypi.python.org/pypi/dwollav2), and therefore can be installed automagically via [pip](https://pip.pypa.io/en/stable/installing/).
+
+```
+pip install dwollav2
+```
+
+## `dwollav2.Client`
+
+### Basic usage
+
+Create a client using your application's consumer key and secret found on the applications page
+([Sandbox][apsandbox], [Production][approd]).
+
+[apsandbox]: https://dashboard-sandbox.dwolla.com/applications
+[approd]: https://dashboard.dwolla.com/applications
+
+```python
+client = dwollav2.Client(
+ key = os.environ['DWOLLA_APP_KEY'],
+ secret = os.environ['DWOLLA_APP_SECRET'],
+ environment = 'sandbox', # defaults to 'production'
+ requests = {'timeout': 0.001}
+)
+```
+
+### Configure an `on_grant` callback (optional)
+
+An `on_grant` callback is useful for storing new tokens when they are granted. The `on_grant`
+callback is called with the `Token` that was just granted by the server.
+
+```python
+client = dwollav2.Client(
+ key = os.environ['DWOLLA_APP_KEY'],
+ secret = os.environ['DWOLLA_APP_SECRET'],
+ on_grant = lambda t: save(t)
+)
+```
+
+It is highly recommended that you encrypt any token data you store.
+
+### Integrations Authorization
+
+Check out our [Integrations Authorization Guide](https://developers.dwolla.com/integrations/authorization).
+
+## `Token`
+
+Tokens can be used to make requests to the Dwolla V2 API.
+
+### Application tokens
+
+Application access tokens are used to authenticate against the API on behalf of a consumer application. Application tokens can be used to access resources in the API that either belong to the application itself (`webhooks`, `events`, `webhook-subscriptions`) or the partner Account that owns the consumer application (`accounts`, `customers`, `funding-sources`, etc.). Application tokens are obtained by using the [`client_credentials`][client_credentials] OAuth grant type:
+
+[client_credentials]: https://tools.ietf.org/html/rfc6749#section-4.4
+
+```python
+application_token = client.Auth.client()
+```
+
+_Application tokens do not include a `refresh_token`. When an application token expires, generate
+a new one using `client.Auth.client()`._
+
+### Initializing pre-existing tokens:
+
+`Token`s can be initialized with the following attributes:
+
+```python
+client.Token(access_token = '...',
+ expires_in = 123)
+```
+
+## Requests
+
+`Token`s can make requests using the `#get`, `#post`, and `#delete` methods.
+
+```python
+# GET api.dwolla.com/resource?foo=bar
+token.get('resource', foo = 'bar')
+
+# POST api.dwolla.com/resource {"foo":"bar"}
+token.post('resource', foo = 'bar')
+
+# POST api.dwolla.com/resource multipart/form-data foo=...
+token.post('resource', foo = ('mclovin.jpg', open('mclovin.jpg', 'rb'), 'image/jpeg'))
+
+# PUT api.dwolla.com/resource {"foo":"bar"}
+token.put('resource', foo = 'bar')
+
+# DELETE api.dwolla.com/resource
+token.delete('resource')
+```
+
+#### Setting headers
+
+To set additional headers on a request you can pass a `dict` of headers as the 3rd argument.
+
+For example:
+
+```python
+token.post('customers', { 'firstName': 'John', 'lastName': 'Doe', 'email': 'jd@doe.com' },
+ { 'Idempotency-Key': 'a52fcf63-0730-41c3-96e8-7147b5d1fb01' })
+```
+
+## Responses
+
+Requests return a `Response`.
+
+```python
+res = token.get('/')
+
+res.status
+# => 200
+
+res.headers
+# => {'server'=>'cloudflare-nginx', 'date'=>'Mon, 28 Mar 2016 15:30:23 GMT', 'content-type'=>'application/vnd.dwolla.v1.hal+json; charset=UTF-8', 'content-length'=>'150', 'connection'=>'close', 'set-cookie'=>'__cfduid=d9dcd0f586c166d36cbd45b992bdaa11b1459179023; expires=Tue, 28-Mar-17 15:30:23 GMT; path=/; domain=.dwolla.com; HttpOnly', 'x-request-id'=>'69a4e612-5dae-4c52-a6a0-2f921e34a88a', 'cf-ray'=>'28ac1f81875941e3-MSP'}
+
+res.body['_links']['events']['href']
+# => 'https://api-sandbox.dwolla.com/events'
+```
+
+## Errors
+
+If the server returns an error, a `dwollav2.Error` (or one of its subclasses) will be raised.
+`dwollav2.Error`s are similar to `Response`s.
+
+```python
+try:
+ token.get('/not-found')
+except dwollav2.NotFoundError as e:
+ e.status
+ # => 404
+
+ e.headers
+ # => {"server"=>"cloudflare-nginx", "date"=>"Mon, 28 Mar 2016 15:35:32 GMT", "content-type"=>"application/vnd.dwolla.v1.hal+json; profile=\"http://nocarrier.co.uk/profiles/vnd.error/\"; charset=UTF-8", "content-length"=>"69", "connection"=>"close", "set-cookie"=>"__cfduid=da1478bfdf3e56275cd8a6a741866ccce1459179332; expires=Tue, 28-Mar-17 15:35:32 GMT; path=/; domain=.dwolla.com; HttpOnly", "access-control-allow-origin"=>"*", "x-request-id"=>"667fca74-b53d-43db-bddd-50426a011881", "cf-ray"=>"28ac270abca64207-MSP"}
+
+ e.body.code
+ # => "NotFound"
+except dwollav2.Error:
+ # ...
+```
+
+### `dwollav2.Error` subclasses:
+
+_See https://docsv2.dwolla.com/#errors for more info._
+
+- `dwollav2.AccessDeniedError`
+- `dwollav2.InvalidCredentialsError`
+- `dwollav2.NotFoundError`
+- `dwollav2.BadRequestError`
+- `dwollav2.InvalidGrantError`
+- `dwollav2.RequestTimeoutError`
+- `dwollav2.ExpiredAccessTokenError`
+- `dwollav2.InvalidRequestError`
+- `dwollav2.ServerError`
+- `dwollav2.ForbiddenError`
+- `dwollav2.InvalidResourceStateError`
+- `dwollav2.TemporarilyUnavailableError`
+- `dwollav2.InvalidAccessTokenError`
+- `dwollav2.InvalidScopeError`
+- `dwollav2.UnauthorizedClientError`
+- `dwollav2.InvalidAccountStatusError`
+- `dwollav2.InvalidScopesError`
+- `dwollav2.UnsupportedGrantTypeError`
+- `dwollav2.InvalidApplicationStatusError`
+- `dwollav2.InvalidVersionError`
+- `dwollav2.UnsupportedResponseTypeError`
+- `dwollav2.InvalidClientError`
+- `dwollav2.MethodNotAllowedError`
+- `dwollav2.ValidationError`
+- `dwollav2.TooManyRequestsError`
+- `dwollav2.ConflictError`
+
+## Development
+
+After checking out the repo, run `pip install -r requirements.txt` to install dependencies.
+Then, run `python setup.py test` to run the tests.
+
+To install this gem onto your local machine, run `pip install -e .`.
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/Dwolla/dwolla-v2-python.
+
+## License
+
+The package is available as open source under the terms of the [MIT License](https://github.com/Dwolla/dwolla-v2-python).
+
+## Changelog
+
+- **2.2.1**
+ - Add extra check in URL's to ensure they are clean. [#36](https://github.com/Dwolla/dwolla-v2-python/pull/36).
+- **2.2.0**
+ - Update JSON request bodies to serialize via `simplejson` so datatypes like `Decimal` still
+ serialize like they did pre `2.0.0`
+- **2.1.0**
+ - Do not share `requests.session()` across instances of `dwollav2.Client`
+- **2.0.0**
+ - JSON request bodies now contain sorted keys to ensure the same request body for a given set of
+ arguments, no matter the order they are passed to `dwolla.post`. This ensures the
+ [`Idempotency-Key`][] header will work as intended without additional effort by developers.
+ - **NOTE**: Because this change alters the formatting of JSON request bodies, we are releasing it
+ as a major new version. The request body of a request made with `1.6.0` will not match the
+ request body of the same request made in `2.0.0`. This will nullify the effect of the
+ [`Idempotency-Key`][] header when upgrading, so please take this into account.
+ If you have any questions please [reach out to us](https://discuss.dwolla.com/)!
+ There are no other changes since `1.6.0`.
+- **1.6.0** Allow configuration of `requests` options on `dwollav2.Client`.
+- **1.5.0** Add integrations auth functionality
+- **1.4.0** ~~Pass kwargs from `get`, `post`, and `delete` methods to underlying requests methods.~~ (Removed in v1.6)
+- **1.3.0** Change token URLs, update dependencies.
+- **1.2.4** Create a new session for each Token.
+- **1.2.3** Check if IOBase when checking to see if something is a file.
+- **1.2.2** Strip domain from URLs provided to token.\* methods.
+- **1.2.1** Update sandbox URLs from uat => sandbox.
+- **1.2.0** Refer to Client id as key.
+- **1.1.8** Support `verified_account` and `dwolla_landing` auth flags
+- **1.1.7** Use session over connections for [performance improvement](http://docs.python-requests.org/en/master/user/advanced/#session-objects) ([#8](https://github.com/Dwolla/dwolla-v2-python/pull/8) - Thanks @bfeeser!)
+- **1.1.5** Fix file upload bug when using with Python 2 ([#6](https://github.com/Dwolla/dwolla-v2-python/issues/6))
+- **1.1.2** Add `TooManyRequestsError` and `ConflictError`
+- **1.1.1** Add MANIFEST.in
+- **1.1.0** Support per-request headers
+
+[`idempotency-key`]: https://docs.dwolla.com/#idempotency-key
+
+
+
+
+%prep
+%autosetup -n dwollav2-2.2.1
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-dwollav2 -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Tue Apr 11 2023 Python_Bot <Python_Bot@openeuler.org> - 2.2.1-1
+- Package Spec generated