worldwide 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c3c323e57e56b609ebdc7fe5d7965a2d5348fede9b72110627528529b3b7ab5
4
- data.tar.gz: f4007e0986bc9702af7d95f3c352a11937292d9f6fbbd8c21e8a1a635fcc7993
3
+ metadata.gz: 70f7f2806122734340656c024d816ec4028060de514b5dc4773529ce8bff4f37
4
+ data.tar.gz: 3c5c2237879ab05f1a77505432bca89ad50e9d5667ff1d1951b501c07f43050e
5
5
  SHA512:
6
- metadata.gz: 333628df88179b5d2696634f3dadec1a548a5a2ef4baebcac86832077565f5f826036da107cdf8d5d4ed84323563235265df4b0bf37648f7d7691ef120e81216
7
- data.tar.gz: cdbad17228b52fc39d188fdbf2e13800aa4015caf18cd314d9cdfcd7f3a7b63f585c2cbd69eec36bb8c450dae83e649c35a0c661c651e55293c626582e03a785
6
+ metadata.gz: 1f8e9fa1416ccc24d3818e609acf7d05da6534cdb9b1e780af496151559bbb5e73540df416d85d554a3083a5add5691df2ab512fa023da3ca43d85251a89c18d
7
+ data.tar.gz: d55d1ed819560e45099c6ae1fc9e1cc5f62e0a6b62c4e9b24aa97daa78b7aae0e6cb8636dc0b6086ca5ba7f3a715badc0e7d4c60ddde09df49cb2b2c00677e8c
data/CHANGELOG.md CHANGED
@@ -28,6 +28,16 @@ Nil.
28
28
 
29
29
  ---
30
30
 
