snail 0.5.7 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/snail.rb +55 -32
- data/lib/snail/constants.rb +513 -1
- data/test/snail_test.rb +37 -3
- metadata +25 -44
data/lib/snail.rb
CHANGED
@@ -11,10 +11,10 @@ end
|
|
11
11
|
|
12
12
|
class Snail
|
13
13
|
include Configurable
|
14
|
-
|
14
|
+
|
15
15
|
# this will be raised whenever formatting or validation is run on an unsupported or unknown country
|
16
16
|
class UnknownCountryError < ArgumentError; end
|
17
|
-
|
17
|
+
|
18
18
|
# My made-up standard fields.
|
19
19
|
attr_accessor :name
|
20
20
|
attr_accessor :line_1
|
@@ -23,7 +23,7 @@ class Snail
|
|
23
23
|
attr_accessor :region
|
24
24
|
attr_accessor :postal_code
|
25
25
|
attr_accessor :country
|
26
|
-
|
26
|
+
|
27
27
|
# Aliases for easier assignment compatibility
|
28
28
|
{
|
29
29
|
:full_name => :name,
|
@@ -39,64 +39,86 @@ class Snail
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.home_country
|
42
|
-
@home_country ||= "
|
42
|
+
@home_country ||= "US"
|
43
43
|
end
|
44
44
|
|
45
45
|
def self.home_country=(val)
|
46
|
-
@home_country = val
|
46
|
+
@home_country = lookup_country_iso(val)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.lookup_country_iso(val)
|
50
|
+
return nil if val.blank?
|
51
|
+
val = val.upcase
|
52
|
+
if ::Snail::Iso3166::ALPHA2[val]
|
53
|
+
val
|
54
|
+
elsif iso = ::Snail::Iso3166::ALPHA2_EXCEPTIONS[val]
|
55
|
+
iso
|
56
|
+
elsif iso = ::Snail::Iso3166::ALPHA3_TO_ALPHA2[val]
|
57
|
+
iso
|
58
|
+
elsif iso_pair = ::Snail::Iso3166::ALPHA2.find { |a2, names| names.include?(val) }
|
59
|
+
ActiveSupport::Deprecation.warn("Country name lookup will be deprecated in the near future. Please pass ISO3166 country codes to Snail instead.", caller)
|
60
|
+
iso_pair.first
|
61
|
+
else
|
62
|
+
nil
|
63
|
+
end
|
47
64
|
end
|
48
|
-
|
65
|
+
|
66
|
+
# Store country as ISO-3166 Alpha 2
|
67
|
+
def country=(val)
|
68
|
+
@country = Snail.lookup_country_iso(val)
|
69
|
+
end
|
70
|
+
|
49
71
|
def to_s
|
50
72
|
[name, line_1, line_2, city_line, country_line].select{|line| !(line.nil? or line.empty?)}.join("\n")
|
51
73
|
end
|
52
|
-
|
53
|
-
def to_html
|
74
|
+
|
75
|
+
def to_html
|
54
76
|
"<address>#{CGI.escapeHTML(to_s).gsub("\n", '<br />')}</address>".html_safe
|
55
77
|
end
|
56
|
-
|
78
|
+
|
57
79
|
# this method will get much larger. completeness is out of my scope at this time.
|
58
80
|
# currently it's based on the sampling of city line formats from frank's compulsive guide.
|
59
81
|
def city_line
|
60
82
|
case country
|
61
|
-
when '
|
83
|
+
when 'CN', 'IN'
|
62
84
|
"#{city}, #{region} #{postal_code}"
|
63
|
-
when '
|
85
|
+
when 'BR'
|
64
86
|
"#{postal_code} #{city}-#{region}"
|
65
|
-
when '
|
87
|
+
when 'MX', 'SK'
|
66
88
|
"#{postal_code} #{city}, #{region}"
|
67
|
-
when '
|
89
|
+
when 'IT'
|
68
90
|
"#{postal_code} #{city} (#{region})"
|
69
|
-
when '
|
91
|
+
when 'BY'
|
70
92
|
"#{postal_code} #{city}-(#{region})"
|
71
|
-
when '
|
93
|
+
when 'US', 'CA', 'AU', nil, ""
|
72
94
|
"#{city} #{region} #{postal_code}"
|
73
|
-
when '
|
95
|
+
when 'IL', 'DK', 'FI', 'FR', 'DE', 'GR', 'IT', 'NO', 'ES', 'SE', 'TR', 'CY', 'PT', 'MK', 'BA'
|
74
96
|
"#{postal_code} #{city}"
|
75
|
-
when '
|
97
|
+
when 'KW', 'SY', 'OM', 'EE', 'LU', 'BE', 'IS', 'CH', 'AT', 'MD', 'ME', 'RS', 'BG', 'GE', 'PL', 'AM', 'HR', 'RO', 'AZ'
|
76
98
|
"#{postal_code} #{city}"
|
77
|
-
when '
|
78
|
-
"#{postal_code}
|
79
|
-
when '
|
99
|
+
when 'NL'
|
100
|
+
"#{postal_code} #{city}"
|
101
|
+
when 'IE'
|
80
102
|
"#{city}, #{region}"
|
81
|
-
when '
|
103
|
+
when 'GB', 'RU', 'UA', 'JO', 'LB', 'IR', 'SA', 'NZ'
|
82
104
|
"#{city} #{postal_code}" # Locally these may be on separate lines. The USPS prefers the city line above the country line, though.
|
83
|
-
when '
|
105
|
+
when 'EC'
|
84
106
|
"#{postal_code} #{city}"
|
85
|
-
when '
|
107
|
+
when 'HK', 'IQ', 'YE', 'QA', 'AL'
|
86
108
|
"#{city}"
|
87
|
-
when '
|
109
|
+
when 'AE'
|
88
110
|
"#{postal_code}\n#{city}"
|
89
|
-
when '
|
111
|
+
when 'JP'
|
90
112
|
"#{city}, #{region}\n#{postal_code}"
|
91
|
-
when '
|
113
|
+
when 'EG', 'ZA', 'IM', 'KZ', 'HU'
|
92
114
|
"#{city}\n#{postal_code}"
|
93
|
-
when '
|
115
|
+
when 'LV'
|
94
116
|
"#{city}, LV-#{postal_code}"
|
95
|
-
when '
|
117
|
+
when 'LT'
|
96
118
|
"LT-#{postal_code} #{city}"
|
97
|
-
when '
|
119
|
+
when 'SI'
|
98
120
|
"SI-#{postal_code} #{city}"
|
99
|
-
when '
|
121
|
+
when 'CZ'
|
100
122
|
"#{postal_code} #{region}\n#{city}"
|
101
123
|
else
|
102
124
|
if Kernel.const_defined?("Rails")
|
@@ -105,8 +127,9 @@ class Snail
|
|
105
127
|
"#{city} #{region} #{postal_code}"
|
106
128
|
end
|
107
129
|
end
|
108
|
-
|
130
|
+
|
131
|
+
# TODO after country name lookup deprecation, add localized country names to this
|
109
132
|
def country_line
|
110
|
-
|
133
|
+
::Snail::Iso3166::ALPHA2[country].first if country and self.class.home_country != country
|
111
134
|
end
|
112
135
|
end
|
data/lib/snail/constants.rb
CHANGED
@@ -112,6 +112,7 @@ class Snail
|
|
112
112
|
'Kenya',
|
113
113
|
'Kiribati',
|
114
114
|
'Korea',
|
115
|
+
'Kosovo',
|
115
116
|
'Kuwait',
|
116
117
|
'Kyrgyzstan',
|
117
118
|
'Laos',
|
@@ -172,7 +173,7 @@ class Snail
|
|
172
173
|
'Republic of the Congo',
|
173
174
|
'Reunion',
|
174
175
|
'Romania',
|
175
|
-
'
|
176
|
+
'Russian Federation',
|
176
177
|
'Rwanda',
|
177
178
|
'Saint Helena',
|
178
179
|
'Saint Kitts and Nevis',
|
@@ -194,6 +195,7 @@ class Snail
|
|
194
195
|
'Somalia',
|
195
196
|
'South Africa',
|
196
197
|
'South Georgia',
|
198
|
+
'South Sudan',
|
197
199
|
'Spain',
|
198
200
|
'Sri Lanka',
|
199
201
|
'Sudan',
|
@@ -333,6 +335,7 @@ class Snail
|
|
333
335
|
"Armed Forces Europe" => "AE",
|
334
336
|
"Armed Forces Middle East" => "AE",
|
335
337
|
"Armed Forces Pacific" => "AP",
|
338
|
+
"Australia" => "AQ"
|
336
339
|
}
|
337
340
|
}
|
338
341
|
|
@@ -342,5 +345,514 @@ class Snail
|
|
342
345
|
CA_PROVINCES = REGIONS[:ca]
|
343
346
|
AU_REGIONS = REGIONS[:au]
|
344
347
|
|
348
|
+
module Iso3166
|
349
|
+
# as of June 3rd, 2010
|
350
|
+
# pulled http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
|
351
|
+
ALPHA2 = {
|
352
|
+
'AD' => ["ANDORRA"],
|
353
|
+
'AE' => ["UNITED ARAB EMIRATES"],
|
354
|
+
'AF' => ["AFGHANISTAN"],
|
355
|
+
'AG' => ["ANTIGUA AND BARBUDA"],
|
356
|
+
'AI' => ["ANGUILLA"],
|
357
|
+
'AL' => ["ALBANIA"],
|
358
|
+
'AM' => ["ARMENIA"],
|
359
|
+
'AN' => ["NETHERLANDS ANTILLES"],
|
360
|
+
'AO' => ["ANGOLA"],
|
361
|
+
'AQ' => ["ANTARCTICA"],
|
362
|
+
'AR' => ["ARGENTINA"],
|
363
|
+
'AS' => ["AMERICAN SAMOA"],
|
364
|
+
'AT' => ["AUSTRIA"],
|
365
|
+
'AU' => ["AUSTRALIA"],
|
366
|
+
'AW' => ["ARUBA"],
|
367
|
+
'AX' => ["ALAND ISLANDS"],
|
368
|
+
'AZ' => ["AZERBAIJAN"],
|
369
|
+
'BA' => ["BOSNIA AND HERZEGOVINA"],
|
370
|
+
'BB' => ["BARBADOS"],
|
371
|
+
'BD' => ["BANGLADESH"],
|
372
|
+
'BE' => ["BELGIUM"],
|
373
|
+
'BF' => ["BURKINA FASO"],
|
374
|
+
'BG' => ["BULGARIA"],
|
375
|
+
'BH' => ["BAHRAIN"],
|
376
|
+
'BI' => ["BURUNDI"],
|
377
|
+
'BJ' => ["BENIN"],
|
378
|
+
'BL' => ["SAINT BARTHELEMY"],
|
379
|
+
'BM' => ["BERMUDA"],
|
380
|
+
'BN' => ["BRUNEI DARUSSALAM"],
|
381
|
+
'BO' => ["BOLIVIA"],
|
382
|
+
'BR' => ["BRAZIL"],
|
383
|
+
'BS' => ["BAHAMAS"],
|
384
|
+
'BT' => ["BHUTAN"],
|
385
|
+
'BV' => ["BOUVET ISLAND"],
|
386
|
+
'BW' => ["BOTSWANA"],
|
387
|
+
'BY' => ["BELARUS"],
|
388
|
+
'BZ' => ["BELIZE"],
|
389
|
+
'CA' => ["CANADA"],
|
390
|
+
'CC' => ["COCOS (KEELING) ISLANDS"],
|
391
|
+
'CD' => ["DEMOCRATIC REPUBLIC OF THE CONGO"],
|
392
|
+
'CF' => ["CENTRAL AFRICAN REPUBLIC"],
|
393
|
+
'CG' => ["CONGO", "REPUBLIC OF THE CONGO"],
|
394
|
+
'CH' => ["SWITZERLAND"],
|
395
|
+
'CI' => ["COTE D'IVOIRE"],
|
396
|
+
'CK' => ["COOK ISLANDS"],
|
397
|
+
'CL' => ["CHILE"],
|
398
|
+
'CM' => ["CAMEROON"],
|
399
|
+
'CN' => ["CHINA", "PEOPLE'S REPUBLIC OF CHINA"],
|
400
|
+
'CO' => ["COLOMBIA"],
|
401
|
+
'CR' => ["COSTA RICA"],
|
402
|
+
'CU' => ["CUBA"],
|
403
|
+
'CV' => ["CAPE VERDE"],
|
404
|
+
'CX' => ["CHRISTMAS ISLAND"],
|
405
|
+
'CY' => ["CYPRUS"],
|
406
|
+
'CZ' => ["CZECH REPUBLIC"],
|
407
|
+
'DE' => ["GERMANY"],
|
408
|
+
'DJ' => ["DJIBOUTI"],
|
409
|
+
'DK' => ["DENMARK"],
|
410
|
+
'DM' => ["DOMINICA"],
|
411
|
+
'DO' => ["DOMINICAN REPUBLIC"],
|
412
|
+
'DZ' => ["ALGERIA"],
|
413
|
+
'EC' => ["ECUADOR"],
|
414
|
+
'EE' => ["ESTONIA"],
|
415
|
+
'EG' => ["EGYPT"],
|
416
|
+
'EH' => ["WESTERN SAHARA"],
|
417
|
+
'ER' => ["ERITREA"],
|
418
|
+
'ES' => ["SPAIN"],
|
419
|
+
'ET' => ["ETHIOPIA"],
|
420
|
+
'FI' => ["FINLAND"],
|
421
|
+
'FJ' => ["FIJI"],
|
422
|
+
'FK' => ["FALKLAND ISLANDS"],
|
423
|
+
'FM' => ["MICRONESIA"],
|
424
|
+
'FO' => ["FAROE ISLANDS"],
|
425
|
+
'FR' => ["FRANCE"],
|
426
|
+
'GA' => ["GABON"],
|
427
|
+
'GB' => ["UNITED KINGDOM", "ENGLAND", "NORTHERN IRELAND", "SCOTLAND", "WALES"],
|
428
|
+
'GD' => ["GRENADA"],
|
429
|
+
'GE' => ["GEORGIA"],
|
430
|
+
'GF' => ["FRENCH GUIANA"],
|
431
|
+
'GG' => ["GUERNSEY"],
|
432
|
+
'GH' => ["GHANA"],
|
433
|
+
'GI' => ["GIBRALTAR"],
|
434
|
+
'GL' => ["GREENLAND"],
|
435
|
+
'GM' => ["GAMBIA"],
|
436
|
+
'GN' => ["GUINEA"],
|
437
|
+
'GP' => ["GUADELOUPE"],
|
438
|
+
'GQ' => ["EQUATORIAL GUINEA"],
|
439
|
+
'GR' => ["GREECE"],
|
440
|
+
'GS' => ["SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS"],
|
441
|
+
'GT' => ["GUATEMALA"],
|
442
|
+
'GU' => ["GUAM"],
|
443
|
+
'GW' => ["GUINEA-BISSAU"],
|
444
|
+
'GY' => ["GUYANA"],
|
445
|
+
'HK' => ["HONG KONG"],
|
446
|
+
'HM' => ["HEARD ISLAND AND MCDONALD ISLANDS"],
|
447
|
+
'HN' => ["HONDURAS"],
|
448
|
+
'HR' => ["CROATIA"],
|
449
|
+
'HT' => ["HAITI"],
|
450
|
+
'HU' => ["HUNGARY"],
|
451
|
+
'ID' => ["INDONESIA"],
|
452
|
+
'IE' => ["IRELAND"],
|
453
|
+
'IL' => ["ISRAEL"],
|
454
|
+
'IM' => ["ISLE OF MAN"],
|
455
|
+
'IN' => ["INDIA"],
|
456
|
+
'IO' => ["BRITISH INDIAN OCEAN TERRITORY"],
|
457
|
+
'IQ' => ["IRAQ"],
|
458
|
+
'IR' => ["IRAN", "ISLAMIC REPUBLIC OF IRAN"],
|
459
|
+
'IS' => ["ICELAND"],
|
460
|
+
'IT' => ["ITALY"],
|
461
|
+
'JE' => ["JERSEY"],
|
462
|
+
'JM' => ["JAMAICA"],
|
463
|
+
'JO' => ["JORDAN"],
|
464
|
+
'JP' => ["JAPAN"],
|
465
|
+
'KE' => ["KENYA"],
|
466
|
+
'KG' => ["KYRGYZSTAN"],
|
467
|
+
'KH' => ["CAMBODIA"],
|
468
|
+
'KI' => ["KIRIBATI"],
|
469
|
+
'KM' => ["COMOROS"],
|
470
|
+
'KN' => ["SAINT KITTS AND NEVIS"],
|
471
|
+
'KP' => ["NORTH KOREA", "DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA"],
|
472
|
+
'KR' => ["SOUTH KOREA", "KOREA", "REPUBLIC OF KOREA"],
|
473
|
+
'KW' => ["KUWAIT"],
|
474
|
+
'KY' => ["CAYMAN ISLANDS"],
|
475
|
+
'KZ' => ["KAZAKHSTAN"],
|
476
|
+
'LA' => ["LAOS"],
|
477
|
+
'LB' => ["LEBANON"],
|
478
|
+
'LC' => ["SAINT LUCIA"],
|
479
|
+
'LI' => ["LIECHTENSTEIN"],
|
480
|
+
'LK' => ["SRI LANKA"],
|
481
|
+
'LR' => ["LIBERIA"],
|
482
|
+
'LS' => ["LESOTHO"],
|
483
|
+
'LT' => ["LITHUANIA"],
|
484
|
+
'LU' => ["LUXEMBOURG"],
|
485
|
+
'LV' => ["LATVIA"],
|
486
|
+
'LY' => ["LIBYAN ARAB JAMAHIRIYA"],
|
487
|
+
'MA' => ["MOROCCO"],
|
488
|
+
'MC' => ["MONACO"],
|
489
|
+
'MD' => ["MOLDOVA"],
|
490
|
+
'ME' => ["MONTENEGRO"],
|
491
|
+
'MF' => ["SAINT MARTIN"],
|
492
|
+
'MG' => ["MADAGASCAR"],
|
493
|
+
'MH' => ["MARSHALL ISLANDS"],
|
494
|
+
'MK' => ["MACEDONIA"],
|
495
|
+
'ML' => ["MALI"],
|
496
|
+
'MM' => ["MYANMAR"],
|
497
|
+
'MN' => ["MONGOLIA"],
|
498
|
+
'MO' => ["MACAO"],
|
499
|
+
'MP' => ["NORTHERN MARIANA ISLANDS"],
|
500
|
+
'MQ' => ["MARTINIQUE"],
|
501
|
+
'MR' => ["MAURITANIA"],
|
502
|
+
'MS' => ["MONTSERRAT"],
|
503
|
+
'MT' => ["MALTA"],
|
504
|
+
'MU' => ["MAURITIUS"],
|
505
|
+
'MV' => ["MALDIVES"],
|
506
|
+
'MW' => ["MALAWI"],
|
507
|
+
'MX' => ["MEXICO"],
|
508
|
+
'MY' => ["MALAYSIA"],
|
509
|
+
'MZ' => ["MOZAMBIQUE"],
|
510
|
+
'NA' => ["NAMIBIA"],
|
511
|
+
'NC' => ["NEW CALEDONIA"],
|
512
|
+
'NE' => ["NIGER"],
|
513
|
+
'NF' => ["NORFOLK ISLAND"],
|
514
|
+
'NG' => ["NIGERIA"],
|
515
|
+
'NI' => ["NICARAGUA"],
|
516
|
+
'NL' => ["NETHERLANDS"],
|
517
|
+
'NO' => ["NORWAY"],
|
518
|
+
'NP' => ["NEPAL"],
|
519
|
+
'NR' => ["NAURU"],
|
520
|
+
'NU' => ["NIUE"],
|
521
|
+
'NZ' => ["NEW ZEALAND"],
|
522
|
+
'OM' => ["OMAN"],
|
523
|
+
'PA' => ["PANAMA"],
|
524
|
+
'PE' => ["PERU"],
|
525
|
+
'PF' => ["FRENCH POLYNESIA"],
|
526
|
+
'PG' => ["PAPUA NEW GUINEA"],
|
527
|
+
'PH' => ["PHILIPPINES"],
|
528
|
+
'PK' => ["PAKISTAN"],
|
529
|
+
'PL' => ["POLAND"],
|
530
|
+
'PM' => ["SAINT PIERRE AND MIQUELON"],
|
531
|
+
'PN' => ["PITCAIRN"],
|
532
|
+
'PR' => ["PUERTO RICO"],
|
533
|
+
'PS' => ["PALESTINIAN TERRITORIES"],
|
534
|
+
'PT' => ["PORTUGAL"],
|
535
|
+
'PW' => ["PALAU"],
|
536
|
+
'PY' => ["PARAGUAY"],
|
537
|
+
'QA' => ["QATAR"],
|
538
|
+
'RE' => ["REUNION"],
|
539
|
+
'RO' => ["ROMANIA"],
|
540
|
+
'RS' => ["SERBIA"],
|
541
|
+
'RU' => ["RUSSIAN FEDERATION", "RUSSIA"],
|
542
|
+
'RW' => ["RWANDA"],
|
543
|
+
'SA' => ["SAUDI ARABIA"],
|
544
|
+
'SB' => ["SOLOMON ISLANDS"],
|
545
|
+
'SC' => ["SEYCHELLES"],
|
546
|
+
'SD' => ["SUDAN"],
|
547
|
+
'SE' => ["SWEDEN"],
|
548
|
+
'SG' => ["SINGAPORE"],
|
549
|
+
'SH' => ["SAINT HELENA"],
|
550
|
+
'SI' => ["SLOVENIA"],
|
551
|
+
'SJ' => ["SVALBARD AND JAN MAYEN"],
|
552
|
+
'SK' => ["SLOVAKIA"],
|
553
|
+
'SL' => ["SIERRA LEONE"],
|
554
|
+
'SM' => ["SAN MARINO"],
|
555
|
+
'SN' => ["SENEGAL"],
|
556
|
+
'SO' => ["SOMALIA"],
|
557
|
+
'SR' => ["SURINAME"],
|
558
|
+
'SS' => ["SOUTH SUDAN"],
|
559
|
+
'ST' => ["SAO TOME AND PRINCIPE"],
|
560
|
+
'SV' => ["EL SALVADOR"],
|
561
|
+
'SY' => ["SYRIAN ARAB REPUBLIC", "SYRIA"],
|
562
|
+
'SZ' => ["SWAZILAND"],
|
563
|
+
'TC' => ["TURKS AND CAICOS ISLANDS"],
|
564
|
+
'TD' => ["CHAD"],
|
565
|
+
'TF' => ["FRENCH SOUTHERN TERRITORIES"],
|
566
|
+
'TG' => ["TOGO"],
|
567
|
+
'TH' => ["THAILAND"],
|
568
|
+
'TJ' => ["TAJIKISTAN"],
|
569
|
+
'TK' => ["TOKELAU"],
|
570
|
+
'TL' => ["TIMOR-LESTE"],
|
571
|
+
'TM' => ["TURKMENISTAN"],
|
572
|
+
'TN' => ["TUNISIA"],
|
573
|
+
'TO' => ["TONGA"],
|
574
|
+
'TR' => ["TURKEY"],
|
575
|
+
'TT' => ["TRINIDAD AND TOBAGO"],
|
576
|
+
'TV' => ["TUVALU"],
|
577
|
+
'TW' => ["TAIWAN"],
|
578
|
+
'TZ' => ["TANZANIA"],
|
579
|
+
'UA' => ["UKRAINE"],
|
580
|
+
'UG' => ["UGANDA"],
|
581
|
+
'UM' => ["UNITED STATES MINOR OUTLYING ISLANDS"],
|
582
|
+
'US' => ["UNITED STATES", "UNITED STATES OF AMERICA"],
|
583
|
+
'UY' => ["URUGUAY"],
|
584
|
+
'UZ' => ["UZBEKISTAN"],
|
585
|
+
'VA' => ["VATICAN CITY"],
|
586
|
+
'VC' => ["SAINT VINCENT AND THE GRENADINES"],
|
587
|
+
'VE' => ["VENEZUELA"],
|
588
|
+
'VG' => ["VIRGIN ISLANDS, BRITISH"],
|
589
|
+
'VI' => ["VIRGIN ISLANDS, U.S."],
|
590
|
+
'VN' => ["VIET NAM"],
|
591
|
+
'VU' => ["VANUATU"],
|
592
|
+
'WF' => ["WALLIS AND FUTUNA"],
|
593
|
+
'WS' => ["SAMOA"],
|
594
|
+
'YE' => ["YEMEN"],
|
595
|
+
'YT' => ["MAYOTTE"],
|
596
|
+
'ZA' => ["SOUTH AFRICA"],
|
597
|
+
'ZM' => ["ZAMBIA"],
|
598
|
+
'ZW' => ["ZIMBABWE"]
|
599
|
+
}
|
600
|
+
|
601
|
+
ALPHA2_EXCEPTIONS = {
|
602
|
+
'UK' => 'GB', # great britain aka united kingdom
|
603
|
+
'FX' => 'FR', # france
|
604
|
+
'SU' => 'RU' # russia
|
605
|
+
}
|
606
|
+
|
607
|
+
ALPHA3_TO_ALPHA2 = {
|
608
|
+
"ABW" => "AW",
|
609
|
+
"AFG" => "AF",
|
610
|
+
"AGO" => "AO",
|
611
|
+
"AIA" => "AI",
|
612
|
+
"ALA" => "AX",
|
613
|
+
"ALB" => "AL",
|
614
|
+
"AND" => "AD",
|
615
|
+
"ANT" => "AN",
|
616
|
+
"ARE" => "AE",
|
617
|
+
"ARG" => "AR",
|
618
|
+
"ARM" => "AM",
|
619
|
+
"ASM" => "AS",
|
620
|
+
"ATA" => "AQ",
|
621
|
+
"ATF" => "TF",
|
622
|
+
"ATG" => "AG",
|
623
|
+
"AUS" => "AU",
|
624
|
+
"AUT" => "AT",
|
625
|
+
"AZE" => "AZ",
|
626
|
+
"BDI" => "BI",
|
627
|
+
"BEL" => "BE",
|
628
|
+
"BEN" => "BJ",
|
629
|
+
"BFA" => "BF",
|
630
|
+
"BGD" => "BD",
|
631
|
+
"BGR" => "BG",
|
632
|
+
"BHR" => "BH",
|
633
|
+
"BHS" => "BS",
|
634
|
+
"BIH" => "BA",
|
635
|
+
"BLM" => "BL",
|
636
|
+
"BLR" => "BY",
|
637
|
+
"BLZ" => "BZ",
|
638
|
+
"BMU" => "BM",
|
639
|
+
"BOL" => "BO",
|
640
|
+
"BRA" => "BR",
|
641
|
+
"BRB" => "BB",
|
642
|
+
"BRN" => "BN",
|
643
|
+
"BTN" => "BT",
|
644
|
+
"BVT" => "BV",
|
645
|
+
"BWA" => "BW",
|
646
|
+
"CAF" => "CF",
|
647
|
+
"CAN" => "CA",
|
648
|
+
"CCK" => "CC",
|
649
|
+
"CHE" => "CH",
|
650
|
+
"CHL" => "CL",
|
651
|
+
"CHN" => "CN",
|
652
|
+
"CIV" => "CI",
|
653
|
+
"CMR" => "CM",
|
654
|
+
"COD" => "CD",
|
655
|
+
"COG" => "CG",
|
656
|
+
"COK" => "CK",
|
657
|
+
"COL" => "CO",
|
658
|
+
"COM" => "KM",
|
659
|
+
"CPV" => "CV",
|
660
|
+
"CRI" => "CR",
|
661
|
+
"CUB" => "CU",
|
662
|
+
"CXR" => "CX",
|
663
|
+
"CYM" => "KY",
|
664
|
+
"CYP" => "CY",
|
665
|
+
"CZE" => "CZ",
|
666
|
+
"DEU" => "DE",
|
667
|
+
"DJI" => "DJ",
|
668
|
+
"DMA" => "DM",
|
669
|
+
"DNK" => "DK",
|
670
|
+
"DOM" => "DO",
|
671
|
+
"DZA" => "DZ",
|
672
|
+
"ECU" => "EC",
|
673
|
+
"EGY" => "EG",
|
674
|
+
"ERI" => "ER",
|
675
|
+
"ESH" => "EH",
|
676
|
+
"ESP" => "ES",
|
677
|
+
"EST" => "EE",
|
678
|
+
"ETH" => "ET",
|
679
|
+
"FIN" => "FI",
|
680
|
+
"FJI" => "FJ",
|
681
|
+
"FLK" => "FK",
|
682
|
+
"FRA" => "FR",
|
683
|
+
"FRO" => "FO",
|
684
|
+
"FSM" => "FM",
|
685
|
+
"GAB" => "GA",
|
686
|
+
"GBR" => "GB",
|
687
|
+
"GEO" => "GE",
|
688
|
+
"GGY" => "GG",
|
689
|
+
"GHA" => "GH",
|
690
|
+
"GIB" => "GI",
|
691
|
+
"GIN" => "GN",
|
692
|
+
"GLP" => "GP",
|
693
|
+
"GMB" => "GM",
|
694
|
+
"GNB" => "GW",
|
695
|
+
"GNQ" => "GQ",
|
696
|
+
"GRC" => "GR",
|
697
|
+
"GRD" => "GD",
|
698
|
+
"GRL" => "GL",
|
699
|
+
"GTM" => "GT",
|
700
|
+
"GUF" => "GF",
|
701
|
+
"GUM" => "GU",
|
702
|
+
"GUY" => "GY",
|
703
|
+
"HKG" => "HK",
|
704
|
+
"HMD" => "HM",
|
705
|
+
"HND" => "HN",
|
706
|
+
"HRV" => "HR",
|
707
|
+
"HTI" => "HT",
|
708
|
+
"HUN" => "HU",
|
709
|
+
"IDN" => "ID",
|
710
|
+
"IMN" => "IM",
|
711
|
+
"IND" => "IN",
|
712
|
+
"IOT" => "IO",
|
713
|
+
"IRL" => "IE",
|
714
|
+
"IRN" => "IR",
|
715
|
+
"IRQ" => "IQ",
|
716
|
+
"ISL" => "IS",
|
717
|
+
"ISR" => "IL",
|
718
|
+
"ITA" => "IT",
|
719
|
+
"JAM" => "JM",
|
720
|
+
"JEY" => "JE",
|
721
|
+
"JOR" => "JO",
|
722
|
+
"JPN" => "JP",
|
723
|
+
"KAZ" => "KZ",
|
724
|
+
"KEN" => "KE",
|
725
|
+
"KGZ" => "KG",
|
726
|
+
"KHM" => "KH",
|
727
|
+
"KIR" => "KI",
|
728
|
+
"KNA" => "KN",
|
729
|
+
"KOR" => "KR",
|
730
|
+
"KWT" => "KW",
|
731
|
+
"LAO" => "LA",
|
732
|
+
"LBN" => "LB",
|
733
|
+
"LBR" => "LR",
|
734
|
+
"LBY" => "LY",
|
735
|
+
"LCA" => "LC",
|
736
|
+
"LIE" => "LI",
|
737
|
+
"LKA" => "LK",
|
738
|
+
"LSO" => "LS",
|
739
|
+
"LTU" => "LT",
|
740
|
+
"LUX" => "LU",
|
741
|
+
"LVA" => "LV",
|
742
|
+
"MAC" => "MO",
|
743
|
+
"MAF" => "MF",
|
744
|
+
"MAR" => "MA",
|
745
|
+
"MCO" => "MC",
|
746
|
+
"MDA" => "MD",
|
747
|
+
"MDG" => "MG",
|
748
|
+
"MDV" => "MV",
|
749
|
+
"MEX" => "MX",
|
750
|
+
"MHL" => "MH",
|
751
|
+
"MKD" => "MK",
|
752
|
+
"MLI" => "ML",
|
753
|
+
"MLT" => "MT",
|
754
|
+
"MMR" => "MM",
|
755
|
+
"MNE" => "ME",
|
756
|
+
"MNG" => "MN",
|
757
|
+
"MNP" => "MP",
|
758
|
+
"MOZ" => "MZ",
|
759
|
+
"MRT" => "MR",
|
760
|
+
"MSR" => "MS",
|
761
|
+
"MTQ" => "MQ",
|
762
|
+
"MUS" => "MU",
|
763
|
+
"MWI" => "MW",
|
764
|
+
"MYS" => "MY",
|
765
|
+
"MYT" => "YT",
|
766
|
+
"NAM" => "NA",
|
767
|
+
"NCL" => "NC",
|
768
|
+
"NER" => "NE",
|
769
|
+
"NFK" => "NF",
|
770
|
+
"NGA" => "NG",
|
771
|
+
"NIC" => "NI",
|
772
|
+
"NIU" => "NU",
|
773
|
+
"NLD" => "NL",
|
774
|
+
"NOR" => "NO",
|
775
|
+
"NPL" => "NP",
|
776
|
+
"NRU" => "NR",
|
777
|
+
"NZL" => "NZ",
|
778
|
+
"OMN" => "OM",
|
779
|
+
"PAK" => "PK",
|
780
|
+
"PAN" => "PA",
|
781
|
+
"PCN" => "PN",
|
782
|
+
"PER" => "PE",
|
783
|
+
"PHL" => "PH",
|
784
|
+
"PLW" => "PW",
|
785
|
+
"PNG" => "PG",
|
786
|
+
"POL" => "PL",
|
787
|
+
"PRI" => "PR",
|
788
|
+
"PRK" => "KP",
|
789
|
+
"PRT" => "PT",
|
790
|
+
"PRY" => "PY",
|
791
|
+
"PSE" => "PS",
|
792
|
+
"PYF" => "PF",
|
793
|
+
"QAT" => "QA",
|
794
|
+
"REU" => "RE",
|
795
|
+
"ROU" => "RO",
|
796
|
+
"RUS" => "RU",
|
797
|
+
"RWA" => "RW",
|
798
|
+
"SAU" => "SA",
|
799
|
+
"SDN" => "SD",
|
800
|
+
"SEN" => "SN",
|
801
|
+
"SGP" => "SG",
|
802
|
+
"SGS" => "GS",
|
803
|
+
"SHN" => "SH",
|
804
|
+
"SJM" => "SJ",
|
805
|
+
"SLB" => "SB",
|
806
|
+
"SLE" => "SL",
|
807
|
+
"SLV" => "SV",
|
808
|
+
"SMR" => "SM",
|
809
|
+
"SOM" => "SO",
|
810
|
+
"SPM" => "PM",
|
811
|
+
"SRB" => "RS",
|
812
|
+
"SSD" => "SS",
|
813
|
+
"STP" => "ST",
|
814
|
+
"SUR" => "SR",
|
815
|
+
"SVK" => "SK",
|
816
|
+
"SVN" => "SI",
|
817
|
+
"SWE" => "SE",
|
818
|
+
"SWZ" => "SZ",
|
819
|
+
"SYC" => "SC",
|
820
|
+
"SYR" => "SY",
|
821
|
+
"TCA" => "TC",
|
822
|
+
"TCD" => "TD",
|
823
|
+
"TGO" => "TG",
|
824
|
+
"THA" => "TH",
|
825
|
+
"TJK" => "TJ",
|
826
|
+
"TKL" => "TK",
|
827
|
+
"TKM" => "TM",
|
828
|
+
"TLS" => "TL",
|
829
|
+
"TON" => "TO",
|
830
|
+
"TTO" => "TT",
|
831
|
+
"TUN" => "TN",
|
832
|
+
"TUR" => "TR",
|
833
|
+
"TUV" => "TV",
|
834
|
+
"TWN" => "TW",
|
835
|
+
"TZA" => "TZ",
|
836
|
+
"UGA" => "UG",
|
837
|
+
"UKR" => "UA",
|
838
|
+
"UMI" => "UM",
|
839
|
+
"URY" => "UY",
|
840
|
+
"USA" => "US",
|
841
|
+
"UZB" => "UZ",
|
842
|
+
"VAT" => "VA",
|
843
|
+
"VCT" => "VC",
|
844
|
+
"VEN" => "VE",
|
845
|
+
"VGB" => "VG",
|
846
|
+
"VIR" => "VI",
|
847
|
+
"VNM" => "VN",
|
848
|
+
"VUT" => "VU",
|
849
|
+
"WLF" => "WF",
|
850
|
+
"WSM" => "WS",
|
851
|
+
"YEM" => "YE",
|
852
|
+
"ZAF" => "ZA",
|
853
|
+
"ZMB" => "ZM",
|
854
|
+
"ZWE" => "ZW"
|
855
|
+
}
|
856
|
+
end
|
345
857
|
|
346
858
|
end
|
data/test/snail_test.rb
CHANGED
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
3
3
|
class SnailTest < ActiveSupport::TestCase
|
4
4
|
def setup
|
5
5
|
@us = {:name => "John Doe", :line_1 => "12345 5th St", :city => "Somewheres", :state => "NY", :zip => "12345", :country => 'USA'}
|
6
|
-
@ca = {:name => "John Doe", :line_1 => "12345 5th St", :city => "Somewheres", :state => "NY", :zip => "12345", :country => '
|
6
|
+
@ca = {:name => "John Doe", :line_1 => "12345 5th St", :city => "Somewheres", :state => "NY", :zip => "12345", :country => 'CAN'}
|
7
7
|
end
|
8
8
|
|
9
9
|
test "provides USPS country names" do
|
@@ -50,6 +50,35 @@ class SnailTest < ActiveSupport::TestCase
|
|
50
50
|
assert_equal Snail.new(:postcode => "12345").postal_code, Snail.new(:postal_code => "12345").postal_code
|
51
51
|
end
|
52
52
|
|
53
|
+
##
|
54
|
+
## Country Normalization
|
55
|
+
##
|
56
|
+
|
57
|
+
test "normalize country name to alpha2" do
|
58
|
+
s = Snail.new(@ca.merge(:country => 'Slovenia'))
|
59
|
+
assert_equal "SI", s.country
|
60
|
+
end
|
61
|
+
|
62
|
+
test "normalize uppercase country name to alpha2" do
|
63
|
+
s = Snail.new(@ca.merge(:country => 'JAPAN'))
|
64
|
+
assert_equal "JP", s.country
|
65
|
+
end
|
66
|
+
|
67
|
+
test "normalize alpha3 to alpha2" do
|
68
|
+
s = Snail.new(@ca.merge(:country => 'SVN'))
|
69
|
+
assert_equal "SI", s.country
|
70
|
+
end
|
71
|
+
|
72
|
+
test "normalize alpha2 exceptions to alpha2" do
|
73
|
+
s = Snail.new(@ca.merge(:country => 'UK'))
|
74
|
+
assert_equal "GB", s.country
|
75
|
+
end
|
76
|
+
|
77
|
+
test "leave alpha2 as alpha2" do
|
78
|
+
s = Snail.new(@ca.merge(:country => 'GB'))
|
79
|
+
assert_equal "GB", s.country
|
80
|
+
end
|
81
|
+
|
53
82
|
##
|
54
83
|
## Formatting
|
55
84
|
##
|
@@ -73,7 +102,12 @@ class SnailTest < ActiveSupport::TestCase
|
|
73
102
|
|
74
103
|
test "includes country name for international addresses" do
|
75
104
|
s = Snail.new(@ca)
|
76
|
-
assert s.to_s.match(/Canada/i)
|
105
|
+
assert s.to_s.match(/Canada\Z/i), s.to_s
|
106
|
+
end
|
107
|
+
|
108
|
+
test "includes first country name for countries with many commonly used names" do
|
109
|
+
s = Snail.new(@ca.merge(:country => 'UK'))
|
110
|
+
assert s.to_s.match(/United Kingdom\Z/i), s.to_s
|
77
111
|
end
|
78
112
|
|
79
113
|
test "output ok if country is nil" do
|
@@ -83,7 +117,7 @@ class SnailTest < ActiveSupport::TestCase
|
|
83
117
|
|
84
118
|
test "country names are uppercased" do
|
85
119
|
s = Snail.new(@ca)
|
86
|
-
assert s.to_s.match(/CANADA/)
|
120
|
+
assert s.to_s.match(/CANADA/), s.to_s
|
87
121
|
end
|
88
122
|
|
89
123
|
test "empty lines are removed" do
|
metadata
CHANGED
@@ -1,76 +1,57 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: snail
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 5
|
9
|
-
- 7
|
10
|
-
version: 0.5.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Lance Ivy
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-08-23 00:00:00 -07:00
|
19
|
-
default_executable:
|
12
|
+
date: 2012-07-09 00:00:00.000000000 Z
|
20
13
|
dependencies: []
|
21
|
-
|
22
|
-
|
14
|
+
description: International snail mail addressing is a pain. This begins to make it
|
15
|
+
easier.
|
23
16
|
email: lance@cainlevy.net
|
24
17
|
executables: []
|
25
|
-
|
26
18
|
extensions: []
|
27
|
-
|
28
19
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
31
|
-
- lib/snail/constants.rb
|
20
|
+
files:
|
32
21
|
- lib/snail/configurable.rb
|
22
|
+
- lib/snail/constants.rb
|
33
23
|
- lib/snail.rb
|
34
24
|
- lib/snail_helpers.rb
|
35
|
-
- test/test_helper.rb
|
36
25
|
- test/snail_test.rb
|
26
|
+
- test/test_helper.rb
|
37
27
|
- README.rdoc
|
38
28
|
- MIT-LICENSE
|
39
|
-
has_rdoc: true
|
40
29
|
homepage: http://github.com/cainlevy/snail
|
41
30
|
licenses: []
|
42
|
-
|
43
31
|
post_install_message:
|
44
|
-
rdoc_options:
|
32
|
+
rdoc_options:
|
45
33
|
- --title
|
46
34
|
- Snail
|
47
35
|
- --line-numbers
|
48
|
-
require_paths:
|
36
|
+
require_paths:
|
49
37
|
- lib
|
50
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
39
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
56
|
-
|
57
|
-
- 0
|
58
|
-
version: "0"
|
59
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
45
|
none: false
|
61
|
-
requirements:
|
62
|
-
- -
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
|
65
|
-
segments:
|
66
|
-
- 0
|
67
|
-
version: "0"
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
68
50
|
requirements: []
|
69
|
-
|
70
51
|
rubyforge_project:
|
71
|
-
rubygems_version: 1.
|
52
|
+
rubygems_version: 1.8.11
|
72
53
|
signing_key:
|
73
54
|
specification_version: 3
|
74
55
|
summary: Easily format snail mail addresses for international delivery
|
75
56
|
test_files: []
|
76
|
-
|
57
|
+
has_rdoc: true
|