telephone_number 1.4.8 → 1.4.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -1
  3. data/CHANGELOG.md +11 -0
  4. data/README.md +11 -5
  5. data/data/geocoding/de/49.dat +0 -0
  6. data/data/geocoding/de/49.txt +3 -3
  7. data/data/geocoding/en/1.dat +0 -0
  8. data/data/geocoding/en/1.txt +10 -1
  9. data/data/geocoding/en/212.dat +0 -0
  10. data/data/geocoding/en/212.txt +9 -1
  11. data/data/geocoding/en/225.dat +0 -0
  12. data/data/geocoding/en/225.txt +22 -22
  13. data/data/geocoding/en/267.dat +0 -0
  14. data/data/geocoding/en/267.txt +1 -0
  15. data/data/geocoding/en/380.dat +0 -0
  16. data/data/geocoding/en/380.txt +1 -1
  17. data/data/geocoding/en/44.dat +0 -0
  18. data/data/geocoding/en/44.txt +6 -1
  19. data/data/geocoding/en/49.dat +0 -0
  20. data/data/geocoding/en/49.txt +3 -3
  21. data/data/geocoding/en/504.dat +0 -0
  22. data/data/geocoding/en/504.txt +2 -1
  23. data/data/geocoding/en/598.dat +0 -0
  24. data/data/geocoding/en/598.txt +9 -1
  25. data/data/geocoding/en/61.dat +0 -0
  26. data/data/geocoding/en/61.txt +39 -9
  27. data/data/geocoding/en/678.dat +0 -0
  28. data/data/geocoding/en/678.txt +1 -1
  29. data/data/geocoding/en/81.dat +0 -0
  30. data/data/geocoding/en/81.txt +9 -1
  31. data/data/geocoding/en/961.dat +0 -0
  32. data/data/geocoding/en/961.txt +23 -0
  33. data/data/geocoding/es/52.dat +0 -0
  34. data/data/geocoding/es/52.txt +16 -16
  35. data/data/geocoding/fr/212.dat +0 -0
  36. data/data/geocoding/fr/212.txt +9 -1
  37. data/data/geocoding/fr/225.dat +0 -0
  38. data/data/geocoding/fr/225.txt +22 -22
  39. data/data/geocoding/ja/81.dat +0 -0
  40. data/data/geocoding/ja/81.txt +9 -1
  41. data/data/telephone_number_data_file.dat +0 -0
  42. data/data/telephone_number_data_file.xml +1687 -1096
  43. data/data/timezones/map_data.dat +0 -0
  44. data/data/timezones/map_data.txt +76 -20
  45. data/lib/telephone_number.rb +0 -1
  46. data/lib/telephone_number/country.rb +22 -9
  47. data/lib/telephone_number/version.rb +1 -1
  48. data/telephone_number.gemspec +1 -0
  49. metadata +6 -4
  50. data/lib/utilities/hash.rb +0 -47
Binary file
@@ -15,7 +15,7 @@
15
15
  # Generated from:
16
16
  # Internal statistics data (2018-06-12).
17
17
 
18
- 1|America/Adak&America/Anchorage&America/Anguilla&America/Antigua&America/Barbados&America/Boise&America/Cayman&America/Chicago&America/Denver&America/Dominica&America/Edmonton&America/Fort_Nelson&America/Grand_Turk&America/Grenada&America/Halifax&America/Jamaica&America/Juneau&America/Los_Angeles&America/Lower_Princes&America/Montserrat&America/Nassau&America/New_York&America/North_Dakota/Center&America/Phoenix&America/Port_of_Spain&America/Puerto_Rico&America/Santo_Domingo&America/St_Johns&America/St_Kitts&America/St_Lucia&America/St_Thomas&America/St_Vincent&America/Toronto&America/Tortola&America/Vancouver&America/Winnipeg&Atlantic/Bermuda&Pacific/Guam&Pacific/Honolulu&Pacific/Pago_Pago&Pacific/Saipan
18
+ 1|America/Adak&America/Anchorage&America/Anguilla&America/Antigua&America/Barbados&America/Boise&America/Cayman&America/Chicago&America/Denver&America/Dominica&America/Edmonton&America/Fort_Nelson&America/Grand_Turk&America/Grenada&America/Halifax&America/Jamaica&America/Juneau&America/Los_Angeles&America/Lower_Princes&America/Montserrat&America/Nassau&America/New_York&America/North_Dakota/Center&America/Phoenix&America/Port_of_Spain&America/Puerto_Rico&America/Regina&America/Santo_Domingo&America/St_Johns&America/St_Kitts&America/St_Lucia&America/St_Thomas&America/St_Vincent&America/Toronto&America/Tortola&America/Vancouver&America/Winnipeg&Atlantic/Bermuda&Pacific/Guam&Pacific/Honolulu&Pacific/Pago_Pago&Pacific/Saipan
19
19
  1201|America/New_York
