tanga_activemerchant 1.37.0 → 1.38.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ce6389b05e20fb008ac9e9e9063b5236321b1452
4
- data.tar.gz: 7d63861c5c3128f136559d1dc495d5725b064f94
3
+ metadata.gz: 3ab6a8d9d49c77311453407ef270a10bb8313d9b
4
+ data.tar.gz: 01608713fb3859a523da6b70314d17ce8cd37054
5
5
  SHA512:
6
- metadata.gz: e6fec94df4265c57f28f20fcdda81c45fa649cc7797411711f7f853409bf814fe4a4cdf4e8072bbcfe7ff517060ed939961e42398150e770f24e5c23cacfda23
7
- data.tar.gz: 4d20cf9fa4c1c547d3457440be4542ee68ebfab99536a020b7c8ddf7e35d5aedbd412a43bb9e2e1a8c82d29bcf5f39b71924abe5d51d7a2372cf88c204da5bc3
6
+ metadata.gz: ae137800501f261490d1a296e135910fc1482e5813c488a2975bc571f37aed5655ee526e4377315397805f8567aa17cfde644cfa0aa2ca5dd29637f8f74b2579
7
+ data.tar.gz: e0bf6e3b03429fc1874423f27ed69c4ec89207be0aec0d9c2eb0eea7801fe05b2ed6308b6f66009acd05a6bbc26a6318f7db8c0e1d7d528f0a3e904012749c27
data/CHANGELOG CHANGED
@@ -1,13 +1,25 @@
1
1
  = ActiveMerchant CHANGELOG
2
2
 
3
+ == Version 1.38.0 (September 6, 2013)
4
+
5
+ * FirstData E4: Include missing address information for AVS and CVV [melari]
6
+ * Litle: Deprecate credit method in favor of refund [melari]
7
+ * Moneris: Add verification_value support [duff]
8
+ * Webpay: Fixes issues with partial JPY currency [keikubo, melari]
9
+ * SecureNet: Add INVOICENUM and INVOICEDESC optional fields [duff]
10
+ * Balanced: Make BalancedGateway::Error inherit from ActiveMerchantError [duff]
11
+ * Balanced: Fix #void interface [duff]
12
+ * HiTrust: Return correct error message for positive retcodes [melari]
13
+ * Moving to pessimistic versioning [davefp]
14
+
15
+ == Version 1.37.0 (August 20, 2013)
16
+
3
17
  * MerchantWarrior: Fix handling of amounts [duff]
4
18
  * Ipay88: New gateway [kamal, siong1987, jduff]
5
19
  * IATS: New gateway [unkown, jduff]
6
20
  * MerchantWarrior: Send the CVV to the gateway [duff]
7
21
  * PayU: Fix a major bug with status types [melari]
8
22
  * SecureNet: Allow production transactions [duff]
9
- * Stripe: Allow a card_not_present_fee to be specified [melari]
10
-
11
23
 
12
24
  == Version 1.36.0 (August 2, 2013)
13
25
 