31
+ [0.3.0] - 2023-11-03
32
+ - Add code alternates for Japan [#23](https://github.com/Shopify/worldwide/pull/23)
33
+ - Add code alternates for Puerto Rico [#24](https://github.com/Shopify/worldwide/pull/24)
34
+ - Record multiple parents per region [#27](https://github.com/Shopify/worldwide/pull/27)
35
+ - Add region.building_number_may_be_in_address2 [#28](https://github.com/Shopify/worldwide/pull/28)
36
+ - Lookup by parent-child ISO and CLDR codes for dual-status territories
37
+ [#29](https://github.com/Shopify/worldwide/pull/29)
38
+ - Handle ISO_CODE only zones lookup [#26](https://github.com/Shopify/worldwide/pull/26)
39
+
40
+
31
41
  [0.2.0] - 2023-11-01
32
42
 
33
43
  - Add Region#group and Region#group_name [#15](https://github.com/Shopify/worldwide/pull/15)
data/Gemfile.lock CHANGED
@@ -13,7 +13,7 @@ GIT
13
13
  PATH
14
14
  remote: .
15
15
  specs:
16
- worldwide (0.2.0)
16
+ worldwide (0.3.0)
17
17
  activesupport (~> 7.0)
18
18
  i18n (~> 1.12.0)
19
19
  phonelib (~> 0.8)
@@ -14,6 +14,7 @@ zip_regex: "^(IT?-?)?\\d{5}$"
14
14
  zip_example: '00144'
15
15
  phone_number_prefix: 39
16
16
  building_number_required: true
17
+ building_number_may_be_in_address2: true
17
18
  week_start_day: monday
18
19
  languages:
19
20
  - it
@@ -34,7 +34,9 @@ module Worldwide
34
34
  :zip_requirement,
35
35
  ]
36
36
 
37
- attr_accessor :parent
37
+ # A region may have more than one parent.
38
+ # For example, Puerto Rico (PR/US-PR) is associated with both the US and the Caribbean (029)
39
+ attr_accessor :parents
38
40
 
39
41
  # ISO-3166 three-letter code for this region, if there is one.
40
42
  # Otherwise, nil.
@@ -45,6 +47,10 @@ module Worldwide
45
47
  # If we require a building number in an address, then this will be true.
46
48
  attr_accessor :building_number_required
47
49
 
50
+ # In some countries, an address may have the building number in address2.
51
+ # If we are allowed to have a building number in address2, then this will be true.
52
+ attr_accessor :building_number_may_be_in_address2
53
+
48
54
  # Alternate codes which may be used to designate this region
49
55
  attr_accessor :code_alternates
50
56
 
@@ -217,6 +223,7 @@ module Worldwide
217
223
  @use_zone_code_as_short_name = use_zone_code_as_short_name
218
224
 
219
225
  @building_number_required = false
226
+ @building_number_may_be_in_address2 = false
220
227
  @currency = nil
221
228
  @flag = nil
222
229
  @format = {}
@@ -236,7 +243,7 @@ module Worldwide
236
243
  @zip_prefixes = []
237
244
  @zip_regex = nil
238
245
 
239
- @parent = nil
246
+ @parents = [].to_set
240
247
  @zones = []
241
248
  end
242
249
 
@@ -249,12 +256,18 @@ module Worldwide
249
256
  def add_zone(region)
250
257
  return if @zones.include?(region)
251
258
 
252
- region.parent = self
259
+ region.parents << self
253
260
  @zones.append(region)
254
261
  end
255
262
 
256
263
  # Attributes
257
264
 
265
+ def associated_country
266
+ return self if country?
267
+
268
+ parent_country
269
+ end
270
+
258
271
  # The value with which to autofill the zip, if this region has zip autofill active;
259
272
  # otherwise, nil.
260
273
  def autofill_zip
@@ -333,7 +346,8 @@ module Worldwide
333
346
 
334
347
  zones.find do |region|
335
348
  [search_code, alt_search_code].any? do |candidate|
336
- candidate == region.alpha_three ||
349
+ candidate == subdivision_code(region.iso_code) ||
350
+ candidate == region.alpha_three ||
337
351
  candidate == region.iso_code ||
338
352
  candidate == region.legacy_code ||
339
353
  candidate == region.numeric_three ||
@@ -371,7 +385,7 @@ module Worldwide
371
385
  # is the given postal code value valid for this region?
372
386
  def valid_zip?(zip, partial_match: false)
373
387
  normalized = Zip.normalize(
374
- country_code: province? && parent.iso_code ? parent.iso_code : iso_code,
388
+ country_code: province? && associated_country.iso_code ? associated_country.iso_code : iso_code,
375
389
  zip: zip,
376
390
  )
377
391
  valid_normalized_zip?(normalized, partial_match: partial_match)
@@ -384,6 +398,21 @@ module Worldwide
384
398
 
385
399
  private
386
400
 
401
+ def answers_to_cldr_code(search_code)
402
+ return false if Util.blank?(search_code) || Util.blank?(cldr_code)
403
+ return true if search_code.casecmp(cldr_code).zero?
404
+
405
+ pc = parent_country
406
+ "#{pc&.cldr_code&.downcase}#{cldr_code.downcase}" == search_code.downcase
407
+ end
408
+
409
+ def answers_to_iso_code(search_code)
410
+ return true if search_code == iso_code
411
+
412
+ pc = parent_country
413
+ "#{pc&.iso_code}-#{iso_code}" == search_code
414
+ end
415
+
387
416
  def cross_border_zip_includes_province?(zip:, province_code:)
388
417
  return false unless country?
389
418
 
@@ -408,11 +437,17 @@ module Worldwide
408
437
  INSPECTION_FIELDS.map { |field_name| "@#{field_name}=#{send(field_name).inspect}" }.join(", ")
409
438
  end
410
439
 
440
+ def parent_country
441
+ parents.find(&:country?)
442
+ end
443
+
411
444
  # Checks whether the given value is acceptable according to the regular expression defined for the country.
412
445
  # @param value [String] for the postal code
413
446
  # @return [Boolean]
414
447
  def passes_country_zip_regexp?(value:, partial_match: false)
415
- return parent.send(:passes_country_zip_regexp?, value: value, partial_match: partial_match) if province?
448
+ if province?
449
+ return associated_country.send(:passes_country_zip_regexp?, value: value, partial_match: partial_match)
450
+ end
416
451
 
417
452
  return false if partial_match && partial_zip_regex.nil?
418
453
 
@@ -445,11 +480,18 @@ module Worldwide
445
480
  end&.first
446
481
  end
447
482
 
483
+ def subdivision_code(iso_code)
484
+ return iso_code if iso_code.nil? || iso_code.length < 3
485
+
486
+ country_code, subdivision_code = iso_code.split("-")
487
+ return subdivision_code if country_code.casecmp(associated_country.iso_code).zero?
488
+ end
489
+
448
490
  def valid_normalized_zip?(normalized, province_code: nil, partial_match: false)
449
491
  if country?
450
492
  country = self
451
493
  elsif province?
452
- country = parent
494
+ country = associated_country
453
495
  province_code ||= legacy_code
454
496
  end
455
497
 
@@ -32,13 +32,13 @@ module Worldwide
32
32
  search_code = cldr.to_s.upcase
33
33
 
34
34
  @regions.find do |r|
35
- r.cldr_code.upcase == search_code
35
+ r.send(:answers_to_cldr_code, search_code)
36
36
  end
37
37
  elsif code
38
38
  search_code = code.to_s.upcase
39
39
 
40
40
  @regions.find do |r|
41
- r.iso_code == search_code || r.alpha_three == search_code || r.numeric_three == search_code
41
+ r.send(:answers_to_iso_code, search_code) || r.alpha_three == search_code || r.numeric_three == search_code
42
42
  end
43
43
  else # search by name
44
44
  search_name = name.upcase
@@ -46,9 +46,7 @@ module Worldwide
46
46
  @regions << current_region
47
47
  end
48
48
 
49
- if parent.present? && current_region.parent != parent
50
- current_region.parent = parent
51
- end
49
+ current_region.parents << parent if Util.present?(parent)
52
50
  parent&.add_zone(current_region)
53
51
  return current_region if children.nil?
54
52
 
@@ -61,6 +59,7 @@ module Worldwide
61
59
 
62
60
  def apply_territory_attributes(region, spec)
63
61
  region.building_number_required = spec["building_number_required"] || true
62
+ region.building_number_may_be_in_address2 = spec["building_number_may_be_in_address2"] || false
64
63
  currency_code = spec["currency"]
65
64
  region.currency = Worldwide.currency(code: currency_code) unless currency_code.nil?
66
65
  region.flag = spec["emoji"]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Worldwide
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
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.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-01 00:00:00.000000000 Z
11
+ date: 2023-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport