phonelib 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{README.rdoc → README.md} +116 -75
- data/data/extended_data.dat +0 -0
- data/data/libphonenumber/FALSEHOODS.md +16 -0
- data/data/libphonenumber/FAQ.md +8 -0
- data/data/libphonenumber/README.md +1 -1
- data/data/libphonenumber/cpp/src/phonenumbers/alternate_format.cc +108 -100
- data/data/libphonenumber/cpp/src/phonenumbers/lite_metadata.cc +10070 -10016
- data/data/libphonenumber/cpp/src/phonenumbers/metadata.cc +10938 -10884
- data/data/libphonenumber/cpp/src/phonenumbers/short_metadata.cc +2481 -2455
- data/data/libphonenumber/java/carrier/pom.xml +26 -4
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/255_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/374_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/374_ru +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/421_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/66_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/91_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/93_fa +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/973_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_fa +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/992_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/994_en +0 -0
- data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/config +0 -0
- data/data/libphonenumber/java/demo/pom.xml +6 -6
- data/data/libphonenumber/java/geocoder/pom.xml +26 -4
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1747_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1934_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/371_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/44_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/504_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_bg +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_ca +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_el +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_es +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_fi +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_hi +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_hu +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_iw +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_ja +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/82_tr +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/91_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/93_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/93_fa +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/98_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/98_fa +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/992_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/994_en +0 -0
- data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config +0 -0
- data/data/libphonenumber/java/internal/prefixmapper/pom.xml +25 -3
- data/data/libphonenumber/java/libphonenumber/pom.xml +23 -2
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataLoader.java +2 -1
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/MultiFileMetadataSourceImpl.java +63 -70
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BR +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SK +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZA +0 -0
- data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/SingleFilePhoneNumberMetadataProto +0 -0
- data/data/libphonenumber/java/libphonenumber/test/com/google/i18n/phonenumbers/MultiFileMetadataSourceImplTest.java +25 -5
- data/data/libphonenumber/java/pom.xml +2 -2
- data/data/libphonenumber/java/release_notes.txt +45 -0
- data/data/libphonenumber/javascript/i18n/phonenumbers/demo-compiled.js +72 -70
- data/data/libphonenumber/javascript/i18n/phonenumbers/metadata.js +38 -32
- data/data/libphonenumber/javascript/i18n/phonenumbers/metadatalite.js +38 -32
- data/data/libphonenumber/resources/PhoneNumberAlternateFormats.xml +16 -0
- data/data/libphonenumber/resources/PhoneNumberMetadata.xml +232 -96
- data/data/libphonenumber/resources/ShortNumberMetadata.xml +188 -44
- data/data/libphonenumber/resources/carrier/en/255.txt +2 -0
- data/data/libphonenumber/resources/carrier/en/374.txt +3 -3
- data/data/libphonenumber/resources/carrier/en/421.txt +1 -0
- data/data/libphonenumber/resources/carrier/en/66.txt +1 -0
- data/data/libphonenumber/resources/carrier/en/91.txt +419 -253
- data/data/libphonenumber/resources/carrier/en/973.txt +1 -0
- data/data/libphonenumber/resources/carrier/en/992.txt +1 -0
- data/data/libphonenumber/resources/carrier/en/994.txt +3 -0
- data/data/libphonenumber/resources/carrier/fa/93.txt +24 -0
- data/data/libphonenumber/resources/carrier/fa/98.txt +30 -0
- data/data/libphonenumber/resources/carrier/ru/374.txt +28 -0
- data/data/libphonenumber/resources/geocoding/bg/82.txt +34 -0
- data/data/libphonenumber/resources/geocoding/ca/82.txt +34 -0
- data/data/libphonenumber/resources/geocoding/el/82.txt +28 -0
- data/data/libphonenumber/resources/geocoding/en/1.txt +2 -0
- data/data/libphonenumber/resources/geocoding/en/371.txt +3 -0
- data/data/libphonenumber/resources/geocoding/en/44.txt +19 -1
- data/data/libphonenumber/resources/geocoding/en/504.txt +19 -0
- data/data/libphonenumber/resources/geocoding/en/91.txt +1 -5
- data/data/libphonenumber/resources/geocoding/en/93.txt +52 -0
- data/data/libphonenumber/resources/geocoding/en/98.txt +0 -2
- data/data/libphonenumber/resources/geocoding/en/992.txt +77 -0
- data/data/libphonenumber/resources/geocoding/en/994.txt +98 -0
- data/data/libphonenumber/resources/geocoding/es/82.txt +33 -0
- data/data/libphonenumber/resources/geocoding/fa/93.txt +53 -0
- data/data/libphonenumber/resources/geocoding/fa/98.txt +0 -2
- data/data/libphonenumber/resources/geocoding/fi/82.txt +34 -0
- data/data/libphonenumber/resources/geocoding/hi/82.txt +36 -0
- data/data/libphonenumber/resources/geocoding/hu/82.txt +35 -0
- data/data/libphonenumber/resources/geocoding/iw/82.txt +37 -0
- data/data/libphonenumber/resources/geocoding/ja/82.txt +35 -0
- data/data/libphonenumber/resources/geocoding/tr/82.txt +35 -0
- data/data/libphonenumber/tools/java/common/pom.xml +2 -0
- data/data/libphonenumber/tools/java/cpp-build/pom.xml +4 -0
- data/data/libphonenumber/tools/java/data/pom.xml +1 -11
- data/data/libphonenumber/tools/java/java-build/pom.xml +2 -0
- data/data/phone_data.dat +0 -0
- data/lib/phonelib.rb +7 -6
- data/lib/phonelib/core.rb +116 -68
- data/lib/phonelib/data_importer.rb +23 -19
- data/lib/phonelib/data_importer_helper.rb +16 -16
- data/lib/phonelib/phone.rb +47 -137
- data/lib/phonelib/phone_analyzer.rb +27 -25
- data/lib/phonelib/phone_analyzer_helper.rb +16 -9
- data/lib/phonelib/phone_extended_data.rb +27 -17
- data/lib/phonelib/phone_formatter.rb +131 -0
- data/lib/phonelib/version.rb +2 -3
- data/lib/tasks/phonelib_tasks.rake +0 -2
- data/lib/validators/phone_validator.rb +24 -14
- metadata +42 -3
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'phonelib/data_importer_helper'
|
2
2
|
|
3
3
|
module Phonelib
|
4
|
-
# module processes creation of data files needed for this gem
|
4
|
+
# @private module processes creation of data files needed for this gem
|
5
5
|
module DataImporter
|
6
6
|
require 'nokogiri'
|
7
7
|
|
@@ -13,7 +13,7 @@ module Phonelib
|
|
13
13
|
Importer.new
|
14
14
|
end
|
15
15
|
|
16
|
-
# class with functionality for importing data
|
16
|
+
# @private class with functionality for importing data
|
17
17
|
class Importer
|
18
18
|
include Phonelib::DataImporterHelper
|
19
19
|
|
@@ -31,18 +31,25 @@ module Phonelib
|
|
31
31
|
# carrier data dir in repo
|
32
32
|
CARRIER_DIR = 'resources/carrier/en/'
|
33
33
|
# timezones data dir in repo
|
34
|
-
TIMEZONES_DIR= 'resources/timezones/'
|
34
|
+
TIMEZONES_DIR = 'resources/timezones/'
|
35
35
|
|
36
36
|
# class initialization method
|
37
37
|
def initialize
|
38
38
|
@destination = File.path(
|
39
|
-
|
39
|
+
"#{File.dirname(__FILE__)}/../../data/libphonenumber/")
|
40
40
|
@data = {}
|
41
41
|
@prefixes = {}
|
42
42
|
@geo_names = []
|
43
43
|
@timezones = []
|
44
44
|
@carriers = []
|
45
45
|
|
46
|
+
run_import
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# running import method
|
52
|
+
def run_import
|
46
53
|
clone_repo
|
47
54
|
import_main_data
|
48
55
|
import_short_data
|
@@ -53,8 +60,6 @@ module Phonelib
|
|
53
60
|
save_data_file
|
54
61
|
end
|
55
62
|
|
56
|
-
private
|
57
|
-
|
58
63
|
# method saves parsed data to data files
|
59
64
|
def save_data_file
|
60
65
|
data_file =
|
@@ -84,7 +89,7 @@ module Phonelib
|
|
84
89
|
|
85
90
|
system("rm -rf #{@destination}")
|
86
91
|
cloned = system("git clone #{repo} #{@destination} --depth 1 -b master")
|
87
|
-
|
92
|
+
fail 'Could not clone repo' unless cloned
|
88
93
|
end
|
89
94
|
|
90
95
|
# method parses main data file
|
@@ -125,15 +130,14 @@ module Phonelib
|
|
125
130
|
def import_alternate_formats
|
126
131
|
puts 'IMPORTING ALTERNATE FORMATS'
|
127
132
|
|
128
|
-
|
129
133
|
main_from_xml("#{@destination}#{FORMATS_FILE}").elements.each do |el|
|
130
|
-
el.children.each do |
|
131
|
-
|
132
|
-
formats = parse_formats(phone_type.children)
|
134
|
+
el.children.each do |phone_type|
|
135
|
+
next unless phone_type.name == 'availableFormats'
|
133
136
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
+
formats = parse_formats(phone_type.children)
|
138
|
+
|
139
|
+
country_code = el.attribute('countryCode').value
|
140
|
+
@data[get_country_by_code(country_code)][:formats] += formats
|
137
141
|
end
|
138
142
|
end
|
139
143
|
end
|
@@ -175,7 +179,7 @@ module Phonelib
|
|
175
179
|
types = {}
|
176
180
|
formats = []
|
177
181
|
|
178
|
-
without_comments(children).each do |
|
182
|
+
without_comments(children).each do |phone_type|
|
179
183
|
if phone_type.name == 'availableFormats'
|
180
184
|
formats = parse_formats(phone_type.children)
|
181
185
|
else
|
@@ -218,7 +222,7 @@ module Phonelib
|
|
218
222
|
|
219
223
|
without_comments(format.children).each do |f|
|
220
224
|
current_format[name2sym(f.name)] =
|
221
|
-
str_clean(f.children.first,
|
225
|
+
str_clean(f.children.first, not_format?(f.name))
|
222
226
|
end
|
223
227
|
|
224
228
|
current_format
|
@@ -242,13 +246,13 @@ module Phonelib
|
|
242
246
|
|
243
247
|
# method finds country by country prefix
|
244
248
|
def get_country_by_code(country_code)
|
245
|
-
match = @data.select { |
|
249
|
+
match = @data.select { |_k, v| v[:country_code] == country_code }
|
246
250
|
if match.size > 1
|
247
|
-
match = match.select { |
|
251
|
+
match = match.select { |_k, v| v[:main_country_for_code] == 'true' }
|
248
252
|
end
|
249
253
|
|
250
254
|
match.keys.first
|
251
255
|
end
|
252
256
|
end
|
253
257
|
end
|
254
|
-
end
|
258
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Phonelib
|
2
|
-
# helper module for parsing raw libphonenumber data
|
2
|
+
# @private helper module for parsing raw libphonenumber data
|
3
3
|
module DataImporterHelper
|
4
4
|
# xml comments attributes names that should not be parsed
|
5
5
|
XML_COMMENT_ATTRIBUTES = %w(text comment)
|
@@ -20,7 +20,7 @@ module Phonelib
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# method for checking if element name is not a format element
|
23
|
-
def
|
23
|
+
def not_format?(name)
|
24
24
|
!XML_FORMAT_NAMES.include? name
|
25
25
|
end
|
26
26
|
|
@@ -35,18 +35,18 @@ module Phonelib
|
|
35
35
|
def get_hash_from_xml(data, type)
|
36
36
|
hash = {}
|
37
37
|
case type
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
38
|
+
when :attributes
|
39
|
+
data.attributes.each do |k, v|
|
40
|
+
hash[name2sym(k)] = str_clean(v)
|
41
|
+
end
|
42
|
+
when :children
|
43
|
+
data.each do |f|
|
44
|
+
hash[name2sym(f[0])] = f[1]
|
45
|
+
end
|
46
|
+
when :element
|
47
|
+
data.elements.each do |child|
|
48
|
+
hash[name2sym(child.name)] = str_clean(child.children.first)
|
49
|
+
end
|
50
50
|
end
|
51
51
|
hash
|
52
52
|
end
|
@@ -66,7 +66,7 @@ module Phonelib
|
|
66
66
|
# get main body from parsed xml document
|
67
67
|
def main_from_xml(file)
|
68
68
|
xml_data = File.read(file)
|
69
|
-
xml_data.force_encoding(
|
69
|
+
xml_data.force_encoding('utf-8')
|
70
70
|
|
71
71
|
doc = Nokogiri::XML(xml_data)
|
72
72
|
doc.elements.first.elements.first
|
@@ -87,4 +87,4 @@ module Phonelib
|
|
87
87
|
s.gsub(/[A-Z]+/) { |m| "_#{m.downcase}" }
|
88
88
|
end
|
89
89
|
end
|
90
|
-
end
|
90
|
+
end
|
data/lib/phonelib/phone.rb
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
module Phonelib
|
2
2
|
# class for parsed phone number, includes validation and formatting methods
|
3
3
|
class Phone
|
4
|
-
#
|
5
|
-
# original phone number passed for parsing
|
4
|
+
# @!attribute [r] original
|
5
|
+
# @return [String] original phone number passed for parsing
|
6
6
|
attr_reader :original
|
7
|
-
#
|
7
|
+
# @!attribute [r] extension
|
8
|
+
# @return [String] phone extension passed for parsing after a number
|
8
9
|
attr_reader :extension
|
9
10
|
|
10
11
|
# including module that has all phone analyzing methods
|
11
12
|
include Phonelib::PhoneAnalyzer
|
12
13
|
include Phonelib::PhoneExtendedData
|
14
|
+
include Phonelib::PhoneFormatter
|
13
15
|
|
14
16
|
# class initialization method
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
def initialize(original, country = nil)
|
23
|
-
@original, @extension = separate_extension(original)
|
17
|
+
# @param phone [String] Phone number for parsing
|
18
|
+
# @param country [String|Symbol] Country specification for parsing.
|
19
|
+
# Must be ISO code of country (2 letters) like 'US', 'us' or :us
|
20
|
+
# for United States
|
21
|
+
# @return [Phonelib::Phone] parsed phone instance
|
22
|
+
def initialize(phone, country = nil)
|
23
|
+
@original, @extension = separate_extension(phone.to_s)
|
24
24
|
@extension.gsub!(/[^0-9]/, '') if @extension
|
25
25
|
|
26
26
|
if sanitized.empty?
|
@@ -33,6 +33,7 @@ module Phonelib
|
|
33
33
|
end
|
34
34
|
|
35
35
|
# method to get sanitized phone number (only numbers)
|
36
|
+
# @return [String] Sanitized phone number
|
36
37
|
def sanitized
|
37
38
|
@sanitized = if Phonelib.strict_check
|
38
39
|
@original
|
@@ -42,36 +43,43 @@ module Phonelib
|
|
42
43
|
end
|
43
44
|
|
44
45
|
# Returns all phone types that matched valid patterns
|
46
|
+
# @return [Array] all valid phone types
|
45
47
|
def types
|
46
|
-
@data.flat_map { |
|
48
|
+
@data.flat_map { |_iso2, data| data[:valid] }.uniq
|
47
49
|
end
|
48
50
|
|
49
51
|
# Returns all possible types that matched possible patterns
|
52
|
+
# @return [Array] all possible phone types
|
50
53
|
def possible_types
|
51
|
-
@data.flat_map { |
|
54
|
+
@data.flat_map { |_iso2, data| data[:possible] }.uniq
|
52
55
|
end
|
53
56
|
|
54
57
|
# Returns first phone type that matched
|
58
|
+
# @return [Symbol] valid phone type
|
55
59
|
def type
|
56
60
|
types.first
|
57
61
|
end
|
58
62
|
|
59
63
|
# Returns human representation of all matched phone types
|
64
|
+
# @return [Array] Array of human readable valid phone types
|
60
65
|
def human_types
|
61
66
|
types.map { |type| Core::TYPES_DESC[type] }
|
62
67
|
end
|
63
68
|
|
64
69
|
# Return human representation of phone type
|
70
|
+
# @return [String] Human readable valid phone type
|
65
71
|
def human_type
|
66
72
|
Core::TYPES_DESC[type]
|
67
73
|
end
|
68
74
|
|
69
75
|
# Returns all countries that matched valid patterns
|
76
|
+
# @return [Array] Possible ISO2 country codes array
|
70
77
|
def countries
|
71
|
-
@data.map { |iso2,
|
78
|
+
@data.map { |iso2, _data| iso2 }
|
72
79
|
end
|
73
80
|
|
74
81
|
# Return countries with valid patterns
|
82
|
+
# @return [Array] Valid ISO2 country codes array
|
75
83
|
def valid_countries
|
76
84
|
@valid_countries ||= countries.select do |iso2|
|
77
85
|
@data[iso2][:valid].any?
|
@@ -79,124 +87,60 @@ module Phonelib
|
|
79
87
|
end
|
80
88
|
|
81
89
|
# Return valid country
|
90
|
+
# @return [String] valid ISO2 country code
|
82
91
|
def valid_country
|
83
|
-
@valid_country ||=
|
92
|
+
@valid_country ||= main_country(valid_countries)
|
84
93
|
end
|
85
94
|
|
86
95
|
# Returns first country that matched valid patterns
|
96
|
+
# @return [String] valid country ISO2 code or first matched country code
|
87
97
|
def country
|
88
|
-
@country ||= valid_country ||
|
89
|
-
end
|
90
|
-
|
91
|
-
# Returns the country code from the original phone number.
|
92
|
-
def country_code
|
93
|
-
if country_data = Phonelib.phone_data[country]
|
94
|
-
country_data[:country_code]
|
95
|
-
end
|
98
|
+
@country ||= valid_country || main_country(countries)
|
96
99
|
end
|
97
100
|
|
98
101
|
# Returns whether a current parsed phone number is valid
|
102
|
+
# @return [Boolean] parsed phone is valid
|
99
103
|
def valid?
|
100
|
-
@data.select { |
|
104
|
+
@data.select { |_iso2, data| data[:valid].any? }.any?
|
101
105
|
end
|
102
106
|
|
103
107
|
# Returns whether a current parsed phone number is invalid
|
108
|
+
# @return [Boolean] parsed phone is invalid
|
104
109
|
def invalid?
|
105
110
|
!valid?
|
106
111
|
end
|
107
112
|
|
108
113
|
# Returns whether a current parsed phone number is possible
|
114
|
+
# @return [Boolean] parsed phone is possible
|
109
115
|
def possible?
|
110
|
-
@data.select { |
|
116
|
+
@data.select { |_iso2, data| data[:possible].any? }.any?
|
111
117
|
end
|
112
118
|
|
113
119
|
# Returns whether a current parsed phone number is impossible
|
120
|
+
# @return [Boolean] parsed phone is impossible
|
114
121
|
def impossible?
|
115
122
|
!possible?
|
116
123
|
end
|
117
124
|
|
118
|
-
# returns area code of parsed number
|
119
|
-
def area_code
|
120
|
-
return nil unless possible?
|
121
|
-
format_match, format_string = get_formatting_data
|
122
|
-
|
123
|
-
if format_string =~ /^.*[0-9]+.*\$1/ && format_match
|
124
|
-
format_string.gsub(/\$1.*$/, format_match[1]).gsub(/[^\d]+/, '')
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
125
|
# returns local number
|
126
|
+
# @return [String] local number
|
129
127
|
def local_number
|
130
128
|
return national unless possible?
|
131
|
-
format_match, format_string =
|
129
|
+
format_match, format_string = formatting_data
|
132
130
|
|
133
131
|
if format_string =~ /^.*[0-9]+.*\$1/ && format_match
|
134
|
-
format_string.gsub(/^.*\$2/, '$2')
|
135
|
-
|
132
|
+
format_string.gsub(/^.*\$2/, '$2')
|
133
|
+
.gsub(/\$\d/) { |el| format_match[el[1].to_i] }
|
136
134
|
else
|
137
135
|
national
|
138
136
|
end
|
139
137
|
end
|
140
138
|
|
141
|
-
# Returns formatted national number
|
142
|
-
def national(formatted = true)
|
143
|
-
return @national_number unless valid?
|
144
|
-
format_match, format_string = get_formatting_data
|
145
|
-
|
146
|
-
if format_match
|
147
|
-
out = format_string.gsub(/\$\d/) { |el| format_match[el[1].to_i] }
|
148
|
-
formatted ? out : out.gsub(/[^0-9]/, '')
|
149
|
-
else
|
150
|
-
@national_number
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# Returns e164 formatted phone number
|
155
|
-
def international(formatted = true)
|
156
|
-
return nil if sanitized.nil? || sanitized.empty?
|
157
|
-
return "+#{country_prefix_or_not}#{sanitized}" unless valid?
|
158
|
-
return "#{@data[country][Core::COUNTRY_CODE]}#{@national_number}" unless formatted
|
159
|
-
|
160
|
-
format = @data[country][:format]
|
161
|
-
if matches = @national_number.match(/#{format[Core::PATTERN]}/)
|
162
|
-
fmt = format[:intl_format] || format[:format]
|
163
|
-
national = fmt.gsub(/\$\d/) { |el| matches[el[1].to_i] }
|
164
|
-
else
|
165
|
-
national = @national_number
|
166
|
-
end
|
167
|
-
|
168
|
-
"+#{country_code} #{national}"
|
169
|
-
end
|
170
|
-
|
171
|
-
# returns national formatted number with extension added
|
172
|
-
def full_national
|
173
|
-
"#{national}#{formatted_extension}"
|
174
|
-
end
|
175
|
-
|
176
|
-
# returns international formatted number with extension added
|
177
|
-
def full_international
|
178
|
-
"#{international}#{formatted_extension}"
|
179
|
-
end
|
180
|
-
|
181
|
-
# returns e164 format of phone with extension added
|
182
|
-
def full_e164
|
183
|
-
"#{e164}#{formatted_extension}"
|
184
|
-
end
|
185
|
-
|
186
|
-
# Returns e164 unformatted phone number
|
187
|
-
def e164
|
188
|
-
international = self.international
|
189
|
-
international and international.gsub /[^+0-9]/, ''
|
190
|
-
end
|
191
|
-
|
192
139
|
# Returns whether a current parsed phone number is valid for specified
|
193
140
|
# country
|
194
|
-
#
|
195
|
-
#
|
196
|
-
#
|
197
|
-
# * +country+ - ISO code of country (2 letters) like 'US', 'us' or :us
|
198
|
-
# for United States
|
199
|
-
#
|
141
|
+
# @param country [String|Symbol] ISO code of country (2 letters) like 'US',
|
142
|
+
# 'us' or :us for United States
|
143
|
+
# @return [Boolean] parsed phone number is valid
|
200
144
|
def valid_for_country?(country)
|
201
145
|
country = country.to_s.upcase
|
202
146
|
@data.find do |iso2, data|
|
@@ -206,61 +150,27 @@ module Phonelib
|
|
206
150
|
|
207
151
|
# Returns whether a current parsed phone number is invalid for specified
|
208
152
|
# country
|
209
|
-
#
|
210
|
-
#
|
211
|
-
#
|
212
|
-
# * +country+ - ISO code of country (2 letters) like 'US', 'us' or :us
|
213
|
-
# for United States
|
214
|
-
#
|
153
|
+
# @param country [String|Symbol] ISO code of country (2 letters) like 'US',
|
154
|
+
# 'us' or :us for United States
|
155
|
+
# @return [Boolean] parsed phone number is invalid
|
215
156
|
def invalid_for_country?(country)
|
216
157
|
!valid_for_country?(country)
|
217
158
|
end
|
218
159
|
|
219
160
|
private
|
220
161
|
|
221
|
-
|
222
|
-
return '' unless country_code
|
223
|
-
sanitized.start_with?(country_code) ? '' : country_code
|
224
|
-
end
|
225
|
-
|
226
|
-
# returns extension with separator defined
|
227
|
-
def formatted_extension
|
228
|
-
return '' if @extension.nil? || @extension.empty?
|
229
|
-
|
230
|
-
"#{Phonelib.extension_separator}#{@extension}"
|
231
|
-
end
|
232
|
-
|
233
|
-
# extracts extension from passed phone number if provided
|
162
|
+
# @private extracts extension from passed phone number if provided
|
234
163
|
def separate_extension(original)
|
235
164
|
regex = cr("[#{Phonelib.extension_separate_symbols}]")
|
236
165
|
split = (original || '').split regex
|
237
|
-
[split.first, split[1..-1] && split[1..-1].join]
|
166
|
+
[split.first || '', split[1..-1] && split[1..-1].join || '']
|
238
167
|
end
|
239
168
|
|
240
|
-
# get main country for code among provided countries
|
241
|
-
def
|
169
|
+
# @private get main country for code among provided countries
|
170
|
+
def main_country(countries_array)
|
242
171
|
countries_array.find do |iso2|
|
243
172
|
@data[iso2][Core::MAIN_COUNTRY_FOR_CODE] == 'true'
|
244
173
|
end || countries_array.first
|
245
174
|
end
|
246
|
-
|
247
|
-
# Get needable data for formatting phone as national number
|
248
|
-
def get_formatting_data
|
249
|
-
return @formatting_data if @formatting_data
|
250
|
-
|
251
|
-
format = @data[country][:format]
|
252
|
-
prefix = @data[country][Core::NATIONAL_PREFIX]
|
253
|
-
rule = (format[Core::NATIONAL_PREFIX_RULE] ||
|
254
|
-
@data[country][Core::NATIONAL_PREFIX_RULE] || '$1')
|
255
|
-
|
256
|
-
# change rule's constants to values
|
257
|
-
rule.gsub!(/(\$NP|\$FG)/, '$NP' => prefix, '$FG' => '$1')
|
258
|
-
|
259
|
-
# add space to format groups, change first group to rule,
|
260
|
-
format_string = format[:format].gsub(/(\d)\$/, '\\1 $').gsub('$1', rule)
|
261
|
-
|
262
|
-
@formatting_data =
|
263
|
-
[@national_number.match(/#{format[Core::PATTERN]}/), format_string]
|
264
|
-
end
|
265
175
|
end
|
266
176
|
end
|