worldwide 0.14.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci-typescript.yml +32 -0
  3. data/.github/workflows/npm-release.yml +38 -0
  4. data/.vscode/settings.json +8 -0
  5. data/CHANGELOG.md +12 -1
  6. data/Gemfile.lock +1 -1
  7. data/db/data/regions/BE.yml +5 -2
  8. data/db/data/regions/BR.yml +7 -4
  9. data/db/data/regions/CL/en.yml +1 -1
  10. data/db/data/regions/CL.yml +7 -4
  11. data/db/data/regions/CO.yml +3 -2
  12. data/db/data/regions/ES.yml +5 -2
  13. data/db/data/regions/ID.yml +3 -2
  14. data/db/data/regions/IL.yml +5 -2
  15. data/db/data/regions/MX/en.yml +20 -0
  16. data/db/data/regions/MX.yml +7 -4
  17. data/db/data/regions/NL.yml +5 -2
  18. data/db/data/regions/PH/en.yml +25 -0
  19. data/db/data/regions/PH.yml +4 -2
  20. data/db/data/regions/TR/en.yml +1 -1
  21. data/db/data/regions/TR.yml +4 -2
  22. data/db/data/regions/TW/en.yml +1 -1
  23. data/db/data/regions/TW.yml +8 -0
  24. data/db/data/regions/VN/en.yml +1 -1
  25. data/db/data/regions/VN.yml +4 -2
  26. data/db/data/regions/_default/cs.yml +27 -2
  27. data/db/data/regions/_default/da.yml +25 -1
  28. data/db/data/regions/_default/el.yml +28 -1
  29. data/db/data/regions/_default/es.yml +29 -1
  30. data/db/data/regions/_default/fi.yml +25 -1
  31. data/db/data/regions/_default/fr.yml +28 -1
  32. data/db/data/regions/_default/hi.yml +25 -1
  33. data/db/data/regions/_default/hu.yml +28 -2
  34. data/db/data/regions/_default/id.yml +26 -1
  35. data/db/data/regions/_default/ja.yml +20 -1
  36. data/db/data/regions/_default/lt.yml +28 -1
  37. data/db/data/regions/_default/ms.yml +26 -1
  38. data/db/data/regions/_default/pt-BR.yml +26 -1
  39. data/db/data/regions/_default/ro.yml +26 -1
  40. data/db/data/regions/_default/ru.yml +25 -1
  41. data/db/data/regions/_default/sk.yml +25 -1
  42. data/db/data/regions/_default/sl.yml +27 -1
  43. data/db/data/regions/_default/sv.yml +25 -1
  44. data/db/data/regions/_default/th.yml +24 -1
  45. data/db/data/regions/_default/tr.yml +24 -1
  46. data/db/data/regions/_default/vi.yml +24 -1
  47. data/db/data/regions/_default/zh-CN.yml +20 -1
  48. data/db/data/regions/_default/zh-TW.yml +20 -1
  49. data/lib/worldwide/address.rb +4 -4
  50. data/lib/worldwide/region.rb +27 -2
  51. data/lib/worldwide/regions_loader.rb +2 -1
  52. data/lib/worldwide/version.rb +1 -1
  53. data/worldwide.gemspec +1 -1
  54. metadata +6 -2
@@ -208,7 +208,7 @@ vi:
208
208
  optional: Khu phố (không bắt buộc)
209
209
  errors:
210
210
  blank: Nhập khu phố
211
- too_long: Khu phố quá dài (tối đa 255 ký tự)
211
+ too_long: Khu phố quá dài (tối đa %{limit} ký tự)
212
212
  contains_emojis: Khu phố không được chứa biểu tượng cảm xúc
213
213
  contains_mathematical_symbols: Khu phố không được chứa ký hiệu toán học
214
214
  contains_restricted_characters: Khu phố chỉ được chứa chữ cái, chữ số,
@@ -222,3 +222,26 @@ vi:
222
222
  unknown_for_address: Khu phố có thể không chính xác.
