aktivemerchant 2.0.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.
Files changed (193) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +1596 -0
  3. data/CONTRIBUTORS +511 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +18 -0
  6. data/lib/active_merchant.rb +108 -0
  7. data/lib/active_merchant/billing.rb +13 -0
  8. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  9. data/lib/active_merchant/billing/avs_result.rb +98 -0
  10. data/lib/active_merchant/billing/base.rb +72 -0
  11. data/lib/active_merchant/billing/check.rb +76 -0
  12. data/lib/active_merchant/billing/compatibility.rb +120 -0
  13. data/lib/active_merchant/billing/credit_card.rb +352 -0
  14. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  15. data/lib/active_merchant/billing/credit_card_methods.rb +160 -0
  16. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  17. data/lib/active_merchant/billing/gateway.rb +268 -0
  18. data/lib/active_merchant/billing/gateways.rb +17 -0
  19. data/lib/active_merchant/billing/gateways/adyen.rb +209 -0
  20. data/lib/active_merchant/billing/gateways/alfabank.rb +117 -0
  21. data/lib/active_merchant/billing/gateways/app55.rb +176 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net.rb +419 -0
  23. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  24. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +976 -0
  25. data/lib/active_merchant/billing/gateways/balanced.rb +256 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +105 -0
  28. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +314 -0
  29. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  30. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  31. data/lib/active_merchant/billing/gateways/beanstream.rb +188 -0
  32. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +393 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +506 -0
  35. data/lib/active_merchant/billing/gateways/bogus.rb +140 -0
  36. data/lib/active_merchant/billing/gateways/borgun.rb +210 -0
  37. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  38. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  39. data/lib/active_merchant/billing/gateways/braintree_blue.rb +515 -0
  40. data/lib/active_merchant/billing/gateways/braintree_orange.rb +20 -0
  41. data/lib/active_merchant/billing/gateways/bridge_pay.rb +189 -0
  42. data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
  43. data/lib/active_merchant/billing/gateways/card_stream.rb +220 -0
  44. data/lib/active_merchant/billing/gateways/cashnet.rb +191 -0
  45. data/lib/active_merchant/billing/gateways/cc5.rb +201 -0
  46. data/lib/active_merchant/billing/gateways/cecabank.rb +229 -0
  47. data/lib/active_merchant/billing/gateways/certo_direct.rb +278 -0
  48. data/lib/active_merchant/billing/gateways/checkout.rb +213 -0
  49. data/lib/active_merchant/billing/gateways/commercegate.rb +143 -0
  50. data/lib/active_merchant/billing/gateways/conekta.rb +209 -0
  51. data/lib/active_merchant/billing/gateways/cyber_source.rb +709 -0
  52. data/lib/active_merchant/billing/gateways/data_cash.rb +600 -0
  53. data/lib/active_merchant/billing/gateways/efsnet.rb +219 -0
  54. data/lib/active_merchant/billing/gateways/elavon.rb +348 -0
  55. data/lib/active_merchant/billing/gateways/epay.rb +275 -0
  56. data/lib/active_merchant/billing/gateways/evo_ca.rb +308 -0
  57. data/lib/active_merchant/billing/gateways/eway.rb +214 -0
  58. data/lib/active_merchant/billing/gateways/eway_managed.rb +291 -0
  59. data/lib/active_merchant/billing/gateways/eway_rapid.rb +524 -0
  60. data/lib/active_merchant/billing/gateways/exact.rb +218 -0
  61. data/lib/active_merchant/billing/gateways/fat_zebra.rb +173 -0
  62. data/lib/active_merchant/billing/gateways/federated_canada.rb +160 -0
  63. data/lib/active_merchant/billing/gateways/finansbank.rb +23 -0
  64. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  65. data/lib/active_merchant/billing/gateways/first_pay.rb +160 -0
  66. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +355 -0
  67. data/lib/active_merchant/billing/gateways/garanti.rb +257 -0
  68. data/lib/active_merchant/billing/gateways/global_transport.rb +183 -0
  69. data/lib/active_merchant/billing/gateways/hdfc.rb +207 -0
  70. data/lib/active_merchant/billing/gateways/hps.rb +288 -0
  71. data/lib/active_merchant/billing/gateways/iats_payments.rb +251 -0
  72. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +246 -0
  73. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  74. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  75. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +66 -0
  76. data/lib/active_merchant/billing/gateways/inspire.rb +213 -0
  77. data/lib/active_merchant/billing/gateways/instapay.rb +163 -0
  78. data/lib/active_merchant/billing/gateways/iridium.rb +457 -0
  79. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  80. data/lib/active_merchant/billing/gateways/jetpay.rb +275 -0
  81. data/lib/active_merchant/billing/gateways/linkpoint.rb +438 -0
  82. data/lib/active_merchant/billing/gateways/litle.rb +346 -0
  83. data/lib/active_merchant/billing/gateways/maxipago.rb +197 -0
  84. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +170 -0
  85. data/lib/active_merchant/billing/gateways/merchant_one.rb +114 -0
  86. data/lib/active_merchant/billing/gateways/merchant_ware.rb +319 -0
  87. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +268 -0
  88. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +195 -0
  89. data/lib/active_merchant/billing/gateways/mercury.rb +333 -0
  90. data/lib/active_merchant/billing/gateways/metrics_global.rb +303 -0
  91. data/lib/active_merchant/billing/gateways/migs.rb +265 -0
  92. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  93. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  94. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +219 -0
  95. data/lib/active_merchant/billing/gateways/moneris.rb +309 -0
  96. data/lib/active_merchant/billing/gateways/moneris_us.rb +291 -0
  97. data/lib/active_merchant/billing/gateways/money_movers.rb +152 -0
  98. data/lib/active_merchant/billing/gateways/nab_transact.rb +280 -0
  99. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  100. data/lib/active_merchant/billing/gateways/netaxept.rb +181 -0
  101. data/lib/active_merchant/billing/gateways/netbilling.rb +190 -0
  102. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  103. data/lib/active_merchant/billing/gateways/network_merchants.rb +242 -0
  104. data/lib/active_merchant/billing/gateways/nmi.rb +256 -0
  105. data/lib/active_merchant/billing/gateways/ogone.rb +435 -0
  106. data/lib/active_merchant/billing/gateways/openpay.rb +194 -0
  107. data/lib/active_merchant/billing/gateways/optimal_payment.rb +313 -0
  108. data/lib/active_merchant/billing/gateways/orbital.rb +803 -0
  109. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +47 -0
  110. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +207 -0
  111. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  112. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +261 -0
  113. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  114. data/lib/active_merchant/billing/gateways/pay_secure.rb +112 -0
  115. data/lib/active_merchant/billing/gateways/pay_u_latam.rb +462 -0
  116. data/lib/active_merchant/billing/gateways/paybox_direct.rb +188 -0
  117. data/lib/active_merchant/billing/gateways/payex.rb +412 -0
  118. data/lib/active_merchant/billing/gateways/payflow.rb +304 -0
  119. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +209 -0
  120. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  121. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  122. data/lib/active_merchant/billing/gateways/payflow_express.rb +224 -0
  123. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  124. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  125. data/lib/active_merchant/billing/gateways/payment_express.rb +353 -0
  126. data/lib/active_merchant/billing/gateways/paymill.rb +281 -0
  127. data/lib/active_merchant/billing/gateways/paypal.rb +117 -0
  128. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +670 -0
  129. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +65 -0
  130. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  131. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  132. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  133. data/lib/active_merchant/billing/gateways/paypal_express.rb +264 -0
  134. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  135. data/lib/active_merchant/billing/gateways/payscout.rb +162 -0
  136. data/lib/active_merchant/billing/gateways/paystation.rb +199 -0
  137. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  138. data/lib/active_merchant/billing/gateways/pin.rb +197 -0
  139. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  140. data/lib/active_merchant/billing/gateways/psigate.rb +216 -0
  141. data/lib/active_merchant/billing/gateways/psl_card.rb +303 -0
  142. data/lib/active_merchant/billing/gateways/qbms.rb +292 -0
  143. data/lib/active_merchant/billing/gateways/quantum.rb +276 -0
  144. data/lib/active_merchant/billing/gateways/quickpay.rb +367 -0
  145. data/lib/active_merchant/billing/gateways/realex.rb +298 -0
  146. data/lib/active_merchant/billing/gateways/redsys.rb +391 -0
  147. data/lib/active_merchant/billing/gateways/sage.rb +175 -0
  148. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +87 -0
  149. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +114 -0
  150. data/lib/active_merchant/billing/gateways/sage/sage_vault.rb +149 -0
  151. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +102 -0
  152. data/lib/active_merchant/billing/gateways/sage_pay.rb +398 -0
  153. data/lib/active_merchant/billing/gateways/sallie_mae.rb +143 -0
  154. data/lib/active_merchant/billing/gateways/secure_net.rb +252 -0
  155. data/lib/active_merchant/billing/gateways/secure_pay.rb +201 -0
  156. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +281 -0
  157. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +105 -0
  158. data/lib/active_merchant/billing/gateways/skip_jack.rb +452 -0
  159. data/lib/active_merchant/billing/gateways/smart_ps.rb +283 -0
  160. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  161. data/lib/active_merchant/billing/gateways/spreedly_core.rb +247 -0
  162. data/lib/active_merchant/billing/gateways/stripe.rb +411 -0
  163. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +157 -0
  164. data/lib/active_merchant/billing/gateways/tns.rb +227 -0
  165. data/lib/active_merchant/billing/gateways/trans_first.rb +126 -0
  166. data/lib/active_merchant/billing/gateways/transax.rb +23 -0
  167. data/lib/active_merchant/billing/gateways/transnational.rb +10 -0
  168. data/lib/active_merchant/billing/gateways/trust_commerce.rb +416 -0
  169. data/lib/active_merchant/billing/gateways/usa_epay.rb +25 -0
  170. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1516 -0
  171. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +254 -0
  172. data/lib/active_merchant/billing/gateways/verifi.rb +225 -0
  173. data/lib/active_merchant/billing/gateways/viaklix.rb +183 -0
  174. data/lib/active_merchant/billing/gateways/vindicia.rb +385 -0
  175. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  176. data/lib/active_merchant/billing/gateways/wepay.rb +189 -0
  177. data/lib/active_merchant/billing/gateways/wirecard.rb +421 -0
  178. data/lib/active_merchant/billing/gateways/worldpay.rb +331 -0
  179. data/lib/active_merchant/billing/gateways/worldpay_us.rb +181 -0
  180. data/lib/active_merchant/billing/model.rb +30 -0
  181. data/lib/active_merchant/billing/payment_token.rb +21 -0
  182. data/lib/active_merchant/billing/rails.rb +3 -0
  183. data/lib/active_merchant/billing/response.rb +91 -0
  184. data/lib/active_merchant/country.rb +332 -0
  185. data/lib/active_merchant/empty.rb +20 -0
  186. data/lib/active_merchant/errors.rb +29 -0
  187. data/lib/active_merchant/offsite_payments_shim.rb +19 -0
  188. data/lib/active_merchant/version.rb +3 -0
  189. data/lib/activemerchant.rb +1 -0
  190. data/lib/support/gateway_support.rb +71 -0
  191. data/lib/support/outbound_hosts.rb +25 -0
  192. data/lib/support/ssl_verify.rb +93 -0
  193. metadata +400 -0
