validates_zipcode 0.3.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +2 -2
- data/.travis.yml +13 -6
- data/Appraisals +6 -2
- data/CHANGELOG.md +21 -0
- data/README.md +17 -0
- data/gemfiles/rails_4.2.gemfile +3 -4
- data/gemfiles/rails_4.2.gemfile.lock +2 -2
- data/gemfiles/rails_5.2.gemfile +3 -4
- data/gemfiles/rails_5.2.gemfile.lock +2 -2
- data/gemfiles/rails_6.1.gemfile +7 -0
- data/gemfiles/rails_6.1.gemfile.lock +85 -0
- data/gemfiles/rails_7.0.gemfile +7 -0
- data/gemfiles/rails_7.0.gemfile.lock +85 -0
- data/gemfiles/rails_edge.gemfile +3 -4
- data/gemfiles/rails_edge.gemfile.lock +2 -2
- data/lib/validates_zipcode/cldr_regex_collection.rb +95 -92
- data/lib/validates_zipcode/formatter.rb +14 -1
- data/lib/validates_zipcode/validator.rb +7 -5
- data/lib/validates_zipcode/version.rb +1 -1
- data/lib/validates_zipcode/zipcode.rb +11 -3
- data/spec/format_zipcode_spec.rb +1 -1
- data/spec/spec_helper.rb +3568 -0
- data/spec/validates_zipcode_spec.rb +42 -370
- metadata +7 -5
- data/gemfiles/rails_6.0.gemfile +0 -8
- data/gemfiles/rails_6.0.gemfile.lock +0 -82
@@ -9,9 +9,9 @@ module ValidatesZipcode
|
|
9
9
|
UK: /\AGIR ?0AA|((([A-Z]\d{1,2})|(([A-Z][A-HJ-Y]\d{1,2})|(([A-Z]\d[A-Z])|([A-Z][A-HJ-Y]\d?[A-Z])))) ?\d[A-Z]{2})\z/i,
|
10
10
|
# GB: /\AGIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}\z/i,
|
11
11
|
# UK: /\A([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)\z/,
|
12
|
-
JE: /\AJE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}\z
|
13
|
-
GG: /\AGY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}\z
|
14
|
-
IM: /\AIM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}\z
|
12
|
+
JE: /\AJE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}\z/i,
|
13
|
+
GG: /\AGY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}\z/i,
|
14
|
+
IM: /\AIM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}\z/i,
|
15
15
|
US: /\A\d{5}([ \-](?:\d{4}|\d{6}))?\z/,
|
16
16
|
IE: /\A([AC-FHKNPRTV-Y]\d{2}|D6W)\s?[0-9AC-FHKNPRTV-Y]{4}\z/,
|
17
17
|
CA: /\A[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d\z/,
|
@@ -21,7 +21,7 @@ module ValidatesZipcode
|
|
21
21
|
CH: /\A\d{4}\z/,
|
22
22
|
AT: /\A\d{4}\z/,
|
23
23
|
ES: /\A\d{5}\z/,
|
24
|
-
NL: /\A[1-9]\d{3}[ ]?(
|
24
|
+
NL: /\A[1-9]\d{3}[ ]?(S[BCE-RT-Z]|[A-RT-Z][A-Z])\z/,
|
25
25
|
BE: /\A\d{4}\z/,
|
26
26
|
DK: /\A\d{4}\z/,
|
27
27
|
NO: /\A\d{4}\z/,
|
@@ -32,16 +32,15 @@ module ValidatesZipcode
|
|
32
32
|
SG: /\A\d{6}\z/,
|
33
33
|
DZ: /\A\d{5}\z/,
|
34
34
|
AD: /\AAD\d{3}\z/,
|
35
|
-
AR: /\A
|
36
|
-
# AR: /\A([A-HJ-NP-Z])?\d{4}([A-Z]{3})?\z/,
|
35
|
+
AR: /\A[A-HJ-NP-Z]{1}\d{4}([A-Z]{3})?\z/,
|
37
36
|
AM: /\A(37)?\d{4}\z/,
|
38
|
-
BH: /\A(
|
37
|
+
BH: /\A(1[0-2]|[1-9])\d{2}\z/,
|
39
38
|
BD: /\A\d{4}\z/,
|
40
|
-
BB: /\
|
39
|
+
BB: /\ABB([1-2]\d{4}|15156667)\z/,
|
41
40
|
BY: /\A\d{6}\z/,
|
42
41
|
BM: /\A[A-Z]{2}[ ]?[A-Z0-9]{2}\z/,
|
43
42
|
BA: /\A\d{5}\z/,
|
44
|
-
BN: /\A[A-Z]
|
43
|
+
BN: /\A[BKTP][A-Z][ ]?\d{4}\z/i,
|
45
44
|
BG: /\A\d{4}\z/,
|
46
45
|
KH: /\A\d{5}\z/,
|
47
46
|
CV: /\A\d{4}\z/,
|
@@ -50,7 +49,7 @@ module ValidatesZipcode
|
|
50
49
|
CY: /\A\d{4}\z/,
|
51
50
|
CZ: /\A[1-7][0-9]{2}[ ]?\d{2}\z/,
|
52
51
|
DO: /\A\d{5}\z/,
|
53
|
-
EC: /\A
|
52
|
+
EC: /\A\d{6}\z/,
|
54
53
|
EE: /\A\d{5}\z/,
|
55
54
|
FO: /\A\d{3}\z/,
|
56
55
|
GE: /\A\d{4}\z/,
|
@@ -61,29 +60,29 @@ module ValidatesZipcode
|
|
61
60
|
IS: /\A\d{3}\z/,
|
62
61
|
IN: /\A\d{6}\z/,
|
63
62
|
ID: /\A\d{5}\z/,
|
64
|
-
IL: /\A\d{5
|
63
|
+
IL: /\A(\d{5}|\d{7})\z/,
|
65
64
|
JO: /\A\d{5}\z/,
|
66
65
|
KZ: /\A\d{6}\z/,
|
67
66
|
KE: /\A\d{5}\z/,
|
68
67
|
KW: /\A\d{5}\z/,
|
69
68
|
LA: /\A\d{5}\z/,
|
70
69
|
LB: /\A(\d{4}([ ]?\d{4})?)?\z/,
|
71
|
-
LU: /\A(L\-)?\d{4}\z/,
|
70
|
+
LU: /\A(L[\- ]?)?\d{4}\z/,
|
72
71
|
MK: /\A\d{4}\z/,
|
73
72
|
MY: /\A\d{5}\z/,
|
74
73
|
MV: /\A\d{5}\z/,
|
75
|
-
MT: /\A[A-Z]{3}[ ]?\d{2,4}\z
|
76
|
-
MU: /\A[
|
74
|
+
MT: /\A[A-Z]{3}[ ]?\d{2,4}\z/i,
|
75
|
+
MU: /\A[AR1-9]\d{4}\z/i,
|
77
76
|
MX: /\A\d{5}\z/,
|
78
77
|
MA: /\A\d{5}\z/,
|
79
78
|
NZ: /\A\d{4}\z/,
|
80
79
|
NI: /\A\d{5}\z/,
|
81
|
-
NG: /\A
|
82
|
-
OM: /\A(PC )?\d{3}\z
|
80
|
+
NG: /\A\d{6}\z/,
|
81
|
+
OM: /\A(PC )?\d{3}\z/i,
|
83
82
|
PK: /\A\d{5}\z/,
|
84
83
|
PY: /\A\d{4}\z/,
|
85
84
|
PH: /\A\d{4}\z/,
|
86
|
-
PL: /\A\d{2}
|
85
|
+
PL: /\A\d{2}[ -]?\d{3}\z/,
|
87
86
|
PR: /\A00[679]\d{2}([ \-]\d{4})?\z/,
|
88
87
|
RO: /\A\d{6}\z/,
|
89
88
|
RU: /\A\d{6}\z/,
|
@@ -111,13 +110,13 @@ module ValidatesZipcode
|
|
111
110
|
YU: /\A\d{5}\z/,
|
112
111
|
CX: /\A6798\z/,
|
113
112
|
ET: /\A\d{4}\z/,
|
114
|
-
FK: /\AFIQQ 1ZZ\z
|
113
|
+
FK: /\AFIQQ[ ]?1ZZ\z/i,
|
115
114
|
NF: /\A2899\z/,
|
116
115
|
FM: /\A(9694[1-4])([ \-]\d{4})?\z/,
|
117
116
|
GF: /\A9[78]3\d{2}\z/,
|
118
117
|
GP: /\A9[78][01]\d{2}\z/,
|
119
|
-
GS: /\ASIQQ 1ZZ\z
|
120
|
-
GU: /\A969[
|
118
|
+
GS: /\ASIQQ[ ]?1ZZ\z/i,
|
119
|
+
GU: /\A969[1-3]\d([ \-]\d{4})?\z/,
|
121
120
|
GW: /\A\d{4}\z/,
|
122
121
|
HM: /\A\d{4}\z/,
|
123
122
|
IQ: /\A\d{5}\z/,
|
@@ -125,7 +124,7 @@ module ValidatesZipcode
|
|
125
124
|
LR: /\A\d{4}\z/,
|
126
125
|
LS: /\A\d{3}\z/,
|
127
126
|
MG: /\A\d{3}\z/,
|
128
|
-
MN: /\A\d{
|
127
|
+
MN: /\A\d{5}(-?\d{4})?\z/,
|
129
128
|
MP: /\A9695[012]([ \-]\d{4})?\z/,
|
130
129
|
MQ: /\A9[78]2\d{2}\z/,
|
131
130
|
NC: /\A988\d{2}\z/,
|
@@ -133,117 +132,121 @@ module ValidatesZipcode
|
|
133
132
|
PF: /\A987\d{2}\z/,
|
134
133
|
PG: /\A\d{3}\z/,
|
135
134
|
PM: /\A9[78]5\d{2}\z/,
|
136
|
-
PN: /\APCRN 1ZZ\z
|
135
|
+
PN: /\APCRN[ ]?1ZZ\z/i,
|
137
136
|
PW: /\A96940\z/,
|
138
|
-
RE: /\
|
139
|
-
SH: /\A(ASCN|STHL) 1ZZ\z
|
137
|
+
RE: /\A974\d{2}\z/,
|
138
|
+
SH: /\A(ASCN|STHL|TDCU)[ ]?1ZZ\z/i,
|
140
139
|
SJ: /\A\d{4}\z/,
|
141
|
-
SZ: /\A[HLMS]\d{3}\z
|
142
|
-
TC: /\ATKCA 1ZZ\z
|
140
|
+
SZ: /\A[HLMS]\d{3}\z/i,
|
141
|
+
TC: /\ATKCA[ ]?1ZZ\z/i,
|
143
142
|
WF: /\A986\d{2}\z/,
|
144
143
|
XK: /\A\d{5}\z/,
|
145
144
|
YT: /\A976\d{2}\z/,
|
146
145
|
# NOTE: UAE has no postal codes
|
147
146
|
# https://github.com/dgilperez/validates_zipcode/issues/28
|
148
|
-
# AE: /\A([
|
147
|
+
# AE: /\A([A-Z\d\s]){3,}\z/i,
|
149
148
|
AF: /\A\d{4}\z/,
|
150
149
|
AL: /\A\d{4}\z/,
|
151
|
-
AG: /\A([
|
152
|
-
AO: /\A([
|
153
|
-
AZ: /\A([
|
154
|
-
BF: /\A([
|
155
|
-
BI: /\A([
|
156
|
-
BS: /\A([
|
157
|
-
BZ: /\A([
|
150
|
+
AG: /\A([A-Z\d\s]){3,}\z/i,
|
151
|
+
AO: /\A([A-Z\d\s]){3,}\z/i,
|
152
|
+
AZ: /\A(AZ[ ]?)?\d{4}\z/i,
|
153
|
+
BF: /\A([A-Z\d\s]){3,}\z/i,
|
154
|
+
BI: /\A([A-Z\d\s]){3,}\z/i,
|
155
|
+
BS: /\A([A-Z\d\s]){3,}\z/i,
|
156
|
+
BZ: /\A([A-Z\d\s]){3,}\z/i,
|
158
157
|
BR: /\A\d{5}(-?\d{3})?\z/,
|
159
|
-
BJ: /\A([
|
158
|
+
BJ: /\A([A-Z\d\s]){3,}\z/i,
|
160
159
|
BT: /\A\d{5}\z/,
|
161
|
-
BQ: /\A([
|
160
|
+
BQ: /\A([A-Z\d\s]){3,}\z/i,
|
162
161
|
BO: /\A\d{4}\z/,
|
163
|
-
BW: /\A([
|
164
|
-
CF: /\A([
|
165
|
-
CG: /\A([
|
166
|
-
CI: /\A([
|
167
|
-
|
168
|
-
|
162
|
+
BW: /\A([A-Z\d\s]){3,}\z/i,
|
163
|
+
CF: /\A([A-Z\d\s]){3,}\z/i,
|
164
|
+
CG: /\A([A-Z\d\s]){3,}\z/i,
|
165
|
+
CI: /\A([A-Z\d\s]){3,}\z/i,
|
166
|
+
# NOTE: Cameroon has no postal codes
|
167
|
+
# CM: /\A([A-Z\d]){3,7}\z/i,
|
168
|
+
CO: /\A([A-Z\d\s]){3,}\z/i,
|
169
169
|
CR: /\A\d{5}\z/,
|
170
170
|
CU: /\A\d{5}\z/,
|
171
|
-
KM: /\A([
|
172
|
-
DJ: /\A([
|
173
|
-
DM: /\A([
|
174
|
-
EG: /\A([
|
175
|
-
GQ: /\A([
|
171
|
+
KM: /\A([A-Z\d\s]){3,}\z/i,
|
172
|
+
DJ: /\A([A-Z\d\s]){3,}\z/i,
|
173
|
+
DM: /\A([A-Z\d\s]){3,}\z/i,
|
174
|
+
EG: /\A([A-Z\d\s]){3,}\z/i,
|
175
|
+
GQ: /\A([A-Z\d\s]){3,}\z/i,
|
176
176
|
EL: /\A\d{5}\z/,
|
177
|
-
ER: /\A([
|
178
|
-
FJ: /\A([
|
177
|
+
ER: /\A([A-Z\d\s]){3,}\z/i,
|
178
|
+
FJ: /\A([A-Z\d\s]){3,}\z/i,
|
179
179
|
FR: /\A\d{5}\z/,
|
180
|
-
GA: /\A\d{
|
181
|
-
GD: /\A([
|
182
|
-
GH: /\A([
|
183
|
-
GM: /\A([
|
184
|
-
GN: /\A([
|
185
|
-
GI: /\A(GX11 1AA)\z
|
180
|
+
GA: /\A\d{4}\z/,
|
181
|
+
GD: /\A([A-Z\d\s]){3,}\z/i,
|
182
|
+
GH: /\A([A-Z\d\s]){3,}\z/i,
|
183
|
+
GM: /\A([A-Z\d\s]){3,}\z/i,
|
184
|
+
GN: /\A([A-Z\d\s]){3,}\z/i,
|
185
|
+
GI: /\A(GX11[ ]?1AA)\z/i,
|
186
186
|
GR: /\A\d{3}[ ]?\d{2}\z/,
|
187
|
-
GY: /\A([
|
188
|
-
HN: /\A(([
|
187
|
+
GY: /\A([A-Z\d\s]){3,}\z/i,
|
188
|
+
HN: /\A(([A-Z]){2}|\d{2})\d{4}\z/i,
|
189
189
|
IO: /\A\d{5}\z/,
|
190
190
|
IR: /\A\d{5}\z/,
|
191
191
|
JP: /\A\d{3}\-?\d{4}\z/,
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
192
|
+
# Jamaica has no postcode system.However, for Kingston, there are one- and two-digit sector codes.
|
193
|
+
# On February 12, 2007 it was announced: "POST CODE PROJECT SUSPENDED INDEFINITELY"
|
194
|
+
# https://en.youbianku.com/Jamaica#:~:text=Jamaica%20has%20no%20postcode%20system,the%20name%20of%20the%20town.
|
195
|
+
JM: /\A((JM(DCN|CHR|AKN|DMR|BPD|AAW|CAN|ACE|DEH|CJS|BMY|BTS|CTY|DWD)(0[1-9]|[1-2]\d))|\d{1,2})?\z/i,
|
196
|
+
KI: /\AKI0[1-3]\d{2}\z/i,
|
197
|
+
KN: /\AKN[ ]?\d{4}\z/i,
|
198
|
+
KP: /\A([A-Z\d\s]){3,8}\z/i,
|
196
199
|
LI: /\A\d{4}\z/,
|
197
|
-
LV: /\A(LV)
|
200
|
+
LV: /\A(LV[\- ]?)?\d{4}\z/i,
|
198
201
|
LY: /\A\d{5}\z/,
|
199
|
-
LT: /\A(LT
|
200
|
-
LC: /\A([
|
202
|
+
LT: /\A(LT[\- ]?)?\d{5}\z/i,
|
203
|
+
LC: /\A([A-Z\d\s]){3,}\z/i,
|
201
204
|
MC: /\A\d{5}\z/,
|
202
|
-
MD: /\A(([
|
203
|
-
ME: /\A([
|
205
|
+
MD: /\A(([A-Z]){2})(|\s)\d{4}\z/i,
|
206
|
+
ME: /\A([A-Z\d\s]){3,}\z/i,
|
204
207
|
MH: /\A\d{5}\z/,
|
205
|
-
MR: /\A([
|
206
|
-
MM: /\A([
|
207
|
-
MW: /\A([
|
208
|
+
MR: /\A([A-Z\d\s]){3,}\z/i,
|
209
|
+
MM: /\A([A-Z\d\s]){3,}\z/i,
|
210
|
+
MW: /\A([A-Z\d\s]){3,}\z/i,
|
208
211
|
MZ: /\A\d{4}\z/,
|
209
212
|
NA: /\A\d{5}\z/,
|
210
213
|
NP: /\A\d{6}\z/,
|
211
|
-
NR: /\A([
|
214
|
+
NR: /\A([A-Z\d\s]){3,}\z/i,
|
212
215
|
PT: /\A\d{4}([\-]\d{3})?\z/,
|
213
216
|
PS: /\A\d{3}\z/,
|
214
217
|
PA: /\A\d{4}\z/,
|
215
218
|
PE: /\A\d{5}\z/,
|
216
|
-
QA: /\A([
|
217
|
-
RW: /\A([
|
218
|
-
SC: /\A([
|
219
|
+
QA: /\A([A-Z\d\s]){3,}\z/i,
|
220
|
+
RW: /\A([A-Z\d\s]){3,}\z/i,
|
221
|
+
SC: /\A([A-Z\d\s]){3,}\z/i,
|
219
222
|
SE: /\A\d{3}[ ]?\d{2}\z/,
|
220
223
|
SK: /\A[089]\d{2}[ ]?\d{2}\z/,
|
221
|
-
SL: /\A([
|
222
|
-
SB: /\A([
|
223
|
-
SR: /\A([
|
224
|
-
SO: /\A([
|
225
|
-
SV: /\A([
|
224
|
+
SL: /\A([A-Z\d\s]){3,}\z/i,
|
225
|
+
SB: /\A([A-Z\d\s]){3,}\z/i,
|
226
|
+
SR: /\A([A-Z\d\s]){3,}\z/i,
|
227
|
+
SO: /\A([A-Z\d\s]){3,}\z/i,
|
228
|
+
SV: /\A([A-Z\d\s]){3,}\z/i,
|
226
229
|
SD: /\A\d{5}\z/,
|
227
|
-
ST: /\A([
|
228
|
-
SY: /\A([
|
230
|
+
ST: /\A([A-Z\d\s]){3,}\z/i,
|
231
|
+
SY: /\A([A-Z\d\s]){3,}\z/i,
|
229
232
|
SS: /\A\d{5}\z/,
|
230
233
|
TD: /\A\d{5}\z/,
|
231
|
-
TG: /\A([
|
232
|
-
TO: /\A([
|
233
|
-
TZ: /\A([
|
234
|
+
TG: /\A([A-Z\d\s]){3,}\z/i,
|
235
|
+
TO: /\A([A-Z\d\s]){3,}\z/i,
|
236
|
+
TZ: /\A([A-Z\d\s]){3,}\z/i,
|
234
237
|
TT: /\A\d{6}\z/,
|
235
238
|
TW: /\A\d{3}(\d{2})?\z/,
|
236
|
-
UG: /\A([
|
237
|
-
UM: /\A([
|
238
|
-
UY: /\A([
|
239
|
-
VC: /\A(VC)\d{4}\z
|
239
|
+
UG: /\A([A-Z\d\s]){3,}\z/i,
|
240
|
+
UM: /\A([A-Z\d\s]){3,}\z/i,
|
241
|
+
UY: /\A([A-Z\d\s]){3,}\z/i,
|
242
|
+
VC: /\A(VC)\d{4}\z/i,
|
240
243
|
VI: /\A\d{5}\z/,
|
241
|
-
VG: /\A([
|
244
|
+
VG: /\A([A-Z\d\s]){3,}\z/i,
|
242
245
|
VN: /\A\d{6}\z/,
|
243
|
-
VU: /\A([
|
244
|
-
WS: /\A([
|
245
|
-
YE: /\A([
|
246
|
-
ZW: /\A([
|
246
|
+
VU: /\A([A-Z\d\s]){3,}\z/i,
|
247
|
+
WS: /\A([A-Z\d\s]){3,}\z/i,
|
248
|
+
YE: /\A([A-Z\d\s]){3,}\z/i,
|
249
|
+
ZW: /\A([A-Z\d\s]){3,}\z/i
|
247
250
|
}.freeze
|
248
251
|
|
249
252
|
def regexp_for_country_alpha2(alpha2)
|
@@ -5,14 +5,27 @@ module ValidatesZipcode
|
|
5
5
|
|
6
6
|
ZIPCODES_TRANSFORMATIONS = {
|
7
7
|
AT: ->(z) { z.scan(/\d/).join },
|
8
|
+
ES: :AT,
|
8
9
|
CA: ->(z) { z.upcase.scan(WORD_CHAR_AND_DIGIT).insert(3, ' ').join },
|
9
10
|
CZ: ->(z) { z.scan(/\d/).insert(3, ' ').join },
|
10
|
-
DE: ->(z) {
|
11
|
+
DE: ->(z) {
|
12
|
+
digits = z.scan(/\d/)
|
13
|
+
result = digits.join
|
14
|
+
result.prepend('0') if digits.count < 5
|
15
|
+
result
|
16
|
+
},
|
11
17
|
GB: ->(z) { z.upcase.scan(WORD_CHAR_AND_DIGIT).insert(-4, ' ').join },
|
12
18
|
NL: ->(z) { z.upcase.scan(WORD_CHAR_AND_DIGIT).insert(4, ' ').join },
|
13
19
|
PL: ->(z) { z.scan(/\d/).insert(2, '-').join },
|
14
20
|
SK: :CZ,
|
15
21
|
UK: :GB,
|
22
|
+
MT: :GB,
|
23
|
+
FK: :GB,
|
24
|
+
GS: :GB,
|
25
|
+
PN: :GB,
|
26
|
+
SH: :GB,
|
27
|
+
TC: :GB,
|
28
|
+
GI: :GB,
|
16
29
|
US: ->(z) {
|
17
30
|
digits = z.scan(/\d/)
|
18
31
|
digits.insert(5, '-') if digits.count > 5
|
@@ -21,6 +21,7 @@ module ValidatesZipcode
|
|
21
21
|
@country_code = options.fetch(:country_code, nil)
|
22
22
|
@country_code_attribute = options.fetch(:country_code_attribute, :country_alpha2)
|
23
23
|
@excluded_country_codes = options.fetch(:excluded_country_codes, [])
|
24
|
+
@format = options.fetch(:format, false)
|
24
25
|
@message = options.fetch(:message, nil)
|
25
26
|
super
|
26
27
|
end
|
@@ -29,12 +30,13 @@ module ValidatesZipcode
|
|
29
30
|
alpha2 = @country_code || record.send(@country_code_attribute)
|
30
31
|
options = { zipcode: value.to_s,
|
31
32
|
country_alpha2: alpha2,
|
32
|
-
excluded_country_codes: @excluded_country_codes
|
33
|
+
excluded_country_codes: @excluded_country_codes,
|
34
|
+
format: @format }
|
33
35
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
return if ValidatesZipcode::Zipcode.new(options).valid?
|
37
|
+
|
38
|
+
message = @message || I18n.t('errors.messages.invalid_zipcode', value: value, default: 'Zipcode is invalid')
|
39
|
+
record.errors.add(attribute, :invalid_zipcode, message: message)
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
@@ -7,18 +7,22 @@ module ValidatesZipcode
|
|
7
7
|
@zipcode = args.fetch(:zipcode)
|
8
8
|
@country_alpha2 = args.fetch(:country_alpha2)
|
9
9
|
@excluded_country_codes = args.fetch(:excluded_country_codes, [])
|
10
|
+
@format = args.fetch(:format, false)
|
10
11
|
end
|
11
12
|
|
12
13
|
def valid?
|
13
14
|
return true if @excluded_country_codes.include?(@country_alpha2)
|
14
15
|
return true unless regexp
|
15
|
-
|
16
|
+
|
17
|
+
zipcode = @format ? formatted_zip : @zipcode
|
18
|
+
!!(regexp =~ zipcode)
|
16
19
|
end
|
17
20
|
alias_method :validate, :valid?
|
18
21
|
|
19
22
|
def format
|
20
|
-
raise InvalidZipcodeError, "invalid zipcode #{
|
21
|
-
|
23
|
+
raise InvalidZipcodeError, "invalid zipcode #{formatted_zip} for country #{@country_alpha2.to_s.upcase}" unless valid?
|
24
|
+
|
25
|
+
formatted_zip
|
22
26
|
end
|
23
27
|
|
24
28
|
private
|
@@ -26,5 +30,9 @@ module ValidatesZipcode
|
|
26
30
|
def regexp
|
27
31
|
@regexp ||= regexp_for_country_alpha2(@country_alpha2)
|
28
32
|
end
|
33
|
+
|
34
|
+
def formatted_zip
|
35
|
+
@formatted_zip ||= Formatter.new(zipcode: @zipcode, country_alpha2: @country_alpha2).format
|
36
|
+
end
|
29
37
|
end
|
30
38
|
end
|
data/spec/format_zipcode_spec.rb
CHANGED