223
223
  warnings:
224
224
  contains_too_many_words: Khu phố nên có tối đa %{word_count} từ
225
+ line2:
226
+ label:
227
+ default: Căn hộ, dãy, v.v.
228
+ optional: Căn hộ, dãy, v.v. (không bắt buộc)
229
+ errors:
230
+ blank: Nhập căn hộ, dãy, v.v.
231
+ too_long: Dòng địa chỉ thứ hai quá dài (tối đa %{limit} ký tự)
232
+ contains_emojis: Dòng địa chỉ thứ hai không được chứa biểu tượng cảm xúc
233
+ contains_mathematical_symbols: Dòng địa chỉ thứ hai không được chứa ký
234
+ hiệu toán học
235
+ contains_restricted_characters: Dòng địa chỉ thứ hai chỉ được chứa chữ
236
+ cái, chữ số, ký tự địa phương và ký tự đặc biệt
237
+ contains_too_many_words: Dòng địa chỉ thứ hai chỉ được có tối đa %{word_count}
238
+ từ
239
+ contains_html_tags: Dòng địa chỉ thứ hai không được chứa thẻ HTML.
240
+ contains_url: Dòng địa chỉ thứ hai không được chứa URL.
241
+ missing_building_number: Thêm số tòa nhà nếu có.
242
+ street_unknown_for_zip: Nhập tên đường hợp lệ cho %{zip}.
243
+ building_number_invalid: Không thể định vị số tòa nhà cho %{street}, %{zip}.
244
+ unknown_for_address: Dòng địa chỉ thứ hai có thể không chính xác.
245
+ warnings:
246
+ contains_too_many_words: Dòng địa chỉ thứ hai nên có tối đa %{word_count}
247
+ từ
@@ -186,7 +186,7 @@ zh-CN:
186
186
  optional: 街区(选填)
187
187
  errors:
188
188
  blank: 输入街区
189
- too_long: 街区过长(最多包含 255 个字符)
189
+ too_long: 街区名过长(最多 %{limit} 个字符)
190
190
  contains_emojis: 街区名不能包含表情符号
191
191
  contains_mathematical_symbols: 街区名不能包含数学符号
192
192
  contains_restricted_characters: 街区名只能包含字母、数字、当地字符和特殊字符
@@ -198,3 +198,22 @@ zh-CN:
198
198
  unknown_for_address: 街区名可能不正确。
199
199
  warnings:
200
200
  contains_too_many_words: 建议街区名少于 %{word_count} 个字词
201
+ line2:
202
+ label:
203
+ default: 公寓、房间号等
204
+ optional: 公寓、房间号等(可选)
205
+ errors:
206
+ blank: 输入公寓、房间号等
207
+ too_long: 第二个地址行过长(最多 %{limit} 个字符)
208
+ contains_emojis: 第二个地址行不能包含表情符号
209
+ contains_mathematical_symbols: 第二个地址行不能包含数学符号
210
+ contains_restricted_characters: 第二个地址行只能包含字母、数字、当地字符和特殊字符
211
+ contains_too_many_words: 第二个地址行不能超过 %{word_count} 个字词
212
+ contains_html_tags: 第二个地址行不能包含 HTML 标记。
213
+ contains_url: 第二个地址行不能包含 URL。
214
+ missing_building_number: 添加大楼编号(如果有)。
215
+ street_unknown_for_zip: 输入 %{zip} 对应的有效街道名称。
216
+ building_number_invalid: 大楼编号与 %{street} 和 %{zip} 不匹配。
217
+ unknown_for_address: 第二个地址行可能不正确。
218
+ warnings:
219
+ contains_too_many_words: 建议第二个地址行少于 %{word_count} 个字词
@@ -186,7 +186,7 @@ zh-TW:
186
186
  optional: 鄰 (選填)
187
187
  errors:
188
188
  blank: 請輸入「鄰」
