balanced 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -0
- data/examples/events_and_callbacks.rb +80 -0
- data/lib/balanced/client.rb +3 -3
- data/lib/balanced/resources.rb +2 -0
- data/lib/balanced/resources/account.rb +20 -2
- data/lib/balanced/resources/callback.rb +11 -0
- data/lib/balanced/resources/card.rb +8 -0
- data/lib/balanced/resources/credit.rb +8 -0
- data/lib/balanced/resources/event.rb +27 -0
- data/lib/balanced/resources/marketplace.rb +13 -0
- data/lib/balanced/version.rb +1 -1
- data/spec/balanced/resources/account_spec.rb +30 -0
- data/spec/balanced/resources/callback_spec.rb +52 -0
- metadata +10 -4
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
Online Marketplace Payments
|
4
4
|
|
5
5
|
[](http://travis-ci.org/balanced/balanced-ruby)
|
6
|
+
[](https://codeclimate.com/github/balanced/balanced-ruby)
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
@@ -0,0 +1,80 @@
|
|
1
|
+
"""
|
2
|
+
Welcome weary traveller. Sick of polling for state changes? Well today have I
|
3
|
+
got good news for you. Run this example below to see how to get yourself some
|
4
|
+
callback goodness and to understand how events work.
|
5
|
+
"""
|
6
|
+
cwd = File.dirname(File.dirname(File.absolute_path(__FILE__)))
|
7
|
+
$:.unshift(cwd + "/lib")
|
8
|
+
require 'balanced'
|
9
|
+
require 'net/http'
|
10
|
+
require 'uri'
|
11
|
+
require 'json'
|
12
|
+
|
13
|
+
api_key = Balanced::ApiKey.new.save
|
14
|
+
Balanced.configure(api_key.secret)
|
15
|
+
marketplace = Balanced::Marketplace.new.save
|
16
|
+
|
17
|
+
# mumble, let's create a requestb.in
|
18
|
+
request_bin = Net::HTTP.post_form(URI.parse('http://requestb.in/api/v1/bins'), {})
|
19
|
+
response = JSON.parse request_bin.body
|
20
|
+
bin_name = response['name']
|
21
|
+
callback_url = 'http://requestb.in/' + bin_name
|
22
|
+
requests_url = 'http://requestb.in/api/v1/bins/%s/requests' % bin_name
|
23
|
+
|
24
|
+
puts 'let\'s create a callback'
|
25
|
+
marketplace.create_callback(
|
26
|
+
:url => callback_url
|
27
|
+
)
|
28
|
+
|
29
|
+
puts 'let\'s create a card and associate it with a new account'
|
30
|
+
card = Balanced::Card.new(
|
31
|
+
:expiration_month => '12',
|
32
|
+
:security_code => '123',
|
33
|
+
:card_number => '5105105105105100',
|
34
|
+
:expiration_year => '2020'
|
35
|
+
).save()
|
36
|
+
buyer = Balanced::Account.new(
|
37
|
+
'card_uri' => card.uri
|
38
|
+
).save()
|
39
|
+
|
40
|
+
puts 'generate a debit (which implicitly creates and captures a hold)'
|
41
|
+
buyer.debit(:amount => 100)
|
42
|
+
|
43
|
+
puts 'event creation is an async operation, let\'s wait until we have ' \
|
44
|
+
'some events!'
|
45
|
+
while Balanced::Event.find(:all).length == 0
|
46
|
+
puts 'Zzzz'
|
47
|
+
sleep(0)
|
48
|
+
end
|
49
|
+
|
50
|
+
puts 'Woop, we got some events, let us see what there is to look at'
|
51
|
+
for event in Balanced::Event.find(:all)
|
52
|
+
puts 'this was a %s event, it occurred at %s, the callback has a ' \
|
53
|
+
'status of %s' % [
|
54
|
+
event.type,
|
55
|
+
event.occurred_at,
|
56
|
+
event.callback_statuses
|
57
|
+
]
|
58
|
+
end
|
59
|
+
|
60
|
+
puts 'you can inspect each event to see the logs'
|
61
|
+
event = Balanced::Event.find(:first)
|
62
|
+
for callback in event.callbacks
|
63
|
+
puts 'inspecting callback to %s for event %s' % [
|
64
|
+
callback.url,
|
65
|
+
event.type
|
66
|
+
]
|
67
|
+
|
68
|
+
for log in callback.logs
|
69
|
+
puts 'this attempt to the callback has a status of %s' % [log.status]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
puts 'ok, let\'s check with requestb.in to see if our callbacks fired at %s' % callback_url
|
74
|
+
uri = URI.parse(requests_url)
|
75
|
+
request_bin = Net::HTTP.get_response(uri)
|
76
|
+
response = JSON.parse request_bin.body
|
77
|
+
puts 'we received %s callbacks, you can view them at http://requestb.in/%s?inspect' % [
|
78
|
+
response.length,
|
79
|
+
bin_name,
|
80
|
+
]
|
data/lib/balanced/client.rb
CHANGED
@@ -7,15 +7,15 @@ require "balanced_exception_middleware"
|
|
7
7
|
|
8
8
|
module Balanced
|
9
9
|
class Client
|
10
|
-
|
10
|
+
|
11
11
|
DEFAULTS = {
|
12
12
|
:scheme => 'http',
|
13
13
|
:host => 'localhost',
|
14
14
|
:port => 5000,
|
15
15
|
:version => '1',
|
16
16
|
:logging_level => 'WARN',
|
17
|
-
:connection_timeout =>
|
18
|
-
:read_timeout =>
|
17
|
+
:connection_timeout => 30,
|
18
|
+
:read_timeout => 30,
|
19
19
|
:logger => nil,
|
20
20
|
:ssl_verify => true
|
21
21
|
}
|
data/lib/balanced/resources.rb
CHANGED
@@ -38,6 +38,19 @@ module Balanced
|
|
38
38
|
meta = args[3] || options.fetch(:meta) { nil }
|
39
39
|
description = args[4] || options.fetch(:description) { nil }
|
40
40
|
source_uri = args[5] || options.fetch(:source_uri) { nil }
|
41
|
+
on_behalf_of = args[6] || options.fetch(:on_behalf_of) { nil }
|
42
|
+
|
43
|
+
if on_behalf_of
|
44
|
+
if on_behalf_of.respond_to? :uri
|
45
|
+
on_behalf_of = on_behalf_of.uri
|
46
|
+
end
|
47
|
+
if !on_behalf_of.is_a?(String)
|
48
|
+
raise ArgumentError, 'The on_behalf_of parameter needs to be an account URI'
|
49
|
+
end
|
50
|
+
if on_behalf_of == self.uri
|
51
|
+
raise ArgumentError, 'The on_behalf_of parameter MAY NOT be the same account as the account you are debiting!'
|
52
|
+
end
|
53
|
+
end
|
41
54
|
|
42
55
|
debit = Debit.new(
|
43
56
|
:uri => self.debits_uri,
|
@@ -47,6 +60,7 @@ module Balanced
|
|
47
60
|
:meta => meta,
|
48
61
|
:description => description,
|
49
62
|
:source_uri => source_uri,
|
63
|
+
:on_behalf_of_uri => on_behalf_of,
|
50
64
|
)
|
51
65
|
debit.save
|
52
66
|
end
|
@@ -146,8 +160,12 @@ module Balanced
|
|
146
160
|
# }
|
147
161
|
# }
|
148
162
|
#
|
149
|
-
def promote_to_merchant
|
150
|
-
|
163
|
+
def promote_to_merchant merchant
|
164
|
+
if merchant.is_a?(String)
|
165
|
+
self.merchant_uri = merchant
|
166
|
+
else
|
167
|
+
self.merchant = merchant
|
168
|
+
end
|
151
169
|
save
|
152
170
|
end
|
153
171
|
|
@@ -18,6 +18,14 @@ module Balanced
|
|
18
18
|
# If +appears_on_statement_as+ is nil, then Balanced will use the
|
19
19
|
# +domain_name+ property from your Marketplace.
|
20
20
|
#
|
21
|
+
# @param [Array] args
|
22
|
+
# @option args [Integer] :amount the amount of the purchase in cents
|
23
|
+
# @option args [String] :appears_on_statement_as
|
24
|
+
# @option args [String] :hold_uri
|
25
|
+
# @option args [Hash] :meta a hash of data to save with the Debit
|
26
|
+
# @option args [String] :description
|
27
|
+
# @option args [String] :source_uri
|
28
|
+
#
|
21
29
|
# @return [Debit]
|
22
30
|
def debit *args
|
23
31
|
warn_on_positional args
|
@@ -9,6 +9,14 @@ module Balanced
|
|
9
9
|
class Credit
|
10
10
|
include Balanced::Resource
|
11
11
|
|
12
|
+
# @param [Array] args
|
13
|
+
# @option [String] :uri the uri of the credit, in the case of an update
|
14
|
+
# @option [Hash] :bank_account
|
15
|
+
# @option [Integer] :amount amount in cents
|
16
|
+
# @option [String] :description a text description of the credit
|
17
|
+
# @option [String] :appears_on_statement_as
|
18
|
+
# @option [Hash] :meta
|
19
|
+
# @option [String] :destination_uri the uri of the bank account to credit
|
12
20
|
def initialize *args
|
13
21
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
14
22
|
uri = options.fetch(:uri) { self.class.uri }
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Balanced
|
2
|
+
|
3
|
+
# An Event is a snapshot of another resource at a point in time when
|
4
|
+
# something significant occurred. Events are created when resources are
|
5
|
+
# created, updated, deleted or otherwise change state such as a Credit being
|
6
|
+
# marked as failed.
|
7
|
+
#
|
8
|
+
class Event
|
9
|
+
include Balanced::Resource
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
# Represents a single event being sent to a callback.
|
14
|
+
#
|
15
|
+
class EventCallback
|
16
|
+
include Balanced::Resource
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
# Represents a single log of an event sent to a callback.
|
21
|
+
#
|
22
|
+
class Log
|
23
|
+
include Balanced::Resource
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -209,6 +209,19 @@ module Balanced
|
|
209
209
|
card.save
|
210
210
|
end
|
211
211
|
|
212
|
+
def create_callback *args
|
213
|
+
warn_on_positional args
|
214
|
+
|
215
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
216
|
+
url = args[0] || options.fetch(:url) { nil }
|
217
|
+
|
218
|
+
callback = Callback.new(
|
219
|
+
'uri' => self.callbacks_uri,
|
220
|
+
'url' => url
|
221
|
+
)
|
222
|
+
callback.save
|
223
|
+
end
|
224
|
+
|
212
225
|
end
|
213
226
|
|
214
227
|
end
|
data/lib/balanced/version.rb
CHANGED
@@ -461,6 +461,36 @@ describe Balanced::Account do
|
|
461
461
|
debit.amount.should eql 500
|
462
462
|
debit.appears_on_statement_as.should eql "BOBS BURGERS"
|
463
463
|
end
|
464
|
+
it "accepts on_behalf_of parameter" do
|
465
|
+
merchant = Balanced::Account.new.save
|
466
|
+
debit = @buyer.debit(
|
467
|
+
:amount => 500,
|
468
|
+
:on_behalf_of => merchant
|
469
|
+
)
|
470
|
+
debit.should be_instance_of Balanced::Debit
|
471
|
+
debit.amount.should eql 500
|
472
|
+
# TODO: once the API returns on_behalf_of in the response, make sure it shows up. For now we just make sure the debit didn't fail.
|
473
|
+
end
|
474
|
+
it "accepts URI for on_behalf_of" do
|
475
|
+
merchant = Balanced::Account.new.save
|
476
|
+
debit = @buyer.debit(
|
477
|
+
:amount => 500,
|
478
|
+
:on_behalf_of => merchant.uri
|
479
|
+
)
|
480
|
+
debit.should be_instance_of Balanced::Debit
|
481
|
+
debit.amount.should eql 500
|
482
|
+
# TODO: once the API returns on_behalf_of in the response, make sure it shows up. For now we just make sure the debit didn't fail.
|
483
|
+
end
|
484
|
+
|
485
|
+
it "fails with bad on_behalf_of parameter" do
|
486
|
+
expect {
|
487
|
+
@buyer.debit(
|
488
|
+
:amount => 500,
|
489
|
+
:on_behalf_of => @buyer
|
490
|
+
)
|
491
|
+
}.to raise_error ArgumentError
|
492
|
+
end
|
493
|
+
|
464
494
|
# this is deprecated
|
465
495
|
it "takes positional parameters" do
|
466
496
|
debit = @buyer.debit(500, "FOO FIGHTER")
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Balanced::Callback do
|
4
|
+
use_vcr_cassette
|
5
|
+
|
6
|
+
before do
|
7
|
+
api_key = Balanced::ApiKey.new.save
|
8
|
+
Balanced.configure api_key.secret
|
9
|
+
|
10
|
+
@marketplace = Balanced::Marketplace.new.save
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "create" do
|
15
|
+
use_vcr_cassette
|
16
|
+
|
17
|
+
before do
|
18
|
+
@callback = @marketplace.create_callback(
|
19
|
+
:url => "http://www.example.com/balanced_callback"
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'check url' do
|
24
|
+
|
25
|
+
subject { @callback.url}
|
26
|
+
it { should eql "http://www.example.com/balanced_callback" }
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "delete" do
|
33
|
+
use_vcr_cassette
|
34
|
+
|
35
|
+
before do
|
36
|
+
@callback = @marketplace.create_callback(
|
37
|
+
:url => "http://www.example.com/balanced_callback"
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'delete' do
|
42
|
+
it "should delete without an error" do
|
43
|
+
|
44
|
+
@callback.destroy
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: balanced
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -47,7 +47,8 @@ description: ! "Balanced is the payments platform for marketplaces.\n Integra
|
|
47
47
|
a payments experience just like Amazon for your marketplace.\n Forget about dealing
|
48
48
|
with banking systems, compliance, fraud, and security.\n "
|
49
49
|
email:
|
50
|
-
-
|
50
|
+
- !binary |-
|
51
|
+
bWFobW91ZEBwb3VuZHBheS5jb20=
|
51
52
|
executables: []
|
52
53
|
extensions: []
|
53
54
|
extra_rdoc_files: []
|
@@ -73,6 +74,7 @@ files:
|
|
73
74
|
- doc/balanced_templates/default/onefile/html/layout.erb
|
74
75
|
- doc/balanced_templates/default/onefile/html/setup.rb
|
75
76
|
- doc/balanced_templates/default/tags/html/index.erb
|
77
|
+
- examples/events_and_callbacks.rb
|
76
78
|
- examples/examples.rb
|
77
79
|
- lib/balanced.rb
|
78
80
|
- lib/balanced/client.rb
|
@@ -82,9 +84,11 @@ files:
|
|
82
84
|
- lib/balanced/resources/account.rb
|
83
85
|
- lib/balanced/resources/api_key.rb
|
84
86
|
- lib/balanced/resources/bank_account.rb
|
87
|
+
- lib/balanced/resources/callback.rb
|
85
88
|
- lib/balanced/resources/card.rb
|
86
89
|
- lib/balanced/resources/credit.rb
|
87
90
|
- lib/balanced/resources/debit.rb
|
91
|
+
- lib/balanced/resources/event.rb
|
88
92
|
- lib/balanced/resources/hold.rb
|
89
93
|
- lib/balanced/resources/marketplace.rb
|
90
94
|
- lib/balanced/resources/merchant.rb
|
@@ -99,6 +103,7 @@ files:
|
|
99
103
|
- spec/balanced/resources/account_spec.rb
|
100
104
|
- spec/balanced/resources/api_key_spec.rb
|
101
105
|
- spec/balanced/resources/bank_account_spec.rb
|
106
|
+
- spec/balanced/resources/callback_spec.rb
|
102
107
|
- spec/balanced/resources/credit_spec.rb
|
103
108
|
- spec/balanced/resources/hold_spec.rb
|
104
109
|
- spec/balanced/resources/marketplace_spec.rb
|
@@ -131,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
136
|
version: '0'
|
132
137
|
requirements: []
|
133
138
|
rubyforge_project:
|
134
|
-
rubygems_version: 1.8.
|
139
|
+
rubygems_version: 1.8.24
|
135
140
|
signing_key:
|
136
141
|
specification_version: 3
|
137
142
|
summary: Sign up on https://balancedpayments.com/
|
@@ -141,6 +146,7 @@ test_files:
|
|
141
146
|
- spec/balanced/resources/account_spec.rb
|
142
147
|
- spec/balanced/resources/api_key_spec.rb
|
143
148
|
- spec/balanced/resources/bank_account_spec.rb
|
149
|
+
- spec/balanced/resources/callback_spec.rb
|
144
150
|
- spec/balanced/resources/credit_spec.rb
|
145
151
|
- spec/balanced/resources/hold_spec.rb
|
146
152
|
- spec/balanced/resources/marketplace_spec.rb
|