braintree 2.4.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +4 -0
- data/lib/braintree.rb +43 -32
- data/lib/braintree/add_on.rb +4 -0
- data/lib/braintree/address.rb +18 -72
- data/lib/braintree/address_gateway.rb +76 -0
- data/lib/braintree/advanced_search.rb +31 -13
- data/lib/braintree/base_module.rb +6 -0
- data/lib/braintree/configuration.rb +57 -39
- data/lib/braintree/credit_card.rb +75 -129
- data/lib/braintree/credit_card_gateway.rb +133 -0
- data/lib/braintree/credit_card_verification.rb +8 -0
- data/lib/braintree/customer.rb +70 -123
- data/lib/braintree/customer_gateway.rb +121 -0
- data/lib/braintree/digest.rb +2 -2
- data/lib/braintree/discount.rb +4 -0
- data/lib/braintree/error_codes.rb +50 -5
- data/lib/braintree/error_result.rb +4 -18
- data/lib/braintree/errors.rb +1 -2
- data/lib/braintree/exceptions.rb +11 -16
- data/lib/braintree/gateway.rb +39 -0
- data/lib/braintree/http.rb +30 -26
- data/lib/braintree/modification.rb +23 -0
- data/lib/braintree/resource_collection.rb +1 -1
- data/lib/braintree/subscription.rb +29 -129
- data/lib/braintree/subscription_gateway.rb +122 -0
- data/lib/braintree/subscription_search.rb +6 -7
- data/lib/braintree/successful_result.rb +1 -12
- data/lib/braintree/test/credit_card_numbers.rb +4 -2
- data/lib/braintree/test/transaction_amounts.rb +3 -0
- data/lib/braintree/transaction.rb +83 -243
- data/lib/braintree/transaction/credit_card_details.rb +4 -4
- data/lib/braintree/transaction_gateway.rb +124 -0
- data/lib/braintree/transaction_search.rb +5 -3
- data/lib/braintree/transparent_redirect.rb +19 -112
- data/lib/braintree/transparent_redirect_gateway.rb +105 -0
- data/lib/braintree/util.rb +4 -0
- data/lib/braintree/validation_error.rb +1 -0
- data/lib/braintree/validation_error_collection.rb +5 -23
- data/lib/braintree/version.rb +2 -2
- data/lib/braintree/xml/parser.rb +1 -1
- data/lib/braintree/xml/rexml.rb +2 -2
- data/spec/integration/braintree/advanced_search_spec.rb +532 -0
- data/spec/integration/braintree/credit_card_spec.rb +5 -8
- data/spec/integration/braintree/http_spec.rb +53 -39
- data/spec/integration/braintree/subscription_spec.rb +678 -213
- data/spec/integration/braintree/transaction_search_spec.rb +318 -43
- data/spec/integration/braintree/transaction_spec.rb +134 -3
- data/spec/integration/braintree/transparent_redirect_spec.rb +1 -1
- data/spec/spec_helper.rb +55 -4
- data/spec/unit/braintree/address_spec.rb +8 -8
- data/spec/unit/braintree/base_module_spec.rb +1 -1
- data/spec/unit/braintree/configuration_spec.rb +34 -29
- data/spec/unit/braintree/credit_card_spec.rb +14 -12
- data/spec/unit/braintree/credit_card_verification_spec.rb +16 -0
- data/spec/unit/braintree/customer_spec.rb +10 -8
- data/spec/unit/braintree/digest_spec.rb +8 -17
- data/spec/unit/braintree/error_result_spec.rb +12 -2
- data/spec/unit/braintree/http_spec.rb +2 -2
- data/spec/unit/braintree/subscription_search_spec.rb +77 -0
- data/spec/unit/braintree/subscription_spec.rb +16 -8
- data/spec/unit/braintree/transaction_spec.rb +17 -12
- data/spec/unit/braintree/transparent_redirect_spec.rb +12 -12
- data/spec/unit/braintree/util_spec.rb +24 -0
- data/spec/unit/braintree/xml/parser_spec.rb +1 -1
- data/spec/unit/braintree_spec.rb +1 -1
- metadata +16 -5
data/README.rdoc
CHANGED
@@ -65,6 +65,10 @@ Example of using bang method:
|
|
65
65
|
We recommend using the bang methods when you assume that the data is valid and do not expect validations to fail.
|
66
66
|
Otherwise, we recommend using the non-bang methods.
|
67
67
|
|
68
|
+
== More Information
|
69
|
+
|
70
|
+
* Documentation[http://www.braintreepaymentsolutions.com/docs/ruby]
|
71
|
+
|
68
72
|
== Tests
|
69
73
|
|
70
74
|
The unit specs can be run by anyone on any system, but the integration specs are meant to be run against a local development
|
data/lib/braintree.rb
CHANGED
@@ -3,6 +3,7 @@ require "cgi"
|
|
3
3
|
require "date"
|
4
4
|
require "digest/sha1"
|
5
5
|
require "enumerator"
|
6
|
+
require "forwardable"
|
6
7
|
require "logger"
|
7
8
|
require "net/http"
|
8
9
|
require "net/https"
|
@@ -18,41 +19,51 @@ end
|
|
18
19
|
|
19
20
|
require "braintree/exceptions"
|
20
21
|
require "braintree/base_module"
|
22
|
+
require "braintree/modification"
|
21
23
|
|
22
|
-
require "braintree/
|
23
|
-
require "braintree/
|
24
|
-
require "braintree/
|
25
|
-
require "braintree/
|
26
|
-
require "braintree/
|
27
|
-
require "braintree/
|
28
|
-
require "braintree/
|
29
|
-
require "braintree/
|
30
|
-
require "braintree/
|
31
|
-
require "braintree/
|
32
|
-
require "braintree/
|
33
|
-
require "braintree/
|
34
|
-
require "braintree/
|
24
|
+
require "braintree/add_on"
|
25
|
+
require "braintree/address"
|
26
|
+
require "braintree/address_gateway"
|
27
|
+
require "braintree/advanced_search"
|
28
|
+
require "braintree/configuration"
|
29
|
+
require "braintree/credit_card"
|
30
|
+
require "braintree/credit_card_gateway"
|
31
|
+
require "braintree/credit_card_verification"
|
32
|
+
require "braintree/customer"
|
33
|
+
require "braintree/customer_gateway"
|
34
|
+
require "braintree/digest"
|
35
|
+
require "braintree/discount"
|
36
|
+
require "braintree/error_codes"
|
37
|
+
require "braintree/error_result"
|
38
|
+
require "braintree/errors"
|
39
|
+
require "braintree/gateway"
|
40
|
+
require "braintree/http"
|
41
|
+
require "braintree/resource_collection"
|
42
|
+
require "braintree/ssl_expiration_check"
|
35
43
|
require "braintree/subscription"
|
44
|
+
require "braintree/subscription_gateway"
|
36
45
|
require "braintree/subscription_search"
|
37
|
-
require "braintree/successful_result
|
38
|
-
require "braintree/test/credit_card_numbers
|
39
|
-
require "braintree/test/transaction_amounts
|
40
|
-
require "braintree/transaction
|
41
|
-
require "braintree/
|
42
|
-
require "braintree/transaction/
|
43
|
-
require "braintree/transaction/
|
44
|
-
require "braintree/
|
45
|
-
require "braintree/
|
46
|
-
require "braintree/
|
47
|
-
require "braintree/
|
48
|
-
require "braintree/
|
49
|
-
require "braintree/
|
50
|
-
require "braintree/
|
51
|
-
require "braintree/
|
52
|
-
require "braintree/
|
53
|
-
require "braintree/xml
|
54
|
-
require "braintree/xml/
|
55
|
-
require "braintree/xml/
|
46
|
+
require "braintree/successful_result"
|
47
|
+
require "braintree/test/credit_card_numbers"
|
48
|
+
require "braintree/test/transaction_amounts"
|
49
|
+
require "braintree/transaction"
|
50
|
+
require "braintree/transaction/address_details"
|
51
|
+
require "braintree/transaction/credit_card_details"
|
52
|
+
require "braintree/transaction/customer_details"
|
53
|
+
require "braintree/transaction_gateway"
|
54
|
+
require "braintree/transaction_search"
|
55
|
+
require "braintree/transaction/status_details"
|
56
|
+
require "braintree/transparent_redirect"
|
57
|
+
require "braintree/transparent_redirect_gateway"
|
58
|
+
require "braintree/util"
|
59
|
+
require "braintree/validation_error"
|
60
|
+
require "braintree/validation_error_collection"
|
61
|
+
require "braintree/version"
|
62
|
+
require "braintree/xml"
|
63
|
+
require "braintree/xml/generator"
|
64
|
+
require "braintree/xml/libxml"
|
65
|
+
require "braintree/xml/rexml"
|
66
|
+
require "braintree/xml/parser"
|
56
67
|
|
57
68
|
Braintree::SSLExpirationCheck.check_dates
|
58
69
|
|
data/lib/braintree/address.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
# CreditCard as the billing address. It can also be used
|
4
|
-
# as the shipping address when creating a Transaction.
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/addresses/details
|
5
3
|
class Address
|
6
4
|
include BaseModule # :nodoc:
|
7
5
|
|
@@ -10,21 +8,7 @@ module Braintree
|
|
10
8
|
:country_code_alpha2, :country_code_alpha3, :country_code_numeric
|
11
9
|
|
12
10
|
def self.create(attributes)
|
13
|
-
|
14
|
-
unless attributes[:customer_id]
|
15
|
-
raise ArgumentError, "Expected hash to contain a :customer_id"
|
16
|
-
end
|
17
|
-
unless attributes[:customer_id] =~ /\A[0-9A-Za-z_-]+\z/
|
18
|
-
raise ArgumentError, ":customer_id contains invalid characters"
|
19
|
-
end
|
20
|
-
response = Http.post "/customers/#{attributes.delete(:customer_id)}/addresses", :address => attributes
|
21
|
-
if response[:address]
|
22
|
-
SuccessfulResult.new(:address => new(response[:address]))
|
23
|
-
elsif response[:api_error_response]
|
24
|
-
ErrorResult.new(response[:api_error_response])
|
25
|
-
else
|
26
|
-
raise UnexpectedError, "expected :address or :api_error_response"
|
27
|
-
end
|
11
|
+
Configuration.gateway.address.create(attributes)
|
28
12
|
end
|
29
13
|
|
30
14
|
def self.create!(attributes)
|
@@ -32,39 +16,23 @@ module Braintree
|
|
32
16
|
end
|
33
17
|
|
34
18
|
def self.delete(customer_or_customer_id, address_id)
|
35
|
-
|
36
|
-
Http.delete("/customers/#{customer_id}/addresses/#{address_id}")
|
37
|
-
SuccessfulResult.new
|
19
|
+
Configuration.gateway.address.delete(customer_or_customer_id, address_id)
|
38
20
|
end
|
39
21
|
|
40
|
-
# Finds the address with the given +address_id+ that is associated to the given +customer_or_customer_id+.
|
41
|
-
# If the address cannot be found, a NotFoundError will be raised.
|
42
22
|
def self.find(customer_or_customer_id, address_id)
|
43
|
-
|
44
|
-
response = Http.get("/customers/#{customer_id}/addresses/#{address_id}")
|
45
|
-
new(response[:address])
|
46
|
-
rescue NotFoundError
|
47
|
-
raise NotFoundError, "address for customer #{customer_id.inspect} with id #{address_id.inspect} not found"
|
23
|
+
Configuration.gateway.address.find(customer_or_customer_id, address_id)
|
48
24
|
end
|
49
25
|
|
50
26
|
def self.update(customer_or_customer_id, address_id, attributes)
|
51
|
-
|
52
|
-
customer_id = _determine_customer_id(customer_or_customer_id)
|
53
|
-
response = Http.put "/customers/#{customer_id}/addresses/#{address_id}", :address => attributes
|
54
|
-
if response[:address]
|
55
|
-
SuccessfulResult.new(:address => new(response[:address]))
|
56
|
-
elsif response[:api_error_response]
|
57
|
-
ErrorResult.new(response[:api_error_response])
|
58
|
-
else
|
59
|
-
raise UnexpectedError, "expected :address or :api_error_response"
|
60
|
-
end
|
27
|
+
Configuration.gateway.address.update(customer_or_customer_id, address_id, attributes)
|
61
28
|
end
|
62
29
|
|
63
30
|
def self.update!(customer_or_customer_id, address_id, attributes)
|
64
31
|
return_object_or_raise(:address) { update(customer_or_customer_id, address_id, attributes) }
|
65
32
|
end
|
66
33
|
|
67
|
-
def initialize(attributes) # :nodoc:
|
34
|
+
def initialize(gateway, attributes) # :nodoc:
|
35
|
+
@gateway = gateway
|
68
36
|
set_instance_variables_from_hash(attributes)
|
69
37
|
end
|
70
38
|
|
@@ -73,25 +41,25 @@ module Braintree
|
|
73
41
|
id == other.id && customer_id == other.customer_id
|
74
42
|
end
|
75
43
|
|
76
|
-
#
|
44
|
+
# Deprecated. Use Braintree::Address.delete
|
77
45
|
def delete
|
78
|
-
|
46
|
+
warn "[DEPRECATED] delete as an instance method is deprecated. Please use CreditCard.delete"
|
47
|
+
@gateway.address.delete(customer_id, self.id)
|
79
48
|
end
|
80
49
|
|
50
|
+
# Deprecated. Use Braintree::Address.update
|
81
51
|
def update(attributes)
|
82
|
-
|
83
|
-
|
84
|
-
if
|
85
|
-
|
86
|
-
SuccessfulResult.new(:address => self)
|
87
|
-
elsif response[:api_error_response]
|
88
|
-
ErrorResult.new(response[:api_error_response])
|
89
|
-
else
|
90
|
-
raise UnexpectedError, "expected :address or :api_error_response"
|
52
|
+
warn "[DEPRECATED] update as an instance method is deprecated. Please use CreditCard.update"
|
53
|
+
result = @gateway.address.update(customer_id, id, attributes)
|
54
|
+
if result.success?
|
55
|
+
copy_instance_variables_from_object result.address
|
91
56
|
end
|
57
|
+
result
|
92
58
|
end
|
93
59
|
|
60
|
+
# Deprecated. Use Braintree::Address.update!
|
94
61
|
def update!(attributes)
|
62
|
+
warn "[DEPRECATED] update! as an instance method is deprecated. Please use CreditCard.update!"
|
95
63
|
return_object_or_raise(:address) { update(attributes) }
|
96
64
|
end
|
97
65
|
|
@@ -99,30 +67,8 @@ module Braintree
|
|
99
67
|
protected :new
|
100
68
|
end
|
101
69
|
|
102
|
-
def self._create_signature # :nodoc:
|
103
|
-
_shared_signature + [:customer_id]
|
104
|
-
end
|
105
|
-
|
106
|
-
def self._determine_customer_id(customer_or_customer_id) # :nodoc:
|
107
|
-
customer_id = customer_or_customer_id.is_a?(Customer) ? customer_or_customer_id.id : customer_or_customer_id
|
108
|
-
unless customer_id =~ /\A[\w_-]+\z/
|
109
|
-
raise ArgumentError, "customer_id contains invalid characters"
|
110
|
-
end
|
111
|
-
customer_id
|
112
|
-
end
|
113
|
-
|
114
|
-
def self._shared_signature # :nodoc:
|
115
|
-
[:company, :country_code_alpha2, :country_code_alpha3, :country_code_numeric,
|
116
|
-
:country_name, :extended_address, :first_name,
|
117
|
-
:last_name, :locality, :postal_code, :region, :street_address]
|
118
|
-
end
|
119
|
-
|
120
70
|
def self._new(*args) # :nodoc:
|
121
71
|
self.new *args
|
122
72
|
end
|
123
|
-
|
124
|
-
def self._update_signature # :nodoc:
|
125
|
-
_create_signature
|
126
|
-
end
|
127
73
|
end
|
128
74
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Braintree
|
2
|
+
class AddressGateway # :nodoc
|
3
|
+
def initialize(gateway)
|
4
|
+
@gateway = gateway
|
5
|
+
@config = gateway.config
|
6
|
+
end
|
7
|
+
|
8
|
+
def create(attributes)
|
9
|
+
Util.verify_keys(AddressGateway._create_signature, attributes)
|
10
|
+
unless attributes[:customer_id]
|
11
|
+
raise ArgumentError, "Expected hash to contain a :customer_id"
|
12
|
+
end
|
13
|
+
unless attributes[:customer_id] =~ /\A[0-9A-Za-z_-]+\z/
|
14
|
+
raise ArgumentError, ":customer_id contains invalid characters"
|
15
|
+
end
|
16
|
+
response = @config.http.post "/customers/#{attributes.delete(:customer_id)}/addresses", :address => attributes
|
17
|
+
if response[:address]
|
18
|
+
SuccessfulResult.new(:address => Address._new(@gateway, response[:address]))
|
19
|
+
elsif response[:api_error_response]
|
20
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
21
|
+
else
|
22
|
+
raise UnexpectedError, "expected :address or :api_error_response"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def delete(customer_or_customer_id, address_id)
|
27
|
+
customer_id = _determine_customer_id(customer_or_customer_id)
|
28
|
+
@config.http.delete("/customers/#{customer_id}/addresses/#{address_id}")
|
29
|
+
SuccessfulResult.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def find(customer_or_customer_id, address_id)
|
33
|
+
customer_id = _determine_customer_id(customer_or_customer_id)
|
34
|
+
response = @config.http.get("/customers/#{customer_id}/addresses/#{address_id}")
|
35
|
+
Address._new(@gateway, response[:address])
|
36
|
+
rescue NotFoundError
|
37
|
+
raise NotFoundError, "address for customer #{customer_id.inspect} with id #{address_id.inspect} not found"
|
38
|
+
end
|
39
|
+
|
40
|
+
def update(customer_or_customer_id, address_id, attributes)
|
41
|
+
Util.verify_keys(AddressGateway._update_signature, attributes)
|
42
|
+
customer_id = _determine_customer_id(customer_or_customer_id)
|
43
|
+
response = @config.http.put "/customers/#{customer_id}/addresses/#{address_id}", :address => attributes
|
44
|
+
if response[:address]
|
45
|
+
SuccessfulResult.new(:address => Address._new(@gateway, response[:address]))
|
46
|
+
elsif response[:api_error_response]
|
47
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
48
|
+
else
|
49
|
+
raise UnexpectedError, "expected :address or :api_error_response"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def _determine_customer_id(customer_or_customer_id) # :nodoc:
|
54
|
+
customer_id = customer_or_customer_id.is_a?(Customer) ? customer_or_customer_id.id : customer_or_customer_id
|
55
|
+
unless customer_id =~ /\A[\w_-]+\z/
|
56
|
+
raise ArgumentError, "customer_id contains invalid characters"
|
57
|
+
end
|
58
|
+
customer_id
|
59
|
+
end
|
60
|
+
|
61
|
+
def self._create_signature # :nodoc:
|
62
|
+
_shared_signature + [:customer_id]
|
63
|
+
end
|
64
|
+
|
65
|
+
def self._shared_signature # :nodoc:
|
66
|
+
[:company, :country_code_alpha2, :country_code_alpha3, :country_code_numeric,
|
67
|
+
:country_name, :extended_address, :first_name,
|
68
|
+
:last_name, :locality, :postal_code, :region, :street_address]
|
69
|
+
end
|
70
|
+
|
71
|
+
def self._update_signature # :nodoc:
|
72
|
+
_create_signature
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Braintree
|
2
|
-
class AdvancedSearch
|
3
|
-
class SearchNode
|
2
|
+
class AdvancedSearch # :nodoc:
|
3
|
+
class SearchNode # :nodoc:
|
4
4
|
def self.operators(*operator_names)
|
5
5
|
operator_names.each do |operator|
|
6
6
|
define_method(operator) do |value|
|
@@ -14,25 +14,25 @@ module Braintree
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
class EqualityNode < SearchNode
|
17
|
+
class EqualityNode < SearchNode # :nodoc:
|
18
18
|
operators :is, :is_not
|
19
19
|
end
|
20
20
|
|
21
|
-
class PartialMatchNode < EqualityNode
|
21
|
+
class PartialMatchNode < EqualityNode # :nodoc:
|
22
22
|
operators :ends_with, :starts_with
|
23
23
|
end
|
24
24
|
|
25
|
-
class TextNode < PartialMatchNode
|
25
|
+
class TextNode < PartialMatchNode # :nodoc:
|
26
26
|
operators :contains
|
27
27
|
end
|
28
28
|
|
29
|
-
class KeyValueNode < SearchNode
|
29
|
+
class KeyValueNode < SearchNode # :nodoc:
|
30
30
|
def is(value)
|
31
31
|
@parent.add_criteria(@node_name, value)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
class MultipleValueNode < SearchNode
|
35
|
+
class MultipleValueNode < SearchNode # :nodoc:
|
36
36
|
def in(*values)
|
37
37
|
values.flatten!
|
38
38
|
|
@@ -44,10 +44,6 @@ module Braintree
|
|
44
44
|
@parent.add_criteria(@node_name, values)
|
45
45
|
end
|
46
46
|
|
47
|
-
def is(value)
|
48
|
-
self.in(value)
|
49
|
-
end
|
50
|
-
|
51
47
|
def initialize(name, parent, options)
|
52
48
|
super(name, parent)
|
53
49
|
@options = options
|
@@ -56,9 +52,25 @@ module Braintree
|
|
56
52
|
def allowed_values
|
57
53
|
@options[:allows]
|
58
54
|
end
|
55
|
+
|
56
|
+
def is(value)
|
57
|
+
self.in(value)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class MultipleValueOrTextNode < MultipleValueNode
|
62
|
+
extend Forwardable
|
63
|
+
def_delegators :@text_node, :contains, :ends_with, :is, :is_not, :starts_with
|
64
|
+
|
65
|
+
def initialize(name, parent, options)
|
66
|
+
super
|
67
|
+
@text_node = TextNode.new(name, parent)
|
68
|
+
end
|
59
69
|
end
|
60
70
|
|
61
|
-
class RangeNode < SearchNode
|
71
|
+
class RangeNode < SearchNode # :nodoc:
|
72
|
+
operators :is
|
73
|
+
|
62
74
|
def between(min, max)
|
63
75
|
self >= min
|
64
76
|
self <= max
|
@@ -73,7 +85,7 @@ module Braintree
|
|
73
85
|
end
|
74
86
|
end
|
75
87
|
|
76
|
-
def self.
|
88
|
+
def self.text_fields(*fields)
|
77
89
|
_create_field_accessors(fields, TextNode)
|
78
90
|
end
|
79
91
|
|
@@ -91,6 +103,12 @@ module Braintree
|
|
91
103
|
end
|
92
104
|
end
|
93
105
|
|
106
|
+
def self.multiple_value_or_text_field(field, options={})
|
107
|
+
define_method(field) do
|
108
|
+
MultipleValueOrTextNode.new(field, self, options)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
94
112
|
def self.key_value_fields(*fields)
|
95
113
|
_create_field_accessors(fields, KeyValueNode)
|
96
114
|
end
|
@@ -10,6 +10,12 @@ module Braintree
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
def copy_instance_variables_from_object(object)
|
14
|
+
object.instance_variables.each do |ivar|
|
15
|
+
instance_variable_set ivar, object.instance_variable_get(ivar)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
13
19
|
def set_instance_variables_from_hash(hash)
|
14
20
|
hash.each do |key, value|
|
15
21
|
instance_variable_set "@#{key}", value
|
@@ -1,19 +1,12 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
|
4
|
-
# * public_key
|
5
|
-
# * private_key
|
6
|
-
# * environment
|
7
|
-
#
|
8
|
-
# By default, the logger will log to +STDOUT+. The log level is set to info.
|
9
|
-
# The logger can be set to any Logger object.
|
10
|
-
module Configuration
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby
|
3
|
+
class Configuration
|
11
4
|
API_VERSION = "2" # :nodoc:
|
12
5
|
|
13
6
|
class << self
|
14
|
-
|
15
|
-
attr_writer :merchant_id, :public_key, :private_key
|
7
|
+
attr_writer :custom_user_agent, :logger, :merchant_id, :public_key, :private_key
|
16
8
|
end
|
9
|
+
attr_reader :logger, :merchant_id, :public_key, :private_key
|
17
10
|
|
18
11
|
def self.expectant_reader(*attributes) # :nodoc:
|
19
12
|
attributes.each do |attribute|
|
@@ -26,16 +19,53 @@ module Braintree
|
|
26
19
|
end
|
27
20
|
expectant_reader :environment, :merchant_id, :public_key, :private_key
|
28
21
|
|
29
|
-
|
30
|
-
|
22
|
+
# Sets the Braintree environment to use. Valid values are <tt>:sandbox</tt> and <tt>:production</tt>
|
23
|
+
def self.environment=(env)
|
24
|
+
unless [:development, :qa, :sandbox, :production].include?(env)
|
25
|
+
raise ArgumentError, "#{env.inspect} is not a valid environment"
|
26
|
+
end
|
27
|
+
@environment = env
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.gateway # :nodoc:
|
31
|
+
Braintree::Gateway.new(instantiate)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.instantiate # :nodoc:
|
35
|
+
config = new(
|
36
|
+
:custom_user_agent => @custom_user_agent,
|
37
|
+
:environment => environment,
|
38
|
+
:logger => logger,
|
39
|
+
:merchant_id => merchant_id,
|
40
|
+
:private_key => private_key,
|
41
|
+
:public_key => public_key
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.logger
|
46
|
+
@logger ||= _default_logger
|
47
|
+
end
|
48
|
+
|
49
|
+
def initialize(options = {})
|
50
|
+
[:environment, :merchant_id, :public_key, :private_key, :custom_user_agent, :logger].each do |attr|
|
51
|
+
instance_variable_set "@#{attr}", options[attr]
|
52
|
+
end
|
31
53
|
end
|
32
54
|
|
33
|
-
def
|
34
|
-
|
55
|
+
def api_version # :nodoc:
|
56
|
+
API_VERSION
|
35
57
|
end
|
36
58
|
|
37
|
-
def
|
38
|
-
|
59
|
+
def base_merchant_path # :nodoc:
|
60
|
+
"/merchants/#{merchant_id}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def base_merchant_url # :nodoc:
|
64
|
+
"#{protocol}://#{server}:#{port}#{base_merchant_path}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def ca_file # :nodoc:
|
68
|
+
case @environment
|
39
69
|
when :qa, :sandbox
|
40
70
|
File.expand_path(File.join(File.dirname(__FILE__), "..", "ssl", "sandbox_braintreegateway_com.ca.crt"))
|
41
71
|
when :production
|
@@ -43,20 +73,12 @@ module Braintree
|
|
43
73
|
end
|
44
74
|
end
|
45
75
|
|
46
|
-
|
47
|
-
|
48
|
-
unless [:development, :qa, :sandbox, :production].include?(env)
|
49
|
-
raise ArgumentError, "#{env.inspect} is not a valid environment"
|
50
|
-
end
|
51
|
-
@environment = env
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.logger # :nodoc:
|
55
|
-
@logger ||= _default_logger
|
76
|
+
def http # :nodoc:
|
77
|
+
Http.new(self)
|
56
78
|
end
|
57
79
|
|
58
|
-
def
|
59
|
-
case environment
|
80
|
+
def port # :nodoc:
|
81
|
+
case @environment
|
60
82
|
when :development
|
61
83
|
ENV['GATEWAY_PORT'] || 3000
|
62
84
|
when :production, :qa, :sandbox
|
@@ -64,12 +86,12 @@ module Braintree
|
|
64
86
|
end
|
65
87
|
end
|
66
88
|
|
67
|
-
def
|
89
|
+
def protocol # :nodoc:
|
68
90
|
ssl? ? "https" : "http"
|
69
91
|
end
|
70
92
|
|
71
|
-
def
|
72
|
-
case environment
|
93
|
+
def server # :nodoc:
|
94
|
+
case @environment
|
73
95
|
when :development
|
74
96
|
"localhost"
|
75
97
|
when :production
|
@@ -81,8 +103,8 @@ module Braintree
|
|
81
103
|
end
|
82
104
|
end
|
83
105
|
|
84
|
-
def
|
85
|
-
case environment
|
106
|
+
def ssl? # :nodoc:
|
107
|
+
case @environment
|
86
108
|
when :development
|
87
109
|
false
|
88
110
|
when :production, :qa, :sandbox
|
@@ -90,11 +112,7 @@ module Braintree
|
|
90
112
|
end
|
91
113
|
end
|
92
114
|
|
93
|
-
def
|
94
|
-
@custom_user_agent = custom_user_agent
|
95
|
-
end
|
96
|
-
|
97
|
-
def self.user_agent
|
115
|
+
def user_agent # :nodoc:
|
98
116
|
base_user_agent = "Braintree Ruby Gem #{Braintree::Version::String}"
|
99
117
|
@custom_user_agent ? "#{base_user_agent} (#{@custom_user_agent})" : base_user_agent
|
100
118
|
end
|