balanced 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
1
  $:.unshift("/Users/mahmoud/code/poundpay/ruby/balanced-ruby/lib")
2
2
  require 'balanced'
3
+
3
4
  begin
4
5
  Balanced::Card
5
6
  rescue NameError
@@ -19,12 +20,17 @@ Balanced.configure(nil, options)
19
20
  puts "create our new api key"
20
21
  api_key = Balanced::ApiKey.new.save
21
22
  puts "Our secret is: ", api_key.secret
23
+ secret = api_key.secret
22
24
 
23
- puts "configure with our secret #{api_key}"
24
- Balanced.configure(api_key.secret)
25
+ puts "configure with our secret #{secret}"
26
+ Balanced.configure(secret)
25
27
 
26
28
  puts "create our marketplace"
27
- marketplace = Balanced::Marketplace.new.save
29
+ begin
30
+ marketplace = Balanced::Marketplace.new.save
31
+ rescue Balanced::Conflict => ex
32
+ marketplace = Balanced::Marketplace.my_marketplace
33
+ end
28
34
 
29
35
  raise "Merchant.me should not be nil" if Balanced::Merchant.me.nil?
30
36
  puts "what's my merchant?, easy: Merchant.me: ", Balanced::Merchant.me
@@ -34,11 +40,12 @@ raise "Marketplace.my_marketplace should not be nil" if Balanced::Marketplace.my
34
40
  puts "what's my marketplace?, easy: Marketplace.my_marketplace: ", Balanced::Marketplace.my_marketplace
35
41
 
36
42
  puts "My marketplace's name is: #{marketplace.name}"