20
20
  1202|America/New_York
21
21
  1203|America/New_York
@@ -641,7 +641,7 @@
641
641
  1303|America/Denver
642
642
  1304|America/New_York
643
643
  1305|America/New_York
644
- 1306|America/Winnipeg
644
+ 1306|America/Regina
645
645
  1307|America/Denver
646
646
  1308|America/Chicago
647
647
  1308235|America/Denver
@@ -681,6 +681,7 @@
681
681
  1321|America/New_York
682
682
  1323|America/Los_Angeles
683
683
  1325|America/Chicago
684
+ 1326|America/New_York
684
685
  1330|America/New_York
685
686
  1331|America/Chicago
686
687
  1332|America/New_York
@@ -701,6 +702,7 @@
701
702
  1364|America/New_York
702
703
  1365|America/Toronto
703
704
  1367|America/Toronto
705
+ 1368|America/Edmonton
704
706
  1380|America/New_York
705
707
  1385|America/Denver
706
708
  1386|America/New_York
@@ -915,12 +917,15 @@
915
917
  1442|America/Los_Angeles
916
918
  1443|America/New_York
917
919
  1445|America/New_York
920
+ 1447|America/Chicago
921
+ 1448|America/New_York
918
922
  1450|America/Toronto
919
923
  1458|America/Los_Angeles
920
924
  1463|America/New_York
921
925
  1469|America/Chicago
922
926
  1470|America/New_York
923
927
  1473|America/Grenada
928
+ 1474|America/Winnipeg
924
929
  1475|America/New_York
925
930
  1478|America/New_York
926
931
  1479|America/Chicago
@@ -965,6 +970,7 @@
965
970
  1567|America/New_York
966
971
  1570|America/New_York
967
972
  1571|America/New_York
973
+ 1572|America/Chicago
968
974
  1573|America/Chicago
969
975
  1574|America/New_York
970
976
  1574772|America/Chicago
@@ -1164,7 +1170,7 @@
1164
1170
  1630|America/Chicago
1165
1171
  1631|America/New_York
1166
1172
  1636|America/Chicago
1167
- 1639|America/Winnipeg
1173
+ 1639|America/Regina
1168
1174
  1640|America/New_York
1169
1175
  1641|America/Chicago
1170
1176
  1646|America/New_York
@@ -1607,6 +1613,8 @@
1607
1613
  1831|America/Los_Angeles
1608
1614
  1832|America/Chicago
1609
1615
  1838|America/New_York
1616
+ 1839|America/New_York
1617
+ 1840|America/Los_Angeles
1610
1618
  1843|America/New_York
1611
1619
  1845|America/New_York
1612
1620
  1847|America/Chicago
@@ -1970,6 +1978,7 @@
1970
1978
  1939|America/Puerto_Rico
1971
1979
  1940|America/Chicago
1972
1980
  1941|America/New_York
1981
+ 1945|America/Chicago
1973
1982
  1947|America/New_York
1974
1983
  1949|America/Los_Angeles
1975
1984
  1951|America/Los_Angeles
@@ -2095,6 +2104,7 @@
2095
2104
  34928|Atlantic/Canary
2096
2105
  350|Europe/Gibraltar
2097
2106
  351|Atlantic/Azores&Europe/Lisbon
2107
+ 3511|Atlantic/Azores&Europe/Lisbon
2098
2108
  3512|Europe/Lisbon
2099
2109
  351292|Atlantic/Azores
2100
2110
  351295|Atlantic/Azores
@@ -2171,6 +2181,33 @@
2171
2181
  441534|Europe/Jersey
2172
2182
  441624|Europe/Isle_of_Man
2173
2183
  442|Europe/London
2184
+ 443|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2185
+ 445|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2186
+ 4470|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2187
+ 4471|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2188
+ 4472|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2189
+ 4473|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2190
+ 4474|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2191
+ 4475|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2192
+ 44760|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2193
+ 44762|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2194
+ 44763|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2195
+ 447640|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2196
+ 447641|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2197
+ 447643|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2198
+ 447644|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2199
+ 447646|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2200
+ 44765|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2201
+ 44766|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2202
+ 44767|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2203
+ 44768|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2204
+ 447693|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2205
+ 447699|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2206
+ 4477|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2207
+ 4478|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2208
+ 4479|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2209
+ 448|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2210
+ 449|Europe/Guernsey&Europe/Isle_of_Man&Europe/London
2174
2211
  45|Europe/Copenhagen
2175
2212
  46|Europe/Stockholm
2176
2213
  47|Arctic/Longyearbyen&Europe/Oslo
@@ -2837,7 +2874,7 @@
2837
2874
  565|America/Santiago
2838
2875
  566|America/Santiago
2839
2876
  567|America/Santiago
2840
- 56800|America/Santiago
2877
+ 568|America/Santiago
2841
2878
  569|America/Santiago
2842
2879
  57|America/Bogota
2843
2880
  58|America/Caracas
@@ -2903,7 +2940,7 @@
2903
2940
  61851060|Indian/Cocos
2904
2941
  61851087|Australia/Perth
2905
2942
  61851088|Indian/Christmas
2906
- 61851089|Australia/Sydney
2943
+ 61851089|Indian/Cocos
2907
2944
  6185109|Australia/Perth
2908
2945
  618511|Australia/Perth
2909
2946
  61851100|Australia/Adelaide&Australia/Perth
@@ -2922,15 +2959,39 @@
2922
2959
  61851156|Australia/Adelaide&Australia/Perth
2923
2960
  61851158|Australia/Adelaide&Australia/Perth
2924
2961
  61851175|Indian/Christmas
2962
+ 61851176|Indian/Cocos
2925
2963
  61851185|Australia/Adelaide&Australia/Perth
2926
2964
  61851187|Australia/Adelaide&Australia/Perth
2927
2965
  6185120|Australia/Perth
2928
2966
  61851204|Indian/Christmas
2929
2967
  61851205|Australia/Sydney
2930
- 6185123|Australia/Sydney
2968
+ 61851209|Australia/Adelaide&Australia/Perth
2969
+ 6185121|Australia/Adelaide&Australia/Perth
2970
+ 61851221|Australia/Adelaide&Australia/Perth
2971
+ 61851222|Indian/Christmas
2972
+ 61851223|Indian/Cocos
2973
+ 61851224|Australia/Perth
2974
+ 61851225|Australia/Perth
2975
+ 61851226|Australia/Perth
2976
+ 61851227|Australia/Adelaide&Australia/Perth
2977
+ 61851228|Australia/Adelaide&Australia/Perth
2978
+ 61851229|Australia/Adelaide&Australia/Perth
2979
+ 61851230|Australia/Sydney
2980
+ 61851231|Australia/Adelaide&Australia/Perth
2981
+ 61851232|Australia/Sydney
2982
+ 61851233|Australia/Sydney
2983
+ 61851234|Australia/Sydney
2984
+ 61851235|Indian/Christmas
2985
+ 61851236|Australia/Adelaide&Australia/Perth
2986
+ 61851237|Australia/Adelaide&Australia/Perth
2987
+ 61851238|Australia/Adelaide&Australia/Perth
2988
+ 61851239|Australia/Adelaide&Australia/Perth
2931
2989
  6185124|Australia/Sydney
