braintree 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|