189
- too_long: "「鄰」過長 (最多 255 個字元)"
189
+ too_long: "「鄰」過長 (最多 %{limit} 個字元)"
190
190
  contains_emojis: "「鄰」不得包含表情符號"
191
191
  contains_mathematical_symbols: "「鄰」不得包含數學符號"
192
192
  contains_restricted_characters: "「鄰」僅可包含字母、數字、當地字元和特殊字元"
@@ -198,3 +198,22 @@ zh-TW:
198
198
  unknown_for_address: "「鄰」可能不正確。"
199
199
  warnings:
200
200
  contains_too_many_words: 建議「鄰」少於 %{word_count} 個字
201
+ line2:
202
+ label:
203
+ default: 公寓、套房等
204
+ optional: 公寓、套房等 (選填)
205
+ errors:
206
+ blank: 請輸入公寓、套房等
207
+ too_long: "「地址第二行」過長 (最多 %{limit} 個字元)"
208
+ contains_emojis: "「地址第二行」不得包含表情符號"
209
+ contains_mathematical_symbols: "「地址第二行」不得包含數學符號"
210
+ contains_restricted_characters: "「地址第二行」僅可包含字母、數字、當地字元和特殊字元"
211
+ contains_too_many_words: "「地址第二行」不得超過 %{word_count} 個字"
212
+ contains_html_tags: "「地址第二行」不得包含 HTML 標籤。"
213
+ contains_url: "「地址第二行」不得包含網址。"
214
+ missing_building_number: 如果您有建築物號碼,請新增建築物號碼。
215
+ street_unknown_for_zip: 請輸入 %{zip} 的有效街道名稱。
216
+ building_number_invalid: 在 %{zip},%{street} 找不到此建築物號碼。
217
+ unknown_for_address: "「地址第二行」可能並不正確。"
218
+ warnings:
219
+ contains_too_many_words: "「地址第二行」建議少於 %{word_count} 字"
@@ -149,23 +149,23 @@ module Worldwide
149
149
  def concatenated_address1
150
150
  return address1 if address1.present?
151
151
 
152
- additional_fields = region.additional_address_fields["address1"] || []
152
+ additional_fields = region.combined_address_format["address1"] || []
153
153
  concatenate_fields(additional_fields)
154
154
  end
155
155
 
156
156
  def concatenated_address2
157
- additional_fields = region.additional_address_fields["address2"] || []
157
+ additional_fields = region.combined_address_format["address2"] || []
158
158
  concatenate_fields(additional_fields)
159
159
  end
160
160
 
161
161
  def split_address1
162
- additional_fields = region.additional_address_fields["address1"] || []
162
+ additional_fields = region.combined_address_format["address1"] || []
163
163
  split_fields_arr = address1&.split(RESERVED_DELIMITER) || []
164
164
  split_fields(additional_fields, split_fields_arr)
165
165
  end
166
166
 
167
167
  def split_address2
168
- additional_fields = region.additional_address_fields["address2"] || []
168
+ additional_fields = region.combined_address_format["address2"] || []
169
169
  split_fields_arr = address2&.split(RESERVED_DELIMITER) || []
170
170
  split_fields(additional_fields, split_fields_arr)
171
171
  end
@@ -34,6 +34,7 @@ module Worldwide
34
34
  :zip_regex,
35
35
  :zip_requirement,
36
36
  :additional_address_fields,
37
+ :combined_address_format,
37
38
  ]
38
39
 
39
40
  # A region may have more than one parent.
@@ -197,9 +198,12 @@ module Worldwide
197
198
  # If true, then the province is optional for addresses in this region.
198
199
  attr_accessor :province_optional
199
200
 
200
- # A hash of additional address fields and the rules for concatening them into the standard fields
201
+ # An array of the additional address fields that are defined for this region
201
202
  attr_accessor :additional_address_fields
202
203
 