2932
2990
  6185125|Australia/Sydney
2933
2991
  6185126|Australia/Sydney
2992
+ 6185127|Australia/Adelaide&Australia/Perth
2993
+ 6185128|Australia/Adelaide&Australia/Perth
2994
+ 6185129|Australia/Adelaide&Australia/Perth
2934
2995
  6186|Australia/Adelaide&Australia/Perth
2935
2996
  6187|Australia/Adelaide&Australia/Perth
2936
2997
  6188|Australia/Adelaide&Australia/Perth
@@ -2971,11 +3032,15 @@
2971
3032
  61891700|Australia/Adelaide&Australia/Perth&Indian/Christmas
2972
3033
  61891701|Australia/Adelaide&Australia/Perth&Indian/Christmas
2973
3034
  61891702|Australia/Adelaide&Australia/Perth&Indian/Cocos
3035
+ 61891703|Indian/Cocos
2974
3036
  61891710|Australia/Adelaide&Australia/Perth&Indian/Christmas
2975
3037
  61891711|Australia/Adelaide&Australia/Perth&Indian/Christmas
2976
3038
  61891712|Australia/Adelaide&Australia/Perth&Indian/Christmas
3039
+ 61891958|Indian/Christmas
2977
3040
  61891959|Australia/Adelaide&Australia/Perth&Indian/Cocos
2978
3041
  62|Asia/Jakarta&Asia/Jayapura&Asia/Makassar
3042
+ 62007|Asia/Jakarta&Asia/Makassar
3043
+ 621|Asia/Jakarta&Asia/Makassar
2979
3044
  622|Asia/Jakarta
2980
3045
  6231|Asia/Jakarta
2981
3046
  6232|Asia/Jakarta
@@ -2983,12 +3048,8 @@
2983
3048
  6234|Asia/Jakarta
2984
3049
  6235|Asia/Jakarta
2985
3050
  6236|Asia/Makassar
2986
- 62370|Asia/Makassar
2987
- 62371|Asia/Makassar
2988
- 62372|Asia/Makassar
2989
- 62373|Asia/Makassar
2990
- 62374|Asia/Makassar
2991
- 62376|Asia/Makassar
3051
+ 6237|Asia/Makassar
3052
+ 62379|Asia/Jakarta&Asia/Makassar
2992
3053
  6238|Asia/Makassar
2993
3054
  624|Asia/Makassar
2994
3055
  62403|Asia/Jayapura&Asia/Makassar
@@ -3013,27 +3074,21 @@
3013
3074
  6256|Asia/Jakarta
3014
3075
  626|Asia/Jakarta
3015
3076
  627|Asia/Jakarta
3016
- 6281|Asia/Jakarta
3077
+ 628|Asia/Jakarta
3078
+ 6280|Asia/Jakarta&Asia/Makassar
3017
3079
  62811|Asia/Jakarta&Asia/Makassar
3018
3080
  62818|Asia/Jakarta&Asia/Makassar
3019
3081
  62819|Asia/Jakarta&Asia/Makassar
3020
- 6282|Asia/Jakarta
3021
3082
  62824|Asia/Jakarta&Asia/Makassar
3022
3083
  62829|Asia/Jakarta&Asia/Makassar
3023
- 6283|Asia/Jakarta
3024
3084
  62831|Asia/Jakarta&Asia/Makassar
3025
3085
  62833|Asia/Jakarta&Asia/Makassar
3026
3086
  62834|Asia/Jakarta&Asia/Makassar
3027
3087
  62839|Asia/Jakarta&Asia/Makassar
3028
- 6285|Asia/Jakarta
3029
3088
  62853|Asia/Jakarta&Asia/Makassar
3030
- 6286|Asia/Jakarta
3031
3089
  62868|Asia/Jakarta&Asia/Makassar
