dwolla-ruby 2.5.5 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 104ede0277b152834734532009f5bfc89fc3bdaf
4
- data.tar.gz: e06536872c2ca718fd2036c2e8fe6ec52d62103f
3
+ metadata.gz: 7fa2436e7ea681ce8fea9abe309bccee237536ea
4
+ data.tar.gz: c398209cf8011fc35adacf92c7cb69d1b5746217
5
5
  SHA512:
6
- metadata.gz: efd22544a62e1282ce6ae2719e3d7035ef4e205d0bcd2d15a402cf26de900ddc8bffb97dfe573a7b1f7be1edc4a45c4b764e593a351a74fd6b910237bbf0ee33
7
- data.tar.gz: 3d52611e834a41c82ccbe07a72e2feceaaaf445df2c7938c25dddd50c37789988e29eace0e423097f6c74de6641e8908cae1c43a5109e4da6127a17f171045b5
6
+ metadata.gz: bd72ed9f135dec234bc41e405bed7cf0ff47a09e1aa48612d0abdb3eb8ea77b678512865be123af6740a0bd51e16c7cfc1a1751c247d28d98ce483543c6dad94
7
+ data.tar.gz: 4513c77af15a22339576046eb1ea7d6346f0fba9f65a97d4e9ea488f879e55b39106be2322b931b447252a8008e43f2ee5b37fa20c694014474818ef70e6a08b
@@ -1,8 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
- - 1.9.2
5
3
  - 1.9.3
6
4
  - 2.0.0
7
5
  gemfile:
8
- - gemfiles/json.gemfile
6
+ - gemfiles/json.gemfile
data/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
  Official Ruby wrapper for Dwolla's API
3
3
 
4
4
  ## Version