37
- puts "Changing it to TestFooey"
38
- marketplace.name = "TestFooey"
43
+ random_name = (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
44
+ puts "Changing it to #{random_name}"
45
+ marketplace.name = random_name
39
46
  marketplace.save
40
47
  puts "My marketplace name is now: #{Balanced::Marketplace.my_marketplace.name}"
41
- raise "Marketplace name is NOT TestFooey!" if Balanced::Marketplace.my_marketplace.name != "TestFooey"
48
+ raise "Marketplace name is NOT #{random_name}!" if Balanced::Marketplace.my_marketplace.name != random_name
42
49
 
43
50
  puts "cool! let's create a new card."
44
51
  card = Balanced::Card.new(
@@ -49,17 +56,20 @@ card = Balanced::Card.new(
49
56
  puts "Our card uri: #{card.uri}"
50
57
 
51
58
  puts "create our **buyer** account"
52
- buyer = marketplace.create_buyer("buyer@example.org", card.uri)
59
+ buyer = marketplace.create_buyer(
60
+ :email_address => "buyer@example.org",
61
+ :card_uri => card.uri
62
+ )
53
63
  puts "our buyer account: #{buyer.uri}"
54
64
 
55
65
  puts "hold some amount of funds on the buyer, lets say 15$"
56
- the_hold = buyer.hold(1500)
66
+ the_hold = buyer.hold(:amount => 1500)
57
67
 
58
- puts "the hold has a fee of 35c, here's the fee #{the_hold.fee}"
59
- raise "The hold's fee is incorrect" if the_hold.fee != 35
68
+ puts "the hold has a fee of 30c, here's the fee #{the_hold.fee}"
69
+ raise "The hold's fee is incorrect" if the_hold.fee != 30
60
70
 
61
71
  puts "ok, no more holds! lets just capture it (for the full amount)"
62
- debit = the_hold.capture()
72
+ debit = the_hold.capture
63
73
 
64
74
  puts "hmm, how much money do i have in escrow? should equal the debit amount"
65
75
  marketplace = marketplace.reload
@@ -82,8 +92,8 @@ bank_account = Balanced::BankAccount.new(
82
92
  ).save
83
93
 
84
94
  merchant = marketplace.create_merchant(
85
- "merchant@example.org",
86
- {
95
+ :email_address => "merchant@example.org",
96
+ :merchant => {
87
97
  :type => "person",
88
98
  :name => "Billy Jones",
89
99
  :street_address => "801 High St.",
@@ -92,27 +102,34 @@ merchant = marketplace.create_merchant(
92
102
  :dob => "1842-01",
93
103
  :phone_number => "+16505551234",
94
104
  },
95
- bank_account.uri,
96
- "Jack Q Merchant",
105
+ :bank_account_uri => bank_account.uri,
106
+ :name => "Jack Q Merchant",
97
107
  )
98
108
 
99
109
  puts "oh our buyer is interested in buying something for 130.00$"
100
- another_debit = buyer.debit(13000, "MARKETPLACE.COM")
110
+ another_debit = buyer.debit(
111
+ :amount => 13000,
112
+ :appears_on_statement_as => "MARKETPLACE.COM"
113
+ )
101
114
 
102
115
  puts "lets credit our merchant 110.00$"
103
- credit = merchant.credit(11000, "Buyer purchased something on MARKETPLACE.COM")
116
+ credit = merchant.credit(
117
+ :amount => 11000,
118
+ :description => "Buyer purchased something on MARKETPLACE.COM"
119
+ )
104
120
 
105
121
  puts "lets assume the marketplace charges 15%, so it earned ~20"
106
- mp_credit = marketplace.owner_account.credit(2000, "Our commission from MARKETPLACE.COM")
122
+ mp_credit = marketplace.owner_account.credit(
123
+ :amount => 2000,
124
+ :description => "Our commission from MARKETPLACE.COM"
125
+ )
107
126
 
108
127
  puts "ok lets invalid a card"
109
- card['is_valid'] = false
110
- card.save
128
+ card.invalidate
111
129
 
112
130
  raise "This card is INCORRECTLY VALID" if card.is_valid
113
131
 
114
132
  puts "invalidating a bank account"
115
- bank_account['is_valid'] = false
116
- bank_account.save
133
+ bank_account.invalidate
117
134
 
118
135
  raise "This card is INCORRECTLY VALID" if bank_account.is_valid
@@ -13,6 +13,7 @@ module Balanced
13
13
  @client = nil
14
14
  @config = {
15
15
  :scheme => 'https',
16
+
16
17
  :host => 'api.balancedpayments.com',
17
18
  :port => 443,
18
19
  :version => '1',
@@ -27,6 +28,10 @@ module Balanced
27
28
  @client = Balanced::Client.new(api_key, @config.merge(options))
28
29
  end
29
30
 
31
+ def is_configured_with_api_key?
32
+ !@client.api_key.nil?
33
+ end
34
+
30
35
  def split_the_uri uri
31
36
  URI.parse(uri).path.sub(/\/$/, '').split('/')
32
37
  end
@@ -0,0 +1,152 @@
1
+ require "cgi"
2
+
3
+ module Balanced
4
+ class Pager
5
+ include Enumerable
6
+
7
+ # A pager for paginating through resource records.
8
+ def initialize uri, options = {}
9
+ @uri = uri
10
+ @options = options
11
+ @page = nil
12
+ @resource_class = nil
13
+ end
14
+
15
+ def resource_class
16
+ return @resource_class unless @resource_class.nil?
17
+ load! unless @page
18
+ @resource_class = Balanced.from_uri items.first[:uri]
19
+ end
20
+
21
+ def first
22
+ load! unless @page
23
+ items.first.nil? ? nil : resource_class.construct_from_response(items.first)
24
+ =begin
25
+ if items.first.nil?
26
+ return nil
27
+ end
28
+ resource_class.construct_from_response items.first
29
+ =end
30
+ end
31
+
32
+ def total
33
+ load! unless @page
34
+ @page[:total]
35
+ end
36
+
37
+ def limit
38
+ load! unless @page
39
+ @page[:limit]
40
+ end
41
+
42
+ def offset
43
+ load! unless @page
44
+ @page[:offset]
45
+ end
46
+
47
+ def items
48
+ load! unless @page
49
+ @page[:items]
50
+ end
51
+
52
+ # @return [Array] Iterates through the current page of records.
53
+ # @yield [record]
54
+ def each
55
+ return enum_for :each unless block_given?
56
+
57
+ load! unless @page
58
+
59
+ loop do
60
+ @page[:items].each do |record|
61
+ yield resource_class.construct_from_response record
62
+ end
63
+ break if @page[:next_uri].nil?
64
+ self.next
65
+ end
66
+
67
+ end
68
+
69
+ # @return [nil]
70
+ # @see Resource.find_each
71
+ # @yield [record]
72
+ def find_each
73
+ return enum_for :find_each unless block_given?
74
+ begin
75
+ each { |record| yield record }
76
+ end while self.next
77
+ end
78
+
79
+ # @return [Array, nil] Refreshes the pager's collection of records with
80
+ # the next page.
81
+ def next
82
+ load! unless @page
83
+ next_uri = @page[:next_uri]
84
+ load_from next_uri, nil unless next_uri.nil?
85
+ end
86
+
87
+ # @return [Array, nil] Refreshes the pager's collection of records with
88
+ # the previous page.
89
+ def prev
90
+ load! unless @page
91
+ prev_uri = @page[:prev_uri]
92
+ load_from prev_uri, nil unless prev_uri.nil?
93
+ end
94
+
95
+ # @return [Array, nil] Refreshes the pager's collection of records with
96
+ # the first page.
97
+ def start
98
+ load! unless @page
99
+ first_page = @page[:first_page]
100
+ load_from first_page, nil unless first_page.nil?
101
+ end
102
+
103
+ # @return [Array, nil] Load (or reload) the pager's collection from the
104
+ # original, supplied options.
105
+ def load!
106
+ load_from @uri, @options
107
+ end
108
+ alias reload load!
109
+
110
+ # @return [Pager] Duplicates the pager, updating it with the options
111
+ # supplied. Useful for resource scopes.
112
+ # @see #initialize
113
+ def paginate options = {}
114
+ dup.instance_eval {
115
+ @page = nil
116
+ @options.update options and self
117
+ }
118
+ end
119
+ alias scoped paginate
120
+ alias where paginate
121
+
122
+ def all options = {}
123
+ paginate(options).to_a
124
+ end
125
+
126
+ def find uri
127
+ if resource_class.respond_to? :find
128
+ raise NoMethodError,
129
+ "#find must be called on #{resource_class} directly"
130
+ end
131
+
132
+ resource_class.find uri
133
+ end
134
+
135
+
136
+ private
137
+
138
+ def load_from uri, params
139
+ parsed_uri = URI.parse(uri)
140
+
141
+ unless parsed_uri.query.nil?
142
+ params.merge! CGI::parse(parsed_uri.query)
143
+ parsed_uri.query = nil
144
+ end
145
+
146
+ response = Balanced.get parsed_uri.to_s, params
147
+ @page = Balanced::Utils.hash_with_indifferent_read_access response.body
148
+ @uri = @page[:uri]
149
+ end
150
+
151
+ end
152
+ end
@@ -10,7 +10,7 @@ module Balanced
10
10
  def initialize attributes = {}
11
11
  Balanced::Utils.stringify_keys! attributes
12
12
  unless attributes.has_key? 'uri'
13
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
13
+ attributes['uri'] = self.class.uri
14
14
  end
15
15
  super attributes
16
16
  end
@@ -21,33 +21,26 @@ module Balanced
21
21
  # @return [Account] if buyer is found
22
22
  # @return [nil] if buyer is not found
23
23
  def self.find_by_email email
24
- response = Balanced.get Balanced::Marketplace.my_marketplace.accounts_uri, {email_address: email}
25
- record = response.body["items"].first
26
- construct_from_response(record) unless record.nil?
27
- end
28
-
29
- def save
30
- the_response = super
31
- if response.status == 300
32
- raise MoreInformationRequiredError, response
33
- end
34
- the_response
24
+ self.find(:first, :email_address => email)
35
25
  end
36
26
 
37
27
  # Returns a new Debit that represents a flow of money from this
38
28
  # Account to your Marketplace's escrow account.
39
29
  #
40
30
  # @return [Debit]
41
- def debit (amount=nil,
42
- appears_on_statement_as=nil,
43
- hold_uri=nil,
44
- meta={},
45
- description=nil,
46
- source_uri=nil)
31
+ def debit *args
32
+ options = args.last.is_a?(Hash) ? args.pop : {}
33
+ amount = args[0] || options.fetch(:amount) { nil }
34
+ soft_descriptor = args[1] || options.fetch(:appears_on_statement_as) { nil }
35
+ hold_uri = args[2] || options.fetch(:hold_uri) { nil }
36
+ meta = args[3] || options.fetch(:meta) { nil }
37
+ description = args[4] || options.fetch(:description) { nil }
38
+ source_uri = args[5] || options.fetch(:source_uri) { nil }
39
+
47
40
  debit = Debit.new(
48
41
  :uri => self.debits_uri,
49
42
  :amount => amount,
50
- :appears_on_statement_as => appears_on_statement_as,
43
+ :appears_on_statement_as => soft_descriptor,
51
44
  :hold_uri => hold_uri,
52
45
  :meta => meta,
53
46
  :description => description,
@@ -65,7 +58,12 @@ module Balanced
65
58
  # added Card is used.
66
59
  # @return [Hold] A Hold representing the reservation of funds from
67
60
  # this Account to your Marketplace.
68
- def hold amount, meta={}, source_uri=nil
61
+ def hold *args
62
+ options = args.last.is_a?(Hash) ? args.pop : {}
63
+ amount = args[0] || options.fetch(:amount) { }
64
+ meta = args[1] || options.fetch(:meta) { nil }
65
+ source_uri = args[2] || options.fetch(:source_uri) { nil }
66
+
69
67
  hold = Hold.new(
70
68
  :uri => self.holds_uri,
71
69
  :amount => amount,
@@ -82,7 +80,13 @@ module Balanced
82
80
  # a BankAccount already associated with this account.
83
81
  # @return [Credit] A Credit representing the transfer of funds from
84
82
  # your Marketplace to this Account.
85
- def credit amount, description=nil, meta={}, destination_uri=nil
83
+ def credit *args
84
+ options = args.last.is_a?(Hash) ? args.pop : {}
85
+ amount = args[0] || options.fetch(:amount) { }
86
+ description = args[1] || options.fetch(:description) { nil }
87
+ meta = args[2] || options.fetch(:meta) { nil }
88
+ destination_uri = args[3] || options.fetch(:destination_uri) { nil }
89
+
86
90
  credit = Credit.new(
87
91
  :uri => self.credits_uri,
88
92
  :amount => amount,
@@ -12,7 +12,7 @@ module Balanced
12
12
  Balanced.configure nil
13
13
  super
14
14
  end
15
- def wut; end;
15
+
16
16
  end
17
17
 
18
18
  end
@@ -10,7 +10,7 @@ module Balanced
10
10
  def initialize attributes = {}
11
11
  Balanced::Utils.stringify_keys! attributes
12
12
  unless attributes.has_key? 'uri'
13
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
13
+ attributes['uri'] = self.class.uri
14
14
  end
15
15
  super attributes
16
16
  end
@@ -20,15 +20,32 @@ module Balanced
20
20
  # @param [String] appears_on_statement_as If nil then Balanced will use
21
21
  # the +domain_name+ property from your Marketplace.
22
22
  # @return [Debit]
23
- def debit amount, appears_on_statement_as=nil, meta={}, description=nil
24
- self.account.debit(amount, appears_on_statement_as, meta, description, self.uri)
23
+ def debit *args
24
+ options = args.last.is_a?(Hash) ? args.pop : {}
25
+ amount = args[0] || options.fetch(:amount) { nil }
26
+ soft_descriptor = args[1] || options.fetch(:appears_on_statement_as) { nil }
27
+ meta = args[2] || options.fetch(:meta) { nil }
28
+ description = args[3] || options.fetch(:description) { nil }
29
+
30
+ self.account.debit(amount, soft_descriptor, meta, description, self.uri)
25
31
  end
26
32
 
27
33
  # Creates a Credit of funds from your Marketplace's escrow account to this Account.
28
34
  #
29
35
  # @return [Credit]
30
- def credit amount, description=nil, meta={}
36
+ def credit *args
37
+ options = args.last.is_a?(Hash) ? args.pop : {}
38
+ amount = args[0] || options.fetch(:amount) { nil }
39
+ description = args[1] || options.fetch(:description) { nil }
40
+ meta = args[2] || options.fetch(:meta) { nil }
41
+
31
42
  self.account.credit(amount, description, meta, self.uri)
32
43
  end
44
+
45
+ def invalidate
46
+ self.is_valid = false
47
+ save
48
+ end
49
+
33
50
  end
34
51
  end
@@ -8,7 +8,7 @@ module Balanced
8
8
  def initialize attributes = {}
9
9
  Balanced::Utils.stringify_keys! attributes
10
10
  unless attributes.has_key? 'uri'
11
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
11
+ attributes['uri'] = self.class.uri
12
12
  end
13
13
  super attributes
14
14
  end
@@ -19,16 +19,33 @@ module Balanced
19
19
  # +domain_name+ property from your Marketplace.
20
20
  #
21
21
  # @return [Debit]
22
- def debit amount=nil, appears_on_statement_as=nil, holds_uri=nil, meta={}, description=nil
22
+ def debit *args
23
+ options = args.last.is_a?(Hash) ? args.pop : {}
24
+ amount = args[0] || options.fetch(:amount) { nil }
25
+ appears_on_statement_as = args[1] || options.fetch(:appears_on_statement_as) { nil }
26
+ holds_uri = args[2] || options.fetch(:holds_uri) { nil }
27
+ meta = args[3] || options.fetch(:meta) { nil }
28
+ description = args[3] || options.fetch(:description) { nil }
29
+
23
30
  self.account.debit(amount, appears_on_statement_as, holds_uri, meta, description, self.uri)
24
31
  end
25
32
 
26
33
  # Creates a Hold of funds from this Card to your Marketplace.
27
34
  #
28
35
  # @return [Hold]
29
- def hold amount=nil, meta=nil
36
+ def hold *args
37
+ options = args.last.is_a?(Hash) ? args.pop : {}
38
+ amount = args[0] || options.fetch(:amount) { nil }
39
+ meta = args[3] || options.fetch(:meta) { nil }
40
+
30
41
  self.account.hold(amount, meta, self.uri)
31
42
  end
43
+
44
+ def invalidate
45
+ self.is_valid = false
46
+ save
47
+ end
48
+
32
49
  end
33
50
 
34
51
  end
@@ -11,7 +11,7 @@ module Balanced
11
11
  def initialize attributes = {}
12
12
  Balanced::Utils.stringify_keys! attributes
13
13
  unless attributes.has_key? 'uri'
14
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
14
+ attributes['uri'] = self.class.uri
15
15
  end
16
16
  super attributes
17
17
  end
@@ -17,7 +17,7 @@ module Balanced
17
17
  def initialize attributes = {}
18
18
  Balanced::Utils.stringify_keys! attributes
19
19
  unless attributes.has_key? 'uri'
20
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
20
+ attributes['uri'] = self.class.uri
21
21
  end
22
22
  super attributes
23
23
  end
@@ -27,7 +27,11 @@ module Balanced
27
27
  # of the original Debit's amount.
28
28
  #
29
29
  # @return [Refund]
30
- def refund amount=nil, description=nil
30
+ def refund *args
31
+ options = args.last.is_a?(Hash) ? args.pop : {}
32
+ amount = args[0] || options.fetch(:amount) { nil }
33
+ description = args[1] || options.fetch(:description) { nil }
34
+
31
35
  refund = Refund.new(
32
36
  :uri => self.refunds_uri,
33
37
  :debit_uri => self.uri,
@@ -16,7 +16,7 @@ module Balanced
16
16
  def initialize attributes = {}
17
17
  Balanced::Utils.stringify_keys! attributes
18
18
  unless attributes.has_key? 'uri'
19
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
19
+ attributes['uri'] = self.class.uri
20
20
  end
21
21
  super attributes
22
22
  end
@@ -32,7 +32,13 @@ module Balanced
32
32
  # funds from the buyer's Account to your Marketplace.
33
33
  #
34
34
  # @return [Debit]
35
- def capture amount=nil, appears_on_statement_as=nil, meta={}, description=nil
35
+ def capture *args
36
+ options = args.last.is_a?(Hash) ? args.pop : {}
37
+ amount = args[0] || options.fetch(:amount) { nil }
38
+ appears_on_statement_as = args[1] || options.fetch(:appears_on_statement_as) { nil }
39
+ meta = args[2] || options.fetch(:meta) { nil }
40
+ description = args[3] || options.fetch(:description) { nil }
41
+
36
42
  amount ||= self.amount
37
43
  self.account.debit(amount, appears_on_statement_as, self.uri, meta, description)
38
44
  end
@@ -9,11 +9,7 @@ module Balanced
9
9
  #
10
10
  # @return [Marketplace]
11
11
  def self.my_marketplace
12
- # TODO: use query
13
- response = Balanced.get collection_path
14
- return nil if response.body.to_s.length.zero? or response.body['total'] == 0
15
- payload = response.body
16
- construct_from_response payload['items'][0]
12
+ Balanced::Merchant.me.marketplace
17
13
  end
18
14
 
19
15
  # Returns an instance representing the marketplace associated with
@@ -27,7 +23,13 @@ module Balanced
27
23
  # Create a buyer Account associated with this Marketplace.
28
24
  #
29
25
  # @return [Account]
30
- def create_buyer email_address, card_uri, name=nil, meta={}
26
+ def create_buyer *args
27
+ options = args.last.is_a?(Hash) ? args.pop : {}
28
+ email_address = args[0] || options.fetch(:email_address) { nil }
29
+ card_uri = args[1] || options.fetch(:card_uri) { nil }
30
+ name = args[2] || options.fetch(:name) { nil }
31
+ meta = args[3] || options.fetch(:meta) { nil }
32
+
31
33
  account = Account.new(
32
34
  :uri => self.accounts_uri,
33
35
  :email_address => email_address,
@@ -51,7 +53,14 @@ module Balanced
51
53
  # Account.create_merchant('bob@example.com', '/v1/TEST-MRxxxx')
52
54
  #
53
55
  # @return [Account]
54
- def create_merchant email_address, merchant, bank_account_uri=nil, name=nil, meta={}
56
+ def create_merchant *args
57
+ options = args.last.is_a?(Hash) ? args.pop : {}
58
+ email_address = args[0] || options.fetch(:email_address) { nil }
59
+ merchant = args[1] || options.fetch(:merchant) { nil }
60
+ bank_account_uri = args[2] || options.fetch(:bank_account_uri) { nil }
61
+ name = args[3] || options.fetch(:name) { nil }
62
+ meta = args[4] || options.fetch(:meta) { nil }
63
+
55
64
  account_attributes = {
56
65
  :uri => self.accounts_uri,
57
66
  :email_address => email_address,
@@ -6,11 +6,7 @@ module Balanced
6
6
  #
7
7
  # @return [Merchant]
8
8
  def self.me
9
- # TODO: use query
10
- response = Balanced.get collection_path
11
- return nil if response.body.to_s.length.zero? or response.body['total'] == 0
12
- payload = response.body
13
- construct_from_response payload['items'][0]
9
+ self.all.first
14
10
  end
15
11
 
16
12
  # Returns the Merchant associated with your Marketplace.
@@ -10,7 +10,7 @@ module Balanced
10
10
  def initialize attributes = {}
11
11
  Balanced::Utils.stringify_keys! attributes
12
12
  unless attributes.has_key? 'uri'
13
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
13
+ attributes['uri'] = self.class.uri
14
14
  end
15
15
  super attributes
16
16
  end
@@ -1,3 +1,6 @@
1
+ require_relative "../pager"
2
+
3
+
1
4
  module Balanced
2
5
  module Resource
3
6
  attr_accessor :attributes
@@ -8,8 +11,8 @@ module Balanced
8
11
 
9
12
  # delegate the query to the pager module
10
13
 
11
- def find uri
12
- self.class.find uri
14
+ def find *arguments
15
+ self.class.find *arguments
13
16
  end
14
17
 
15
18
  def save
@@ -80,6 +83,23 @@ module Balanced
80
83
  Utils.underscore resource_name
81
84
  end
82
85
 
86
+ def uri
87
+ # the uri of a particular resource depends if there's a marketplace created or not
88
+ # if there's a marketplace, then all resources have their own uri from there and the top level ones
89
+ # if there's not a marketplace
90
+ # if there's an api key, then the merchant is available
91
+ # if there's no api key, the only resources exposed are purely top level
92
+ if self == Balanced::Merchant or self == Balanced::Marketplace or self == Balanced::ApiKey
93
+ collection_path
94
+ else
95
+ if Balanced::Marketplace.my_marketplace.nil?
96
+ raise Balanced::Error, "#{self.name} is nested under a marketplace, which is not created or configured."
97
+ else
98
+ Balanced::Marketplace.my_marketplace.send(collection_name + '_uri')
99
+ end
100
+ end
101
+ end
102
+
83
103
  def construct_from_response payload
84
104
  payload = Balanced::Utils.hash_with_indifferent_read_access payload
85
105
  return payload if payload[:uri].nil?
@@ -102,9 +122,7 @@ module Balanced
102
122
  # if uri is a collection -> this would definitely be if it ends in a symbol
103
123
  # then we should allow a lazy executor of the query pager
104
124
  if Balanced.is_collection(value)
105
- # TODO: return the pager
106
- p "TODO: return the pager for this class: #{values_class}"
107
- values_class.new
125
+ values_class.all
108
126
  else
109
127
  values_class.find(value)
110
128
  end
@@ -122,14 +140,30 @@ module Balanced
122
140
  instance
123
141
  end
124
142
 
125
- def find uri
126
- response = Balanced.get uri
127
- construct_from_response response.body
143
+ def find *arguments
144
+ scope = arguments.slice!(0)
145
+ options = arguments.slice!(0) || {}
146
+ case scope
147
+ when :all then all(options)
148
+ when :first then paginate(options).first
149
+ else
150
+ response = Balanced.get scope, options
151
+ construct_from_response response.body
152
+ end
128
153
  end
129
154
 
130
- end
155
+ def paginate options = {}
156
+ Pager.new uri, options
157
+ end
158
+ alias scoped paginate
159
+ alias where paginate
131
160
 
161
+ def all options = {}
162
+ pager = paginate(options)
163
+ pager.to_a
164
+ end
132
165
 
166
+ end
133
167
 
134
168
  end
135
169
  end
@@ -8,7 +8,7 @@ module Balanced
8
8
  def initialize attributes = {}
9
9
  Balanced::Utils.stringify_keys! attributes
10
10
  unless attributes.has_key? 'uri'
11
- attributes['uri'] = Balanced::Marketplace.my_marketplace.send(self.class.collection_name + '_uri')
11
+ attributes['uri'] = self.class.uri
12
12
  end
13
13
  super attributes
14
14
  end
@@ -37,6 +37,13 @@ module Balanced
37
37
  base.each_pair do |key, value|
38
38
  if value.is_a? Hash
39
39
  value = hash_with_indifferent_read_access value
40
+ elsif value.respond_to? :each
41
+ value.map! do |v|
42
+ if v.is_a? Hash
43
+ v = hash_with_indifferent_read_access v
44
+ end
45
+ v
46
+ end
40
47
  end
41
48
  indifferent[key.to_s] = value
42
49
  end
@@ -1,3 +1,3 @@
1
1
  module Balanced
2
- VERSION = '0.3.4'
2
+ VERSION = '0.3.5'
3
3
  end
@@ -8,6 +8,38 @@ describe Balanced::Account do
8
8
  @marketplace = Balanced::Marketplace.new.save
9
9
  end
10
10
 
11
+ describe "Account.uri" do
12
+ use_vcr_cassette
13
+
14
+ context "when ApiKey is not configured" do
15
+ use_vcr_cassette
16
+ before do
17
+ Balanced.configure nil
18
+ end
19
+
20
+ it "throw an exception that it can not generate the URI" do
21
+ expect {
22
+ Balanced::Account.uri
23
+ }.to raise_error Balanced::Error
24
+ end
25
+ end
26
+
27
+ context "when ApiKey is configured" do
28
+ use_vcr_cassette
29
+ before do
30
+ api_key = Balanced::ApiKey.new.save
31
+ Balanced.configure api_key.secret
32
+ @marketplace = Balanced::Marketplace.new.save
33
+ end
34
+
35
+ it "it matches the resource's uri structure" do
36
+ uri = Balanced::Account.uri
37
+ uri.should_not be_nil
38
+ uri.should match ACCOUNTS_URI_REGEX
39
+ end
40
+ end
41
+ end
42
+
11
43
  describe "merchant" do
12
44
  use_vcr_cassette
13
45
 
@@ -207,7 +239,7 @@ describe Balanced::Account do
207
239
  describe "buyer" do
208
240
  describe "#save" do
209
241
  describe "when creating" do
210
- use_vcr_cassette
242
+ use_vcr_cassette :record => :new_episodes
211
243
  before do
212
244
  card = Balanced::Card.new(
213
245
  :card_number => "5105105105105100",
@@ -226,7 +258,7 @@ describe Balanced::Account do
226
258
 
227
259
  describe "after #save" do
228
260
  describe "attributes" do
229
- use_vcr_cassette
261
+ use_vcr_cassette :record => :new_episodes
230
262
  before do
231
263
  card = Balanced::Card.new(
232
264
  :card_number => "4111111111111111",
@@ -296,11 +328,16 @@ describe Balanced::Account do
296
328
  subject { @buyer.cards_uri }
297
329
  it { should match CARDS_URI_REGEX }
298
330
  end
331
+ describe "#cards" do
332
+ subject { @buyer.cards }
333
+ it { should be_instance_of Array }
334
+ it { should_not be_empty }
335
+ it { subject.first.should be_instance_of Balanced::Card }
336
+ end
299
337
  end
300
338
  end
301
339
  end
302
340
 
303
-
304
341
  describe "#add_card" do
305
342
 
306
343
  describe "when executing" do
@@ -418,10 +455,85 @@ describe Balanced::Account do
418
455
  end
419
456
 
420
457
  end
458
+
459
+ describe "#debit" do
460
+ use_vcr_cassette :match_requests_on => [:body], :record => :new_episodes
461
+ before do
462
+ card = Balanced::Card.new(
463
+ :card_number => "4111111111111111",
464
+ :expiration_month => "12",
465
+ :expiration_year => "2015",
466
+ ).save
467
+ begin
468
+ @buyer = Balanced::Account.new(
469
+ :uri => @marketplace.accounts_uri,
470
+ :email_address => "buyer7@example.org",
471
+ :card_uri => card.uri,
472
+ :name => "Jack Q Buyer"
473
+ ).save
474
+ rescue Balanced::Conflict => ex
475
+ @buyer = Balanced::Account.find(ex.extras[:account_uri])
476
+ end
477
+ end
478
+ it "takes optional parameters" do
479
+ debit = @buyer.debit(
480
+ :amount => 500,
481
+ :appears_on_statement_as => "BOBS BURGERS",
482
+ )
483
+ debit.should be_instance_of Balanced::Debit
484
+ debit.amount.should eql 500
485
+ debit.appears_on_statement_as.should eql "BOBS BURGERS"
486
+ end
487
+ it "takes positional parameters" do
488
+ debit = @buyer.debit(500, "FOO FIGHTER")
489
+ debit.should be_instance_of Balanced::Debit
490
+ debit.amount.should eql 500
491
+ debit.appears_on_statement_as.should eql "FOO FIGHTER"
492
+ end
493
+
494
+ end
421
495
  end
422
496
 
423
- describe ".find_by_email" do
497
+ describe ".find" do
424
498
  use_vcr_cassette
499
+
500
+ before do
501
+ api_key = Balanced::ApiKey.new.save
502
+ Balanced.configure api_key.secret
503
+ @marketplace = Balanced::Marketplace.new.save
504
+ card = Balanced::Card.new(
505
+ :card_number => "5105105105105100",
506
+ :expiration_month => "12",
507
+ :expiration_year => "2015",
508
+ ).save
509
+ Balanced::Marketplace.my_marketplace.create_buyer(
510
+ "john.doe@example.com",
511
+ card.uri
512
+ )
513
+ end
514
+
515
+ context "(:all, :some_field => 'op')" do
516
+ use_vcr_cassette
517
+ it "should find the account by returning a page with items of one" do
518
+ response = Balanced::Account.find(:all, :email_address => "john.doe@example.com")
519
+ response.should be_instance_of Array
520
+ response[0].should be_instance_of Balanced::Account
521
+ end
522
+ end
523
+
524
+ context "(:first, :some_field => 'op')" do
525
+ use_vcr_cassette
526
+ it "should find the account by returning the first item" do
527
+ response = Balanced::Account.find(:first, :email_address => "john.doe@example.com")
528
+ response.should be_instance_of Balanced::Account
529
+ end
530
+ end
531
+
532
+
533
+ end
534
+
535
+ describe ".find_by_email" do
536
+ use_vcr_cassette :record => :new_episodes
425
537
  before do
426
538
  api_key = Balanced::ApiKey.new.save
427
539
  Balanced.configure api_key.secret
@@ -438,14 +550,14 @@ describe Balanced::Account do
438
550
  end
439
551
 
440
552
  context "email address is in system" do
441
- use_vcr_cassette
553
+ use_vcr_cassette :record => :new_episodes
442
554
  it "should return account object" do
443
555
  Balanced::Account.find_by_email("john.doe@example.com").should be_instance_of Balanced::Account
444
556
  end
445
557
  end
446
558
 
447
559
  context "email address does not exist" do
448
- use_vcr_cassette
560
+ use_vcr_cassette :record => :new_episodes
449
561
  it "should return nil" do
450
562
  Balanced::Account.find_by_email("foo@bar.com").should be_nil
451
563
  end
@@ -20,6 +20,7 @@ RSpec.configure do |c|
20
20
  end
21
21
 
22
22
 
23
+ ACCOUNTS_URI_REGEX = /\/v1\/marketplaces\/TEST-\w*\/accounts/
23
24
  MERCHANT_URI_REGEX = /\/v1\/marketplaces\/TEST-\w*\/accounts\/\w*/
24
25
  HOLDS_URI_REGEX = /\/v1\/marketplaces\/TEST-\w*\/accounts\/\w*\/holds/
25
26
  BANK_ACCOUNTS_URI_REGEX = /\/v1\/marketplaces\/TEST-\w*\/accounts\/\w*\/bank_accounts/
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.3.4
4
+ version: 0.3.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: 2012-06-28 00:00:00.000000000 Z
12
+ date: 2012-07-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -77,6 +77,7 @@ files:
77
77
  - lib/balanced.rb
78
78
  - lib/balanced/client.rb
79
79
  - lib/balanced/error.rb
80
+ - lib/balanced/pager.rb
80
81
  - lib/balanced/resources.rb
81
82
  - lib/balanced/resources/account.rb
82
83
  - lib/balanced/resources/api_key.rb