3032
- 6287|Asia/Jakarta
3033
3090
  62876|Asia/Jakarta&Asia/Makassar
3034
- 6288|Asia/Jakarta
3035
3091
  62887|Asia/Jakarta&Asia/Makassar
3036
- 6289|Asia/Jakarta
3037
3092
  6290|Asia/Jayapura
3038
3093
  6291|Asia/Jayapura
3039
3094
  62915|Asia/Jakarta&Asia/Jayapura
@@ -3088,6 +3143,7 @@
3088
3143
  688|Pacific/Funafuti
3089
3144
  689|Pacific/Gambier&Pacific/Marquesas&Pacific/Tahiti
3090
3145
  6894|Pacific/Tahiti
3146
+ 68980|Pacific/Gambier&Pacific/Marquesas&Pacific/Tahiti
3091
3147
  68987|Pacific/Gambier&Pacific/Marquesas&Pacific/Tahiti
3092
3148
  68988|Pacific/Tahiti
3093
3149
  68989|Pacific/Tahiti
@@ -1,5 +1,4 @@
1
1
  require 'telephone_number/version'
2
- require 'utilities/hash'
3
2
  require 'active_model/telephone_number_validator' if defined?(ActiveModel)
4
3
  require 'forwardable'
5
4
 
@@ -7,18 +7,18 @@ module TelephoneNumber
7
7
  MOBILE_TOKEN_COUNTRIES = { AR: '9' }.freeze
8
8
 
9
9
  def initialize(data_hash)
10
+ validations = data_hash.fetch(:validations, {}).dup
10
11
  @country_code = data_hash[:country_code]
11
12
  @country_id = data_hash[:id]
12
- @general_validation = NumberValidation.new(:general_desc, data_hash[:validations][:general_desc]) if data_hash.fetch(:validations, {})[:general_desc]
13
+ @general_validation = NumberValidation.new(:general_desc, validations[:general_desc]) if validations[:general_desc]
13
14
  @international_prefix = Regexp.new(data_hash[:international_prefix]) if data_hash[:international_prefix]
14
15
  @main_country_for_code = data_hash[:main_country_for_code] == 'true'
15
16
  @mobile_token = MOBILE_TOKEN_COUNTRIES[@country_id.to_sym]
16
17
  @national_prefix = data_hash[:national_prefix]
17
18
  @national_prefix_for_parsing = Regexp.new(data_hash[:national_prefix_for_parsing]) if data_hash[:national_prefix_for_parsing]
18
19
  @national_prefix_transform_rule = data_hash[:national_prefix_transform_rule]
19
- @validations = data_hash.fetch(:validations, {})
20
- .except(:general_desc, :area_code_optional)
21
- .map { |name, data| NumberValidation.new(name, data) }
20
+ @validations = validations.delete_if { |name, _| name == :general_desc || name == :area_code_optional }
21
+ .map { |name, data| NumberValidation.new(name, data) }
22
22
  @formats = data_hash.fetch(:formats, []).map { |format| NumberFormat.new(format, data_hash[:national_prefix_formatting_rule]) }
23
23
  end
24
24
 
@@ -52,11 +52,24 @@ module TelephoneNumber
52
52
  end
53
53
 
54
54
  def self.load_data
55
- data_file = "#{File.dirname(__FILE__)}/../../data/telephone_number_data_file.dat"
56
- main_data = Marshal.load(File.binread(data_file))
57
- override_data = {}
58
- override_data = Marshal.load(File.binread(TelephoneNumber.override_file)) if TelephoneNumber.override_file
59
- return main_data.deep_deep_merge!(override_data)
55
+ data_path = "#{File.dirname(__FILE__)}/../../data/telephone_number_data_file.dat"
56
+ main_data = Marshal.load(File.binread(data_path))
57
+ if TelephoneNumber.override_file
58
+ override_data = Marshal.load(File.binread(TelephoneNumber.override_file))
59
+ main_data = deep_merge(main_data, override_data)
60
+ end
61
+ main_data
62
+ end
63
+
64
+ def self.deep_merge(base_hash, other_hash)
65
+ other_hash.each do |key, value|
66
+ base_hash[key] = if base_hash[key].is_a?(Hash) && value.is_a?(Hash)
67
+ deep_merge(base_hash[key], value)
68
+ else
69
+ value
70
+ end
71
+ end
72
+ base_hash
60
73
  end
