worldwide 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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