data/README.md CHANGED
@@ -166,7 +166,7 @@ The [ActiveMerchant Wiki](http://github.com/Shopify/active_merchant/wikis) conta
166
166
  * [SecurePayTech](http://www.securepaytech.com/) - NZ
167
167
  * [SkipJack](http://www.skipjack.com/) - US, CA
168
168
  * [Spreedly Core](https://spreedlycore.com/) - AD, AE, AT, AU, BD, BE, BG, BN, CA, CH, CY, CZ, DE, DK, EE, EG, ES, FI, FR, GB, GI, GR, HK, HU, ID, IE, IL, IM, IN, IS, IT, JO, KW, LB, LI, LK, LT, LU, LV, MC, MT, MU, MV, MX, MY, NL, NO, NZ, OM, PH, PL, PT, QA, RO, SA, SE, SG, SI, SK, SM, TR, TT, UM, US, VA, VN, ZA
169
- * [Stripe](https://stripe.com/) - US
169
+ * [Stripe](https://stripe.com/) - US, CA, GB
170
170
  * [TransFirst](http://www.transfirst.com/) - US
171
171
  * [Transnational](http://www.tnbci.com/) - US
172
172
  * [TrustCommerce](http://www.trustcommerce.com/) - US
@@ -69,7 +69,7 @@ module ActiveMerchant #:nodoc:
69
69
  self.display_name = 'Balanced'
70
70
  self.money_format = :cents
71
71
 
72
- class Error < StandardError
72
+ class Error < ActiveMerchant::ActiveMerchantError
73
73
  attr_reader :response
74
74
 
75
75
  def initialize(response, msg=nil)
@@ -210,7 +210,7 @@ module ActiveMerchant #:nodoc:
210
210
  #
211
211
  # * <tt>authorization</tt> -- The uri of the authorization returned from
212
212
  # an `authorize` request.
213
- def void(authorization)
213
+ def void(authorization, options = {})
214
214
  post = {}
215
215
  post[:is_void] = true
216
216
 
@@ -8,7 +8,7 @@ module ActiveMerchant #:nodoc:
8
8
  self.live_url = 'https://www.eway.com.au'
9
9
 
10
10
  self.money_format = :cents
11
- self.supported_countries = ['AU']
11
+ self.supported_countries = ['AU', 'NZ', 'GB']
12
12
  self.supported_cardtypes = [:visa, :master, :american_express, :diners_club]
13
13
  self.homepage_url = 'http://www.eway.com.au/'
14
14
  self.display_name = 'eWAY'
@@ -116,7 +116,7 @@ module ActiveMerchant #:nodoc:
116
116
  if credit_card_or_store_authorization.is_a? String
117
117
  add_credit_card_token(xml, credit_card_or_store_authorization)
118
118
  else
119
- add_credit_card(xml, credit_card_or_store_authorization)
119
+ add_credit_card(xml, credit_card_or_store_authorization, options)
120
120
  end
121
121
 
122
122
  add_customer_data(xml, options)
@@ -138,7 +138,7 @@ module ActiveMerchant #:nodoc:
138
138
  def build_store_request(credit_card, options)
139
139
  xml = Builder::XmlMarkup.new
140
140
 
141
- add_credit_card(xml, credit_card)
141
+ add_credit_card(xml, credit_card, options)
142
142
  add_customer_data(xml, options)
143
143
 
144
144
  xml.target!
@@ -164,12 +164,23 @@ module ActiveMerchant #:nodoc:
164
164
  xml.tag! "DollarAmount", amount(money)
165
165
  end
166
166
 
167
- def add_credit_card(xml, credit_card)
167
+ def add_credit_card(xml, credit_card, options)
168
168
  xml.tag! "Card_Number", credit_card.number
169
169
  xml.tag! "Expiry_Date", expdate(credit_card)
170
170
  xml.tag! "CardHoldersName", credit_card.name
171
171
  xml.tag! "CardType", credit_card.brand
172
172
 
173
+ add_credit_card_verification_strings(xml, credit_card, options)
174
+ end
175
+
176
+ def add_credit_card_verification_strings(xml, credit_card, options)
177
+ address = options[:billing_address] || options[:address]
178
+ if address
179
+ address_values = []
180
+ [:address1, :zip, :city, :state, :country].each { |part| address_values << address[part].to_s }
181
+ xml.tag! "VerificationStr1", address_values.join("|")
182
+ end
183
+
173
184
  if credit_card.verification_value?
174
185
  xml.tag! "CVD_Presence_Ind", "1"
175
186
  xml.tag! "VerificationStr2", credit_card.verification_value
@@ -112,11 +112,16 @@ module ActiveMerchant #:nodoc:
112
112
  end
113
113
  end
114
114
 
115
- def credit(money, identification_or_token, options = {})
116
- to_pass = build_credit_request(money, identification_or_token, options)
115
+ def refund(money, authorization, options = {})
116
+ to_pass = build_credit_request(money, authorization, options)
117
117
  build_response(:credit, @litle.credit(to_pass))
118
118
  end
119
119
 
120
+ def credit(money, authorization, options = {})
121
+ deprecated CREDIT_DEPRECATION_MESSAGE
122
+ refund(money, authorization, options)
123
+ end
124
+
120
125
  def store(creditcard_or_paypage_registration_id, options = {})
121
126
  to_pass = create_token_hash(creditcard_or_paypage_registration_id, options)
122
127
  build_response(:registerToken, @litle.register_token_request(to_pass), %w(000 801 802))
@@ -128,6 +128,7 @@ module ActiveMerchant #:nodoc:
128
128
  else
129
129
  post[:pan] = source.number
130
130
  post[:expdate] = expdate(source)
131
+ post[:cvd_value] = source.verification_value if source.verification_value?
131
132
  end
132
133
  end
133
134
 
@@ -155,6 +156,7 @@ module ActiveMerchant #:nodoc:
155
156
 
156
157
  Response.new(successful?(response), message_from(response[:message]), response,
157
158
  :test => test?,
159
+ :cvv_result => response[:cvd_result_code].try(:last),
158
160
  :authorization => authorization_from(response)
159
161
  )
160
162
  end
@@ -192,14 +194,35 @@ module ActiveMerchant #:nodoc:
192
194
  root = xml.add_element("request")
193
195
  root.add_element("store_id").text = options[:login]
194
196
  root.add_element("api_token").text = options[:password]
195
- transaction = root.add_element(action)
197
+ root.add_element(transaction_element(action, parameters))
198
+
199
+ xml.to_s
200
+ end
201
+
202
+ def transaction_element(action, parameters)
203
+ transaction = REXML::Element.new(action)
196
204
 
197
205
  # Must add the elements in the correct order
198
206
  actions[action].each do |key|
199
- transaction.add_element(key.to_s).text = parameters[key] unless parameters[key].blank?
207
+ if key == :cvd_info
208
+ transaction.add_element(cvd_element(parameters[:cvd_value]))
209
+ else
210
+ transaction.add_element(key.to_s).text = parameters[key] unless parameters[key].blank?
211
+ end
200
212
  end
201
213
 
202
- xml.to_s
214
+ transaction
215
+ end
216
+
217
+ def cvd_element(cvd_value)
218
+ element = REXML::Element.new('cvd_info')
219
+ if cvd_value
220
+ element.add_element('cvd_indicator').text = "1"
221
+ element.add_element('cvd_value').text = cvd_value
222
+ else
223
+ element.add_element('cvd_indicator').text = "0"
224
+ end
225
+ element
203
226
  end
204
227
 
205
228
  def message_from(message)
@@ -219,8 +242,8 @@ module ActiveMerchant #:nodoc:
219
242
 
220
243
  def actions
221
244
  {
222
- "purchase" => [:order_id, :cust_id, :amount, :pan, :expdate, :crypt_type],
223
- "preauth" => [:order_id, :cust_id, :amount, :pan, :expdate, :crypt_type],
245
+ "purchase" => [:order_id, :cust_id, :amount, :pan, :expdate, :crypt_type, :cvd_info],
246
+ "preauth" => [:order_id, :cust_id, :amount, :pan, :expdate, :crypt_type, :cvd_info],
224
247
  "command" => [:order_id],
225
248
  "refund" => [:order_id, :amount, :txn_number, :crypt_type],
226
249
  "indrefund" => [:order_id, :cust_id, :amount, :pan, :expdate, :crypt_type],
@@ -182,8 +182,9 @@ module ActiveMerchant #:nodoc:
182
182
  end
183
183
 
184
184
  def add_invoice(xml, options)
185
- xml.tag! 'INVOICEDESC', options[:description]
186
- xml.tag! 'INVOICENUM', 'inv-8'
185
+ xml.tag! 'NOTE', options[:description] if options[:description]
186
+ xml.tag! 'INVOICEDESC', options[:invoice_description] if options[:invoice_description]
187
+ xml.tag! 'INVOICENUM', options[:invoice_number] if options[:invoice_number]
187
188
  end
188
189
 
189
190
  def add_merchant_key(xml, options)
@@ -21,7 +21,7 @@ module ActiveMerchant #:nodoc:
21
21
  'unchecked' => 'P'
22
22
  }
23
23
 
24
- self.supported_countries = ['US', 'CA']
24
+ self.supported_countries = ['US', 'CA', 'GB']
25
25
  self.default_currency = 'USD'
26
26
  self.money_format = :cents
27
27
  self.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club]
@@ -40,7 +40,7 @@ module ActiveMerchant #:nodoc:
40
40
  post = create_post_for_auth_or_purchase(money, creditcard, options)
41
41
  post[:capture] = "false"
42
42
 
43
- commit(:post, 'charges', post, generate_meta(options), creditcard)
43
+ commit(:post, 'charges', post, generate_meta(options))
44
44
  end
45
45
 
46
46
  # To create a charge on a card or a token, call
@@ -53,12 +53,12 @@ module ActiveMerchant #:nodoc:
53
53
  def purchase(money, creditcard, options = {})
54
54
  post = create_post_for_auth_or_purchase(money, creditcard, options)
55
55
 
56
- commit(:post, 'charges', post, generate_meta(options), creditcard)
56
+ commit(:post, 'charges', post, generate_meta(options))
57
57
  end
58
58
 
59
59
  def capture(money, authorization, options = {})
60
60
  post = {:amount => amount(money)}
61
- add_application_fee(post, nil, options)
61
+ add_application_fee(post, options)
62
62
 
63
63
  commit(:post, "charges/#{CGI.escape(authorization)}/capture", post)
64
64
  end
@@ -71,7 +71,7 @@ module ActiveMerchant #:nodoc:
71
71
  post = {:amount => amount(money)}
72
72
  commit_options = generate_meta(options)
73
73
 
74
- MultiResponse.run do |r|
74
+ MultiResponse.run(:first) do |r|
75
75
  r.process { commit(:post, "charges/#{CGI.escape(identification)}/refund", post, commit_options) }
76
76
 
77
77
  return r unless options[:refund_fee_amount]
@@ -131,7 +131,7 @@ module ActiveMerchant #:nodoc:
131
131
  add_customer_data(post,options)
132
132
  post[:description] = options[:description] || options[:email]
133
133
  add_flags(post, options)
134
- add_application_fee(post, creditcard, options)
134
+ add_application_fee(post, options)
135
135
  post
136
136
  end
137
137
 
@@ -140,25 +140,8 @@ module ActiveMerchant #:nodoc:
140
140
  post[:currency] = (options[:currency] || currency(money)).downcase
141
141
  end
142
142
 
143
- def add_application_fee(post, creditcard, options)
144
- return unless options[:application_fee]
145
- if use_card_not_present_fee?(creditcard, options)
146
- post[:application_fee] = options[:card_not_present_fee]
147
- else
148
- post[:application_fee] = options[:application_fee]
149
- end
150
- end
151
-
152
- def use_card_not_present_fee?(creditcard, options)
153
- options[:card_not_present_fee].present? && !includes_track_data?(creditcard, options)
154
- end
155
-
156
- def includes_track_data?(creditcard, options)
157
- if creditcard.respond_to?(:track_data)
158
- creditcard.track_data.present?
159
- else
160
- options[:track_data].present?
161
- end
143
+ def add_application_fee(post, options)
144
+ post[:application_fee] = options[:application_fee] if options[:application_fee]
162
145
  end
163
146
 
164
147
  def add_customer_data(post, options)
@@ -207,7 +190,7 @@ module ActiveMerchant #:nodoc:
207
190
  end
208
191
 
209
192
  def add_customer(post, options)
210
- post[:customer] = options[:customer] if options[:customer] && !post[:card]
193
+ post[:customer] = options[:customer] if options[:customer] && post[:card].blank?
211
194
  end
212
195
 
213
196
  def add_flags(post, options)
@@ -265,7 +248,7 @@ module ActiveMerchant #:nodoc:
265
248
  }
266
249
  end
267
250
 
268
- def commit(method, url, parameters=nil, options = {}, creditcard = nil)
251
+ def commit(method, url, parameters=nil, options = {})
269
252
  raw_response = response = nil
270
253
  success = false
271
254
  begin
@@ -279,8 +262,6 @@ module ActiveMerchant #:nodoc:
279
262
  response = json_error(raw_response)
280
263
  end
281
264
 
282
- response[:card_present] = includes_track_data?(creditcard, options)
283
-
284
265
  card = response["card"] || response["active_card"] || {}
285
266
  avs_code = AVS_CODE_TRANSLATOR["line1: #{card["address_line1_check"]}, zip: #{card["address_zip_check"]}"]
286
267
  cvc_code = CVC_CODE_TRANSLATOR[card["cvc_check"]]
@@ -21,10 +21,33 @@ module ActiveMerchant #:nodoc:
21
21
  raise NotImplementedError.new
22
22
  end
23
23
 
24
+ def refund(money, identification, options = {})
25
+ post = {:amount => localized_amount(money)}
26
+ commit_options = generate_meta(options)
27
+
28
+ MultiResponse.run do |r|
29
+ r.process { commit(:post, "charges/#{CGI.escape(identification)}/refund", post, commit_options) }
30
+
31
+ return r unless options[:refund_fee_amount]
32
+
33
+ r.process { fetch_application_fees(identification, commit_options) }
34
+ r.process { refund_application_fee(options[:refund_fee_amount], application_fee_from_response(r), commit_options) }
35
+ end
36
+ end
37
+
24
38
  def refund_fee(identification, options, meta)
25
39
  raise NotImplementedError.new
26
40
  end
27
41
 
42
+ def localized_amount(money, currency = self.default_currency)
43
+ non_fractional_currency?(currency) ? (amount(money).to_f / 100).floor : amount(money)
44
+ end
45
+
46
+ def add_amount(post, money, options)
47
+ post[:currency] = (options[:currency] || currency(money)).downcase
48
+ post[:amount] = localized_amount(money, post[:currency].upcase)
49
+ end
50
+
28
51
  def json_error(raw_response)
29
52
  msg = 'Invalid response received from the WebPay API. Please contact support@webpay.jp if you continue to receive this message.'
30
53
  msg += " (The raw response returned by the API was #{raw_response.inspect})"
@@ -7,10 +7,10 @@ module ActiveMerchant #:nodoc:
7
7
  CODES = { "00" => "Operation completed successfully",
8
8
  "-1" => "Unable to initialize winsock dll.",
9
9
  "-2" => "Can't create stream socket.",
10
- "-3" => "No Request Message.",
10
+ "-3" => "No Request Message.",
11
11
  "-4" => "Can't connect to server.",
12
12
  "-5" => "Send socket error.",
13
- "-6" => "Couldn't receive data.",
13
+ "-6" => "Couldn't receive data.",
14
14
  "-7" => "Receive Broken message.",
15
15
  "-8" => "Unable to initialize Envirnment.",
16
16
  "-9" => "Can't Read Server RSA File.",
@@ -52,15 +52,16 @@ module ActiveMerchant #:nodoc:
52
52
  "-308" => "Order Number already exists.",
53
53
  "positive" => "Response from Bank. Please contact with Acquirer Bank Service or HiTRUST Call Center."
54
54
  }
55
-
55
+
56
56
  def success?
57
57
  params['retcode'] == SUCCESS
58
58
  end
59
-
59
+
60
60
  def message
61
+ return CODES["positive"] if params['retcode'].to_i > 0
61
62
  CODES[ params['retcode'] ]
62
63
  end
63
- end
64
+ end
64
65
  end
65
66
  end
66
67
  end
@@ -39,14 +39,18 @@ module ActiveMerchant #:nodoc:
39
39
  end
40
40
 
41
41
  class MultiResponse < Response
42
- def self.run(&block)
43
- new.tap(&block)
42
+ def self.run(primary_response = :last, &block)
43
+ response = new.tap(&block)
44
+ response.primary_response = primary_response
45
+ response
44
46
  end
45
47
 
46
48
  attr_reader :responses
49
+ attr_writer :primary_response
47
50
 
48
51
  def initialize
49
52
  @responses = []
53
+ @primary_response = :last
50
54
  end
51
55
 
52
56
  def process
@@ -65,10 +69,14 @@ module ActiveMerchant #:nodoc:
65
69
  @responses.all?{|r| r.success?}
66
70
  end
67
71
 
72
+ def primary_response
73
+ success? && @primary_response == :first ? @responses.first : @responses.last
74
+ end
75
+
68
76
  %w(params message test authorization avs_result cvv_result test? fraud_review?).each do |m|
69
77
  class_eval %(
70
78
  def #{m}
71
- (@responses.empty? ? nil : @responses.last.#{m})
79
+ (@responses.empty? ? nil : primary_response.#{m})
72
80
  end
73
81
  )
74
82
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveMerchant
2
- VERSION = "1.37.0"
2
+ VERSION = "1.38.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tanga_activemerchant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.37.0
4
+ version: 1.38.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - gem-public_cert.pem
12
- date: 2015-04-21 00:00:00.000000000 Z
12
+ date: 2015-05-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -18,6 +18,9 @@ dependencies:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: 2.3.14
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: 5.0.0
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -25,90 +28,99 @@ dependencies:
25
28
  - - ">="
26
29
  - !ruby/object:Gem::Version
27
30
  version: 2.3.14
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: 5.0.0
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: i18n
30
36
  requirement: !ruby/object:Gem::Requirement
31
37
  requirements:
32
- - - ">="
38
+ - - "~>"
33
39
  - !ruby/object:Gem::Version
34
- version: '0'
40
+ version: '0.5'
35
41
  type: :runtime
36
42
  prerelease: false
37
43
  version_requirements: !ruby/object:Gem::Requirement
38
44
  requirements:
39
- - - ">="
45
+ - - "~>"
40
46
  - !ruby/object:Gem::Version
41
- version: '0'
47
+ version: '0.5'
42
48
  - !ruby/object:Gem::Dependency
43
49
  name: money
44
50
  requirement: !ruby/object:Gem::Requirement
45
51
  requirements:
46
- - - ">="
52
+ - - "<"
47
53
  - !ruby/object:Gem::Version
48
- version: '0'
54
+ version: 6.0.0
49
55
  type: :runtime
50
56
  prerelease: false
51
57
  version_requirements: !ruby/object:Gem::Requirement
52
58
  requirements:
53
- - - ">="
59
+ - - "<"
54
60
  - !ruby/object:Gem::Version
55
- version: '0'
61
+ version: 6.0.0
56
62
  - !ruby/object:Gem::Dependency
57
63
  name: builder
58
64
  requirement: !ruby/object:Gem::Requirement
59
65
  requirements:
60
66
  - - ">="
61
67
  - !ruby/object:Gem::Version
62
- version: 2.0.0
68
+ version: 2.1.2
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: 4.0.0
63
72
  type: :runtime
64
73
  prerelease: false
65
74
  version_requirements: !ruby/object:Gem::Requirement
66
75
  requirements:
67
76
  - - ">="
68
77
  - !ruby/object:Gem::Version
69
- version: 2.0.0
78
+ version: 2.1.2
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: 4.0.0
70
82
  - !ruby/object:Gem::Dependency
71
83
  name: json
72
84
  requirement: !ruby/object:Gem::Requirement
73
85
  requirements:
74
- - - ">="
86
+ - - "~>"
75
87
  - !ruby/object:Gem::Version
76
- version: 1.5.1
88
+ version: '1.7'
77
89
  type: :runtime
78
90
  prerelease: false
79
91
  version_requirements: !ruby/object:Gem::Requirement
80
92
  requirements:
81
- - - ">="
93
+ - - "~>"
82
94
  - !ruby/object:Gem::Version
83
- version: 1.5.1
95
+ version: '1.7'
84
96
  - !ruby/object:Gem::Dependency
85
97
  name: active_utils
86
98
  requirement: !ruby/object:Gem::Requirement
87
99
  requirements:
88
- - - ">="
100
+ - - "~>"
89
101
  - !ruby/object:Gem::Version
90
- version: 1.0.2
102
+ version: '2.0'
91
103
  type: :runtime
92
104
  prerelease: false
93
105
  version_requirements: !ruby/object:Gem::Requirement
94
106
  requirements:
95
- - - ">="
107
+ - - "~>"
96
108
  - !ruby/object:Gem::Version
97
- version: 1.0.2
109
+ version: '2.0'
98
110
  - !ruby/object:Gem::Dependency
99
111
  name: nokogiri
100
112
  requirement: !ruby/object:Gem::Requirement
101
113
  requirements:
102
- - - "<"
114
+ - - "~>"
103
115
  - !ruby/object:Gem::Version
104
- version: 1.6.0
116
+ version: '1.4'
105
117
  type: :runtime
106
118
  prerelease: false
107
119
  version_requirements: !ruby/object:Gem::Requirement
108
120
  requirements:
109
- - - "<"
121
+ - - "~>"
110
122
  - !ruby/object:Gem::Version
111
- version: 1.6.0
123
+ version: '1.4'
112
124
  - !ruby/object:Gem::Dependency
113
125
  name: rake
114
126
  requirement: !ruby/object:Gem::Requirement
@@ -503,4 +515,3 @@ signing_key:
503
515
  specification_version: 4
504
516
  summary: Framework and tools for dealing with credit card transactions.
505
517
  test_files: []
506
- has_rdoc: