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.
@@ -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}[ ]?(?!SA|SD|SS)[A-Z]{2}\z/,
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([A-HJ-NP-Z]{1}\d{4}[A-Z]{3}|[a-z]{1}\d{4}[a-hj-tp-z]{3})\z/,
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((1[0-2]|[2-9])\d{2})?\z/,
37
+ BH: /\A(1[0-2]|[1-9])\d{2}\z/,
39
38
  BD: /\A\d{4}\z/,
40
- BB: /\A(BB\d{5})?\z/,
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]{2}[ ]?\d{4}\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([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?\z/,
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,7}\z/,
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[ARar1-9]\d{4}\z/,
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(\d{6})?\z/,
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}-\d{3}\z/,
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[123]\d([ \-]\d{4})?\z/,
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{6}\z/,
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: /\A9[78]4\d{2}\z/,
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([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
152
- AO: /\A([a-zA-Z\d\s]){3,}\z/,
153
- AZ: /\A([a-zA-Z\d\s]){3,}\z/,
154
- BF: /\A([a-zA-Z\d\s]){3,}\z/,
155
- BI: /\A([a-zA-Z\d\s]){3,}\z/,
156
- BS: /\A([a-zA-Z\d\s]){3,}\z/,
157
- BZ: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
158
+ BJ: /\A([A-Z\d\s]){3,}\z/i,
160
159
  BT: /\A\d{5}\z/,
161
- BQ: /\A([a-zA-Z\d\s]){3,}\z/,
160
+ BQ: /\A([A-Z\d\s]){3,}\z/i,
162
161
  BO: /\A\d{4}\z/,
163
- BW: /\A([a-zA-Z\d\s]){3,}\z/,
164
- CF: /\A([a-zA-Z\d\s]){3,}\z/,
165
- CG: /\A([a-zA-Z\d\s]){3,}\z/,
166
- CI: /\A([a-zA-Z\d\s]){3,}\z/,
167
- CM: /\A([a-zA-Z\d]){3,7}\z/,
168
- CO: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
172
- DJ: /\A([a-zA-Z\d\s]){3,}\z/,
173
- DM: /\A([a-zA-Z\d\s]){3,}\z/,
174
- EG: /\A([a-zA-Z\d\s]){3,}\z/,
175
- GQ: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
178
- FJ: /\A([a-zA-Z\d\s]){3,}\z/,
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{2}\z/,
181
- GD: /\A([a-zA-Z\d\s]){3,}\z/,
182
- GH: /\A([a-zA-Z\d\s]){3,}\z/,
183
- GM: /\A([a-zA-Z\d\s]){3,}\z/,
184
- GN: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
188
- HN: /\A(([a-zA-Z]){2}|\d{2})\d{4}\z/,
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
- JM: /\A(JM)[A-Z]{3}\d{2}\z/,
193
- KI: /\A([a-zA-Z\d\s]){3,}\z/,
194
- KN: /\A([a-zA-Z\d\s]){3,8}\z/,
195
- KP: /\A([a-zA-Z\d\s]){3,8}\z/,
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)?\-?\d{4}\z/,
200
+ LV: /\A(LV[\- ]?)?\d{4}\z/i,
198
201
  LY: /\A\d{5}\z/,
199
- LT: /\A(LT-)?\d{5}\z/,
200
- LC: /\A([a-zA-Z\d\s]){3,}\z/,
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(([a-zA-Z]){2})(|\s)\d{4}\z/,
203
- ME: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
206
- MM: /\A([a-zA-Z\d\s]){3,}\z/,
207
- MW: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
217
- RW: /\A([a-zA-Z\d\s]){3,}\z/,
218
- SC: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
222
- SB: /\A([a-zA-Z\d\s]){3,}\z/,
223
- SR: /\A([a-zA-Z\d\s]){3,}\z/,
224
- SO: /\A([a-zA-Z\d\s]){3,}\z/,
225
- SV: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
228
- SY: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
232
- TO: /\A([a-zA-Z\d\s]){3,}\z/,
233
- TZ: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
237
- UM: /\A([a-zA-Z\d\s]){3,}\z/,
238
- UY: /\A([a-zA-Z\d\s]){3,}\z/,
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([a-zA-Z\d\s]){3,}\z/,
244
+ VG: /\A([A-Z\d\s]){3,}\z/i,
242
245
  VN: /\A\d{6}\z/,
243
- VU: /\A([a-zA-Z\d\s]){3,}\z/,
244
- WS: /\A([a-zA-Z\d\s]){3,}\z/,
245
- YE: /\A([a-zA-Z\d\s]){3,}\z/,
246
- ZW: /\A([a-zA-Z\d\s]){3,}\z/
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) { z.scan(/\d/).join.rjust(5, '0') },
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
- unless ValidatesZipcode::Zipcode.new(options).valid?
35
- message = @message || I18n.t('errors.messages.invalid_zipcode', value: value, default: 'Zipcode is invalid')
36
- record.errors.add(attribute, :invalid_zipcode, message: message)
37
- end
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
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ValidatesZipcode
3
- VERSION = '0.3.2'
3
+ VERSION = '0.5.1'
4
4
  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
- !!(regexp =~ @zipcode)
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 #{@zipcode} for country #{@country_alpha2.to_s.upcase}" unless valid?
21
- Formatter.new(zipcode: @zipcode, country_alpha2: @country_alpha2).format
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
@@ -39,4 +39,4 @@ describe ValidatesZipcode::Formatter, '#format' do
39
39
  from_zip, to_zip = formatting.first
40
40
  expect(::ValidatesZipcode::Formatter.new(zipcode: from_zip, country_alpha2: country).format).to eq(to_zip)
41
41
  end
42
- end
42
+ end