5
- 2.5.5
5
+ 2.6.0
6
+
7
+ [![Build Status](https://travis-ci.org/Dwolla/dwolla-ruby.svg?branch=master)](https://travis-ci.org/Dwolla/dwolla-ruby)
6
8
 
7
9
  ## Requirements
8
10
  - [Ruby](http://www.ruby-lang.org/)
@@ -10,11 +12,11 @@ Official Ruby wrapper for Dwolla's API
10
12
  ## Installation
11
13
  The easiest way to install the dwolla-ruby gem for now is to use bundler and add the following line to your Gemfile:
12
14
 
13
- gem 'dwolla-ruby'
15
+ `gem 'dwolla-ruby'`
14
16
 
15
17
  The recommended way to install dwolla-ruby is through RubyGems:
16
18
 
17
- gem install dwolla-ruby
19
+ `gem install dwolla-ruby`
18
20
 
19
21
  ## Examples / Quickstart
20
22
 
@@ -23,15 +25,21 @@ To use the examples in the /examples folder, first edit the _keys.rb file and ad
23
25
  This repo includes various usage examples, including:
24
26
 
25
27
  * Authenticating with OAuth [oauth.rb]
26
- * Sending money [send.rb]
27
28
  * Fetching user information [users.rb]
28
29
  * Grabbing a user's contacts [contacts.rb]
29
30
  * Listing a user's funding sources [fundingSources.rb]
30
- * Transacting money [transactions.rb]
31
+ * Transacting money (includes sending) [transactions.rb]
31
32
  * Getting a user's balance [balance.rb]
32
33
 
33
34
  ## Changelog
34
35
 
36
+ 2.6.0
37
+
38
+ * **BREAKING CHANGE**: OAuth access tokens now expire. Instead of a string, `Dwolla::OAuth::get_token` now returns a hash with an `access_token`, `refresh_token`, and expiration times in seconds for both. In order to refresh authorization, use `Dwolla::OAuth.refresh_auth`
39
+ * **BREAKING CHANGE**: Guest send has been officially deprecated and removed from this gem.
40
+ * All MassPay endpoints have been included in this release for batch payment support.
41
+ * Proper unit tests implemented for all endpoints.
42
+
35
43
  2.5.5
36
44
 
37
45
  * Pulled in a merge request for syntax error (thanks, @mstahl)
@@ -121,8 +129,11 @@ This wrapper is heavily based off Stripe's Ruby Gem
121
129
 
122
130
  ## Support
123
131
 
132
+ We highly recommend seeking support on our forums, [located here!](https://discuss.dwolla.com/category/api-support)
133
+
124
134
  - Dwolla API <api@dwolla.com>
125
- - Michael Schonfeld <michael@dwolla.com>
135
+ - David Stancu <david@dwolla.com>
136
+ - Gordon Zheng <gordon@dwolla.com>
126
137
 
127
138
  ## References / Documentation
128
139
 
@@ -9,6 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.homepage = "https://github.com/dwolla/dwolla-ruby"
10
10
  s.summary = %q{Official Ruby Wrapper for Dwolla's API}
11
11
  s.description = %q{Official Ruby Wrapper for Dwolla's API. Completely re-written based on Stripe's Ruby Bindings.}
12
+ s.license = 'MIT'
12
13
 
13
14
  s.rubyforge_project = "dwolla-ruby"
14
15
 
@@ -21,7 +22,6 @@ Gem::Specification.new do |s|
21
22
  s.add_dependency('addressable', '>= 2')
22
23
 
23
24
  s.add_development_dependency('mocha')
24
- s.add_development_dependency('shoulda')
25
25
  s.add_development_dependency('test-unit')
26
26
  s.add_development_dependency('rake')
27
27
  end
@@ -18,17 +18,34 @@ redirect_uri = 'http://localhost:4567/oauth_return'
18
18
  # Create an authentication URL
19
19
  # that the user will be redirected to
20
20
  get '/' do
21
- authUrl = Dwolla::OAuth.get_auth_url(redirect_uri)
22
- "To begin the OAuth process, send the user off to <a href=\"#{authUrl}\">#{authUrl}</a>"
21
+ authUrl = Dwolla::OAuth.get_auth_url(redirect_uri)
22
+ "To begin the OAuth process, send the user off to <a href=\"#{authUrl}\">#{authUrl}</a>"
23
23
  end
24
24
 
25
25
 
26
26
  # STEP 2:
27
27
  # Exchange the temporary code given
28
28
  # to us in the querystring, for
29
- # a never-expiring OAuth access token
29
+ # an expiring OAuth access token and refresh token pair.
30
30
  get '/oauth_return' do
31
- code = params['code']
32
- token = Dwolla::OAuth.get_token(code, redirect_uri)
33
- "Your never-expiring OAuth access token is: <b>#{token}</b>"
31
+ code = params['code']
32
+ info = Dwolla::OAuth.get_token(code, redirect_uri)
33
+ token = info['access_token']
34
+ refresh_token = info['refresh_token']
35
+ "Your expiring OAuth access token is: <b>#{token}</b>, and your refresh token is <b>#{refresh_token}</b>"
34
36
  end
37
+
38
+ # STEP 3:
39
+ #
40
+ # The array returned in step 2 as 'info' also contains
41
+ # expiration times for when the OAuth token will become
42
+ # invalid. Use this method to refresh your token with
43
+ # the provided refresh token.
44
+ #
45
+ get '/oauth_refresh' do
46
+ refresh_token = params['refresh_token']
47
+ info = Dwolla::OAuth.refresh_auth(refresh_token)
48
+ token = info['access_token']
49
+ refresh_token = info['refresh_token']
50
+ "Your expiring OAuth access token is: <b>#{token}</b>, and your refresh token is <b>#{refresh_token}</b>"
51
+ end
@@ -7,28 +7,28 @@ require 'multi_json'
7
7
  require 'addressable/uri'
8
8
 
9
9
  # Version
10
- require 'dwolla/version'
10
+ require_relative 'dwolla/version'
11
11
 
12
12
  # Resources
13
- require 'dwolla/json'
14
- require 'dwolla/transactions'
15
- require 'dwolla/requests'
16
- require 'dwolla/contacts'
17
- require 'dwolla/users'
18
- require 'dwolla/balance'
19
- require 'dwolla/funding_sources'
20
- require 'dwolla/oauth'
21
- require 'dwolla/offsite_gateway'
22
- require 'dwolla/accounts'
23
- # require 'dwolla/register' // Under Construction
13
+ require_relative 'dwolla/json'
14
+ require_relative 'dwolla/transactions'
15
+ require_relative 'dwolla/requests'
16
+ require_relative 'dwolla/contacts'
17
+ require_relative 'dwolla/users'
18
+ require_relative 'dwolla/balance'
19
+ require_relative 'dwolla/funding_sources'
20
+ require_relative 'dwolla/oauth'
21
+ require_relative 'dwolla/offsite_gateway'
22
+ require_relative 'dwolla/accounts'
23
+ require_relative 'dwolla/masspay'
24
24
 
25
25
  # Errors
26
- require 'dwolla/errors/dwolla_error'
27
- require 'dwolla/errors/api_connection_error'
28
- require 'dwolla/errors/api_error'
29
- require 'dwolla/errors/missing_parameter_error'
30
- require 'dwolla/errors/authentication_error'
31
- require 'dwolla/errors/invalid_request_error'
26
+ require_relative 'dwolla/errors/dwolla_error'
27
+ require_relative 'dwolla/errors/api_connection_error'
28
+ require_relative 'dwolla/errors/api_error'
29
+ require_relative 'dwolla/errors/missing_parameter_error'
30
+ require_relative 'dwolla/errors/authentication_error'
31
+ require_relative 'dwolla/errors/invalid_request_error'
32
32
 
33
33
  module Dwolla
34
34
  @@api_key = nil
@@ -1,6 +1,12 @@
1
1
  module Dwolla
2
2
  class Accounts
3
- def self.auto_withdrawl(enabled=true, funding_id=nil, token=nil)
3
+ def self.get_auto_withdrawal_status(token=nil)
4
+ url = accounts_url + 'features/auto_withdrawl'
5
+
6
+ Dwolla.request(:get, url, {}, {}, token)
7
+ end
8
+
9
+ def self.toggle_auto_withdrawl(enabled=true, funding_id=nil, token=nil)
4
10
  raise MissingParameterError.new('No Funding ID Provided.') if funding_id.nil?
5
11
 
6
12
  url = accounts_url + 'features/auto_withdrawl'
@@ -7,10 +7,18 @@ module Dwolla
7
7
  end
8
8
 
9
9
 
10
- def self.nearby(filters={})
11
- url = contacts_url + 'nearby'
10
+ def self.nearby(lat=nil, lon=nil, filters={})
11
+ raise MissingParameterError.new('No Latitude Provided') unless lat
12
+ raise MissingParameterError.new('No Longitude Provided.') unless lon
12
13
 
13
- Dwolla.request(:get, url, filters, {}, false)
14
+ url = contacts_url + 'nearby'
15
+
16
+ params = {
17
+ :latitude => lat,
18
+ :longitude => lon
19
+ }.merge(filters)
20
+
21
+ Dwolla.request(:get, url, params, {}, false)
14
22
  end
15
23
 
16
24
  private
@@ -0,0 +1,53 @@
1
+ module Dwolla
2
+ class MassPay
3
+
4
+ def self.get(token=nil)
5
+ Dwolla.request(:get, masspay_url, {}, {}, token);
6
+ end
7
+
8
+ def self.create(params={}, token=nil)
9
+ raise MissingParameterError.new('No fundsSource ID Provided.') unless params[:fundsSource]
10
+ raise MissingParameterError.new('No PIN Provided.') unless params[:pin]
11
+ raise MissingParameterError.new('No Items Provided.') unless params[:items]
12
+
13
+ Dwolla.request(:post, masspay_url, params, {}, token)
14
+ end
15
+
16
+ def self.getItems(id=nil, params={}, token=nil)
17
+ raise MissingParameterError.new('No MassPay Job ID Provided.') if id.nil?
18
+ url = masspay_url
19
+ url += id.to_s unless id.nil?
20
+ url += '/items'
21
+
22
+ Dwolla.request(:get, url, params, {}, token)
23
+ end
24
+
25
+ def self.getItem(jobId=nil, itemId=nil, token=nil)
26
+ raise MissingParameterError.new('No MassPay Job ID Provided.') if jobId.nil?
27
+ raise MissingParameterError.new('No Item ID Provided.') if itemId.nil?
28
+
29
+ url = masspay_url
30
+ url += jobId.to_s unless jobId.nil?
31
+ url += '/items/'
32
+ url += itemId.to_s unless itemId.nil?
33
+
34
+ Dwolla.request(:get, url, {}, {}, token)
35
+ end
36
+
37
+ def self.getJob(id=nil, token=nil)
38
+ raise MissingParameterError.new('No MassPay Job ID Provided.') if id.nil?
39
+
40
+ url = masspay_url
41
+ url += id.to_s unless id.nil?
42
+
43
+ Dwolla.request(:get, url, {}, {}, token)
44
+ end
45
+
46
+ private
47
+
48
+ def self.masspay_url
49
+ return '/masspay/'
50
+ end
51
+
52
+ end
53
+ end
@@ -1,51 +1,76 @@
1
1
  module Dwolla
2
- class OAuth
3
- def self.get_auth_url(redirect_uri=nil, scope=Dwolla::scope)
4
- raise AuthenticationError.new('No Api Key Provided.') unless Dwolla::api_key
2
+ class OAuth
3
+ def self.get_auth_url(redirect_uri=nil, scope=Dwolla::scope)
4
+ raise AuthenticationError.new('No Api Key Provided.') unless Dwolla::api_key
5
5
 
6
- params = {
7
- :scope => scope,
8
- :response_type => 'code',
9
- :client_id => Dwolla::api_key
10
- }
6
+ params = {
7
+ :scope => scope,
8
+ :response_type => 'code',
9
+ :client_id => Dwolla::api_key
10
+ }
11
11
 
12
- params['redirect_uri'] = redirect_uri unless redirect_uri.nil?
12
+ params['redirect_uri'] = redirect_uri unless redirect_uri.nil?
13
13
 
14
- uri = Addressable::URI.new
15
- uri.query_values = params
14
+ uri = Addressable::URI.new
15
+ uri.query_values = params
16
16
 
17
- if Dwolla::debug and Dwolla::sandbox
18
- puts "[DWOLLA SANDBOX MODE OPERATION]"
19
- end
17
+ if Dwolla::debug and Dwolla::sandbox
18
+ puts "[DWOLLA SANDBOX MODE OPERATION]"
19
+ end
20
20
 
21
- return auth_url + '?' + uri.query
22
- end
21
+ return auth_url + '?' + uri.query
22
+ end
23
+
24
+ def self.get_token(code=nil, redirect_uri=nil)
25
+ raise MissingParameterError.new('No Code Provided.') if code.nil?
26
+
27
+ params = {
28
+ :grant_type => 'authorization_code',
29
+ :code => code
30
+ }
31
+
32
+ # I realize this is ugly, but the unit tests fail
33
+ # if the key is accessed["like_this"] because the
34
+ # hash is compared with "quotes" and not :like_this.
35
+
36
+ # It may very well be my Ruby version
37
+ # TODO: Revisit this
38
+ (params = params.merge({:redirect_uri => redirect_uri})) unless redirect_uri.nil?
23
39
 
24
- def self.get_token(code=nil, redirect_uri=nil)
25
- raise MissingParameterError.new('No Code Provided.') if code.nil?
40
+ resp = Dwolla.request(:get, token_url, params, {}, false, false, true)
26
41
 
27
- params = {
28
- :grant_type => 'authorization_code',
29
- :code => code
30
- }
42
+ # TODO: Revisit this to make it more unit test friendly, fails ['error_description'] due to
43
+ # key not existing, same on L58
44
+ return "No data received." unless resp.is_a?(Hash)
45
+ raise APIError.new(resp['error_description']) unless resp['access_token'] and resp['refresh_token']
31
46
 
32
- params['redirect_uri'] = redirect_uri unless redirect_uri.nil?
47
+ return resp
48
+ end
49
+
50
+ def self.refresh_auth(refresh_token=nil)
51
+ raise MissingParameterError.new('No Refresh Token Provided') if refresh_token.nil?
33
52
 
34
- resp = Dwolla.request(:get, token_url, params, {}, false, false, true)
53
+ params = {
54
+ :grant_type => 'refresh_token',
55
+ :refresh_token => refresh_token
56
+ }
35
57
 
36
- raise APIError.new(resp['error_description']) unless resp['access_token']
58
+ resp = Dwolla.request(:get, token_url, params, {}, false, false, true)
37
59
 
38
- return resp['access_token']
39
- end
60
+ return "No data received." unless resp.is_a?(Hash)
61
+ raise APIError.new(resp['error_description']) unless resp.has_key['access_token'] and resp['refresh_token']
40
62
 
41
- private
63
+ return resp
64
+ end
42
65
 
43
- def self.auth_url
44
- Dwolla.hostname + '/oauth/v2/authenticate'
45
- end
66
+ private
67
+
68
+ def self.auth_url
69
+ Dwolla.hostname + '/oauth/v2/authenticate'
70
+ end
46
71
 
47
- def self.token_url
48
- Dwolla.hostname + '/oauth/v2/token'
49
- end
72
+ def self.token_url
73
+ Dwolla.hostname + '/oauth/v2/token'
50
74
  end
51
- end
75
+ end
76
+ end
@@ -85,6 +85,8 @@ module Dwolla
85
85
  }
86
86
 
87
87
  resp = Dwolla.request(:post, request_url, params, {}, false, false, true)
88
+
89
+ return "No data received." unless resp.is_a?(Hash)
88
90
  raise APIError.new(resp['Message']) unless resp['Result'] == 'Success'
89
91
 
90
92
  return checkout_url + resp['CheckoutId']
@@ -42,21 +42,6 @@ module Dwolla
42
42
  Dwolla.request(:post, url, params, {}, token)
43
43
  end
44
44
 
45
- def self.guest_send(params={})
46
- raise MissingParameterError.new('No Destination ID Provided.') unless params[:destinationId]
47
- raise MissingParameterError.new('No Amount Provided.') unless params[:amount]
48
- raise MissingParameterError.new('No First Name Provided.') unless params[:firstName]
49
- raise MissingParameterError.new('No Last Name Provided.') unless params[:lastName]
50
- raise MissingParameterError.new('No Email Address Provided.') unless params[:emailAddress]
51
- raise MissingParameterError.new('No Routing Number (ABA) Provided.') unless params[:routingNumber]
52
- raise MissingParameterError.new('No Account Number Provided.') unless params[:accountNumber]
53
- raise MissingParameterError.new('No Account Type Provided.') unless params[:accountType]
54
-
55
- url = transactions_url + 'guestsend'
56
-
57
- Dwolla.request(:post, url, params, {}, false)
58
- end
59
-
60
45
  class << self
61
46
  alias_method :listing, :get
62
47
  alias_method :send, :create
@@ -21,10 +21,13 @@ module Dwolla
21
21
  self.get(nil, token)
22
22
  end
23
23
 
24
- def self.nearby(filters={})
25
- url = users_url + 'nearby'
24
+ def self.nearby(params={})
25
+ raise MissingParameterError.new('No Latitude Provided') unless params[:latitude]
26
+ raise MissingParameterError.new('No Longitude Provided') unless params[:longitude]
26
27
 
27
- Dwolla.request(:get, url, filters, {}, false)
28
+ url = users_url + 'nearby'
29
+
30
+ Dwolla.request(:get, url, params, {}, false)
28
31
  end
29
32
 
30
33
  private
@@ -1,3 +1,3 @@
1
1
  module Dwolla
2
- VERSION = "2.5.5"
2
+ VERSION = "2.6.0"
3
3
  end