204
+ # A hash of the rules for concatening the additional address fields into the standard fields
205
+ attr_accessor :combined_address_format
206
+
203
207
  def initialize(
204
208
  alpha_three: nil,
205
209
  continent: false,
@@ -235,7 +239,8 @@ module Worldwide
235
239
  @tax_rate = tax_rate
236
240
  @use_zone_code_as_short_name = use_zone_code_as_short_name
237
241
 
238
- @additional_address_fields = {}
242
+ @additional_address_fields = []
243
+ @combined_address_format = {}
239
244
  @building_number_required = false
240
245
  @building_number_may_be_in_address2 = false
241
246
  @currency = nil
@@ -414,6 +419,21 @@ module Worldwide
414
419
  end
415
420
  end
416
421
 
422
+ # is a neighborhood required for this region?
423
+ def neighborhood_required?
424
+ additional_field_required?("neighborhood")
425
+ end
426
+
427
+ # is a street name required for this region?
428
+ def street_name_required?
429
+ additional_field_required?("streetName")
430
+ end
431
+
432
+ # is a street number required for this region?
433
+ def street_number_required?
434
+ additional_field_required?("streetNumber")
435
+ end
436
+
417
437
  # is the given postal code value valid for this region?
418
438
  def valid_zip?(zip, partial_match: false)
419
439
  normalized = Zip.normalize(
@@ -441,6 +461,11 @@ module Worldwide
441
461
  end
442
462
  end
443
463
 
464
+ def additional_field_required?(field_name)
465
+ field = additional_address_fields.find { |f| f["name"] == field_name }
466
+ field ? !!field["required"] : false
467
+ end
468
+
444
469
  def answers_to_cldr_code(search_code)
445
470
  return false if Util.blank?(search_code) || Util.blank?(cldr_code)
446
471
  return true if search_code.casecmp(cldr_code).zero?
@@ -95,7 +95,8 @@ module Worldwide
95
95
  end
96
96
 
97
97
  def apply_territory_attributes(region, spec)
98
- region.additional_address_fields = spec["additional_address_fields"] || {}
98
+ region.additional_address_fields = spec["additional_address_fields"] || []
99
+ region.combined_address_format = spec["combined_address_format"] || {}
99
100
  region.building_number_required = spec["building_number_required"] || false
100
101
  region.building_number_may_be_in_address2 = spec["building_number_may_be_in_address2"] || false
101
102
  currency_code = spec["currency"]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Worldwide
4
- VERSION = "0.14.0"
4
+ VERSION = "1.0.0"
5
5
  end
data/worldwide.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.metadata["changelog_uri"] = "https://github.com/Shopify/worldwide/blob/main/CHANGELOG.md"
19
19
 
20
20
  spec.files = %x(git ls-files -z).split("\x0").reject do |f|
21
- f.match(%r{^(rake|test|spec|features)/})
21
+ f.match(%r{^(rake|test|spec|features|lang/typescript)/})
22
22
  end
23
23
  spec.bindir = "exe"
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: worldwide
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-29 00:00:00.000000000 Z
11
+ date: 2024-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -64,11 +64,14 @@ files:
64
64
  - ".github/CONTRIBUTING.md"
65
65
  - ".github/dependabot.yml"
66
66
  - ".github/pull_request_template.md"
67
+ - ".github/workflows/ci-typescript.yml"
67
68
  - ".github/workflows/ci.yml"
68
69
  - ".github/workflows/cla.yml"
70
+ - ".github/workflows/npm-release.yml"
69
71
  - ".gitignore"
70
72
  - ".rubocop.yml"
71
73
  - ".ruby-version"
74
+ - ".vscode/settings.json"
72
75
  - CHANGELOG.md
73
76
  - Gemfile
74
77
  - Gemfile.lock
@@ -7703,6 +7706,7 @@ files:
7703
7706
  - db/data/regions/PF.yml
7704
7707
  - db/data/regions/PG.yml
7705
7708
  - db/data/regions/PH.yml
7709
+ - db/data/regions/PH/en.yml
7706
7710
  - db/data/regions/PK.yml
7707
7711
  - db/data/regions/PL.yml
7708
7712
  - db/data/regions/PM.yml