postoffice 0.0.9

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.
@@ -0,0 +1,161 @@
1
+ Postoffice
2
+ ==========
3
+
4
+ 2 digit ruby symbols are used to specify a country. See README.md for usage details.
5
+
6
+ Countries with supported postcodes:
7
+ :us => "United States"
8
+ :ca => "Canada"
9
+ :gb => "United Kingdom (Great Britain)"
10
+ :cn => "China"
11
+ :jp => "Japan"
12
+ :de => "Germany"
13
+ :fr => "France"
14
+ :au => "Australia"
15
+ :it => "Italy"
16
+ :ch => "Switzerland"
17
+ :at => "Austria"
18
+ :es => "Spain"
19
+ :nl => "Netherlands"
20
+ :be => "Belgium"
21
+ :dk => "Denmark"
22
+ :se => "Sweden"
23
+ :no => "Norway"
24
+ :br => "Brazil"
25
+ :pt => "Portugal"
26
+ :fi => "Finaland"
27
+ :ax => "Aland Islands"
28
+ :kr => "Korea"
29
+ :tw => "Taiwan"
30
+ :sg => "Singapore"
31
+ :dz => "Algeria"
32
+ :ad => "Andorra"
33
+ :ar => "Argentina"
34
+ :am => "Armenia"
35
+ :az => "Azerbaijan"
36
+ :bh => "Bahrain"
37
+ :bd => "Bangladesh"
38
+ :bb => "Barbados"
39
+ :by => "Belarus"
40
+ :bm => "Bermuda"
41
+ :ba => "Bosnia and Herzegovina"
42
+ :io => "British Indian Ocean Territory"
43
+ :bn => "Brunei Darussalam"
44
+ :bg => "Bulgaria"
45
+ :kh => "Cambodia"
46
+ :cv => "Cape Verde"
47
+ :cl => "Chile"
48
+ :cr => "Costa Rica"
49
+ :hr => "Croatia"
50
+ :cy => "Cyprus"
51
+ :cz => "Czech Republic"
52
+ :do => "Dominican Republic"
53
+ :ec => "Ecuador"
54
+ :eg => "Egypt"
55
+ :ee => "Estonia"
56
+ :fo => "Faroe Islands"
57
+ :ge => "Georgia"
58
+ :gr => "Greece"
59
+ :gl => "Greenland"
60
+ :gt => "Guatemala"
61
+ :ht => "Haiti"
62
+ :hn => "Honduras"
63
+ :hu => "Hungary"
64
+ :is => "Iceland"
65
+ :in => "India"
66
+ :id => "Indonesia"
67
+ :ie => "Ireland"
68
+ :il => "Israel"
69
+ :jo => "Jordan"
70
+ :kz => "Kazakhstan"
71
+ :ke => "Kenya"
72
+ :kw => "Kuwait"
73
+ :la => "Lao People's Democratic Republic"
74
+ :lv => "Latvia"
75
+ :lb => "Lebanon"
76
+ :li => "Liechtenstein"
77
+ :lt => "Lithuania"
78
+ :lu => "Luxembourg"
79
+ :mk => "Macedonia"
80
+ :my => "Malaysia"
81
+ :mv => "Maldives"
82
+ :mt => "Malta"
83
+ :mu => "Mauritius"
84
+ :mx => "Mexico"
85
+ :md => "Moldova"
86
+ :mc => "Monaco"
87
+ :ma => "Morocco"
88
+ :np => "Nepal"
89
+ :nz => "New Zealand"
90
+ :ni => "Nicaragua"
91
+ :ng => "Nigeria"
92
+ :om => "Oman"
93
+ :pk => "Pakistan"
94
+ :py => "Paraguay"
95
+ :ph => "Philippines"
96
+ :pl => "Poland"
97
+ :pr => "Puerto Rico"
98
+ :ro => "Romania"
99
+ :ru => "Russia"
100
+ :sm => "San Marino"
101
+ :sa => "Saudi Arabia"
102
+ :sn => "Senegal"
103
+ :sk => "Slovakia"
104
+ :si => "Slovenia"
105
+ :za => "South Africa"
106
+ :lk => "Sri Lanka"
107
+ :tj => "Tajikistan"
108
+ :th => "Thailand"
109
+ :tn => "Tunisia"
110
+ :tr => "Turkey"
111
+ :tm => "Turkmenistan"
112
+ :ua => "Ukraine"
113
+ :uy => "Uruguay"
114
+ :uz => "Uzbekistan"
115
+ :va => "Vatican City"
116
+ :ve => "Venezuela"
117
+ :zm => "Zambia"
118
+ :as => "American Samoa"
119
+ :cc => "Cocos (Keeling) Islands"
120
+ :ck => "Cook Islands"
121
+ :rs => "Serbia"
122
+ :me => "Montenegro"
123
+ :cs => "Serbia and Montenegro"
124
+ :yu => "Yugoslavia"
125
+ :cx => "Christmas Island"
126
+ :et => "Ethiopia"
127
+ :fk => "Falkland Islands (Malvinas)"
128
+ :nf => "Norfolk Island "
129
+ :fm => "Micronesia"
130
+ :gf => "French Guiana"
131
+ :gn => "Guinea"
132
+ :gp => "Guadeloupe"
133
+ :gs => "South Georgia and the South Sandwich Islands"
134
+ :gu => "Guam"
135
+ :gw => "Guinea-Bissau"
136
+ :hm => "Heard Island and McDonald Islands"
137
+ :iq => "Iraq"
138
+ :kg => "Kyrgyzstan"
139
+ :lr => "Liberia"
140
+ :ls => "Lesotho"
141
+ :mg => "Madagascar"
142
+ :mh => "Marshall Islands"
143
+ :mn => "Mongolia"
144
+ :mp => "Northern Mariana Islands"
145
+ :mq => "Martinique"
146
+ :nc => "New Caledonia"
147
+ :ne => "Niger"
148
+ :vi => "Virgin Islands, U.S."
149
+ :pf => "French Polynesia"
150
+ :pg => "Papua New Guinea"
151
+ :pm => "Saint Pierre and Miquelon"
152
+ :pn => "Pitcairn"
153
+ :pw => "Palau"
154
+ :re => "Reunion"
155
+ :sh => "Saint Helena"
156
+ :sj => "Svalbard and Jan Mayen"
157
+ :so => "Somalia"
158
+ :sz => "Swaziland"
159
+ :tc => "Turks and Caicos Islands"
160
+ :wf => "Wallis and Futuna"
161
+ :yt => "Mayotte"
data/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ # Licensed under a Creative Commons Attribution-ShareAlike 3.0 License
2
+ # http://http://creativecommons.org/licenses/by-sa/3.0/
3
+ #
4
+ # Attribution: Some of this work is based on 'validates_as_postal_code' by Wes Hays, John Dell
5
+ # URLs: https://rubygems.org/gems/validates_as_postal_code
6
+ # https://github.com/gbdev/validates_as_postal_code
@@ -0,0 +1,50 @@
1
+ Postoffice
2
+ ==========
3
+
4
+ ### Rails gem to validate format of various world postal and zip codes, and more.
5
+
6
+ Installation:
7
+ -------------
8
+ gem install postoffice
9
+
10
+ or add the following to your Gemfile
11
+
12
+ gem 'postoffice'
13
+
14
+ Usage as a Rails validator:
15
+ ---------------------------
16
+ To validate various world postal codes:
17
+
18
+ class MyClass < ActiveRecord::Base
19
+ validates :postcode, :postcode_format => {:country_code => :us, :message => "entered is not a valid postcode for #{PostOffice.country_name(options[:country_code])}."}
20
+ end
21
+
22
+ To validate Canadian postal codes, simply change the symbol :us to :ca, and you'll get:
23
+ ![An example Postoffice error message](http://i.imgur.com/3ed7b.png "An example Postoffice error message")
24
+
25
+ > Note: Don't forget to use the ':allow_blank => true' option, when needed.
26
+
27
+ Country name codes abide by the [ISO 3166-1 alpha-2 standard](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). 155 countries are supported: see COUNTRYCODES.md for the full list.
28
+
29
+ General usage:
30
+ --------------
31
+ Validating correctness of postcodes directly:
32
+
33
+ # Validating an English postcode. Returns 0, since this postcode is valid, returns nil otherwise
34
+ PostOffice.validate_postcode('N1 9GU', :gb)
35
+
36
+ To produce a string of the name of a country, input a supported 2-digit country code as a symbol.
37
+
38
+ Example:
39
+
40
+ PostOffice.country_name(:us)
41
+
42
+ This will output "United States".
43
+
44
+ PostOffice.country_name(:lu)
45
+
46
+ This will output "Luxembourg".
47
+
48
+ License:
49
+ --------
50
+ See the LICENSE file.
@@ -0,0 +1,24 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rdoc/task'
4
+ require 'rubygems'
5
+ require 'active_record'
6
+
7
+ desc 'Default: run unit tests.'
8
+ task :default => :test
9
+
10
+ desc 'Test the postoffice plugin.'
11
+ Rake::TestTask.new(:test) do |t|
12
+ t.libs << 'lib'
13
+ t.test_files = FileList['test/**/*_test.rb']
14
+ t.verbose = true
15
+ end
16
+
17
+ # desc 'Generate documentation for the postoffice plugin.'
18
+ Rake::RDocTask.new(:rdoc) do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'Postoffice'
21
+ rdoc.options << '--line-numbers' << '--inline-source'
22
+ rdoc.rdoc_files.include('README')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
data/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'postoffice'
2
+ include PostOffice
@@ -0,0 +1,189 @@
1
+ module PostOffice
2
+ COUNTRY_DATA = {
3
+ :us => ["United States",'\d{5}(-\d{4})?'],
4
+ :ca => ["Canada",'[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}'],
5
+ :gb => ["United Kingdom (Great Britain)",'([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)'],
6
+ :cn => ["China",'([0-9]){6}'],
7
+ :jp => ["Japan",'\d{3}(-)?\d{4}'],
8
+ :de => ["Germany",'\d{5}'],
9
+ :fr => ["France",'\d{2}[ ]?\d{3}'],
10
+ :au => ["Australia",'\d{4}'],
11
+ :it => ["Italy",'\d{5}'],
12
+ :ch => ["Switzerland",'\d{4}'],
13
+ :at => ["Austria",'\d{4}'],
14
+ :es => ["Spain",'\d{5}'],
15
+ :nl => ["Netherlands",'\d{4}[ ]?[A-Z]{2}'],
16
+ :be => ["Belgium",'\d{4}'],
17
+ :dk => ["Denmark",'\d{4}'],
18
+ :se => ["Sweden",'\d{3}[ ]?\d{2}'],
19
+ :no => ["Norway",'\d{4}'],
20
+ :br => ["Brazil",'\d{5}[\-]?\d{3}'],
21
+ :pt => ["Portugal",'\d{4}([\-]\d{3})?'],
22
+ :fi => ["Finaland",'\d{5}'],
23
+ :ax => ["Aland Islands",'22\d{3}'],
24
+ :kr => ["Korea",'\d{3}[\-]\d{3}'],
25
+ :tw => ["Taiwan",'\d{3}(\d{2})?'],
26
+ :sg => ["Singapore",'\d{6}'],
27
+ :dz => ["Algeria",'\d{5}'],
28
+ :ad => ["Andorra",'AD\d{3}'],
29
+ :ar => ["Argentina",'([A-HJ-NP-Z])?\d{4}([A-Z]{3})?'],
30
+ :am => ["Armenia",'(37)?\d{4}'],
31
+ :az => ["Azerbaijan",'\d{4}'],
32
+ :bh => ["Bahrain",'((1[0-2]|[2-9])\d{2})?'],
33
+ :bd => ["Bangladesh",'\d{4}'],
34
+ :bb => ["Barbados",'(BB\d{5})?'],
35
+ :by => ["Belarus",'\d{6}'],
36
+ :bm => ["Bermuda",'[A-Z]{2}[ ]?[A-Z0-9]{2}'],
37
+ :ba => ["Bosnia and Herzegovina",'\d{5}'],
38
+ :io => ["British Indian Ocean Territory",'BBND 1ZZ'],
39
+ :bn => ["Brunei Darussalam",'[A-Z]{2}[ ]?\d{4}'],
40
+ :bg => ["Bulgaria",'\d{4}'],
41
+ :kh => ["Cambodia",'\d{5}'],
42
+ :cv => ["Cape Verde",'\d{4}'],
43
+ :cl => ["Chile",'\d{7}'],
44
+ :cr => ["Costa Rica",'\d{4,5}|\d{3}-\d{4}'],
45
+ :hr => ["Croatia",'\d{5}'],
46
+ :cy => ["Cyprus",'\d{4}'],
47
+ :cz => ["Czech Republic",'\d{3}[ ]?\d{2}'],
48
+ :do => ["Dominican Republic",'\d{5}'],
49
+ :ec => ["Ecuador",'([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?'],
50
+ :eg => ["Egypt",'\d{5}'],
51
+ :ee => ["Estonia",'\d{5}'],
52
+ :fo => ["Faroe Islands",'\d{3}'],
53
+ :ge => ["Georgia",'\d{4}'],
54
+ :gr => ["Greece",'\d{3}[ ]?\d{2}'],
55
+ :gl => ["Greenland",'39\d{2}'],
56
+ :gt => ["Guatemala",'\d{5}'],
57
+ :ht => ["Haiti",'\d{4}'],
58
+ :hn => ["Honduras",'(?:\d{5})?'],
59
+ :hu => ["Hungary",'\d{4}'],
60
+ :is => ["Iceland",'\d{3}'],
61
+ :in => ["India",'\d{6}'],
62
+ :id => ["Indonesia",'\d{5}'],
63
+ :ie => ["Ireland",'((D|DUBLIN)?([1-9]|6[wW]|1[0-8]|2[024]))?'],
64
+ :il => ["Israel",'\d{5}'],
65
+ :jo => ["Jordan",'\d{5}'],
66
+ :kz => ["Kazakhstan",'\d{6}'],
67
+ :ke => ["Kenya",'\d{5}'],
68
+ :kw => ["Kuwait",'\d{5}'],
69
+ :la => ["Lao People's Democratic Republic",'\d{5}'],
70
+ :lv => ["Latvia",'\d{4}'],
71
+ :lb => ["Lebanon",'(\d{4}([ ]?\d{4})?)?'],
72
+ :li => ["Liechtenstein",'(948[5-9])|(949[0-7])'],
73
+ :lt => ["Lithuania",'\d{5}'],
74
+ :lu => ["Luxembourg",'\d{4}'],
75
+ :mk => ["Macedonia",'\d{4}'],
76
+ :my => ["Malaysia",'\d{5}'],
77
+ :mv => ["Maldives",'\d{5}'],
78
+ :mt => ["Malta",'[A-Z]{3}[ ]?\d{2,4}'],
79
+ :mu => ["Mauritius",'(\d{3}[A-Z]{2}\d{3})?'],
80
+ :mx => ["Mexico",'\d{5}'],
81
+ :md => ["Moldova",'\d{4}'],
82
+ :mc => ["Monaco",'980\d{2}'],
83
+ :ma => ["Morocco",'\d{5}'],
84
+ :np => ["Nepal",'\d{5}'],
85
+ :nz => ["New Zealand",'\d{4}'],
86
+ :ni => ["Nicaragua",'((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?'],
87
+ :ng => ["Nigeria",'(\d{6})?'],
88
+ :om => ["Oman",'(PC )?\d{3}'],
89
+ :pk => ["Pakistan",'\d{5}'],
90
+ :py => ["Paraguay",'\d{4}'],
91
+ :ph => ["Philippines",'\d{4}'],
92
+ :pl => ["Poland",'\d{2}-\d{3}'],
93
+ :pr => ["Puerto Rico",'00[679]\d{2}([ \-]\d{4})?'],
94
+ :ro => ["Romania",'\d{6}'],
95
+ :ru => ["Russia",'\d{6}'],
96
+ :sm => ["San Marino",'4789\d'],
97
+ :sa => ["Saudi Arabia",'\d{5}'],
98
+ :sn => ["Senegal",'\d{5}'],
99
+ :sk => ["Slovakia",'\d{3}[ ]?\d{2}'],
100
+ :si => ["Slovenia",'\d{4}'],
101
+ :za => ["South Africa",'\d{4}'],
102
+ :lk => ["Sri Lanka",'\d{5}'],
103
+ :tj => ["Tajikistan",'\d{6}'],
104
+ :th => ["Thailand",'\d{5}'],
105
+ :tn => ["Tunisia",'\d{4}'],
106
+ :tr => ["Turkey",'\d{5}'],
107
+ :tm => ["Turkmenistan",'\d{6}'],
108
+ :ua => ["Ukraine",'\d{5}'],
109
+ :uy => ["Uruguay",'\d{5}'],
110
+ :uz => ["Uzbekistan",'\d{6}'],
111
+ :va => ["Vatican City",'00120'],
112
+ :ve => ["Venezuela",'\d{4}'],
113
+ :zm => ["Zambia",'\d{5}'],
114
+ :as => ["American Samoa",'96799'],
115
+ :cc => ["Cocos (Keeling) Islands",'6799'],
116
+ :ck => ["Cook Islands",'\d{4}'],
117
+ :rs => ["Serbia",'\d{6}'],
118
+ :me => ["Montenegro",'8\d{4}'],
119
+ :cs => ["Serbia and Montenegro",'\d{5}'],
120
+ :yu => ["Yugoslavia",'\d{5}'],
121
+ :cx => ["Christmas Island",'6798'],
122
+ :et => ["Ethiopia",'\d{4}'],
123
+ :fk => ["Falkland Islands (Malvinas)",'FIQQ 1ZZ'],
124
+ :nf => ["Norfolk Island ",'2899'],
125
+ :fm => ["Micronesia",'(9694[1-4])([ \-]\d{4})?'],
126
+ :gf => ["French Guiana",'9[78]3\d{2}'],
127
+ :gn => ["Guinea",'\d{3}'],
128
+ :gp => ["Guadeloupe",'9[78][01]\d{2}'],
129
+ :gs => ["South Georgia and the South Sandwich Islands",'SIQQ 1ZZ'],
130
+ :gu => ["Guam",'969[123]\d([ \-]\d{4})?'],
131
+ :gw => ["Guinea-Bissau",'\d{4}'],
132
+ :hm => ["Heard Island and McDonald Islands",'\d{4}'],
133
+ :iq => ["Iraq",'\d{5}'],
134
+ :kg => ["Kyrgyzstan",'\d{6}'],
135
+ :lr => ["Liberia",'\d{4}'],
136
+ :ls => ["Lesotho",'\d{3}'],
137
+ :mg => ["Madagascar",'\d{3}'],
138
+ :mh => ["Marshall Islands",'969[67]\d([ \-]\d{4})?'],
139
+ :mn => ["Mongolia",'\d{6}'],
140
+ :mp => ["Northern Mariana Islands",'9695[012]([ \-]\d{4})?'],
141
+ :mq => ["Martinique",'9[78]2\d{2}'],
142
+ :nc => ["New Caledonia",'988\d{2}'],
143
+ :ne => ["Niger",'\d{4}'],
144
+ :vi => ["Virgin Islands, U.S.",'008(([0-4]\d)|(5[01]))([ \-]\d{4})?'],
145
+ :pf => ["French Polynesia",'987\d{2}'],
146
+ :pg => ["Papua New Guinea",'\d{3}'],
147
+ :pm => ["Saint Pierre and Miquelon",'9[78]5\d{2}'],
148
+ :pn => ["Pitcairn",'PCRN 1ZZ'],
149
+ :pw => ["Palau",'96940'],
150
+ :re => ["Reunion",'9[78]4\d{2}'],
151
+ :sh => ["Saint Helena",'(ASCN|STHL) 1ZZ'],
152
+ :sj => ["Svalbard and Jan Mayen",'\d{4}'],
153
+ :so => ["Somalia",'\d{5}'],
154
+ :sz => ["Swaziland",'[HLMS]\d{3}'],
155
+ :tc => ["Turks and Caicos Islands",'TKCA 1ZZ'],
156
+ :wf => ["Wallis and Futuna",'986\d{2}'],
157
+ :yt => ["Mayotte",'976\d{2}']
158
+ }
159
+
160
+ def get_regex(code)
161
+ result = COUNTRY_DATA[code]
162
+ result != nil ? result[1] : ""
163
+ end
164
+
165
+ def country_name(code)
166
+ result = COUNTRY_DATA[code]
167
+ result != nil ? result[0] : "Not found"
168
+ end
169
+
170
+ def validate_postcode(value, country_code)
171
+ regexStr = PostOffice.get_regex(country_code)
172
+
173
+ value = value.to_s.strip
174
+
175
+ return value =~ /^#{regexStr}$/i
176
+ end
177
+ end
178
+
179
+ include PostOffice
180
+ class PostcodeFormatValidator < ActiveModel::EachValidator
181
+ def validate_each(object, attribute, value)
182
+
183
+ result = PostOffice.validate_postcode(value, options[:country_code])
184
+
185
+ if !result
186
+ object.errors[attribute] << (options[:message] || "entered is not a valid postcode for #{PostOffice.country_name(options[:country_code])}.")
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,95 @@
1
+ # Notes:
2
+ # ActiveRecord testing in local sqlite, running in memory
3
+ # http://devblog.avdi.org/2011/01/14/activerecord-golf/
4
+
5
+ require 'test/unit'
6
+
7
+ require 'active_record'
8
+ require 'postoffice'
9
+
10
+ require File.dirname(__FILE__) + '/test_helper.rb'
11
+
12
+ ActiveRecord::Base.establish_connection(
13
+ :adapter => "sqlite3",
14
+ :database => ":memory:")
15
+
16
+ # ActiveRecord::Base.connection.create_table(:test_records) do |t|
17
+ # t.string :postcode
18
+ # t.string :country_code
19
+ # end
20
+
21
+ class ValidatesAsPostCodeTest < Test::Unit::TestCase
22
+
23
+ # Valid post codes
24
+ def test_valid_post_codes
25
+ valid_post_codes.each_pair do |key, value|
26
+
27
+ test_model_class = Class.new(ActiveRecord::Base) do
28
+ def self.name
29
+ 'TestRecord'
30
+ end
31
+
32
+ def self.columns; []; end
33
+ attr_accessor :postcode
34
+
35
+ validates :postcode, :postcode_format => {:country_code => key}
36
+ end
37
+
38
+ value.each do |code|
39
+ assert test_model_class.new(:postcode => code.to_sym).valid?, "#{code} should be valid."
40
+ end
41
+ end
42
+ end
43
+
44
+ # Invalid post codes
45
+ def test_invalid_post_codes
46
+ invalid_post_codes.each_pair do |key, value|
47
+ test_model_class = Class.new(ActiveRecord::Base) do
48
+ def self.name
49
+ 'TestRecord'
50
+ end
51
+
52
+ def self.columns; []; end
53
+ attr_accessor :postcode
54
+
55
+ validates :postcode, :postcode_format => {:country_code => key}
56
+ end
57
+
58
+ value.each do |code|
59
+ assert test_model_class.new(:postcode => code.to_sym).invalid?, "#{code} should be invalid."
60
+ end
61
+ end
62
+ end
63
+
64
+ def test_manual_valid_post_codes
65
+ assert PostOffice.validate_postcode('N1 9GU', :gb), "should evaluate true"
66
+ assert PostOffice.validate_postcode('K1A 0A6', :ca), "should evaluate true"
67
+ assert PostOffice.validate_postcode('20500', :us), "should evaluate true"
68
+ end
69
+
70
+ def test_manual_invalid_post_codes
71
+ assert !PostOffice.validate_postcode('N1GU', :gb), "should evaluate false"
72
+ assert !PostOffice.validate_postcode('K1A 0AX6', :ca), "should evaluate false"
73
+ assert !PostOffice.validate_postcode('2050', :us), "should evaluate false"
74
+ end
75
+
76
+ def test_country_code_name_retrieval
77
+ assert PostOffice.country_name(:us) == "United States", "should evaluate to 'United States'"
78
+ assert PostOffice.country_name(:la) == "Lao People's Democratic Republic", "should evaluate to 'Lao People's Democratic Republic'"
79
+ assert PostOffice.country_name(:vi) == "Virgin Islands, U.S.", "should evaluate to 'Virgin Islands, U.S.'"
80
+ end
81
+
82
+ # Test blank post codes
83
+ def test_blank_post_code_allowed
84
+
85
+ test_model_class = Class.new(ActiveRecord::Base) do
86
+ def self.columns; []; end
87
+ attr_accessor :postcode
88
+
89
+ validates :postcode, :postcode_format => {:country_code => true}, :allow_blank => true
90
+ end
91
+
92
+ assert !test_model_class.new(:postcode => nil).invalid?, "Blank post code should be legal."
93
+ assert !test_model_class.new(:postcode => '').invalid?, "Blank post code should be legal."
94
+ end
95
+ end
@@ -0,0 +1,53 @@
1
+ def valid_post_codes
2
+ {:us => ['89511-1000',
3
+ '89511'],
4
+ :ca => ['M6K2P4',
5
+ 'M6K 2P4',
6
+ 'T0E 1S2',
7
+ 'T0E1S2',
8
+ 'B4V 2K4',
9
+ 'B4V2K4'],
10
+ :gb => ['BX2 1LB',
11
+ 'E98 1TT',
12
+ 'EH99 1SP',
13
+ 'N1 9GU',
14
+ 'SW1A 0AA',
15
+ 'SW1A 0PW',
16
+ 'W1A 1AA',
17
+ 'W1N 4DJ'],
18
+ :cn => ['510000',
19
+ '010000',
20
+ '129999'],
21
+ :jp => ['1006828',
22
+ '1620854',
23
+ '1740045'],
24
+ :ru => ['119021',
25
+ '247112']}
26
+ end
27
+
28
+ def invalid_post_codes
29
+ {:us => ['891511-1000',
30
+ '895x11'],
31
+ :ca => ['M662P4',
32
+ 'M6K 2PP',
33
+ 'T0E 1zS2',
34
+ 'T0E1S22',
35
+ '3B4V 2K4',
36
+ 'B4 V2K4'],
37
+ :gb => ['2 1LB',
38
+ 'E98x 11TT',
39
+ 'EH99 P1SP',
40
+ 'N1 9GUx',
41
+ 'SW1A 0AAT',
42
+ 'SW14A 0PW',
43
+ 'W1A 145AA',
44
+ 'W1N 4DDJ'],
45
+ :cn => ['5100010',
46
+ '010x000',
47
+ '11999'],
48
+ :jp => ['10068281',
49
+ '1620 854',
50
+ '174z0045'],
51
+ :ru => ['119 021',
52
+ '1247112']}
53
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: postoffice
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Christopher Butcher
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-05 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Implements an ActiveModel::EachValidator that can be added to your models
15
+ in a single line, to validate the format of various world postal codes. More features
16
+ for working with addresses to come.
17
+ email: cbutcher@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - README.md
23
+ - LICENSE
24
+ - COUNTRYCODES.md
25
+ - Rakefile
26
+ - init.rb
27
+ - lib/postoffice.rb
28
+ - test/postcode_validator_test.rb
29
+ - test/test_helper.rb
30
+ homepage: https://github.com/chrisbutcher/postoffice
31
+ licenses:
32
+ - Creative Commons Attribution-ShareAlike 3.0
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubyforge_project:
52
+ rubygems_version: 1.8.24
53
+ signing_key:
54
+ specification_version: 3
55
+ summary: Rails gem to validate format of various world postal codes, and more.
56
+ test_files:
57
+ - test/postcode_validator_test.rb