phonelib 0.7.4 → 0.8.7
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/data/extended_data.dat +0 -0
- data/data/phone_data.dat +0 -0
- data/lib/phonelib/core.rb +27 -4
- data/lib/phonelib/data_importer.rb +3 -1
- data/lib/phonelib/phone.rb +2 -0
- data/lib/phonelib/phone_analyzer.rb +11 -4
- data/lib/phonelib/phone_analyzer_helper.rb +4 -1
- data/lib/phonelib/phone_formatter.rb +2 -2
- data/lib/phonelib/version.rb +1 -1
- data/lib/phonelib.rb +8 -0
- metadata +35 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ead15db333d3f8490017aef9004751e4944ba84689238cb2c2579cde56c3b751
|
4
|
+
data.tar.gz: ac6ff256e13409683825f984fb400e1eb85d6dfbfaec90dc10f163414d69eb8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e49e7edbe4835d24c76f393aa2a21f9bfd0cf2876536f4106e39def0bd3806b2099fc45a9a2fa8b71a8ecf6a47404c2938a26881fcd153548be396bac9977c5
|
7
|
+
data.tar.gz: 237714d47010cbb5258944d0cdadfb55f7df6d8facbf6fe0c13651b0f759ea8fd6cb3737d9e52a5c1244b0270616150214e580675148a73fa7c44494c42c1eed
|
data/data/extended_data.dat
CHANGED
Binary file
|
data/data/phone_data.dat
CHANGED
Binary file
|
data/lib/phonelib/core.rb
CHANGED
@@ -4,12 +4,35 @@ module Phonelib
|
|
4
4
|
# @private variable will include hash with data for validation
|
5
5
|
@@phone_data = nil
|
6
6
|
|
7
|
+
# eagerly initialize the gem, loads data into memory. not required, initialization is done lazily otherwise, but
|
8
|
+
# may be desirable in production enviroments to avoid initialization time on first use.
|
9
|
+
def eager_load!
|
10
|
+
return if @@skip_eager_loading
|
11
|
+
phone_data
|
12
|
+
phone_ext_data
|
13
|
+
end
|
14
|
+
|
15
|
+
@@skip_eager_loading = false
|
16
|
+
def skip_eager_loading!
|
17
|
+
@@skip_eager_loading = true
|
18
|
+
end
|
19
|
+
|
7
20
|
# getter for phone data for other modules of gem, can be used outside
|
8
21
|
# @return [Hash] all data for phone parsing
|
9
22
|
def phone_data
|
10
23
|
@@phone_data ||= load_data.freeze
|
11
24
|
end
|
12
25
|
|
26
|
+
# @private getter for phone data indexed by country code (internal use only)
|
27
|
+
def data_by_country_codes
|
28
|
+
@@data_by_country_codes ||= phone_data.each_value.group_by { |d| d[COUNTRY_CODE] }.freeze
|
29
|
+
end
|
30
|
+
|
31
|
+
# @private getter for all international prefixes in phone_data
|
32
|
+
def phone_data_int_prefixes
|
33
|
+
@@all_int_prefixes ||= phone_data.map {|k,v| v[:international_prefix] }.select { |v| v != '' }.compact.uniq.join('|').freeze
|
34
|
+
end
|
35
|
+
|
13
36
|
# @private used to cache frequently-used regular expressions
|
14
37
|
@@phone_regexp_cache = {}
|
15
38
|
|
@@ -30,14 +53,14 @@ module Phonelib
|
|
30
53
|
@@default_country = nil
|
31
54
|
|
32
55
|
# getter method for default_country variable
|
33
|
-
# @return [String
|
56
|
+
# @return [String,Symbol,Array<String,Symbol>,nil] Default country ISO2 code or codes used for parsing
|
34
57
|
def default_country
|
35
58
|
@@default_country
|
36
59
|
end
|
37
60
|
|
38
61
|
# setter method for default_country variable
|
39
|
-
# @param country [String
|
40
|
-
# @return [String
|
62
|
+
# @param country [String,Symbol,Array<String,Symbol>] Default country ISO2 code or codes used for parsing
|
63
|
+
# @return [String,Symbol,Array<String,Symbol>] Default country ISO2 code or codes used for parsing
|
41
64
|
def default_country=(country)
|
42
65
|
@@default_country = country
|
43
66
|
end
|
@@ -179,7 +202,7 @@ module Phonelib
|
|
179
202
|
def add_additional_regex(country, type, national_regex)
|
180
203
|
return unless Phonelib::Core::TYPES_DESC.keys.include?(type.to_sym)
|
181
204
|
return unless national_regex.is_a?(String)
|
182
|
-
@@phone_data = nil
|
205
|
+
@@phone_data = @@data_by_country_codes = nil
|
183
206
|
@@additional_regexes[country.to_s.upcase] ||= {}
|
184
207
|
@@additional_regexes[country.to_s.upcase][type] ||= []
|
185
208
|
@@additional_regexes[country.to_s.upcase][type] << national_regex
|
@@ -45,6 +45,7 @@ module Phonelib
|
|
45
45
|
'TA' => 'SH',
|
46
46
|
'TC' => 'US',
|
47
47
|
'TT' => 'US',
|
48
|
+
'UM' => 'US',
|
48
49
|
'VA' => 'IT',
|
49
50
|
'VC' => 'US',
|
50
51
|
'VG' => 'US',
|
@@ -160,6 +161,7 @@ module Phonelib
|
|
160
161
|
# some countries missing formats, and are linking them to another countries
|
161
162
|
def process_format_links
|
162
163
|
FORMAT_SHARING.each do |destination, source|
|
164
|
+
next unless @data[destination]
|
163
165
|
@data[destination][:formats] ||= []
|
164
166
|
@data[destination][:formats] = @data[destination][:formats] + @data[source][:formats]
|
165
167
|
end
|
@@ -195,7 +197,7 @@ module Phonelib
|
|
195
197
|
|
196
198
|
require 'open-uri'
|
197
199
|
require 'csv'
|
198
|
-
io = open('http://
|
200
|
+
io = URI.open('http://download.geonames.org/export/dump/countryInfo.txt')
|
199
201
|
csv = CSV.new(io, {col_sep: "\t"})
|
200
202
|
csv.each do |row|
|
201
203
|
next if row[0].nil? || row[0].start_with?('#') || row[0].empty? || row[0].size != 2
|
data/lib/phonelib/phone.rb
CHANGED
@@ -178,6 +178,8 @@ module Phonelib
|
|
178
178
|
|
179
179
|
# @private extracts extension from passed phone number if provided
|
180
180
|
def separate_extension(original)
|
181
|
+
return [original, ''] unless Phonelib.extension_separate_symbols
|
182
|
+
|
181
183
|
regex = if Phonelib.extension_separate_symbols.is_a?(Array)
|
182
184
|
cr("#{Phonelib.extension_separate_symbols.join('|')}")
|
183
185
|
else
|
@@ -124,15 +124,22 @@ module Phonelib
|
|
124
124
|
#
|
125
125
|
# * +phone+ - phone number for parsing
|
126
126
|
def detect_and_parse(phone, country)
|
127
|
-
|
128
|
-
|
127
|
+
countries_data = country_code_candidates_for(phone).flat_map { |code|
|
128
|
+
Phonelib.data_by_country_codes[code] || []
|
129
|
+
}
|
130
|
+
countries_data.each_with_object({}) do |data, result|
|
131
|
+
key = data[:id]
|
129
132
|
parsed = parse_single_country(phone, data)
|
130
133
|
if (!Phonelib.strict_double_prefix_check || key == country) && double_prefix_allowed?(data, phone, parsed && parsed[key])
|
131
134
|
parsed = parse_single_country(changed_dp_phone(key, phone), data)
|
132
135
|
end
|
133
136
|
result.merge!(parsed) unless parsed.nil?
|
134
|
-
end
|
135
|
-
|
137
|
+
end.compact
|
138
|
+
end
|
139
|
+
|
140
|
+
def country_code_candidates_for(phone)
|
141
|
+
stripped_phone = phone.gsub(/^(#{Phonelib.phone_data_int_prefixes})/, '')
|
142
|
+
((1..3).map { |length| phone[0, length] } + (1..3).map { |length| stripped_phone[0, length] }).uniq
|
136
143
|
end
|
137
144
|
|
138
145
|
# Create phone representation in e164 format
|
@@ -7,6 +7,8 @@ module Phonelib
|
|
7
7
|
if result.size == 1
|
8
8
|
result
|
9
9
|
else
|
10
|
+
matched_countries = country_or_default_country(nil) & result.keys
|
11
|
+
result = result.keep_if {|k, _v| matched_countries.include?(k) } if matched_countries
|
10
12
|
Hash[result.take(1)]
|
11
13
|
end
|
12
14
|
end
|
@@ -56,7 +58,7 @@ module Phonelib
|
|
56
58
|
def country_can_dp?(country)
|
57
59
|
Phonelib.phone_data[country] &&
|
58
60
|
Phonelib.phone_data[country][Core::DOUBLE_COUNTRY_PREFIX_FLAG] &&
|
59
|
-
!original_starts_with_plus?
|
61
|
+
!original_starts_with_plus? && original_s.start_with?(Phonelib.phone_data[country][Core::COUNTRY_CODE])
|
60
62
|
end
|
61
63
|
|
62
64
|
# changes phone to with/without double country prefix
|
@@ -66,6 +68,7 @@ module Phonelib
|
|
66
68
|
|
67
69
|
country_code = Phonelib.phone_data[country][Core::COUNTRY_CODE]
|
68
70
|
if phone.start_with? country_code * 2
|
71
|
+
# remove double prefix in case it is there
|
69
72
|
phone.gsub(cr("^#{country_code}"), '')
|
70
73
|
else
|
71
74
|
"#{country_code}#{phone}"
|
@@ -5,7 +5,7 @@ module Phonelib
|
|
5
5
|
# @param formatted [Boolean] whether to return numbers only or formatted
|
6
6
|
# @return [String] formatted national number
|
7
7
|
def national(formatted = true)
|
8
|
-
return @national_number unless
|
8
|
+
return @national_number unless possible?
|
9
9
|
format_match, format_string = formatting_data
|
10
10
|
|
11
11
|
if format_match
|
@@ -52,7 +52,7 @@ module Phonelib
|
|
52
52
|
def international(formatted = true, prefix = '+')
|
53
53
|
prefix = formatted if formatted.is_a?(String)
|
54
54
|
return nil if sanitized.empty?
|
55
|
-
return "#{prefix}#{country_prefix_or_not}#{sanitized}" unless
|
55
|
+
return "#{prefix}#{country_prefix_or_not}#{sanitized}" unless possible?
|
56
56
|
return "#{prefix}#{data_country_code}#{@national_number}" unless formatted
|
57
57
|
|
58
58
|
fmt = @data[country][:format]
|
data/lib/phonelib/version.rb
CHANGED
data/lib/phonelib.rb
CHANGED
@@ -17,4 +17,12 @@ if defined?(ActiveModel) || defined?(Rails)
|
|
17
17
|
else
|
18
18
|
autoload :PhoneValidator, 'validators/phone_validator'
|
19
19
|
end
|
20
|
+
|
21
|
+
if defined?(Rails)
|
22
|
+
class Phonelib::Railtie < Rails::Railtie
|
23
|
+
initializer 'phonelib' do |app|
|
24
|
+
app.config.eager_load_namespaces << Phonelib
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
20
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phonelib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7
|
4
|
+
version: 0.8.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vadim Senderovich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: '1.15'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
40
|
+
version: '1.15'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.0.
|
75
|
+
version: 1.0.9
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.0.
|
82
|
+
version: 1.0.9
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: benchmark-ips
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: benchmark-memory
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: rack-cache
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -169,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
197
|
- !ruby/object:Gem::Version
|
170
198
|
version: '0'
|
171
199
|
requirements: []
|
172
|
-
rubygems_version: 3.
|
200
|
+
rubygems_version: 3.1.4
|
173
201
|
signing_key:
|
174
202
|
specification_version: 4
|
175
203
|
summary: Gem validates phone numbers with Google libphonenumber database
|