@@ -0,0 +1,30 @@
1
+ require "active_merchant/billing/compatibility"
2
+ require "active_merchant/empty"
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ class Model
7
+ include Compatibility::Model
8
+ include Empty
9
+
10
+ def initialize(attributes = {})
11
+ attributes.each do |key, value|
12
+ send("#{key}=", value)
13
+ end
14
+ end
15
+
16
+ def validate
17
+ {}
18
+ end
19
+
20
+ private
21
+
22
+ def errors_hash(array)
23
+ array.inject({}) do |hash, (attribute, error)|
24
+ (hash[attribute] ||= []) << error
25
+ hash
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ # Base class representation of cryptographic payment data tokens that may be used for EMV-style transactions
4
+ # like Apple Pay. Payment data may be transmitted via any data type, and may also be padded
5
+ # with metadata specific to the cryptographer. This metadata should be parsed and interpreted in concrete
6
+ # implementations of your given cryptographer. Like credit cards, you must also return a string representing
7
+ # the token's type, like 'apple_pay' or 'stripe' should your target payment gateway process these tokens.
8
+ class PaymentToken
9
+ attr_reader :payment_data, :type
10
+
11
+ def initialize(payment_data, options = {})
12
+ @payment_data = payment_data
13
+ @metadata = options.with_indifferent_access
14
+ end
15
+
16
+ def type
17
+ raise NotImplementedError
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ require "active_merchant/billing/compatibility"
2
+
3
+ ActiveMerchant::Billing::Compatibility.rails_required!
@@ -0,0 +1,91 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class Error < ActiveMerchantError #:nodoc:
4
+ end
5
+
6
+ class Response
7
+ attr_reader :params, :message, :test, :authorization, :avs_result, :cvv_result, :error_code
8
+
9
+ def success?
10
+ @success
11
+ end
12
+
13
+ def test?
14
+ @test
15
+ end
16
+
17
+ def fraud_review?
18
+ @fraud_review
19
+ end
20
+
21
+ def initialize(success, message, params = {}, options = {})
22
+ @success, @message, @params = success, message, params.stringify_keys
23
+ @test = options[:test] || false
24
+ @authorization = options[:authorization]
25
+ @fraud_review = options[:fraud_review]
26
+ @error_code = options[:error_code]
27
+
28
+ @avs_result = if options[:avs_result].kind_of?(AVSResult)
29
+ options[:avs_result].to_hash
30
+ else
31
+ AVSResult.new(options[:avs_result]).to_hash
32
+ end
33
+
34
+ @cvv_result = if options[:cvv_result].kind_of?(CVVResult)
35
+ options[:cvv_result].to_hash
36
+ else
37
+ CVVResult.new(options[:cvv_result]).to_hash
38
+ end
39
+ end
40
+ end
41
+
42
+ class MultiResponse < Response
43
+ def self.run(use_first_response = false, &block)
44
+ new(use_first_response).tap(&block)
45
+ end
46
+
47
+ attr_reader :responses, :primary_response
48
+
49
+ def initialize(use_first_response = false)
50
+ @responses = []
51
+ @use_first_response = use_first_response
52
+ @primary_response = nil
53
+ end
54
+
55
+ def process(ignore_result=false)
56
+ return unless success?
57
+
58
+ response = yield
59
+ self << response
60
+
61
+ unless ignore_result
62
+ if(@use_first_response && response.success?)
63
+ @primary_response ||= response
64
+ else
65
+ @primary_response = response
66
+ end
67
+ end
68
+ end
69
+
70
+ def <<(response)
71
+ if response.is_a?(MultiResponse)
72
+ response.responses.each{|r| @responses << r}
73
+ else
74
+ @responses << response
75
+ end
76
+ end
77
+
78
+ def success?
79
+ (primary_response ? primary_response.success? : true)
80
+ end
81
+
82
+ %w(params message test authorization avs_result cvv_result test? fraud_review?).each do |m|
83
+ class_eval %(
84
+ def #{m}
85
+ (@responses.empty? ? nil : primary_response.#{m})
86
+ end
87
+ )
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,332 @@
1
+ # encoding: utf-8
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ class InvalidCountryCodeError < StandardError
5
+ end
6
+
7
+ class CountryCodeFormatError < StandardError
8
+ end
9
+
10
+ class CountryCode
11
+ attr_reader :value, :format
12
+ def initialize(value)
13
+ @value = value.to_s.upcase
14
+ detect_format
15
+ end
16
+
17
+ def to_s
18
+ value
19
+ end
20
+
21
+ private
22
+
23
+ def detect_format
24
+ case @value
25
+ when /^[[:alpha:]]{2}$/
26
+ @format = :alpha2
27
+ when /^[[:alpha:]]{3}$/
28
+ @format = :alpha3
29
+ when /^[[:digit:]]{3}$/
30
+ @format = :numeric
31
+ else
32
+ raise CountryCodeFormatError, "The country code is not formatted correctly #{@value}"
33
+ end
34
+ end
35
+ end
36
+
37
+ class Country
38
+ attr_reader :name
39
+
40
+ def initialize(options = {})
41
+ @name = options.delete(:name)
42
+ @codes = options.collect{|k,v| CountryCode.new(v)}
43
+ end
44
+
45
+ def code(format)
46
+ @codes.detect{|c| c.format == format}
47
+ end
48
+
49
+ def ==(other)
50
+ if other.class == ActiveMerchant::Country
51
+ (@name == other.name)
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ alias eql? ==
58
+
59
+ def hash
60
+ @name.hash
61
+ end
62
+
63
+ def to_s
64
+ @name
65
+ end
66
+
67
+ COUNTRIES = [
68
+ { alpha2: 'AF', name: 'Afghanistan', alpha3: 'AFG', numeric: '004' },
69
+ { alpha2: 'AL', name: 'Albania', alpha3: 'ALB', numeric: '008' },
70
+ { alpha2: 'DZ', name: 'Algeria', alpha3: 'DZA', numeric: '012' },
71
+ { alpha2: 'AS', name: 'American Samoa', alpha3: 'ASM', numeric: '016' },
72
+ { alpha2: 'AD', name: 'Andorra', alpha3: 'AND', numeric: '020' },
73
+ { alpha2: 'AO', name: 'Angola', alpha3: 'AGO', numeric: '024' },
74
+ { alpha2: 'AI', name: 'Anguilla', alpha3: 'AIA', numeric: '660' },
75
+ { alpha2: 'AG', name: 'Antigua and Barbuda', alpha3: 'ATG', numeric: '028' },
76
+ { alpha2: 'AR', name: 'Argentina', alpha3: 'ARG', numeric: '032' },
77
+ { alpha2: 'AM', name: 'Armenia', alpha3: 'ARM', numeric: '051' },
78
+ { alpha2: 'AW', name: 'Aruba', alpha3: 'ABW', numeric: '533' },
79
+ { alpha2: 'AU', name: 'Australia', alpha3: 'AUS', numeric: '036' },
80
+ { alpha2: 'AT', name: 'Austria', alpha3: 'AUT', numeric: '040' },
81
+ { alpha2: 'AZ', name: 'Azerbaijan', alpha3: 'AZE', numeric: '031' },
82
+ { alpha2: 'BS', name: 'Bahamas', alpha3: 'BHS', numeric: '044' },
83
+ { alpha2: 'BH', name: 'Bahrain', alpha3: 'BHR', numeric: '048' },
84
+ { alpha2: 'BD', name: 'Bangladesh', alpha3: 'BGD', numeric: '050' },
85
+ { alpha2: 'BB', name: 'Barbados', alpha3: 'BRB', numeric: '052' },
86
+ { alpha2: 'BY', name: 'Belarus', alpha3: 'BLR', numeric: '112' },
87
+ { alpha2: 'BE', name: 'Belgium', alpha3: 'BEL', numeric: '056' },
88
+ { alpha2: 'BZ', name: 'Belize', alpha3: 'BLZ', numeric: '084' },
89
+ { alpha2: 'BJ', name: 'Benin', alpha3: 'BEN', numeric: '204' },
90
+ { alpha2: 'BM', name: 'Bermuda', alpha3: 'BMU', numeric: '060' },
91
+ { alpha2: 'BT', name: 'Bhutan', alpha3: 'BTN', numeric: '064' },
92
+ { alpha2: 'BO', name: 'Bolivia', alpha3: 'BOL', numeric: '068' },
93
+ { alpha2: 'BA', name: 'Bosnia and Herzegovina', alpha3: 'BIH', numeric: '070' },
94
+ { alpha2: 'BW', name: 'Botswana', alpha3: 'BWA', numeric: '072' },
95
+ { alpha2: 'BV', name: 'Bouvet Island', alpha3: 'BVD', numeric: '074' },
96
+ { alpha2: 'BR', name: 'Brazil', alpha3: 'BRA', numeric: '076' },
97
+ { alpha2: 'IO', name: 'British Indian Ocean Territory', alpha3: 'IOT', numeric: '086' },
98
+ { alpha2: 'BN', name: 'Brunei Darussalam', alpha3: 'BRN', numeric: '096' },
99
+ { alpha2: 'BG', name: 'Bulgaria', alpha3: 'BGR', numeric: '100' },
100
+ { alpha2: 'BF', name: 'Burkina Faso', alpha3: 'BFA', numeric: '854' },
101
+ { alpha2: 'BI', name: 'Burundi', alpha3: 'BDI', numeric: '108' },
102
+ { alpha2: 'KH', name: 'Cambodia', alpha3: 'KHM', numeric: '116' },
103
+ { alpha2: 'CM', name: 'Cameroon', alpha3: 'CMR', numeric: '120' },
104
+ { alpha2: 'CA', name: 'Canada', alpha3: 'CAN', numeric: '124' },
105
+ { alpha2: 'CV', name: 'Cape Verde', alpha3: 'CPV', numeric: '132' },
106
+ { alpha2: 'KY', name: 'Cayman Islands', alpha3: 'CYM', numeric: '136' },
107
+ { alpha2: 'CF', name: 'Central African Republic', alpha3: 'CAF', numeric: '140' },
108
+ { alpha2: 'TD', name: 'Chad', alpha3: 'TCD', numeric: '148' },
109
+ { alpha2: 'CL', name: 'Chile', alpha3: 'CHL', numeric: '152' },
110
+ { alpha2: 'CN', name: 'China', alpha3: 'CHN', numeric: '156' },
111
+ { alpha2: 'CX', name: 'Christmas Island', alpha3: 'CXR', numeric: '162' },
112
+ { alpha2: 'CC', name: 'Cocos (Keeling) Islands', alpha3: 'CCK', numeric: '166' },
113
+ { alpha2: 'CO', name: 'Colombia', alpha3: 'COL', numeric: '170' },
114
+ { alpha2: 'KM', name: 'Comoros', alpha3: 'COM', numeric: '174' },
115
+ { alpha2: 'CG', name: 'Congo', alpha3: 'COG', numeric: '178' },
116
+ { alpha2: 'CD', name: 'Congo, the Democratic Republic of the', alpha3: 'COD', numeric: '180' },
117
+ { alpha2: 'CK', name: 'Cook Islands', alpha3: 'COK', numeric: '184' },
118
+ { alpha2: 'CR', name: 'Costa Rica', alpha3: 'CRI', numeric: '188' },
119
+ { alpha2: 'CI', name: 'Cote D\'Ivoire', alpha3: 'CIV', numeric: '384' },
120
+ { alpha2: 'HR', name: 'Croatia', alpha3: 'HRV', numeric: '191' },
121
+ { alpha2: 'CU', name: 'Cuba', alpha3: 'CUB', numeric: '192' },
122
+ { alpha2: 'CW', name: 'Curaçao', alpha3: 'CUW', numeric: '531' },
123
+ { alpha2: 'CY', name: 'Cyprus', alpha3: 'CYP', numeric: '196' },
124
+ { alpha2: 'CZ', name: 'Czech Republic', alpha3: 'CZE', numeric: '203' },
125
+ { alpha2: 'DK', name: 'Denmark', alpha3: 'DNK', numeric: '208' },
126
+ { alpha2: 'DJ', name: 'Djibouti', alpha3: 'DJI', numeric: '262' },
127
+ { alpha2: 'DM', name: 'Dominica', alpha3: 'DMA', numeric: '212' },
128
+ { alpha2: 'DO', name: 'Dominican Republic', alpha3: 'DOM', numeric: '214' },
129
+ { alpha2: 'EC', name: 'Ecuador', alpha3: 'ECU', numeric: '218' },
130
+ { alpha2: 'EG', name: 'Egypt', alpha3: 'EGY', numeric: '818' },
131
+ { alpha2: 'SV', name: 'El Salvador', alpha3: 'SLV', numeric: '222' },
132
+ { alpha2: 'GQ', name: 'Equatorial Guinea', alpha3: 'GNQ', numeric: '226' },
133
+ { alpha2: 'ER', name: 'Eritrea', alpha3: 'ERI', numeric: '232' },
134
+ { alpha2: 'EE', name: 'Estonia', alpha3: 'EST', numeric: '233' },
135
+ { alpha2: 'ET', name: 'Ethiopia', alpha3: 'ETH', numeric: '231' },
136
+ { alpha2: 'FK', name: 'Falkland Islands (Malvinas)', alpha3: 'FLK', numeric: '238' },
137
+ { alpha2: 'FO', name: 'Faroe Islands', alpha3: 'FRO', numeric: '234' },
138
+ { alpha2: 'FJ', name: 'Fiji', alpha3: 'FJI', numeric: '242' },
139
+ { alpha2: 'FI', name: 'Finland', alpha3: 'FIN', numeric: '246' },
140
+ { alpha2: 'FR', name: 'France', alpha3: 'FRA', numeric: '250' },
141
+ { alpha2: 'GF', name: 'French Guiana', alpha3: 'GUF', numeric: '254' },
142
+ { alpha2: 'PF', name: 'French Polynesia', alpha3: 'PYF', numeric: '258' },
143
+ { alpha2: 'TF', name: 'French Southern Territories', alpha3: 'ATF', numeric: '260' },
144
+ { alpha2: 'GA', name: 'Gabon', alpha3: 'GAB', numeric: '266' },
145
+ { alpha2: 'GM', name: 'Gambia', alpha3: 'GMB', numeric: '270' },
146
+ { alpha2: 'GE', name: 'Georgia', alpha3: 'GEO', numeric: '268' },
147
+ { alpha2: 'DE', name: 'Germany', alpha3: 'DEU', numeric: '276' },
148
+ { alpha2: 'GH', name: 'Ghana', alpha3: 'GHA', numeric: '288' },
149
+ { alpha2: 'GI', name: 'Gibraltar', alpha3: 'GIB', numeric: '292' },
150
+ { alpha2: 'GR', name: 'Greece', alpha3: 'GRC', numeric: '300' },
151
+ { alpha2: 'GL', name: 'Greenland', alpha3: 'GRL', numeric: '304' },
152
+ { alpha2: 'GD', name: 'Grenada', alpha3: 'GRD', numeric: '308' },
153
+ { alpha2: 'GP', name: 'Guadeloupe', alpha3: 'GLP', numeric: '312' },
154
+ { alpha2: 'GU', name: 'Guam', alpha3: 'GUM', numeric: '316' },
155
+ { alpha2: 'GT', name: 'Guatemala', alpha3: 'GTM', numeric: '320' },
156
+ { alpha2: 'GG', name: 'Guernsey', alpha3: 'GGY', numeric: '831' },
157
+ { alpha2: 'GN', name: 'Guinea', alpha3: 'GIN', numeric: '324' },
158
+ { alpha2: 'GW', name: 'Guinea-Bissau', alpha3: 'GNB', numeric: '624' },
159
+ { alpha2: 'GY', name: 'Guyana', alpha3: 'GUY', numeric: '328' },
160
+ { alpha2: 'HT', name: 'Haiti', alpha3: 'HTI', numeric: '332' },
161
+ { alpha2: 'HM', name: 'Heard Island And Mcdonald Islands', alpha3: 'HMD', numeric: '334' },
162
+ { alpha2: 'VA', name: 'Holy See (Vatican City State)', alpha3: 'VAT', numeric: '336' },
163
+ { alpha2: 'HN', name: 'Honduras', alpha3: 'HND', numeric: '340' },
164
+ { alpha2: 'HK', name: 'Hong Kong', alpha3: 'HKG', numeric: '344' },
165
+ { alpha2: 'HU', name: 'Hungary', alpha3: 'HUN', numeric: '348' },
166
+ { alpha2: 'IS', name: 'Iceland', alpha3: 'ISL', numeric: '352' },
167
+ { alpha2: 'IN', name: 'India', alpha3: 'IND', numeric: '356' },
168
+ { alpha2: 'ID', name: 'Indonesia', alpha3: 'IDN', numeric: '360' },
169
+ { alpha2: 'IR', name: 'Iran, Islamic Republic of', alpha3: 'IRN', numeric: '364' },
170
+ { alpha2: 'IQ', name: 'Iraq', alpha3: 'IRQ', numeric: '368' },
171
+ { alpha2: 'IE', name: 'Ireland', alpha3: 'IRL', numeric: '372' },
172
+ { alpha2: 'IM', name: 'Isle Of Man', alpha3: 'IMN', numeric: '833' },
173
+ { alpha2: 'IL', name: 'Israel', alpha3: 'ISR', numeric: '376' },
174
+ { alpha2: 'IT', name: 'Italy', alpha3: 'ITA', numeric: '380' },
175
+ { alpha2: 'JM', name: 'Jamaica', alpha3: 'JAM', numeric: '388' },
176
+ { alpha2: 'JP', name: 'Japan', alpha3: 'JPN', numeric: '392' },
177
+ { alpha2: 'JE', name: 'Jersey', alpha3: 'JEY', numeric: '832' },
178
+ { alpha2: 'JO', name: 'Jordan', alpha3: 'JOR', numeric: '400' },
179
+ { alpha2: 'KZ', name: 'Kazakhstan', alpha3: 'KAZ', numeric: '398' },
180
+ { alpha2: 'KE', name: 'Kenya', alpha3: 'KEN', numeric: '404' },
181
+ { alpha2: 'KI', name: 'Kiribati', alpha3: 'KIR', numeric: '296' },
182
+ { alpha2: 'KP', name: 'Korea, Democratic People\'s Republic of', alpha3: 'PRK', numeric: '408' },
183
+ { alpha2: 'KR', name: 'Korea, Republic of', alpha3: 'KOR', numeric: '410' },
184
+ { alpha2: 'KV', name: 'Kosovo', alpha3: 'KSV', numeric: '377' },
185
+ { alpha2: 'KW', name: 'Kuwait', alpha3: 'KWT', numeric: '414' },
186
+ { alpha2: 'KG', name: 'Kyrgyzstan', alpha3: 'KGZ', numeric: '417' },
187
+ { alpha2: 'LA', name: 'Lao People\'s Democratic Republic', alpha3: 'LAO', numeric: '418' },
188
+ { alpha2: 'LV', name: 'Latvia', alpha3: 'LVA', numeric: '428' },
189
+ { alpha2: 'LB', name: 'Lebanon', alpha3: 'LBN', numeric: '422' },
190
+ { alpha2: 'LS', name: 'Lesotho', alpha3: 'LSO', numeric: '426' },
191
+ { alpha2: 'LR', name: 'Liberia', alpha3: 'LBR', numeric: '430' },
192
+ { alpha2: 'LY', name: 'Libyan Arab Jamahiriya', alpha3: 'LBY', numeric: '434' },
193
+ { alpha2: 'LI', name: 'Liechtenstein', alpha3: 'LIE', numeric: '438' },
194
+ { alpha2: 'LT', name: 'Lithuania', alpha3: 'LTU', numeric: '440' },
195
+ { alpha2: 'LU', name: 'Luxembourg', alpha3: 'LUX', numeric: '442' },
196
+ { alpha2: 'MO', name: 'Macao', alpha3: 'MAC', numeric: '446' },
197
+ { alpha2: 'MK', name: 'Macedonia, the Former Yugoslav Republic of', alpha3: 'MKD', numeric: '807' },
198
+ { alpha2: 'MG', name: 'Madagascar', alpha3: 'MDG', numeric: '450' },
199
+ { alpha2: 'MW', name: 'Malawi', alpha3: 'MWI', numeric: '454' },
200
+ { alpha2: 'MY', name: 'Malaysia', alpha3: 'MYS', numeric: '458' },
201
+ { alpha2: 'MV', name: 'Maldives', alpha3: 'MDV', numeric: '462' },
202
+ { alpha2: 'ML', name: 'Mali', alpha3: 'MLI', numeric: '466' },
203
+ { alpha2: 'MT', name: 'Malta', alpha3: 'MLT', numeric: '470' },
204
+ { alpha2: 'MH', name: 'Marshall Islands', alpha3: 'MHL', numeric: '584' },
205
+ { alpha2: 'MQ', name: 'Martinique', alpha3: 'MTQ', numeric: '474' },
206
+ { alpha2: 'MR', name: 'Mauritania', alpha3: 'MRT', numeric: '478' },
207
+ { alpha2: 'MU', name: 'Mauritius', alpha3: 'MUS', numeric: '480' },
208
+ { alpha2: 'YT', name: 'Mayotte', alpha3: 'MYT', numeric: '175' },
209
+ { alpha2: 'MX', name: 'Mexico', alpha3: 'MEX', numeric: '484' },
210
+ { alpha2: 'FM', name: 'Micronesia, Federated States of', alpha3: 'FSM', numeric: '583' },
211
+ { alpha2: 'MD', name: 'Moldova, Republic of', alpha3: 'MDA', numeric: '498' },
212
+ { alpha2: 'MC', name: 'Monaco', alpha3: 'MCO', numeric: '492' },
213
+ { alpha2: 'MN', name: 'Mongolia', alpha3: 'MNG', numeric: '496' },
214
+ { alpha2: 'ME', name: 'Montenegro', alpha3: 'MNE', numeric: '499' },
215
+ { alpha2: 'MS', name: 'Montserrat', alpha3: 'MSR', numeric: '500' },
216
+ { alpha2: 'MA', name: 'Morocco', alpha3: 'MAR', numeric: '504' },
217
+ { alpha2: 'MZ', name: 'Mozambique', alpha3: 'MOZ', numeric: '508' },
218
+ { alpha2: 'MM', name: 'Myanmar', alpha3: 'MMR', numeric: '104' },
219
+ { alpha2: 'NA', name: 'Namibia', alpha3: 'NAM', numeric: '516' },
220
+ { alpha2: 'NR', name: 'Nauru', alpha3: 'NRU', numeric: '520' },
221
+ { alpha2: 'NP', name: 'Nepal', alpha3: 'NPL', numeric: '524' },
222
+ { alpha2: 'NL', name: 'Netherlands', alpha3: 'NLD', numeric: '528' },
223
+ { alpha2: 'AN', name: 'Netherlands Antilles', alpha3: 'ANT', numeric: '530' },
224
+ { alpha2: 'NC', name: 'New Caledonia', alpha3: 'NCL', numeric: '540' },
225
+ { alpha2: 'NZ', name: 'New Zealand', alpha3: 'NZL', numeric: '554' },
226
+ { alpha2: 'NI', name: 'Nicaragua', alpha3: 'NIC', numeric: '558' },
227
+ { alpha2: 'NE', name: 'Niger', alpha3: 'NER', numeric: '562' },
228
+ { alpha2: 'NG', name: 'Nigeria', alpha3: 'NGA', numeric: '566' },
229
+ { alpha2: 'NU', name: 'Niue', alpha3: 'NIU', numeric: '570' },
230
+ { alpha2: 'NF', name: 'Norfolk Island', alpha3: 'NFK', numeric: '574' },
231
+ { alpha2: 'MP', name: 'Northern Mariana Islands', alpha3: 'MNP', numeric: '580' },
232
+ { alpha2: 'NO', name: 'Norway', alpha3: 'NOR', numeric: '578' },
233
+ { alpha2: 'OM', name: 'Oman', alpha3: 'OMN', numeric: '512' },
234
+ { alpha2: 'PK', name: 'Pakistan', alpha3: 'PAK', numeric: '586' },
235
+ { alpha2: 'PW', name: 'Palau', alpha3: 'PLW', numeric: '585' },
236
+ { alpha2: 'PS', name: 'Palestinian Territory, Occupied', alpha3: 'PSE', numeric: '275' },
237
+ { alpha2: 'PA', name: 'Panama', alpha3: 'PAN', numeric: '591' },
238
+ { alpha2: 'PG', name: 'Papua New Guinea', alpha3: 'PNG', numeric: '598' },
239
+ { alpha2: 'PY', name: 'Paraguay', alpha3: 'PRY', numeric: '600' },
240
+ { alpha2: 'PE', name: 'Peru', alpha3: 'PER', numeric: '604' },
241
+ { alpha2: 'PH', name: 'Philippines', alpha3: 'PHL', numeric: '608' },
242
+ { alpha2: 'PN', name: 'Pitcairn', alpha3: 'PCN', numeric: '612' },
243
+ { alpha2: 'PL', name: 'Poland', alpha3: 'POL', numeric: '616' },
244
+ { alpha2: 'PT', name: 'Portugal', alpha3: 'PRT', numeric: '620' },
245
+ { alpha2: 'PR', name: 'Puerto Rico', alpha3: 'PRI', numeric: '630' },
246
+ { alpha2: 'QA', name: 'Qatar', alpha3: 'QAT', numeric: '634' },
247
+ { alpha2: 'RE', name: 'Reunion', alpha3: 'REU', numeric: '638' },
248
+ { alpha2: 'RO', name: 'Romania', alpha3: 'ROM', numeric: '642' },
249
+ { alpha2: 'RU', name: 'Russian Federation', alpha3: 'RUS', numeric: '643' },
250
+ { alpha2: 'RW', name: 'Rwanda', alpha3: 'RWA', numeric: '646' },
251
+ { alpha2: 'BL', name: 'Saint Barthélemy', alpha3: 'BLM', numeric: '652' },
252
+ { alpha2: 'SH', name: 'Saint Helena', alpha3: 'SHN', numeric: '654' },
253
+ { alpha2: 'KN', name: 'Saint Kitts and Nevis', alpha3: 'KNA', numeric: '659' },
254
+ { alpha2: 'LC', name: 'Saint Lucia', alpha3: 'LCA', numeric: '662' },
255
+ { alpha2: 'MF', name: 'Saint Martin (French part)', alpha3: 'MAF', numeric: '663' },
256
+ { alpha2: 'PM', name: 'Saint Pierre and Miquelon', alpha3: 'SPM', numeric: '666' },
257
+ { alpha2: 'VC', name: 'Saint Vincent and the Grenadines', alpha3: 'VCT', numeric: '670' },
258
+ { alpha2: 'WS', name: 'Samoa', alpha3: 'WSM', numeric: '882' },
259
+ { alpha2: 'SM', name: 'San Marino', alpha3: 'SMR', numeric: '674' },
260
+ { alpha2: 'ST', name: 'Sao Tome and Principe', alpha3: 'STP', numeric: '678' },
261
+ { alpha2: 'SA', name: 'Saudi Arabia', alpha3: 'SAU', numeric: '682' },
262
+ { alpha2: 'SN', name: 'Senegal', alpha3: 'SEN', numeric: '686' },
263
+ { alpha2: 'RS', name: 'Serbia', alpha3: 'SRB', numeric: '688' },
264
+ { alpha2: 'SC', name: 'Seychelles', alpha3: 'SYC', numeric: '690' },
265
+ { alpha2: 'SL', name: 'Sierra Leone', alpha3: 'SLE', numeric: '694' },
266
+ { alpha2: 'SG', name: 'Singapore', alpha3: 'SGP', numeric: '702' },
267
+ { alpha2: 'SK', name: 'Slovakia', alpha3: 'SVK', numeric: '703' },
268
+ { alpha2: 'SI', name: 'Slovenia', alpha3: 'SVN', numeric: '705' },
269
+ { alpha2: 'SB', name: 'Solomon Islands', alpha3: 'SLB', numeric: '090' },
270
+ { alpha2: 'SO', name: 'Somalia', alpha3: 'SOM', numeric: '706' },
271
+ { alpha2: 'ZA', name: 'South Africa', alpha3: 'ZAF', numeric: '710' },
272
+ { alpha2: 'GS', name: 'South Georgia and the South Sandwich Islands', alpha3: 'SGS', numeric: '239' },
273
+ { alpha2: 'ES', name: 'Spain', alpha3: 'ESP', numeric: '724' },
274
+ { alpha2: 'LK', name: 'Sri Lanka', alpha3: 'LKA', numeric: '144' },
275
+ { alpha2: 'SD', name: 'Sudan', alpha3: 'SDN', numeric: '736' },
276
+ { alpha2: 'SR', name: 'Suriname', alpha3: 'SUR', numeric: '740' },
277
+ { alpha2: 'SJ', name: 'Svalbard and Jan Mayen', alpha3: 'SJM', numeric: '744' },
278
+ { alpha2: 'SZ', name: 'Swaziland', alpha3: 'SWZ', numeric: '748' },
279
+ { alpha2: 'SE', name: 'Sweden', alpha3: 'SWE', numeric: '752' },
280
+ { alpha2: 'CH', name: 'Switzerland', alpha3: 'CHE', numeric: '756' },
281
+ { alpha2: 'SY', name: 'Syrian Arab Republic', alpha3: 'SYR', numeric: '760' },
282
+ { alpha2: 'TW', name: 'Taiwan, Province of China', alpha3: 'TWN', numeric: '158' },
283
+ { alpha2: 'TJ', name: 'Tajikistan', alpha3: 'TJK', numeric: '762' },
284
+ { alpha2: 'TZ', name: 'Tanzania, United Republic of', alpha3: 'TZA', numeric: '834' },
285
+ { alpha2: 'TH', name: 'Thailand', alpha3: 'THA', numeric: '764' },
286
+ { alpha2: 'TL', name: 'Timor Leste', alpha3: 'TLS', numeric: '626' },
287
+ { alpha2: 'TG', name: 'Togo', alpha3: 'TGO', numeric: '768' },
288
+ { alpha2: 'TK', name: 'Tokelau', alpha3: 'TKL', numeric: '772' },
289
+ { alpha2: 'TO', name: 'Tonga', alpha3: 'TON', numeric: '776' },
290
+ { alpha2: 'TT', name: 'Trinidad and Tobago', alpha3: 'TTO', numeric: '780' },
291
+ { alpha2: 'TN', name: 'Tunisia', alpha3: 'TUN', numeric: '788' },
292
+ { alpha2: 'TR', name: 'Turkey', alpha3: 'TUR', numeric: '792' },
293
+ { alpha2: 'TM', name: 'Turkmenistan', alpha3: 'TKM', numeric: '795' },
294
+ { alpha2: 'TC', name: 'Turks and Caicos Islands', alpha3: 'TCA', numeric: '796' },
295
+ { alpha2: 'TV', name: 'Tuvalu', alpha3: 'TUV', numeric: '798' },
296
+ { alpha2: 'UG', name: 'Uganda', alpha3: 'UGA', numeric: '800' },
297
+ { alpha2: 'UA', name: 'Ukraine', alpha3: 'UKR', numeric: '804' },
298
+ { alpha2: 'AE', name: 'United Arab Emirates', alpha3: 'ARE', numeric: '784' },
299
+ { alpha2: 'GB', name: 'United Kingdom', alpha3: 'GBR', numeric: '826' },
300
+ { alpha2: 'US', name: 'United States', alpha3: 'USA', numeric: '840' },
301
+ { alpha2: 'UM', name: 'United States Minor Outlying Islands', alpha3: 'UMI', numeric: '581' },
302
+ { alpha2: 'UY', name: 'Uruguay', alpha3: 'URY', numeric: '858' },
303
+ { alpha2: 'UZ', name: 'Uzbekistan', alpha3: 'UZB', numeric: '860' },
304
+ { alpha2: 'VU', name: 'Vanuatu', alpha3: 'VUT', numeric: '548' },
305
+ { alpha2: 'VE', name: 'Venezuela', alpha3: 'VEN', numeric: '862' },
306
+ { alpha2: 'VN', name: 'Viet Nam', alpha3: 'VNM', numeric: '704' },
307
+ { alpha2: 'VG', name: 'Virgin Islands, British', alpha3: 'VGB', numeric: '092' },
308
+ { alpha2: 'VI', name: 'Virgin Islands, U.S.', alpha3: 'VIR', numeric: '850' },
309
+ { alpha2: 'WF', name: 'Wallis and Futuna', alpha3: 'WLF', numeric: '876' },
310
+ { alpha2: 'EH', name: 'Western Sahara', alpha3: 'ESH', numeric: '732' },
311
+ { alpha2: 'YE', name: 'Yemen', alpha3: 'YEM', numeric: '887' },
312
+ { alpha2: 'ZM', name: 'Zambia', alpha3: 'ZMB', numeric: '894' },
313
+ { alpha2: 'ZW', name: 'Zimbabwe', alpha3: 'ZWE', numeric: '716' },
314
+ { alpha2: 'AX', name: 'Åland Islands', alpha3: 'ALA', numeric: '248' }
315
+ ]
316
+
317
+ def self.find(name)
318
+ raise InvalidCountryCodeError, "Cannot lookup country for an empty name" if name.blank?
319
+
320
+ case name.length
321
+ when 2, 3
322
+ upcase_name = name.upcase
323
+ country_code = CountryCode.new(name)
324
+ country = COUNTRIES.detect{|c| c[country_code.format] == upcase_name }
325
+ else
326
+ country = COUNTRIES.detect{|c| c[:name] == name }
327
+ end
328
+ raise InvalidCountryCodeError, "No country could be found for the country #{name}" if country.nil?
329
+ Country.new(country.dup)
330
+ end
331
+ end
332
+ end