61
74
 
62
75
  def self.all_countries
@@ -1,3 +1,3 @@
1
1
  module TelephoneNumber
2
- VERSION = "1.4.8"
2
+ VERSION = "1.4.12"
3
3
  end
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.bindir = 'exe'
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
+ spec.required_ruby_version = '>= 2.4.0'
22
23
 
23
24
  spec.add_development_dependency 'bundler'
24
25
  spec.add_development_dependency 'rake'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telephone_number
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.8
4
+ version: 1.4.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - MOBI Wireless Management
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-14 00:00:00.000000000 Z
11
+ date: 2021-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,6 +150,7 @@ files:
150
150
  - ".rubocop.yml"
151
151
  - ".ruby-version"
152
152
  - ".travis.yml"
153
+ - CHANGELOG.md
153
154
  - CODE_OF_CONDUCT.md
154
155
  - Gemfile
155
156
  - LICENSE
@@ -453,6 +454,8 @@ files:
453
454
  - data/geocoding/en/95.txt
454
455
  - data/geocoding/en/960.dat
455
456
  - data/geocoding/en/960.txt
457
+ - data/geocoding/en/961.dat
458
+ - data/geocoding/en/961.txt
456
459
  - data/geocoding/en/962.dat
457
460
  - data/geocoding/en/962.txt
458
461
  - data/geocoding/en/963.dat
@@ -632,7 +635,6 @@ files:
632
635
  - lib/telephone_number/parser.rb
633
636
  - lib/telephone_number/time_zone_detector.rb
634
637
  - lib/telephone_number/version.rb
635
- - lib/utilities/hash.rb
636
638
  - telephone_number.gemspec
637
639
  homepage: https://github.com/mobi/telephone_number
638
640
  licenses:
@@ -646,7 +648,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
646
648
  requirements:
647
649
  - - ">="
648
650
  - !ruby/object:Gem::Version
649
- version: '0'
651
+ version: 2.4.0
650
652
  required_rubygems_version: !ruby/object:Gem::Requirement
651
653
  requirements:
652
654
  - - ">="
@@ -1,47 +0,0 @@
1
- class Hash
2
- # Returns a new hash with +self+ and +other_hash+ merged recursively.
3
- #
4
- # h1 = { a: true, b: { c: [1, 2, 3] } }
5
- # h2 = { a: false, b: { x: [3, 4, 5] } }
6
- #
7
- # h1.deep_merge(h2) # => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } }
8
- #
9
- # Like with Hash#merge in the standard library, a block can be provided
10
- # to merge values:
11
- #
12
- # h1 = { a: 100, b: 200, c: { c1: 100 } }
13
- # h2 = { b: 250, c: { c1: 200 } }
14
- # h1.deep_merge(h2) { |key, this_val, other_val| this_val + other_val }
15
- # # => { a: 100, b: 450, c: { c1: 300 } }
16
- def deep_deep_merge(other_hash, &block)
17
- dup.deep_deep_merge!(other_hash, &block)
18
- end
19
-
20
- # Same as +deep_merge+, but modifies +self+.
21
- def deep_deep_merge!(other_hash, &block)
22
- other_hash.each_pair do |current_key, other_value|
23
- this_value = self[current_key]
24
-
25
- self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
26
- this_value.deep_deep_merge(other_value, &block)
27
- else
28
- if block_given? && key?(current_key)
29
- block.call(current_key, this_value, other_value)
30
- else
31
- other_value
32
- end
33
- end
34
- end
35
-
36
- self
37
- end
38
-
39
- def except(*keys)
40
- dup.except!(*keys)
41
- end
42
-
43
- def except!(*keys)
44
- keys.each { |key| delete(key) }
45
- self
46
- end
47
- end