braintree 2.1.0 → 2.2.0
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/lib/braintree.rb +2 -1
- data/lib/braintree/credit_card.rb +21 -14
- data/lib/braintree/customer.rb +19 -20
- data/lib/braintree/exceptions.rb +3 -0
- data/lib/braintree/resource_collection.rb +16 -36
- data/lib/braintree/subscription.rb +10 -5
- data/lib/braintree/subscription_search.rb +1 -0
- data/lib/braintree/transaction.rb +14 -26
- data/lib/braintree/transaction_search.rb +1 -0
- data/lib/braintree/util.rb +2 -0
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/xml/parser.rb +1 -1
- data/spec/integration/braintree/credit_card_spec.rb +40 -4
- data/spec/integration/braintree/customer_spec.rb +4 -4
- data/spec/integration/braintree/http_spec.rb +1 -1
- data/spec/integration/braintree/subscription_spec.rb +14 -1
- data/spec/integration/braintree/transaction_search_spec.rb +51 -68
- data/spec/integration/braintree/transaction_spec.rb +1 -1
- data/spec/unit/braintree/resource_collection_spec.rb +11 -59
- data/spec/unit/braintree/util_spec.rb +6 -0
- metadata +2 -2
data/lib/braintree.rb
CHANGED
@@ -66,25 +66,17 @@ module Braintree
|
|
66
66
|
|
67
67
|
# Returns a ResourceCollection of expired credit cards.
|
68
68
|
def self.expired(options = {})
|
69
|
-
|
70
|
-
response
|
71
|
-
attributes = response[:payment_methods]
|
72
|
-
attributes[:items] = Util.extract_attribute_as_array(attributes, :credit_card).map do |payment_method_attributes|
|
73
|
-
new payment_method_attributes
|
74
|
-
end
|
75
|
-
ResourceCollection.new(attributes) { |page_number| CreditCard.expired(:page => page_number) }
|
69
|
+
response = Http.post("/payment_methods/all/expired_ids")
|
70
|
+
ResourceCollection.new(response) { |ids| _fetch_expired(ids) }
|
76
71
|
end
|
77
72
|
|
78
73
|
# Returns a ResourceCollection of credit cards expiring between +start_date+ and +end_date+ inclusive.
|
79
74
|
# Only the month and year of the start and end dates are used.
|
80
75
|
def self.expiring_between(start_date, end_date, options = {})
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
new payment_method_attributes
|
86
|
-
end
|
87
|
-
ResourceCollection.new(attributes) { |page_number| CreditCard.expiring_between(start_date, end_date, :page => page_number) }
|
76
|
+
formatted_start_date = start_date.strftime('%m%Y')
|
77
|
+
formatted_end_date = end_date.strftime('%m%Y')
|
78
|
+
response = Http.post("/payment_methods/all/expiring_ids?start=#{formatted_start_date}&end=#{formatted_end_date}")
|
79
|
+
ResourceCollection.new(response) { |ids| _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) }
|
88
80
|
end
|
89
81
|
|
90
82
|
# Finds the credit card with the given +token+. Raises a NotFoundError if it cannot be found.
|
@@ -124,6 +116,21 @@ module Braintree
|
|
124
116
|
"#{Braintree::Configuration.base_merchant_url}/payment_methods/all/update_via_transparent_redirect_request"
|
125
117
|
end
|
126
118
|
|
119
|
+
def self._fetch_expired(ids)
|
120
|
+
response = Http.post("/payment_methods/all/expired", :search => {:ids => ids})
|
121
|
+
attributes = response[:payment_methods]
|
122
|
+
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| _new(attrs) }
|
123
|
+
end
|
124
|
+
|
125
|
+
def self._fetch_expiring_between(formatted_start_date, formatted_end_date, ids)
|
126
|
+
response = Http.post(
|
127
|
+
"/payment_methods/all/expiring?start=#{formatted_start_date}&end=#{formatted_end_date}",
|
128
|
+
:search => {:ids => ids}
|
129
|
+
)
|
130
|
+
attributes = response[:payment_methods]
|
131
|
+
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| _new(attrs) }
|
132
|
+
end
|
133
|
+
|
127
134
|
def initialize(attributes) # :nodoc:
|
128
135
|
_init attributes
|
129
136
|
@subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription._new(subscription_hash) }
|
data/lib/braintree/customer.rb
CHANGED
@@ -8,25 +8,21 @@ module Braintree
|
|
8
8
|
attr_reader :addresses, :company, :created_at, :credit_cards, :email, :fax, :first_name, :id, :last_name,
|
9
9
|
:phone, :updated_at, :website, :custom_fields
|
10
10
|
|
11
|
-
# Returns a ResourceCollection of all customers stored in the vault.
|
12
|
-
# may not reliably return all customers stored in the vault.
|
11
|
+
# Returns a ResourceCollection of all customers stored in the vault.
|
13
12
|
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
# puts "Customer #{customer.id} email is #{customer.email}"
|
18
|
-
# end
|
19
|
-
# break if page.last_page?
|
20
|
-
# page = page.next_page
|
13
|
+
# customers = Braintree::Customer.all
|
14
|
+
# customers.each do |customer|
|
15
|
+
# puts "Customer #{customer.id} email is #{customer.email}"
|
21
16
|
# end
|
22
|
-
def self.all
|
23
|
-
|
24
|
-
response
|
17
|
+
def self.all
|
18
|
+
response = Http.post "/customers/advanced_search_ids"
|
19
|
+
ResourceCollection.new(response) { |ids| _fetch_customers(ids) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def self._fetch_customers(ids)
|
23
|
+
response = Http.post "/customers/advanced_search", {:search => {:ids => ids}}
|
25
24
|
attributes = response[:customers]
|
26
|
-
|
27
|
-
new customer_attributes
|
28
|
-
end
|
29
|
-
ResourceCollection.new(attributes) { |page_number| Customer.all(:page => page_number) }
|
25
|
+
Util.extract_attribute_as_array(attributes, :customer).map { |attrs| _new(attrs) }
|
30
26
|
end
|
31
27
|
|
32
28
|
# Creates a customer using the given +attributes+. If <tt>:id</tt> is not passed,
|
@@ -100,13 +96,16 @@ module Braintree
|
|
100
96
|
|
101
97
|
# Returns a ResourceCollection of transactions for the customer with the given +customer_id+.
|
102
98
|
def self.transactions(customer_id, options = {})
|
103
|
-
|
104
|
-
response
|
99
|
+
response = Http.post "/customers/#{customer_id}/transaction_ids"
|
100
|
+
ResourceCollection.new(response) { |ids| _fetch_transactions(customer_id, ids) }
|
101
|
+
end
|
102
|
+
|
103
|
+
def self._fetch_transactions(customer_id, ids)
|
104
|
+
response = Http.post "/customers/#{customer_id}/transactions", :search => {:ids => ids}
|
105
105
|
attributes = response[:credit_card_transactions]
|
106
|
-
|
106
|
+
Util.extract_attribute_as_array(attributes, :transaction).map do |transaction_attributes|
|
107
107
|
Transaction._new transaction_attributes
|
108
108
|
end
|
109
|
-
ResourceCollection.new(attributes) { |page_number| Customer.transactions(customer_id, :page => page_number) }
|
110
109
|
end
|
111
110
|
|
112
111
|
def self.update(customer_id, attributes)
|
data/lib/braintree/exceptions.rb
CHANGED
@@ -38,6 +38,9 @@ module Braintree # :nodoc:
|
|
38
38
|
# This shouldn't happen.
|
39
39
|
class UnexpectedError < BraintreeError; end
|
40
40
|
|
41
|
+
# Raised when a client library that has been End of Life'd is being used.
|
42
|
+
class UpgradeRequiredError < BraintreeError; end
|
43
|
+
|
41
44
|
# Raised from bang methods when validations fail.
|
42
45
|
class ValidationsFailed < BraintreeError
|
43
46
|
attr_reader :error_result
|
@@ -1,55 +1,35 @@
|
|
1
1
|
module Braintree
|
2
2
|
class ResourceCollection
|
3
|
-
include BaseModule
|
4
3
|
include Enumerable
|
5
4
|
|
6
|
-
def initialize(
|
7
|
-
|
5
|
+
def initialize(response, &block) # :nodoc:
|
6
|
+
@ids = Util.extract_attribute_as_array(response[:search_results], :ids)
|
7
|
+
@page_size = response[:search_results][:page_size]
|
8
8
|
@paging_block = block
|
9
9
|
end
|
10
10
|
|
11
|
-
# Yields each item
|
11
|
+
# Yields each item
|
12
12
|
def each(&block)
|
13
|
-
@
|
14
|
-
|
15
|
-
|
13
|
+
@ids.each_slice(@page_size) do |page_of_ids|
|
14
|
+
resources = @paging_block.call(page_of_ids)
|
15
|
+
resources.each(&block)
|
16
|
+
end
|
16
17
|
end
|
17
18
|
|
18
19
|
def empty?
|
19
|
-
@
|
20
|
+
@ids.empty?
|
20
21
|
end
|
21
22
|
|
22
|
-
# Returns the first item
|
23
|
+
# Returns the first item in the collection or nil if the collection is empty
|
23
24
|
def first
|
24
|
-
@
|
25
|
-
end
|
26
|
-
|
27
|
-
# Returns true if the page is the last page. False otherwise.
|
28
|
-
def _last_page?
|
29
|
-
@current_page_number == _total_pages
|
30
|
-
end
|
31
|
-
|
32
|
-
# Retrieves the next page of records.
|
33
|
-
def _next_page
|
34
|
-
if _last_page?
|
35
|
-
return nil
|
36
|
-
end
|
37
|
-
@paging_block.call(@current_page_number + 1)
|
25
|
+
@paging_block.call([@ids.first]).first
|
38
26
|
end
|
39
27
|
|
40
|
-
#
|
41
|
-
#
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
# Returns the total number of pages.
|
47
|
-
def _total_pages
|
48
|
-
total = @total_items / @page_size
|
49
|
-
if @total_items % @page_size != 0
|
50
|
-
total += 1
|
51
|
-
end
|
52
|
-
total
|
28
|
+
# Only the maximum size of a resource collection can be determined since the data on the server can change while
|
29
|
+
# fetching blocks of results for iteration. For example, customers can be deleted while iterating, so the number
|
30
|
+
# of results iterated over may be less than the maximum_size. In general, this method should be avoided.
|
31
|
+
def maximum_size
|
32
|
+
@ids.size
|
53
33
|
end
|
54
34
|
end
|
55
35
|
end
|
@@ -97,14 +97,19 @@ module Braintree
|
|
97
97
|
# s.days_past_due.is "30"
|
98
98
|
# s.status.in [Subscription::Status::PastDue]
|
99
99
|
# end
|
100
|
-
def self.search(
|
100
|
+
def self.search(&block)
|
101
101
|
search = SubscriptionSearch.new
|
102
|
-
block.call(search)
|
102
|
+
block.call(search) if block
|
103
103
|
|
104
|
-
response = Http.post "/subscriptions/
|
104
|
+
response = Http.post "/subscriptions/advanced_search_ids", {:search => search.to_hash}
|
105
|
+
ResourceCollection.new(response) { |ids| _fetch_subscriptions(search, ids) }
|
106
|
+
end
|
107
|
+
|
108
|
+
def self._fetch_subscriptions(search, ids)
|
109
|
+
search.ids.in ids
|
110
|
+
response = Http.post "/subscriptions/advanced_search", {:search => search.to_hash}
|
105
111
|
attributes = response[:subscriptions]
|
106
|
-
|
107
|
-
ResourceCollection.new(attributes) { |page_number| Subscription.search(page_number, &block) }
|
112
|
+
Util.extract_attribute_as_array(attributes, :subscription).map { |attrs| _new(attrs) }
|
108
113
|
end
|
109
114
|
|
110
115
|
def self.update(subscription_id, attributes)
|
@@ -223,14 +223,13 @@ module Braintree
|
|
223
223
|
# Returns a ResourceCollection of transactions matching the search query.
|
224
224
|
# If <tt>query</tt> is a string, the search will be a basic search.
|
225
225
|
# If <tt>query</tt> is a hash, the search will be an advanced search.
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
end
|
226
|
+
# See: http://www.braintreepaymentsolutions.com/gateway/transaction-api#searching
|
227
|
+
def self.search(&block)
|
228
|
+
search = TransactionSearch.new
|
229
|
+
block.call(search) if block
|
230
|
+
|
231
|
+
response = Http.post "/transactions/advanced_search_ids", {:search => search.to_hash}
|
232
|
+
ResourceCollection.new(response) { |ids| _fetch_transactions(search, ids) }
|
234
233
|
end
|
235
234
|
|
236
235
|
# Submits transaction with +transaction_id+ for settlement.
|
@@ -395,28 +394,10 @@ module Braintree
|
|
395
394
|
end
|
396
395
|
end
|
397
396
|
|
398
|
-
def self._advanced_search(page, &block) # :nodoc:
|
399
|
-
search = TransactionSearch.new
|
400
|
-
block.call(search)
|
401
|
-
|
402
|
-
response = Http.post "/transactions/advanced_search?page=#{page}", {:search => search.to_hash}
|
403
|
-
attributes = response[:credit_card_transactions]
|
404
|
-
attributes[:items] = Util.extract_attribute_as_array(attributes, :transaction).map { |attrs| _new(attrs) }
|
405
|
-
|
406
|
-
ResourceCollection.new(attributes) { |page_number| Transaction.search(nil, page_number, &block) }
|
407
|
-
end
|
408
|
-
|
409
397
|
def self._attributes # :nodoc:
|
410
398
|
[:amount, :created_at, :credit_card_details, :customer_details, :id, :status, :type, :updated_at]
|
411
399
|
end
|
412
400
|
|
413
|
-
def self._basic_search(query, page) # :nodoc:
|
414
|
-
response = Http.get "/transactions/all/search?q=#{Util.url_encode(query)}&page=#{Util.url_encode(page)}"
|
415
|
-
attributes = response[:credit_card_transactions]
|
416
|
-
attributes[:items] = Util.extract_attribute_as_array(attributes, :transaction).map { |attrs| _new(attrs) }
|
417
|
-
ResourceCollection.new(attributes) { |page_number| Transaction.search(query, page_number) }
|
418
|
-
end
|
419
|
-
|
420
401
|
def self._create_signature # :nodoc:
|
421
402
|
[
|
422
403
|
:amount, :customer_id, :merchant_account_id, :order_id, :payment_method_token, :type,
|
@@ -429,6 +410,13 @@ module Braintree
|
|
429
410
|
]
|
430
411
|
end
|
431
412
|
|
413
|
+
def self._fetch_transactions(search, ids)
|
414
|
+
search.ids.in ids
|
415
|
+
response = Http.post "/transactions/advanced_search", {:search => search.to_hash}
|
416
|
+
attributes = response[:credit_card_transactions]
|
417
|
+
Util.extract_attribute_as_array(attributes, :transaction).map { |attrs| _new(attrs) }
|
418
|
+
end
|
419
|
+
|
432
420
|
def _init(attributes) # :nodoc:
|
433
421
|
set_instance_variables_from_hash(attributes)
|
434
422
|
@amount = Util.to_big_decimal(amount)
|
@@ -47,6 +47,7 @@ module Braintree
|
|
47
47
|
CreditCard::CustomerLocation::International,
|
48
48
|
CreditCard::CustomerLocation::US
|
49
49
|
]
|
50
|
+
multiple_value_field :ids
|
50
51
|
multiple_value_field :merchant_account_id
|
51
52
|
multiple_value_field :status, :allows => Transaction::Status::All
|
52
53
|
multiple_value_field :source, :allows => [
|
data/lib/braintree/util.rb
CHANGED
data/lib/braintree/version.rb
CHANGED
data/lib/braintree/xml/parser.rb
CHANGED
@@ -23,7 +23,7 @@ module Braintree
|
|
23
23
|
when 'Hash'
|
24
24
|
if value['type'] == 'array'
|
25
25
|
child_key, entries = value.detect { |k,v| k != 'type' } # child_key is throwaway
|
26
|
-
if entries.nil? || (c = value[CONTENT_ROOT] && c.
|
26
|
+
if entries.nil? || ((c = value[CONTENT_ROOT]) && c.strip.empty?)
|
27
27
|
[]
|
28
28
|
else
|
29
29
|
case entries.class.to_s # something weird with classes not matching here. maybe singleton methods breaking is_a?
|
@@ -518,7 +518,7 @@ describe Braintree::CreditCard do
|
|
518
518
|
updated_credit_card.last_4.should == Braintree::Test::CreditCardNumbers::MasterCard[-4..-1]
|
519
519
|
updated_credit_card.expiration_date.should == "06/2013"
|
520
520
|
updated_credit_card.cardholder_name.should == "New Holder"
|
521
|
-
updated_credit_card.updated_at.between?(Time.now -
|
521
|
+
updated_credit_card.updated_at.between?(Time.now - 60, Time.now).should == true
|
522
522
|
end
|
523
523
|
|
524
524
|
it "raises a ValidationsFailed if invalid" do
|
@@ -686,19 +686,55 @@ describe Braintree::CreditCard do
|
|
686
686
|
describe "self.expired" do
|
687
687
|
it "finds expired payment methods, paginated" do
|
688
688
|
collection = Braintree::CreditCard.expired
|
689
|
-
collection.
|
689
|
+
collection.maximum_size.should > 0
|
690
690
|
collection.all? { |pm| pm.expired?.should == true }
|
691
691
|
end
|
692
|
+
|
693
|
+
it "can iterate over all items" do
|
694
|
+
customer = Braintree::Customer.all.first
|
695
|
+
|
696
|
+
(110 - Braintree::CreditCard.expired.maximum_size).times do
|
697
|
+
Braintree::CreditCard.create!(
|
698
|
+
:customer_id => customer.id,
|
699
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
700
|
+
:expiration_date => "01/2010"
|
701
|
+
)
|
702
|
+
end
|
703
|
+
|
704
|
+
collection = Braintree::CreditCard.expired
|
705
|
+
collection.maximum_size.should > 100
|
706
|
+
|
707
|
+
credit_card_ids = collection.map {|c| c.token }.uniq.compact
|
708
|
+
credit_card_ids.size.should == collection.maximum_size
|
709
|
+
end
|
692
710
|
end
|
693
711
|
|
694
712
|
describe "self.expiring_between" do
|
695
713
|
it "finds payment methods expiring between the given dates" do
|
696
714
|
next_year = Time.now.year + 1
|
697
715
|
collection = Braintree::CreditCard.expiring_between(Time.mktime(next_year, 1), Time.mktime(next_year, 12))
|
698
|
-
collection.
|
716
|
+
collection.maximum_size.should > 0
|
699
717
|
collection.all? { |pm| pm.expired?.should == false }
|
700
718
|
collection.all? { |pm| pm.expiration_year.should == next_year.to_s }
|
701
719
|
end
|
720
|
+
|
721
|
+
it "can iterate over all items" do
|
722
|
+
customer = Braintree::Customer.all.first
|
723
|
+
|
724
|
+
(110 - Braintree::CreditCard.expiring_between(Time.mktime(2010, 1, 1), Time.mktime(2010,3, 1)).maximum_size).times do
|
725
|
+
Braintree::CreditCard.create!(
|
726
|
+
:customer_id => customer.id,
|
727
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
728
|
+
:expiration_date => "01/2010"
|
729
|
+
)
|
730
|
+
end
|
731
|
+
|
732
|
+
collection = Braintree::CreditCard.expiring_between(Time.mktime(2010, 1, 1), Time.mktime(2010,3, 1))
|
733
|
+
collection.maximum_size.should > 100
|
734
|
+
|
735
|
+
credit_card_ids = collection.map {|c| c.token }.uniq.compact
|
736
|
+
credit_card_ids.size.should == collection.maximum_size
|
737
|
+
end
|
702
738
|
end
|
703
739
|
|
704
740
|
describe "self.find" do
|
@@ -967,7 +1003,7 @@ describe Braintree::CreditCard do
|
|
967
1003
|
credit_card.last_4.should == Braintree::Test::CreditCardNumbers::MasterCard[-4..-1]
|
968
1004
|
credit_card.expiration_date.should == "06/2013"
|
969
1005
|
credit_card.cardholder_name.should == "New Holder"
|
970
|
-
credit_card.updated_at.between?(Time.now -
|
1006
|
+
credit_card.updated_at.between?(Time.now - 60, Time.now).should == true
|
971
1007
|
end
|
972
1008
|
|
973
1009
|
it "raises a ValidationsFailed if invalid" do
|
@@ -4,10 +4,10 @@ describe Braintree::Customer do
|
|
4
4
|
describe "self.all" do
|
5
5
|
it "gets more than a page of customers" do
|
6
6
|
customers = Braintree::Customer.all
|
7
|
-
customers.
|
7
|
+
customers.maximum_size.should > 100
|
8
8
|
|
9
9
|
customer_ids = customers.map {|c| c.id }.uniq.compact
|
10
|
-
customer_ids.size.should == customers.
|
10
|
+
customer_ids.size.should == customers.maximum_size
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -578,7 +578,7 @@ describe Braintree::Customer do
|
|
578
578
|
)
|
579
579
|
updated_customer.first_name.should == "Mr. Joe"
|
580
580
|
updated_customer.last_name.should == "Super Cool"
|
581
|
-
updated_customer.updated_at.between?(Time.now -
|
581
|
+
updated_customer.updated_at.between?(Time.now - 60, Time.now).should == true
|
582
582
|
end
|
583
583
|
|
584
584
|
it "raises an error if unsuccessful" do
|
@@ -630,7 +630,7 @@ describe Braintree::Customer do
|
|
630
630
|
).should == customer
|
631
631
|
customer.first_name.should == "Mr. Joe"
|
632
632
|
customer.last_name.should == "Super Cool"
|
633
|
-
customer.updated_at.between?(Time.now -
|
633
|
+
customer.updated_at.between?(Time.now - 60, Time.now).should == true
|
634
634
|
end
|
635
635
|
|
636
636
|
it "raises an error if unsuccessful" do
|
@@ -32,7 +32,7 @@ describe Braintree::Http do
|
|
32
32
|
Braintree::Configuration.logger.level = Logger::INFO
|
33
33
|
Braintree::Customer.all
|
34
34
|
utc_or_gmt = Time.now.utc.strftime("%Z")
|
35
|
-
output.string.should include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}]
|
35
|
+
output.string.should include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}] POST /customers/advanced_search_ids 200")
|
36
36
|
end
|
37
37
|
ensure
|
38
38
|
Braintree::Configuration.logger = old_logger
|
@@ -416,7 +416,7 @@ describe Braintree::Subscription do
|
|
416
416
|
search.plan_id.is "not_a_real_plan_id"
|
417
417
|
end
|
418
418
|
|
419
|
-
collection.
|
419
|
+
collection.maximum_size.should == 0
|
420
420
|
end
|
421
421
|
|
422
422
|
context "is statement" do
|
@@ -612,6 +612,19 @@ describe Braintree::Subscription do
|
|
612
612
|
end
|
613
613
|
end
|
614
614
|
end
|
615
|
+
|
616
|
+
it "returns multiple results" do
|
617
|
+
(110 - Braintree::Subscription.search.maximum_size).times do
|
618
|
+
Braintree::Subscription.create(:payment_method_token => @credit_card.token, :plan_id => TriallessPlan[:id])
|
619
|
+
end
|
620
|
+
|
621
|
+
collection = Braintree::Subscription.search
|
622
|
+
collection.maximum_size.should > 100
|
623
|
+
|
624
|
+
subscriptions_ids = collection.map {|t| t.id }.uniq.compact
|
625
|
+
subscriptions_ids.size.should == collection.maximum_size
|
626
|
+
end
|
627
|
+
|
615
628
|
end
|
616
629
|
|
617
630
|
describe "self.retry_charge" do
|
@@ -7,7 +7,7 @@ describe Braintree::Transaction, "search" do
|
|
7
7
|
search.billing_first_name.is "thisnameisnotreal"
|
8
8
|
end
|
9
9
|
|
10
|
-
collection.
|
10
|
+
collection.maximum_size.should == 0
|
11
11
|
end
|
12
12
|
|
13
13
|
it "returns one result for text field search" do
|
@@ -101,7 +101,7 @@ describe Braintree::Transaction, "search" do
|
|
101
101
|
search.id.is transaction.id
|
102
102
|
search.send(criterion).is value
|
103
103
|
end
|
104
|
-
collection.
|
104
|
+
collection.maximum_size.should == 1
|
105
105
|
collection.first.id.should == transaction.id
|
106
106
|
|
107
107
|
collection = Braintree::Transaction.search do |search|
|
@@ -198,7 +198,7 @@ describe Braintree::Transaction, "search" do
|
|
198
198
|
search.id.is transaction.id
|
199
199
|
end
|
200
200
|
|
201
|
-
collection.
|
201
|
+
collection.maximum_size.should == 1
|
202
202
|
collection.first.id.should == transaction.id
|
203
203
|
end
|
204
204
|
|
@@ -217,21 +217,21 @@ describe Braintree::Transaction, "search" do
|
|
217
217
|
search.created_using.is Braintree::Transaction::CreatedUsing::FullInformation
|
218
218
|
end
|
219
219
|
|
220
|
-
collection.
|
220
|
+
collection.maximum_size.should == 1
|
221
221
|
|
222
222
|
collection = Braintree::Transaction.search do |search|
|
223
223
|
search.id.is transaction.id
|
224
224
|
search.created_using.in Braintree::Transaction::CreatedUsing::FullInformation, Braintree::Transaction::CreatedUsing::Token
|
225
225
|
end
|
226
226
|
|
227
|
-
collection.
|
227
|
+
collection.maximum_size.should == 1
|
228
228
|
|
229
229
|
collection = Braintree::Transaction.search do |search|
|
230
230
|
search.id.is transaction.id
|
231
231
|
search.created_using.is Braintree::Transaction::CreatedUsing::Token
|
232
232
|
end
|
233
233
|
|
234
|
-
collection.
|
234
|
+
collection.maximum_size.should == 0
|
235
235
|
end
|
236
236
|
|
237
237
|
it "searches on credit_card_customer_location" do
|
@@ -248,21 +248,21 @@ describe Braintree::Transaction, "search" do
|
|
248
248
|
search.credit_card_customer_location.is Braintree::CreditCard::CustomerLocation::US
|
249
249
|
end
|
250
250
|
|
251
|
-
collection.
|
251
|
+
collection.maximum_size.should == 1
|
252
252
|
|
253
253
|
collection = Braintree::Transaction.search do |search|
|
254
254
|
search.id.is transaction.id
|
255
255
|
search.credit_card_customer_location.in Braintree::CreditCard::CustomerLocation::US, Braintree::CreditCard::CustomerLocation::International
|
256
256
|
end
|
257
257
|
|
258
|
-
collection.
|
258
|
+
collection.maximum_size.should == 1
|
259
259
|
|
260
260
|
collection = Braintree::Transaction.search do |search|
|
261
261
|
search.id.is transaction.id
|
262
262
|
search.credit_card_customer_location.is Braintree::CreditCard::CustomerLocation::International
|
263
263
|
end
|
264
264
|
|
265
|
-
collection.
|
265
|
+
collection.maximum_size.should == 0
|
266
266
|
end
|
267
267
|
|
268
268
|
it "searches on merchant_account_id" do
|
@@ -279,21 +279,21 @@ describe Braintree::Transaction, "search" do
|
|
279
279
|
search.merchant_account_id.is transaction.merchant_account_id
|
280
280
|
end
|
281
281
|
|
282
|
-
collection.
|
282
|
+
collection.maximum_size.should == 1
|
283
283
|
|
284
284
|
collection = Braintree::Transaction.search do |search|
|
285
285
|
search.id.is transaction.id
|
286
286
|
search.merchant_account_id.in transaction.merchant_account_id, "bogus_merchant_account_id"
|
287
287
|
end
|
288
288
|
|
289
|
-
collection.
|
289
|
+
collection.maximum_size.should == 1
|
290
290
|
|
291
291
|
collection = Braintree::Transaction.search do |search|
|
292
292
|
search.id.is transaction.id
|
293
293
|
search.merchant_account_id.is "bogus_merchant_account_id"
|
294
294
|
end
|
295
295
|
|
296
|
-
collection.
|
296
|
+
collection.maximum_size.should == 0
|
297
297
|
end
|
298
298
|
|
299
299
|
it "searches on credit_card_card_type" do
|
@@ -310,28 +310,28 @@ describe Braintree::Transaction, "search" do
|
|
310
310
|
search.credit_card_card_type.is Braintree::CreditCard::CardType::Visa
|
311
311
|
end
|
312
312
|
|
313
|
-
collection.
|
313
|
+
collection.maximum_size.should == 1
|
314
314
|
|
315
315
|
collection = Braintree::Transaction.search do |search|
|
316
316
|
search.id.is transaction.id
|
317
317
|
search.credit_card_card_type.is transaction.credit_card_details.card_type
|
318
318
|
end
|
319
319
|
|
320
|
-
collection.
|
320
|
+
collection.maximum_size.should == 1
|
321
321
|
|
322
322
|
collection = Braintree::Transaction.search do |search|
|
323
323
|
search.id.is transaction.id
|
324
324
|
search.credit_card_card_type.in Braintree::CreditCard::CardType::Visa, Braintree::CreditCard::CardType::MasterCard
|
325
325
|
end
|
326
326
|
|
327
|
-
collection.
|
327
|
+
collection.maximum_size.should == 1
|
328
328
|
|
329
329
|
collection = Braintree::Transaction.search do |search|
|
330
330
|
search.id.is transaction.id
|
331
331
|
search.credit_card_card_type.is Braintree::CreditCard::CardType::MasterCard
|
332
332
|
end
|
333
333
|
|
334
|
-
collection.
|
334
|
+
collection.maximum_size.should == 0
|
335
335
|
end
|
336
336
|
|
337
337
|
it "searches on status" do
|
@@ -348,21 +348,21 @@ describe Braintree::Transaction, "search" do
|
|
348
348
|
search.status.is Braintree::Transaction::Status::Authorized
|
349
349
|
end
|
350
350
|
|
351
|
-
collection.
|
351
|
+
collection.maximum_size.should == 1
|
352
352
|
|
353
353
|
collection = Braintree::Transaction.search do |search|
|
354
354
|
search.id.is transaction.id
|
355
355
|
search.status.in Braintree::Transaction::Status::Authorized, Braintree::Transaction::Status::ProcessorDeclined
|
356
356
|
end
|
357
357
|
|
358
|
-
collection.
|
358
|
+
collection.maximum_size.should == 1
|
359
359
|
|
360
360
|
collection = Braintree::Transaction.search do |search|
|
361
361
|
search.id.is transaction.id
|
362
362
|
search.status.is Braintree::Transaction::Status::ProcessorDeclined
|
363
363
|
end
|
364
364
|
|
365
|
-
collection.
|
365
|
+
collection.maximum_size.should == 0
|
366
366
|
end
|
367
367
|
|
368
368
|
it "searches on source" do
|
@@ -379,21 +379,21 @@ describe Braintree::Transaction, "search" do
|
|
379
379
|
search.source.is Braintree::Transaction::Source::Api
|
380
380
|
end
|
381
381
|
|
382
|
-
collection.
|
382
|
+
collection.maximum_size.should == 1
|
383
383
|
|
384
384
|
collection = Braintree::Transaction.search do |search|
|
385
385
|
search.id.is transaction.id
|
386
386
|
search.source.in Braintree::Transaction::Source::Api, Braintree::Transaction::Source::ControlPanel
|
387
387
|
end
|
388
388
|
|
389
|
-
collection.
|
389
|
+
collection.maximum_size.should == 1
|
390
390
|
|
391
391
|
collection = Braintree::Transaction.search do |search|
|
392
392
|
search.id.is transaction.id
|
393
393
|
search.source.is Braintree::Transaction::Source::ControlPanel
|
394
394
|
end
|
395
395
|
|
396
|
-
collection.
|
396
|
+
collection.maximum_size.should == 0
|
397
397
|
end
|
398
398
|
|
399
399
|
it "searches on type" do
|
@@ -425,7 +425,7 @@ describe Braintree::Transaction, "search" do
|
|
425
425
|
search.type.is Braintree::Transaction::Type::Credit
|
426
426
|
end
|
427
427
|
|
428
|
-
collection.
|
428
|
+
collection.maximum_size.should == 2
|
429
429
|
|
430
430
|
collection = Braintree::Transaction.search do |search|
|
431
431
|
search.credit_card_cardholder_name.is cardholder_name
|
@@ -433,7 +433,7 @@ describe Braintree::Transaction, "search" do
|
|
433
433
|
search.refund.is true
|
434
434
|
end
|
435
435
|
|
436
|
-
collection.
|
436
|
+
collection.maximum_size.should == 1
|
437
437
|
collection.first.id.should == refund_transaction.id
|
438
438
|
|
439
439
|
collection = Braintree::Transaction.search do |search|
|
@@ -442,7 +442,7 @@ describe Braintree::Transaction, "search" do
|
|
442
442
|
search.refund.is false
|
443
443
|
end
|
444
444
|
|
445
|
-
collection.
|
445
|
+
collection.maximum_size.should == 1
|
446
446
|
collection.first.id.should == credit_transaction.id
|
447
447
|
end
|
448
448
|
end
|
@@ -463,7 +463,7 @@ describe Braintree::Transaction, "search" do
|
|
463
463
|
search.amount.between "500.00", "1500.00"
|
464
464
|
end
|
465
465
|
|
466
|
-
collection.
|
466
|
+
collection.maximum_size.should == 1
|
467
467
|
collection.first.id.should == transaction.id
|
468
468
|
|
469
469
|
collection = Braintree::Transaction.search do |search|
|
@@ -471,7 +471,7 @@ describe Braintree::Transaction, "search" do
|
|
471
471
|
search.amount >= "500.00"
|
472
472
|
end
|
473
473
|
|
474
|
-
collection.
|
474
|
+
collection.maximum_size.should == 1
|
475
475
|
collection.first.id.should == transaction.id
|
476
476
|
|
477
477
|
collection = Braintree::Transaction.search do |search|
|
@@ -479,7 +479,7 @@ describe Braintree::Transaction, "search" do
|
|
479
479
|
search.amount <= "1500.00"
|
480
480
|
end
|
481
481
|
|
482
|
-
collection.
|
482
|
+
collection.maximum_size.should == 1
|
483
483
|
collection.first.id.should == transaction.id
|
484
484
|
|
485
485
|
collection = Braintree::Transaction.search do |search|
|
@@ -487,7 +487,7 @@ describe Braintree::Transaction, "search" do
|
|
487
487
|
search.amount.between "500.00", "900.00"
|
488
488
|
end
|
489
489
|
|
490
|
-
collection.
|
490
|
+
collection.maximum_size.should == 0
|
491
491
|
end
|
492
492
|
|
493
493
|
it "can also take BigDecimal for amount" do
|
@@ -504,7 +504,7 @@ describe Braintree::Transaction, "search" do
|
|
504
504
|
search.amount <= BigDecimal.new("1000.00")
|
505
505
|
end
|
506
506
|
|
507
|
-
collection.
|
507
|
+
collection.maximum_size.should == 1
|
508
508
|
end
|
509
509
|
end
|
510
510
|
|
@@ -528,7 +528,7 @@ describe Braintree::Transaction, "search" do
|
|
528
528
|
)
|
529
529
|
end
|
530
530
|
|
531
|
-
collection.
|
531
|
+
collection.maximum_size.should == 1
|
532
532
|
collection.first.id.should == transaction.id
|
533
533
|
|
534
534
|
collection = Braintree::Transaction.search do |search|
|
@@ -536,7 +536,7 @@ describe Braintree::Transaction, "search" do
|
|
536
536
|
search.created_at >= created_at - 1
|
537
537
|
end
|
538
538
|
|
539
|
-
collection.
|
539
|
+
collection.maximum_size.should == 1
|
540
540
|
collection.first.id.should == transaction.id
|
541
541
|
|
542
542
|
collection = Braintree::Transaction.search do |search|
|
@@ -544,7 +544,7 @@ describe Braintree::Transaction, "search" do
|
|
544
544
|
search.created_at <= created_at + 1
|
545
545
|
end
|
546
546
|
|
547
|
-
collection.
|
547
|
+
collection.maximum_size.should == 1
|
548
548
|
collection.first.id.should == transaction.id
|
549
549
|
|
550
550
|
collection = Braintree::Transaction.search do |search|
|
@@ -555,7 +555,7 @@ describe Braintree::Transaction, "search" do
|
|
555
555
|
)
|
556
556
|
end
|
557
557
|
|
558
|
-
collection.
|
558
|
+
collection.maximum_size.should == 0
|
559
559
|
end
|
560
560
|
|
561
561
|
it "searches on created_at in local time" do
|
@@ -577,7 +577,7 @@ describe Braintree::Transaction, "search" do
|
|
577
577
|
)
|
578
578
|
end
|
579
579
|
|
580
|
-
collection.
|
580
|
+
collection.maximum_size.should == 1
|
581
581
|
collection.first.id.should == transaction.id
|
582
582
|
|
583
583
|
collection = Braintree::Transaction.search do |search|
|
@@ -585,7 +585,7 @@ describe Braintree::Transaction, "search" do
|
|
585
585
|
search.created_at >= now - 60
|
586
586
|
end
|
587
587
|
|
588
|
-
collection.
|
588
|
+
collection.maximum_size.should == 1
|
589
589
|
collection.first.id.should == transaction.id
|
590
590
|
|
591
591
|
collection = Braintree::Transaction.search do |search|
|
@@ -593,7 +593,7 @@ describe Braintree::Transaction, "search" do
|
|
593
593
|
search.created_at <= now + 60
|
594
594
|
end
|
595
595
|
|
596
|
-
collection.
|
596
|
+
collection.maximum_size.should == 1
|
597
597
|
collection.first.id.should == transaction.id
|
598
598
|
|
599
599
|
collection = Braintree::Transaction.search do |search|
|
@@ -604,18 +604,16 @@ describe Braintree::Transaction, "search" do
|
|
604
604
|
)
|
605
605
|
end
|
606
606
|
|
607
|
-
collection.
|
607
|
+
collection.maximum_size.should == 0
|
608
608
|
end
|
609
609
|
end
|
610
610
|
|
611
611
|
it "returns multiple results" do
|
612
|
-
collection = Braintree::Transaction.search
|
613
|
-
|
614
|
-
end
|
615
|
-
collection._approximate_size.should > 100
|
612
|
+
collection = Braintree::Transaction.search
|
613
|
+
collection.maximum_size.should > 100
|
616
614
|
|
617
615
|
transaction_ids = collection.map {|t| t.id }.uniq.compact
|
618
|
-
transaction_ids.size.should == collection.
|
616
|
+
transaction_ids.size.should == collection.maximum_size
|
619
617
|
end
|
620
618
|
|
621
619
|
context "text node operations" do
|
@@ -636,7 +634,7 @@ describe Braintree::Transaction, "search" do
|
|
636
634
|
search.credit_card_cardholder_name.is "Tom Smith"
|
637
635
|
end
|
638
636
|
|
639
|
-
collection.
|
637
|
+
collection.maximum_size.should == 1
|
640
638
|
collection.first.id.should == @transaction.id
|
641
639
|
|
642
640
|
collection = Braintree::Transaction.search do |search|
|
@@ -644,7 +642,7 @@ describe Braintree::Transaction, "search" do
|
|
644
642
|
search.credit_card_cardholder_name.is "Invalid"
|
645
643
|
end
|
646
644
|
|
647
|
-
collection.
|
645
|
+
collection.maximum_size.should == 0
|
648
646
|
end
|
649
647
|
|
650
648
|
it "is_not" do
|
@@ -653,7 +651,7 @@ describe Braintree::Transaction, "search" do
|
|
653
651
|
search.credit_card_cardholder_name.is_not "Anybody Else"
|
654
652
|
end
|
655
653
|
|
656
|
-
collection.
|
654
|
+
collection.maximum_size.should == 1
|
657
655
|
collection.first.id.should == @transaction.id
|
658
656
|
|
659
657
|
collection = Braintree::Transaction.search do |search|
|
@@ -661,7 +659,7 @@ describe Braintree::Transaction, "search" do
|
|
661
659
|
search.credit_card_cardholder_name.is_not "Tom Smith"
|
662
660
|
end
|
663
661
|
|
664
|
-
collection.
|
662
|
+
collection.maximum_size.should == 0
|
665
663
|
end
|
666
664
|
|
667
665
|
it "ends_with" do
|
@@ -670,7 +668,7 @@ describe Braintree::Transaction, "search" do
|
|
670
668
|
search.credit_card_cardholder_name.ends_with "m Smith"
|
671
669
|
end
|
672
670
|
|
673
|
-
collection.
|
671
|
+
collection.maximum_size.should == 1
|
674
672
|
collection.first.id.should == @transaction.id
|
675
673
|
|
676
674
|
collection = Braintree::Transaction.search do |search|
|
@@ -678,7 +676,7 @@ describe Braintree::Transaction, "search" do
|
|
678
676
|
search.credit_card_cardholder_name.ends_with "Tom S"
|
679
677
|
end
|
680
678
|
|
681
|
-
collection.
|
679
|
+
collection.maximum_size.should == 0
|
682
680
|
end
|
683
681
|
|
684
682
|
it "starts_with" do
|
@@ -687,7 +685,7 @@ describe Braintree::Transaction, "search" do
|
|
687
685
|
search.credit_card_cardholder_name.starts_with "Tom S"
|
688
686
|
end
|
689
687
|
|
690
|
-
collection.
|
688
|
+
collection.maximum_size.should == 1
|
691
689
|
collection.first.id.should == @transaction.id
|
692
690
|
|
693
691
|
collection = Braintree::Transaction.search do |search|
|
@@ -695,7 +693,7 @@ describe Braintree::Transaction, "search" do
|
|
695
693
|
search.credit_card_cardholder_name.starts_with "m Smith"
|
696
694
|
end
|
697
695
|
|
698
|
-
collection.
|
696
|
+
collection.maximum_size.should == 0
|
699
697
|
end
|
700
698
|
|
701
699
|
it "contains" do
|
@@ -704,7 +702,7 @@ describe Braintree::Transaction, "search" do
|
|
704
702
|
search.credit_card_cardholder_name.contains "m Sm"
|
705
703
|
end
|
706
704
|
|
707
|
-
collection.
|
705
|
+
collection.maximum_size.should == 1
|
708
706
|
collection.first.id.should == @transaction.id
|
709
707
|
|
710
708
|
collection = Braintree::Transaction.search do |search|
|
@@ -712,23 +710,8 @@ describe Braintree::Transaction, "search" do
|
|
712
710
|
search.credit_card_cardholder_name.contains "Anybody Else"
|
713
711
|
end
|
714
712
|
|
715
|
-
collection.
|
713
|
+
collection.maximum_size.should == 0
|
716
714
|
end
|
717
715
|
end
|
718
716
|
end
|
719
|
-
|
720
|
-
context "basic" do
|
721
|
-
it "returns transactions matching the given search terms" do
|
722
|
-
transactions = Braintree::Transaction.search "1111"
|
723
|
-
transactions._approximate_size.should > 0
|
724
|
-
end
|
725
|
-
|
726
|
-
it "can iterate over the entire collection" do
|
727
|
-
transactions = Braintree::Transaction.search "411111"
|
728
|
-
transactions._approximate_size.should > 100
|
729
|
-
|
730
|
-
transaction_ids = transactions.map {|t| t.id }.uniq.compact
|
731
|
-
transaction_ids.size.should == transactions._approximate_size
|
732
|
-
end
|
733
|
-
end
|
734
717
|
end
|
@@ -636,7 +636,7 @@ describe Braintree::Transaction do
|
|
636
636
|
result.success?.should == true
|
637
637
|
result.transaction.amount.should == BigDecimal.new("999.99")
|
638
638
|
result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
639
|
-
result.transaction.updated_at.between?(Time.now -
|
639
|
+
result.transaction.updated_at.between?(Time.now - 60, Time.now).should == true
|
640
640
|
end
|
641
641
|
|
642
642
|
it "returns an error result if settlement is too large" do
|
@@ -1,68 +1,20 @@
|
|
1
1
|
require File.dirname(__FILE__) + "/../spec_helper"
|
2
2
|
|
3
3
|
describe "Braintree::ResourceCollection" do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
describe "each" do
|
10
|
-
it "iterates over the contents" do
|
11
|
-
expected = ["apples", "bananas", "cherries"]
|
12
|
-
collection = Braintree::ResourceCollection.new(
|
13
|
-
:current_page_number => 1,
|
14
|
-
:items => expected,
|
15
|
-
:page_size => 5,
|
16
|
-
:total_items => expected.size
|
17
|
-
)
|
18
|
-
actual = []
|
19
|
-
collection.each do |item|
|
20
|
-
actual << item
|
4
|
+
describe "enumeration" do
|
5
|
+
it "iterates over the elements, yielding to the block in pages" do
|
6
|
+
values = %w(a b c d e)
|
7
|
+
collection = Braintree::ResourceCollection.new(:search_results => {:ids => [0,1,2,3,4], :page_size => 2}) do |ids|
|
8
|
+
ids.map {|id| values[id] }
|
21
9
|
end
|
22
|
-
actual.should == expected
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "empty?" do
|
27
|
-
it "returns true if there are no items" do
|
28
|
-
collection = Braintree::ResourceCollection.new(
|
29
|
-
:current_page_number => 1,
|
30
|
-
:items => [],
|
31
|
-
:page_size => 5,
|
32
|
-
:total_items => 0
|
33
|
-
)
|
34
|
-
collection.should be_empty
|
35
|
-
end
|
36
|
-
|
37
|
-
it "returns false if there are items" do
|
38
|
-
collection = Braintree::ResourceCollection.new(
|
39
|
-
:current_page_number => 1,
|
40
|
-
:items => ["one"],
|
41
|
-
:page_size => 5,
|
42
|
-
:total_items => 1
|
43
|
-
)
|
44
|
-
collection.should_not be_empty
|
45
|
-
end
|
46
|
-
end
|
47
10
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
collection.first.should == "apples"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "_last_page?" do
|
58
|
-
it "returns true if the page is the last page" do
|
59
|
-
collection = Braintree::ResourceCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 150)
|
60
|
-
collection._last_page?.should == true
|
61
|
-
end
|
11
|
+
count = 0
|
12
|
+
collection.each_with_index do |item, index|
|
13
|
+
item.should == values[index]
|
14
|
+
count += 1
|
15
|
+
end
|
62
16
|
|
63
|
-
|
64
|
-
collection = Braintree::ResourceCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 151)
|
65
|
-
collection._last_page?.should == false
|
17
|
+
count.should == 5
|
66
18
|
end
|
67
19
|
end
|
68
20
|
end
|
@@ -183,6 +183,12 @@ describe Braintree::Util do
|
|
183
183
|
end.to raise_error(Braintree::AuthorizationError)
|
184
184
|
end
|
185
185
|
|
186
|
+
it "raises an UpgradeRequired if the client library is EOL'd" do
|
187
|
+
expect do
|
188
|
+
Braintree::Util.raise_exception_for_status_code(426)
|
189
|
+
end.to raise_error(Braintree::UpgradeRequiredError, "Please upgrade your client library.")
|
190
|
+
end
|
191
|
+
|
186
192
|
it "raises a ServerError if the server 500's" do
|
187
193
|
expect do
|
188
194
|
Braintree::Util.raise_exception_for_status_code(500)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: braintree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Braintree Payment Solutions
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-05-
|
12
|
+
date: 2010-05-17 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|