addressing 0.2.0 → 0.4.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +9 -1
- data/data/country/en-MV.json +258 -0
- data/data/country/hi-Latn.json +258 -0
- data/data/country/zh.json +1 -1
- data/data/subdivision/CN--04f2bf92fa38c06607ad8a68fc36bdc1107ea6b1.json +6 -6
- data/data/subdivision/CN--4894d4f187cc75f7b048914fc0fa0408e18e8bad.json +3 -3
- data/data/subdivision/CN--68aa195ad83f0be79ef72d8679a88093deded0d1.json +3 -3
- data/data/subdivision/CN--c1a32ce65700c13ccf65888ece4a898d998dd58c.json +1 -1
- data/data/subdivision/CN--ee4adef9be42a1ffc9d772b091c203a1336d422f.json +3 -3
- data/data/subdivision/KR--73f130c4099bceaa0ba69e7e283a7265abe28670.json +1 -1
- data/data/subdivision/TW-9a2f374fb1c944b3c0d9451b91d5f1f72c74f003.json +1 -1
- data/lib/addressing/address_format.rb +21 -0
- data/lib/addressing/country.rb +9 -9
- data/lib/addressing/field_override.rb +33 -0
- data/lib/addressing/model.rb +17 -12
- data/lib/addressing/version.rb +1 -1
- data/lib/addressing.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 659b1dd0f7f34037b67ac6695c23de7900feb573c65c24d45d0e485569151c41
|
4
|
+
data.tar.gz: 457905c5e2e0fa9671d0bf0e4b5b5b6ad27c73d651536f79d5667b1fcbdd8866
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f59e9030add9d99fca4584f0b9181dd27ab7f5f65e778ce3f04ff238582dccf5fc17839578da58ba5d591b2dd44dd7c8705f38476170512ff7408821d5b17d3
|
7
|
+
data.tar.gz: 61a9c438dc4146c964d96b6358cc1545a47053e6d30fd4f9c7e02dc7773d4b2c85def3d8c805c26b44053d4dba9ad6b796442c93e8e5dc321df048a175b10879
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,21 @@
|
|
2
2
|
|
3
3
|
All notable changes to `addressing` will be documented in this file.
|
4
4
|
|
5
|
+
## 0.4.0 (13-07-2022)
|
6
|
+
|
7
|
+
- Update CLDR to v41
|
8
|
+
|
9
|
+
## 0.3.1 (04-04-2022)
|
10
|
+
|
11
|
+
- Break with both subdivisions and parents when subdivision field is empty
|
12
|
+
- Only retrieve field if it exists on model
|
13
|
+
|
14
|
+
## 0.3.0 (04-04-2022)
|
15
|
+
|
16
|
+
- Allow field validation to be overridden
|
17
|
+
- Only verify address when one of the field changes
|
18
|
+
- Allow used address fields to be configured
|
19
|
+
|
5
20
|
## 0.2.0 (25-02-2022)
|
6
21
|
|
7
22
|
- Add ActiveRecord validations
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@ A Ruby addressing library, powered by CLDR and Google's address data.
|
|
8
8
|
- Both latin and local subdivision names, when relevant (e.g: Okinawa / 沖縄県)
|
9
9
|
- Formatting, both in HTML and plain text
|
10
10
|
|
11
|
-
All data is [stored locally](data) as JSON and automatically updated through scheduled Github Actions. Countries are generated from [CLDR
|
11
|
+
All data is [stored locally](data) as JSON and automatically updated through scheduled Github Actions. Countries are generated from [CLDR v41](https://github.com/unicode-org/cldr-json.git). Address formats and subdivisions are generated from [Google's Address Data Service](https://chromium-i18n.appspot.com/ssl-address).
|
12
12
|
|
13
13
|
[](https://github.com/robinvdvleuten/addressing/actions?query=workflow%3Atest)
|
14
14
|
[](https://github.com/robinvdvleuten/addressing/blob/main/LICENSE)
|
@@ -182,6 +182,14 @@ class User < ApplicationRecord
|
|
182
182
|
end
|
183
183
|
```
|
184
184
|
|
185
|
+
For performance, the address is only verified if at least one of the fields changes. Set your own condition with:
|
186
|
+
|
187
|
+
```rb
|
188
|
+
class User < ApplicationRecord
|
189
|
+
validates_address if: -> { something_changed? }, ...
|
190
|
+
end
|
191
|
+
```
|
192
|
+
|
185
193
|
## Changelog
|
186
194
|
|
187
195
|
Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
|
@@ -0,0 +1,258 @@
|
|
1
|
+
{
|
2
|
+
"AF": "Afghanistan",
|
3
|
+
"AX": "Åland Islands",
|
4
|
+
"AL": "Albania",
|
5
|
+
"DZ": "Algeria",
|
6
|
+
"AS": "American Samoa",
|
7
|
+
"AD": "Andorra",
|
8
|
+
"AO": "Angola",
|
9
|
+
"AI": "Anguilla",
|
10
|
+
"AQ": "Antarctica",
|
11
|
+
"AG": "Antigua & Barbuda",
|
12
|
+
"AR": "Argentina",
|
13
|
+
"AM": "Armenia",
|
14
|
+
"AW": "Aruba",
|
15
|
+
"AC": "Ascension Island",
|
16
|
+
"AU": "Australia",
|
17
|
+
"AT": "Austria",
|
18
|
+
"AZ": "Azerbaijan",
|
19
|
+
"BS": "Bahamas",
|
20
|
+
"BH": "Bahrain",
|
21
|
+
"BD": "Bangladesh",
|
22
|
+
"BB": "Barbados",
|
23
|
+
"BY": "Belarus",
|
24
|
+
"BE": "Belgium",
|
25
|
+
"BZ": "Belize",
|
26
|
+
"BJ": "Benin",
|
27
|
+
"BM": "Bermuda",
|
28
|
+
"BT": "Bhutan",
|
29
|
+
"BO": "Bolivia",
|
30
|
+
"BA": "Bosnia & Herzegovina",
|
31
|
+
"BW": "Botswana",
|
32
|
+
"BV": "Bouvet Island",
|
33
|
+
"BR": "Brazil",
|
34
|
+
"IO": "British Indian Ocean Territory",
|
35
|
+
"VG": "British Virgin Islands",
|
36
|
+
"BN": "Brunei",
|
37
|
+
"BG": "Bulgaria",
|
38
|
+
"BF": "Burkina Faso",
|
39
|
+
"BI": "Burundi",
|
40
|
+
"KH": "Cambodia",
|
41
|
+
"CM": "Cameroon",
|
42
|
+
"CA": "Canada",
|
43
|
+
"IC": "Canary Islands",
|
44
|
+
"CV": "Cape Verde",
|
45
|
+
"BQ": "Caribbean Netherlands",
|
46
|
+
"KY": "Cayman Islands",
|
47
|
+
"CF": "Central African Republic",
|
48
|
+
"EA": "Ceuta & Melilla",
|
49
|
+
"TD": "Chad",
|
50
|
+
"CL": "Chile",
|
51
|
+
"CN": "China",
|
52
|
+
"CX": "Christmas Island",
|
53
|
+
"CP": "Clipperton Island",
|
54
|
+
"CC": "Cocos (Keeling) Islands",
|
55
|
+
"CO": "Colombia",
|
56
|
+
"KM": "Comoros",
|
57
|
+
"CG": "Congo - Brazzaville",
|
58
|
+
"CD": "Congo - Kinshasa",
|
59
|
+
"CK": "Cook Islands",
|
60
|
+
"CR": "Costa Rica",
|
61
|
+
"CI": "Côte d’Ivoire",
|
62
|
+
"HR": "Croatia",
|
63
|
+
"CU": "Cuba",
|
64
|
+
"CW": "Curaçao",
|
65
|
+
"CY": "Cyprus",
|
66
|
+
"CZ": "Czechia",
|
67
|
+
"DK": "Denmark",
|
68
|
+
"DG": "Diego Garcia",
|
69
|
+
"DJ": "Djibouti",
|
70
|
+
"DM": "Dominica",
|
71
|
+
"DO": "Dominican Republic",
|
72
|
+
"EC": "Ecuador",
|
73
|
+
"EG": "Egypt",
|
74
|
+
"SV": "El Salvador",
|
75
|
+
"GQ": "Equatorial Guinea",
|
76
|
+
"ER": "Eritrea",
|
77
|
+
"EE": "Estonia",
|
78
|
+
"SZ": "Eswatini",
|
79
|
+
"ET": "Ethiopia",
|
80
|
+
"FK": "Falkland Islands",
|
81
|
+
"FO": "Faroe Islands",
|
82
|
+
"FJ": "Fiji",
|
83
|
+
"FI": "Finland",
|
84
|
+
"FR": "France",
|
85
|
+
"GF": "French Guiana",
|
86
|
+
"PF": "French Polynesia",
|
87
|
+
"TF": "French Southern Territories",
|
88
|
+
"GA": "Gabon",
|
89
|
+
"GM": "Gambia",
|
90
|
+
"GE": "Georgia",
|
91
|
+
"DE": "Germany",
|
92
|
+
"GH": "Ghana",
|
93
|
+
"GI": "Gibraltar",
|
94
|
+
"GR": "Greece",
|
95
|
+
"GL": "Greenland",
|
96
|
+
"GD": "Grenada",
|
97
|
+
"GP": "Guadeloupe",
|
98
|
+
"GU": "Guam",
|
99
|
+
"GT": "Guatemala",
|
100
|
+
"GG": "Guernsey",
|
101
|
+
"GN": "Guinea",
|
102
|
+
"GW": "Guinea-Bissau",
|
103
|
+
"GY": "Guyana",
|
104
|
+
"HT": "Haiti",
|
105
|
+
"HM": "Heard & McDonald Islands",
|
106
|
+
"HN": "Honduras",
|
107
|
+
"HK": "Hong Kong SAR China",
|
108
|
+
"HU": "Hungary",
|
109
|
+
"IS": "Iceland",
|
110
|
+
"IN": "India",
|
111
|
+
"ID": "Indonesia",
|
112
|
+
"IR": "Iran",
|
113
|
+
"IQ": "Iraq",
|
114
|
+
"IE": "Ireland",
|
115
|
+
"IM": "Isle of Man",
|
116
|
+
"IL": "Israel",
|
117
|
+
"IT": "Italy",
|
118
|
+
"JM": "Jamaica",
|
119
|
+
"JP": "Japan",
|
120
|
+
"JE": "Jersey",
|
121
|
+
"JO": "Jordan",
|
122
|
+
"KZ": "Kazakhstan",
|
123
|
+
"KE": "Kenya",
|
124
|
+
"KI": "Kiribati",
|
125
|
+
"XK": "Kosovo",
|
126
|
+
"KW": "Kuwait",
|
127
|
+
"KG": "Kyrgyzstan",
|
128
|
+
"LA": "Laos",
|
129
|
+
"LV": "Latvia",
|
130
|
+
"LB": "Lebanon",
|
131
|
+
"LS": "Lesotho",
|
132
|
+
"LR": "Liberia",
|
133
|
+
"LY": "Libya",
|
134
|
+
"LI": "Liechtenstein",
|
135
|
+
"LT": "Lithuania",
|
136
|
+
"LU": "Luxembourg",
|
137
|
+
"MO": "Macao SAR China",
|
138
|
+
"MG": "Madagascar",
|
139
|
+
"MW": "Malawi",
|
140
|
+
"MY": "Malaysia",
|
141
|
+
"MV": "Maldives",
|
142
|
+
"ML": "Mali",
|
143
|
+
"MT": "Malta",
|
144
|
+
"MH": "Marshall Islands",
|
145
|
+
"MQ": "Martinique",
|
146
|
+
"MR": "Mauritania",
|
147
|
+
"MU": "Mauritius",
|
148
|
+
"YT": "Mayotte",
|
149
|
+
"MX": "Mexico",
|
150
|
+
"FM": "Micronesia",
|
151
|
+
"MD": "Moldova",
|
152
|
+
"MC": "Monaco",
|
153
|
+
"MN": "Mongolia",
|
154
|
+
"ME": "Montenegro",
|
155
|
+
"MS": "Montserrat",
|
156
|
+
"MA": "Morocco",
|
157
|
+
"MZ": "Mozambique",
|
158
|
+
"MM": "Myanmar (Burma)",
|
159
|
+
"NA": "Namibia",
|
160
|
+
"NR": "Nauru",
|
161
|
+
"NP": "Nepal",
|
162
|
+
"NL": "Netherlands",
|
163
|
+
"NC": "New Caledonia",
|
164
|
+
"NZ": "New Zealand",
|
165
|
+
"NI": "Nicaragua",
|
166
|
+
"NE": "Niger",
|
167
|
+
"NG": "Nigeria",
|
168
|
+
"NU": "Niue",
|
169
|
+
"NF": "Norfolk Island",
|
170
|
+
"KP": "North Korea",
|
171
|
+
"MK": "North Macedonia",
|
172
|
+
"MP": "Northern Mariana Islands",
|
173
|
+
"NO": "Norway",
|
174
|
+
"OM": "Oman",
|
175
|
+
"PK": "Pakistan",
|
176
|
+
"PW": "Palau",
|
177
|
+
"PS": "Palestinian Territories",
|
178
|
+
"PA": "Panama",
|
179
|
+
"PG": "Papua New Guinea",
|
180
|
+
"PY": "Paraguay",
|
181
|
+
"PE": "Peru",
|
182
|
+
"PH": "Philippines",
|
183
|
+
"PN": "Pitcairn Islands",
|
184
|
+
"PL": "Poland",
|
185
|
+
"PT": "Portugal",
|
186
|
+
"PR": "Puerto Rico",
|
187
|
+
"QA": "Qatar",
|
188
|
+
"RE": "Réunion",
|
189
|
+
"RO": "Romania",
|
190
|
+
"RU": "Russia",
|
191
|
+
"RW": "Rwanda",
|
192
|
+
"WS": "Samoa",
|
193
|
+
"SM": "San Marino",
|
194
|
+
"ST": "São Tomé & Príncipe",
|
195
|
+
"SA": "Saudi Arabia",
|
196
|
+
"SN": "Senegal",
|
197
|
+
"RS": "Serbia",
|
198
|
+
"SC": "Seychelles",
|
199
|
+
"SL": "Sierra Leone",
|
200
|
+
"SG": "Singapore",
|
201
|
+
"SX": "Sint Maarten",
|
202
|
+
"SK": "Slovakia",
|
203
|
+
"SI": "Slovenia",
|
204
|
+
"SB": "Solomon Islands",
|
205
|
+
"SO": "Somalia",
|
206
|
+
"ZA": "South Africa",
|
207
|
+
"GS": "South Georgia & South Sandwich Islands",
|
208
|
+
"KR": "South Korea",
|
209
|
+
"SS": "South Sudan",
|
210
|
+
"ES": "Spain",
|
211
|
+
"LK": "Sri Lanka",
|
212
|
+
"BL": "St. Barthélemy",
|
213
|
+
"SH": "St. Helena",
|
214
|
+
"KN": "St. Kitts & Nevis",
|
215
|
+
"LC": "St. Lucia",
|
216
|
+
"MF": "St. Martin",
|
217
|
+
"PM": "St. Pierre & Miquelon",
|
218
|
+
"VC": "St. Vincent & Grenadines",
|
219
|
+
"SD": "Sudan",
|
220
|
+
"SR": "Suriname",
|
221
|
+
"SJ": "Svalbard & Jan Mayen",
|
222
|
+
"SE": "Sweden",
|
223
|
+
"CH": "Switzerland",
|
224
|
+
"SY": "Syria",
|
225
|
+
"TW": "Taiwan",
|
226
|
+
"TJ": "Tajikistan",
|
227
|
+
"TZ": "Tanzania",
|
228
|
+
"TH": "Thailand",
|
229
|
+
"TL": "Timor-Leste",
|
230
|
+
"TG": "Togo",
|
231
|
+
"TK": "Tokelau",
|
232
|
+
"TO": "Tonga",
|
233
|
+
"TT": "Trinidad & Tobago",
|
234
|
+
"TA": "Tristan da Cunha",
|
235
|
+
"TN": "Tunisia",
|
236
|
+
"TR": "Turkey",
|
237
|
+
"TM": "Turkmenistan",
|
238
|
+
"TC": "Turks & Caicos Islands",
|
239
|
+
"TV": "Tuvalu",
|
240
|
+
"UG": "Uganda",
|
241
|
+
"UA": "Ukraine",
|
242
|
+
"AE": "United Arab Emirates",
|
243
|
+
"GB": "United Kingdom",
|
244
|
+
"US": "United States",
|
245
|
+
"UY": "Uruguay",
|
246
|
+
"UM": "US Outlying Islands",
|
247
|
+
"VI": "US Virgin Islands",
|
248
|
+
"UZ": "Uzbekistan",
|
249
|
+
"VU": "Vanuatu",
|
250
|
+
"VA": "Vatican City",
|
251
|
+
"VE": "Venezuela",
|
252
|
+
"VN": "Vietnam",
|
253
|
+
"WF": "Wallis & Futuna",
|
254
|
+
"EH": "Western Sahara",
|
255
|
+
"YE": "Yemen",
|
256
|
+
"ZM": "Zambia",
|
257
|
+
"ZW": "Zimbabwe"
|
258
|
+
}
|
@@ -0,0 +1,258 @@
|
|
1
|
+
{
|
2
|
+
"AF": "Afghanistan",
|
3
|
+
"AX": "Åland Islands",
|
4
|
+
"AL": "Albania",
|
5
|
+
"DZ": "Algeria",
|
6
|
+
"AS": "American Samoa",
|
7
|
+
"AD": "Andorra",
|
8
|
+
"AO": "Angola",
|
9
|
+
"AI": "Anguilla",
|
10
|
+
"AQ": "Antarctica",
|
11
|
+
"AG": "Antigua & Barbuda",
|
12
|
+
"AR": "Argentina",
|
13
|
+
"AM": "Armenia",
|
14
|
+
"AW": "Aruba",
|
15
|
+
"AC": "Ascension Island",
|
16
|
+
"AU": "Australia",
|
17
|
+
"AT": "Austria",
|
18
|
+
"AZ": "Azerbaijan",
|
19
|
+
"BS": "Bahamas",
|
20
|
+
"BH": "Bahrain",
|
21
|
+
"BD": "Bangladesh",
|
22
|
+
"BB": "Barbados",
|
23
|
+
"BY": "Belarus",
|
24
|
+
"BE": "Belgium",
|
25
|
+
"BZ": "Belize",
|
26
|
+
"BJ": "Benin",
|
27
|
+
"BM": "Bermuda",
|
28
|
+
"BT": "Bhutan",
|
29
|
+
"BO": "Bolivia",
|
30
|
+
"BA": "Bosnia & Herzegovina",
|
31
|
+
"BW": "Botswana",
|
32
|
+
"BV": "Bouvet Island",
|
33
|
+
"BR": "Brazil",
|
34
|
+
"IO": "British Indian Ocean Territory",
|
35
|
+
"VG": "British Virgin Islands",
|
36
|
+
"BN": "Brunei",
|
37
|
+
"BG": "Bulgaria",
|
38
|
+
"BF": "Burkina Faso",
|
39
|
+
"BI": "Burundi",
|
40
|
+
"KH": "Cambodia",
|
41
|
+
"CM": "Cameroon",
|
42
|
+
"CA": "Canada",
|
43
|
+
"IC": "Canary Islands",
|
44
|
+
"CV": "Cape Verde",
|
45
|
+
"BQ": "Caribbean Netherlands",
|
46
|
+
"KY": "Cayman Islands",
|
47
|
+
"CF": "Central African Republic",
|
48
|
+
"EA": "Ceuta & Melilla",
|
49
|
+
"TD": "Chad",
|
50
|
+
"CL": "Chile",
|
51
|
+
"CN": "China",
|
52
|
+
"CX": "Christmas Island",
|
53
|
+
"CP": "Clipperton Island",
|
54
|
+
"CC": "Cocos (Keeling) Islands",
|
55
|
+
"CO": "Colombia",
|
56
|
+
"KM": "Comoros",
|
57
|
+
"CG": "Congo - Brazzaville",
|
58
|
+
"CD": "Congo - Kinshasa",
|
59
|
+
"CK": "Cook Islands",
|
60
|
+
"CR": "Costa Rica",
|
61
|
+
"CI": "Côte d’Ivoire",
|
62
|
+
"HR": "Croatia",
|
63
|
+
"CU": "Cuba",
|
64
|
+
"CW": "Curaçao",
|
65
|
+
"CY": "Cyprus",
|
66
|
+
"CZ": "Czechia",
|
67
|
+
"DK": "Denmark",
|
68
|
+
"DG": "Diego Garcia",
|
69
|
+
"DJ": "Djibouti",
|
70
|
+
"DM": "Dominica",
|
71
|
+
"DO": "Dominican Republic",
|
72
|
+
"EC": "Ecuador",
|
73
|
+
"EG": "Egypt",
|
74
|
+
"SV": "El Salvador",
|
75
|
+
"GQ": "Equatorial Guinea",
|
76
|
+
"ER": "Eritrea",
|
77
|
+
"EE": "Estonia",
|
78
|
+
"SZ": "Eswatini",
|
79
|
+
"ET": "Ethiopia",
|
80
|
+
"FK": "Falkland Islands",
|
81
|
+
"FO": "Faroe Islands",
|
82
|
+
"FJ": "Fiji",
|
83
|
+
"FI": "Finland",
|
84
|
+
"FR": "France",
|
85
|
+
"GF": "French Guiana",
|
86
|
+
"PF": "French Polynesia",
|
87
|
+
"TF": "French Southern Territories",
|
88
|
+
"GA": "Gabon",
|
89
|
+
"GM": "Gambia",
|
90
|
+
"GE": "Georgia",
|
91
|
+
"DE": "Germany",
|
92
|
+
"GH": "Ghana",
|
93
|
+
"GI": "Gibraltar",
|
94
|
+
"GR": "Greece",
|
95
|
+
"GL": "Greenland",
|
96
|
+
"GD": "Grenada",
|
97
|
+
"GP": "Guadeloupe",
|
98
|
+
"GU": "Guam",
|
99
|
+
"GT": "Guatemala",
|
100
|
+
"GG": "Guernsey",
|
101
|
+
"GN": "Guinea",
|
102
|
+
"GW": "Guinea-Bissau",
|
103
|
+
"GY": "Guyana",
|
104
|
+
"HT": "Haiti",
|
105
|
+
"HM": "Heard & McDonald Islands",
|
106
|
+
"HN": "Honduras",
|
107
|
+
"HK": "Hong Kong SAR China",
|
108
|
+
"HU": "Hungary",
|
109
|
+
"IS": "Iceland",
|
110
|
+
"IN": "India",
|
111
|
+
"ID": "Indonesia",
|
112
|
+
"IR": "Iran",
|
113
|
+
"IQ": "Iraq",
|
114
|
+
"IE": "Ireland",
|
115
|
+
"IM": "Isle of Man",
|
116
|
+
"IL": "Israel",
|
117
|
+
"IT": "Italy",
|
118
|
+
"JM": "Jamaica",
|
119
|
+
"JP": "Japan",
|
120
|
+
"JE": "Jersey",
|
121
|
+
"JO": "Jordan",
|
122
|
+
"KZ": "Kazakhstan",
|
123
|
+
"KE": "Kenya",
|
124
|
+
"KI": "Kiribati",
|
125
|
+
"XK": "Kosovo",
|
126
|
+
"KW": "Kuwait",
|
127
|
+
"KG": "Kyrgyzstan",
|
128
|
+
"LA": "Laos",
|
129
|
+
"LV": "Latvia",
|
130
|
+
"LB": "Lebanon",
|
131
|
+
"LS": "Lesotho",
|
132
|
+
"LR": "Liberia",
|
133
|
+
"LY": "Libya",
|
134
|
+
"LI": "Liechtenstein",
|
135
|
+
"LT": "Lithuania",
|
136
|
+
"LU": "Luxembourg",
|
137
|
+
"MO": "Macao SAR China",
|
138
|
+
"MG": "Madagascar",
|
139
|
+
"MW": "Malawi",
|
140
|
+
"MY": "Malaysia",
|
141
|
+
"MV": "Maldives",
|
142
|
+
"ML": "Mali",
|
143
|
+
"MT": "Malta",
|
144
|
+
"MH": "Marshall Islands",
|
145
|
+
"MQ": "Martinique",
|
146
|
+
"MR": "Mauritania",
|
147
|
+
"MU": "Mauritius",
|
148
|
+
"YT": "Mayotte",
|
149
|
+
"MX": "Mexico",
|
150
|
+
"FM": "Micronesia",
|
151
|
+
"MD": "Moldova",
|
152
|
+
"MC": "Monaco",
|
153
|
+
"MN": "Mongolia",
|
154
|
+
"ME": "Montenegro",
|
155
|
+
"MS": "Montserrat",
|
156
|
+
"MA": "Morocco",
|
157
|
+
"MZ": "Mozambique",
|
158
|
+
"MM": "Myanmar (Burma)",
|
159
|
+
"NA": "Namibia",
|
160
|
+
"NR": "Nauru",
|
161
|
+
"NP": "Nepal",
|
162
|
+
"NL": "Netherlands",
|
163
|
+
"NC": "New Caledonia",
|
164
|
+
"NZ": "New Zealand",
|
165
|
+
"NI": "Nicaragua",
|
166
|
+
"NE": "Niger",
|
167
|
+
"NG": "Nigeria",
|
168
|
+
"NU": "Niue",
|
169
|
+
"NF": "Norfolk Island",
|
170
|
+
"KP": "North Korea",
|
171
|
+
"MK": "North Macedonia",
|
172
|
+
"MP": "Northern Mariana Islands",
|
173
|
+
"NO": "Norway",
|
174
|
+
"OM": "Oman",
|
175
|
+
"PK": "Pakistan",
|
176
|
+
"PW": "Palau",
|
177
|
+
"PS": "Palestinian Territories",
|
178
|
+
"PA": "Panama",
|
179
|
+
"PG": "Papua New Guinea",
|
180
|
+
"PY": "Paraguay",
|
181
|
+
"PE": "Peru",
|
182
|
+
"PH": "Philippines",
|
183
|
+
"PN": "Pitcairn Islands",
|
184
|
+
"PL": "Poland",
|
185
|
+
"PT": "Portugal",
|
186
|
+
"PR": "Puerto Rico",
|
187
|
+
"QA": "Qatar",
|
188
|
+
"RE": "Réunion",
|
189
|
+
"RO": "Romania",
|
190
|
+
"RU": "Russia",
|
191
|
+
"RW": "Rwanda",
|
192
|
+
"WS": "Samoa",
|
193
|
+
"SM": "San Marino",
|
194
|
+
"ST": "São Tomé & Príncipe",
|
195
|
+
"SA": "Saudi Arabia",
|
196
|
+
"SN": "Senegal",
|
197
|
+
"RS": "Serbia",
|
198
|
+
"SC": "Seychelles",
|
199
|
+
"SL": "Sierra Leone",
|
200
|
+
"SG": "Singapore",
|
201
|
+
"SX": "Sint Maarten",
|
202
|
+
"SK": "Slovakia",
|
203
|
+
"SI": "Slovenia",
|
204
|
+
"SB": "Solomon Islands",
|
205
|
+
"SO": "Somalia",
|
206
|
+
"ZA": "South Africa",
|
207
|
+
"GS": "South Georgia & South Sandwich Islands",
|
208
|
+
"KR": "South Korea",
|
209
|
+
"SS": "South Sudan",
|
210
|
+
"ES": "Spain",
|
211
|
+
"LK": "Sri Lanka",
|
212
|
+
"BL": "St. Barthélemy",
|
213
|
+
"SH": "St. Helena",
|
214
|
+
"KN": "St. Kitts & Nevis",
|
215
|
+
"LC": "St. Lucia",
|
216
|
+
"MF": "St. Martin",
|
217
|
+
"PM": "St. Pierre & Miquelon",
|
218
|
+
"VC": "St. Vincent & Grenadines",
|
219
|
+
"SD": "Sudan",
|
220
|
+
"SR": "Suriname",
|
221
|
+
"SJ": "Svalbard & Jan Mayen",
|
222
|
+
"SE": "Sweden",
|
223
|
+
"CH": "Switzerland",
|
224
|
+
"SY": "Syria",
|
225
|
+
"TW": "Taiwan",
|
226
|
+
"TJ": "Tajikistan",
|
227
|
+
"TZ": "Tanzania",
|
228
|
+
"TH": "Thailand",
|
229
|
+
"TL": "Timor-Leste",
|
230
|
+
"TG": "Togo",
|
231
|
+
"TK": "Tokelau",
|
232
|
+
"TO": "Tonga",
|
233
|
+
"TT": "Trinidad & Tobago",
|
234
|
+
"TA": "Tristan da Cunha",
|
235
|
+
"TN": "Tunisia",
|
236
|
+
"TR": "Turkey",
|
237
|
+
"TM": "Turkmenistan",
|
238
|
+
"TC": "Turks & Caicos Islands",
|
239
|
+
"TV": "Tuvalu",
|
240
|
+
"UM": "U.S. Outlying Islands",
|
241
|
+
"VI": "U.S. Virgin Islands",
|
242
|
+
"UG": "Uganda",
|
243
|
+
"UA": "Ukraine",
|
244
|
+
"AE": "United Arab Emirates",
|
245
|
+
"GB": "United Kingdom",
|
246
|
+
"US": "United States",
|
247
|
+
"UY": "Uruguay",
|
248
|
+
"UZ": "Uzbekistan",
|
249
|
+
"VU": "Vanuatu",
|
250
|
+
"VA": "Vatican City",
|
251
|
+
"VE": "Venezuela",
|
252
|
+
"VN": "Vietnam",
|
253
|
+
"WF": "Wallis & Futuna",
|
254
|
+
"EH": "Western Sahara",
|
255
|
+
"YE": "Yemen",
|
256
|
+
"ZM": "Zambia",
|
257
|
+
"ZW": "Zimbabwe"
|
258
|
+
}
|
data/data/country/zh.json
CHANGED
@@ -35,6 +35,7 @@
|
|
35
35
|
"MK": "北马其顿",
|
36
36
|
"BJ": "贝宁",
|
37
37
|
"BE": "比利时",
|
38
|
+
"PE": "秘鲁",
|
38
39
|
"IS": "冰岛",
|
39
40
|
"PR": "波多黎各",
|
40
41
|
"PL": "波兰",
|
@@ -148,7 +149,6 @@
|
|
148
149
|
"MN": "蒙古",
|
149
150
|
"MS": "蒙特塞拉特",
|
150
151
|
"BD": "孟加拉国",
|
151
|
-
"PE": "秘鲁",
|
152
152
|
"FM": "密克罗尼西亚",
|
153
153
|
"MM": "缅甸",
|
154
154
|
"MD": "摩尔多瓦",
|
@@ -7,12 +7,6 @@
|
|
7
7
|
],
|
8
8
|
"locale": "zh-Hans",
|
9
9
|
"subdivisions": {
|
10
|
-
"Chenbei Xinqu": {
|
11
|
-
"local_code": "沈北新区"
|
12
|
-
},
|
13
|
-
"Shenhe Qu": {
|
14
|
-
"local_code": "沈河区"
|
15
|
-
},
|
16
10
|
"Dadong Qu": {
|
17
11
|
"local_code": "大东区"
|
18
12
|
},
|
@@ -35,6 +29,12 @@
|
|
35
29
|
"Liaozhong Xian": {
|
36
30
|
"local_code": "辽中县"
|
37
31
|
},
|
32
|
+
"Chenbei Xinqu": {
|
33
|
+
"local_code": "沈北新区"
|
34
|
+
},
|
35
|
+
"Shenhe Qu": {
|
36
|
+
"local_code": "沈河区"
|
37
|
+
},
|
38
38
|
"Sujiatun Qu": {
|
39
39
|
"local_code": "苏家屯区"
|
40
40
|
},
|
@@ -7,9 +7,6 @@
|
|
7
7
|
],
|
8
8
|
"locale": "zh-Hans",
|
9
9
|
"subdivisions": {
|
10
|
-
"Shenqiu Xian": {
|
11
|
-
"local_code": "沈丘县"
|
12
|
-
},
|
13
10
|
"Chuanhui Qu": {
|
14
11
|
"local_code": "川汇区"
|
15
12
|
},
|
@@ -28,6 +25,9 @@
|
|
28
25
|
"Shangshui Xian": {
|
29
26
|
"local_code": "商水县"
|
30
27
|
},
|
28
|
+
"Shenqiu Xian": {
|
29
|
+
"local_code": "沈丘县"
|
30
|
+
},
|
31
31
|
"Taikang Xian": {
|
32
32
|
"local_code": "太康县"
|
33
33
|
},
|
@@ -13,15 +13,15 @@
|
|
13
13
|
"Chunhua Xian": {
|
14
14
|
"local_code": "淳化县"
|
15
15
|
},
|
16
|
-
"Qian Xian": {
|
17
|
-
"local_code": "乾县"
|
18
|
-
},
|
19
16
|
"Jingyang Xian": {
|
20
17
|
"local_code": "泾阳县"
|
21
18
|
},
|
22
19
|
"Liquan Xian": {
|
23
20
|
"local_code": "礼泉县"
|
24
21
|
},
|
22
|
+
"Qian Xian": {
|
23
|
+
"local_code": "乾县"
|
24
|
+
},
|
25
25
|
"Qindu Qu": {
|
26
26
|
"local_code": "秦都区"
|
27
27
|
},
|
@@ -10,9 +10,6 @@
|
|
10
10
|
"Fuyu Xian": {
|
11
11
|
"local_code": "扶余县"
|
12
12
|
},
|
13
|
-
"Qian'an Xian": {
|
14
|
-
"local_code": "乾安县"
|
15
|
-
},
|
16
13
|
"Ningjiang Qu": {
|
17
14
|
"local_code": "宁江区"
|
18
15
|
},
|
@@ -20,6 +17,9 @@
|
|
20
17
|
"local_code": "前郭尔罗斯蒙古族自治县",
|
21
18
|
"local_name": "前郭尔罗斯县"
|
22
19
|
},
|
20
|
+
"Qian'an Xian": {
|
21
|
+
"local_code": "乾安县"
|
22
|
+
},
|
23
23
|
"Changling Xian": {
|
24
24
|
"local_code": "长岭县"
|
25
25
|
}
|
@@ -141,4 +141,25 @@ module Addressing
|
|
141
141
|
fields & used_fields
|
142
142
|
end
|
143
143
|
end
|
144
|
+
|
145
|
+
class AddressFormatHelper
|
146
|
+
class << self
|
147
|
+
# Gets the required fields.
|
148
|
+
#
|
149
|
+
# Applies field overrides to the required fields
|
150
|
+
# specified by the address format.
|
151
|
+
def required_fields(address_format, field_overrides)
|
152
|
+
required_fields = address_format.required_fields
|
153
|
+
required_fields = required_fields - field_overrides.optional_fields
|
154
|
+
required_fields = required_fields - field_overrides.hidden_fields
|
155
|
+
|
156
|
+
if field_overrides.required_fields
|
157
|
+
required_fields = required_fields + field_overrides.required_fields
|
158
|
+
required_fields = required_fields.uniq
|
159
|
+
end
|
160
|
+
|
161
|
+
required_fields
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
144
165
|
end
|
data/lib/addressing/country.rb
CHANGED
@@ -8,18 +8,18 @@ module Addressing
|
|
8
8
|
@@available_locales = [
|
9
9
|
"af", "am", "ar", "ar-LY", "ar-SA", "as", "az", "be", "bg", "bn",
|
10
10
|
"bn-IN", "bs", "ca", "cs", "cy", "da", "de", "de-AT", "de-CH", "el",
|
11
|
-
"en", "en-001", "en-CA", "en-GB", "es", "es-419", "es-AR",
|
11
|
+
"en", "en-001", "en-CA", "en-GB", "en-MV", "es", "es-419", "es-AR",
|
12
12
|
"es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-GT", "es-HN",
|
13
13
|
"es-MX", "es-NI", "es-PA", "es-PE", "es-PR", "es-PY", "es-SV", "es-US",
|
14
14
|
"es-VE", "et", "eu", "fa", "fa-AF", "fi", "fil", "fr", "fr-BE", "fr-CA",
|
15
|
-
"ga", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is",
|
16
|
-
"ka", "kk", "km", "ko", "ko-KP", "ky", "lo", "lt", "lv",
|
17
|
-
"mn", "mr", "ms", "my", "ne", "nl", "nn", "no", "or", "pa",
|
18
|
-
"ps-PK", "pt", "pt-PT", "ro", "ro-MD", "ru", "ru-UA", "sd",
|
19
|
-
"sl", "so", "sq", "sr", "sr-Cyrl-BA", "sr-Cyrl-ME",
|
20
|
-
"sr-Latn", "sr-Latn-BA", "sr-Latn-ME", "sr-Latn-XK", "sv",
|
21
|
-
"sw-CD", "sw-KE", "ta", "te", "th", "tk", "tr", "uk", "ur",
|
22
|
-
"uz", "vi", "yue", "zh", "zh-Hant", "zh-Hant-HK", "zu"
|
15
|
+
"ga", "gl", "gu", "he", "hi", "hi-Latn", "hr", "hu", "hy", "id", "is",
|
16
|
+
"it", "ja", "ka", "kk", "km", "ko", "ko-KP", "ky", "lo", "lt", "lv",
|
17
|
+
"mk", "ml", "mn", "mr", "ms", "my", "ne", "nl", "nn", "no", "or", "pa",
|
18
|
+
"pl", "ps", "ps-PK", "pt", "pt-PT", "ro", "ro-MD", "ru", "ru-UA", "sd",
|
19
|
+
"si", "sk", "sl", "so", "sq", "sr", "sr-Cyrl-BA", "sr-Cyrl-ME",
|
20
|
+
"sr-Cyrl-XK", "sr-Latn", "sr-Latn-BA", "sr-Latn-ME", "sr-Latn-XK", "sv",
|
21
|
+
"sw", "sw-CD", "sw-KE", "ta", "te", "th", "tk", "tr", "uk", "ur",
|
22
|
+
"ur-IN", "uz", "vi", "yue", "zh", "zh-Hant", "zh-Hant-HK", "zu"
|
23
23
|
]
|
24
24
|
|
25
25
|
def get(country_code, locale = "en", fallback_locale = "en")
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Addressing
|
4
|
+
class FieldOverride < Enum
|
5
|
+
HIDDEN = "hidden"
|
6
|
+
OPTIONAL = "optional"
|
7
|
+
REQUIRED = "required"
|
8
|
+
end
|
9
|
+
|
10
|
+
class FieldOverrides
|
11
|
+
attr_reader :hidden_fields, :optional_fields, :required_fields
|
12
|
+
|
13
|
+
def initialize(definition)
|
14
|
+
AddressField.assert_all_exist(definition.keys)
|
15
|
+
FieldOverride.assert_all_exist(definition.values)
|
16
|
+
|
17
|
+
@hidden_fields = []
|
18
|
+
@optional_fields = []
|
19
|
+
@required_fields = []
|
20
|
+
|
21
|
+
definition.each do |field, override|
|
22
|
+
case override
|
23
|
+
when FieldOverride::HIDDEN
|
24
|
+
@hidden_fields << field
|
25
|
+
when FieldOverride::OPTIONAL
|
26
|
+
@optional_fields << field
|
27
|
+
when FieldOverride::REQUIRED
|
28
|
+
@required_fields << field
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/addressing/model.rb
CHANGED
@@ -2,16 +2,20 @@
|
|
2
2
|
|
3
3
|
module Addressing
|
4
4
|
module Model
|
5
|
-
def validates_address_format(
|
5
|
+
def validates_address_format(
|
6
|
+
fields: [:country_code, :administrative_area, :locality, :dependent_locality, :postal_code, :sorting_code, :address_line1, :address_line2, :organization, :given_name, :additional_name, :family_name, :locale], field_overrides: nil, **options)
|
7
|
+
fields = Array(fields)
|
8
|
+
field_overrides ||= FieldOverrides.new({})
|
9
|
+
|
10
|
+
options[:if] ||= -> { fields.any? { |f| changes.key?(f.to_s) } } unless options[:unless]
|
11
|
+
|
6
12
|
class_eval do
|
7
13
|
validate :verify_address_format, **options
|
8
14
|
|
9
15
|
define_method :verify_address_format do
|
10
|
-
|
11
|
-
|
12
|
-
end
|
16
|
+
values = fields.each_with_object({}) { |f, v| v[f] = send(f) if self.respond_to?(f) }
|
17
|
+
address = Address.new(**values)
|
13
18
|
|
14
|
-
address = Address.new(**fields)
|
15
19
|
return unless address.country_code.present?
|
16
20
|
|
17
21
|
address_format = AddressFormat.get(address.country_code)
|
@@ -23,14 +27,16 @@ module Addressing
|
|
23
27
|
address_format.used_fields
|
24
28
|
|
25
29
|
# Validate the presence of required fields.
|
26
|
-
address_format.
|
30
|
+
AddressFormatHelper::required_fields(address_format, field_overrides).each do |required_field|
|
27
31
|
next unless address.send(required_field).blank?
|
28
32
|
|
29
33
|
errors.add(required_field, "should not be blank")
|
30
34
|
end
|
31
35
|
|
36
|
+
used_fields = address_format.used_fields - field_overrides.hidden_fields
|
37
|
+
|
32
38
|
# Validate the absence of unused fields.
|
33
|
-
unused_fields = AddressField.all.values -
|
39
|
+
unused_fields = AddressField.all.values - used_fields
|
34
40
|
unused_fields.each do |unused_field|
|
35
41
|
next if address.send(unused_field).blank?
|
36
42
|
|
@@ -38,20 +44,19 @@ module Addressing
|
|
38
44
|
end
|
39
45
|
|
40
46
|
# Validate subdivisions.
|
41
|
-
subdivisions = verify_subdivisions(address, address_format)
|
47
|
+
subdivisions = verify_subdivisions(address, address_format, field_overrides)
|
42
48
|
|
43
49
|
# Validate postal code.
|
44
|
-
verify_postal_code(address.postal_code, subdivisions, address_format) if
|
50
|
+
verify_postal_code(address.postal_code, subdivisions, address_format) if used_fields.include?(AddressField::POSTAL_CODE)
|
45
51
|
end
|
46
52
|
|
47
|
-
define_method :verify_subdivisions do |address, address_format|
|
53
|
+
define_method :verify_subdivisions do |address, address_format, field_overrides|
|
48
54
|
# No predefined subdivisions exist, nothing to validate against.
|
49
55
|
return [] if address_format.subdivision_depth < 1
|
50
56
|
|
51
57
|
subdivisions, _parents = address_format.used_subdivision_fields.each_with_index.inject([[], []]) do |(subdivisions, parents), (field, index)|
|
52
58
|
# The field is empty or validation is disabled.
|
53
|
-
|
54
|
-
break subdivisions if address.send(field).blank?
|
59
|
+
break [subdivisions, parents] if address.send(field).blank? || field_overrides.hidden_fields.include?(field)
|
55
60
|
|
56
61
|
parents << (index > 0 ? address.send(address_format.used_subdivision_fields[index - 1]) : address_format.country_code)
|
57
62
|
subdivision = Subdivision.get(address.send(field), parents)
|
data/lib/addressing/version.rb
CHANGED
data/lib/addressing.rb
CHANGED
@@ -12,6 +12,7 @@ require "addressing/administrative_area_type"
|
|
12
12
|
require "addressing/country"
|
13
13
|
require "addressing/default_formatter"
|
14
14
|
require "addressing/dependent_locality_type"
|
15
|
+
require "addressing/field_override"
|
15
16
|
require "addressing/lazy_subdivisions"
|
16
17
|
require "addressing/locale"
|
17
18
|
require "addressing/locality_type"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: addressing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robin van der Vleuten
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: robinvdvleuten@gmail.com
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- data/country/en-001.json
|
45
45
|
- data/country/en-CA.json
|
46
46
|
- data/country/en-GB.json
|
47
|
+
- data/country/en-MV.json
|
47
48
|
- data/country/en.json
|
48
49
|
- data/country/es-419.json
|
49
50
|
- data/country/es-AR.json
|
@@ -78,6 +79,7 @@ files:
|
|
78
79
|
- data/country/gl.json
|
79
80
|
- data/country/gu.json
|
80
81
|
- data/country/he.json
|
82
|
+
- data/country/hi-Latn.json
|
81
83
|
- data/country/hi.json
|
82
84
|
- data/country/hr.json
|
83
85
|
- data/country/hu.json
|
@@ -689,6 +691,7 @@ files:
|
|
689
691
|
- lib/addressing/default_formatter.rb
|
690
692
|
- lib/addressing/dependent_locality_type.rb
|
691
693
|
- lib/addressing/enum.rb
|
694
|
+
- lib/addressing/field_override.rb
|
692
695
|
- lib/addressing/lazy_subdivisions.rb
|
693
696
|
- lib/addressing/locale.rb
|
694
697
|
- lib/addressing/locality_type.rb
|