phonelib 0.6.2 → 0.6.3
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/{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,5 +1,5 @@
|
|
|
1
1
|
module Phonelib
|
|
2
|
-
# phone analyzing methods module
|
|
2
|
+
# @private phone analyzing methods module
|
|
3
3
|
module PhoneAnalyzer
|
|
4
4
|
# extending with helper methods for analyze
|
|
5
5
|
include Phonelib::PhoneAnalyzerHelper
|
|
@@ -7,8 +7,8 @@ module Phonelib
|
|
|
7
7
|
# array of types not included for validation check in cycle
|
|
8
8
|
NOT_FOR_CHECK = [:general_desc, :fixed_line, :mobile, :fixed_or_mobile]
|
|
9
9
|
|
|
10
|
-
# parses provided phone if it is valid for country data and
|
|
11
|
-
# analyze
|
|
10
|
+
# parses provided phone if it is valid for country data and
|
|
11
|
+
# returns result of analyze
|
|
12
12
|
#
|
|
13
13
|
# ==== Attributes
|
|
14
14
|
#
|
|
@@ -20,7 +20,9 @@ module Phonelib
|
|
|
20
20
|
|
|
21
21
|
result = try_to_parse_single_country(phone, country)
|
|
22
22
|
# if previous parsing failed, trying for all countries
|
|
23
|
-
if passed_country.nil? &&
|
|
23
|
+
if passed_country.nil? && \
|
|
24
|
+
(result.nil? || result.empty? || result.values.first[:valid].empty?)
|
|
25
|
+
|
|
24
26
|
detected = detect_and_parse phone
|
|
25
27
|
result = detected.empty? ? result || {} : detected
|
|
26
28
|
end
|
|
@@ -38,18 +40,18 @@ module Phonelib
|
|
|
38
40
|
# * +country+ - country to parse phone with
|
|
39
41
|
def try_to_parse_single_country(phone, country)
|
|
40
42
|
data = Phonelib.phone_data[country]
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
return nil unless country && data
|
|
44
|
+
|
|
45
|
+
# if country was provided and it's a valid country, trying to
|
|
46
|
+
# create e164 representation of phone number,
|
|
47
|
+
# kind of normalization for parsing
|
|
48
|
+
e164 = convert_to_e164 phone, data
|
|
49
|
+
# if phone starts with international prefix of provided
|
|
50
|
+
# country try to reanalyze without international prefix for
|
|
51
|
+
# all countries
|
|
52
|
+
return analyze(e164.delete('+'), nil) if e164[0] == '+'
|
|
53
|
+
# trying to parse number for provided country
|
|
54
|
+
parse_single_country e164, data
|
|
53
55
|
end
|
|
54
56
|
|
|
55
57
|
# method checks if phone is valid against single provided country data
|
|
@@ -61,10 +63,10 @@ module Phonelib
|
|
|
61
63
|
def parse_single_country(e164, data)
|
|
62
64
|
valid_match = phone_match_data?(e164, data)
|
|
63
65
|
if valid_match
|
|
64
|
-
|
|
66
|
+
national_and_data(e164, data, valid_match)
|
|
65
67
|
else
|
|
66
68
|
possible_match = phone_match_data?(e164, data, true)
|
|
67
|
-
possible_match &&
|
|
69
|
+
possible_match && national_and_data(e164, data, possible_match, true)
|
|
68
70
|
end
|
|
69
71
|
end
|
|
70
72
|
|
|
@@ -112,14 +114,14 @@ module Phonelib
|
|
|
112
114
|
# * +data+ - country data
|
|
113
115
|
# * +country_match+ - result of match of phone within full regex
|
|
114
116
|
# * +not_valid+ - specifies that number is not valid by general desc pattern
|
|
115
|
-
def
|
|
117
|
+
def national_and_data(phone, data, country_match, not_valid = false)
|
|
116
118
|
prefix_length = data[Core::COUNTRY_CODE].length
|
|
117
119
|
prefix_length += [1, 2].map { |i| country_match[i].to_s.size }.inject(:+)
|
|
118
|
-
result = data.select { |k,
|
|
120
|
+
result = data.select { |k, _v| k != :types && k != :formats }
|
|
119
121
|
result[:national] = phone[prefix_length..-1] || ''
|
|
120
|
-
result[:format] =
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
result[:format] = number_format(result[:national], data[Core::FORMATS])
|
|
123
|
+
result.merge! all_number_types(result[:national], data[Core::TYPES],
|
|
124
|
+
not_valid)
|
|
123
125
|
result[:valid] = [] if not_valid
|
|
124
126
|
|
|
125
127
|
{ result[:id] => result }
|
|
@@ -154,10 +156,10 @@ module Phonelib
|
|
|
154
156
|
#
|
|
155
157
|
# * +national+ - national phone number
|
|
156
158
|
# * +format_data+ - formatting data from country data
|
|
157
|
-
def
|
|
159
|
+
def number_format(national, format_data)
|
|
158
160
|
format_data && format_data.find do |format|
|
|
159
161
|
(format[Core::LEADING_DIGITS].nil? \
|
|
160
|
-
|
|
162
|
+
|| national.match(cr("^(#{format[Core::LEADING_DIGITS]})"))) \
|
|
161
163
|
&& national.match(cr("^(#{format[Core::PATTERN]})$"))
|
|
162
164
|
end || Core::DEFAULT_NUMBER_FORMAT
|
|
163
165
|
end
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
module Phonelib
|
|
2
|
-
# helper methods for analyser
|
|
2
|
+
# @private helper methods for analyser
|
|
3
3
|
module PhoneAnalyzerHelper
|
|
4
4
|
private
|
|
5
5
|
|
|
6
6
|
# defines if to validate against single country or not
|
|
7
7
|
def passed_country(country)
|
|
8
|
-
|
|
9
|
-
if @original.start_with?('+') &&
|
|
10
|
-
# in case number passed with + but it doesn't start with passed
|
|
8
|
+
code = country_prefix(country)
|
|
9
|
+
if @original.start_with?('+') && code && !sanitized.start_with?(code)
|
|
10
|
+
# in case number passed with + but it doesn't start with passed
|
|
11
|
+
# country prefix
|
|
11
12
|
country = nil
|
|
12
13
|
end
|
|
13
14
|
country
|
|
@@ -16,7 +17,8 @@ module Phonelib
|
|
|
16
17
|
# returns country prefix for provided country or nil
|
|
17
18
|
def country_prefix(country)
|
|
18
19
|
country = country.to_s.upcase
|
|
19
|
-
Phonelib.phone_data[country] &&
|
|
20
|
+
Phonelib.phone_data[country] && \
|
|
21
|
+
Phonelib.phone_data[country][Core::COUNTRY_CODE]
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
# caches regular expression, reusing it for later lookups
|
|
@@ -33,8 +35,13 @@ module Phonelib
|
|
|
33
35
|
# * +parsed+ - parsed regex match for phone
|
|
34
36
|
def allows_double_prefix(data, phone, parsed)
|
|
35
37
|
data[Core::DOUBLE_COUNTRY_PREFIX_FLAG] &&
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
phone =~ cr("^#{data[Core::COUNTRY_CODE]}") &&
|
|
39
|
+
parsed && (parsed[:valid].nil? || parsed[:valid].empty?)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Returns original number passed if it's a string or empty string otherwise
|
|
43
|
+
def original_string
|
|
44
|
+
@original.is_a?(String) ? @original : ''
|
|
38
45
|
end
|
|
39
46
|
|
|
40
47
|
# Get country that was provided or default country in needable format
|
|
@@ -43,7 +50,7 @@ module Phonelib
|
|
|
43
50
|
#
|
|
44
51
|
# * +country+ - country passed for parsing
|
|
45
52
|
def country_or_default_country(country)
|
|
46
|
-
country
|
|
53
|
+
country ||= (original_string.start_with?('+') ? nil : Phonelib.default_country)
|
|
47
54
|
country && country.to_s.upcase
|
|
48
55
|
end
|
|
49
56
|
|
|
@@ -143,4 +150,4 @@ module Phonelib
|
|
|
143
150
|
[valid && possible, possible]
|
|
144
151
|
end
|
|
145
152
|
end
|
|
146
|
-
end
|
|
153
|
+
end
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
module Phonelib
|
|
2
2
|
# module provides extended data methods for parsed phone
|
|
3
3
|
module PhoneExtendedData
|
|
4
|
+
# @private keys for extended data
|
|
5
|
+
EXT_KEYS = [
|
|
6
|
+
Phonelib::Core::EXT_GEO_NAME_KEY,
|
|
7
|
+
Phonelib::Core::EXT_TIMEZONE_KEY,
|
|
8
|
+
Phonelib::Core::EXT_CARRIER_KEY
|
|
9
|
+
]
|
|
10
|
+
|
|
4
11
|
# Returns geo name of parsed phone number or nil if number is invalid or
|
|
5
12
|
# there is no geo name specified in db for this number
|
|
13
|
+
# @return [String|nil] geo name for parsed phone
|
|
6
14
|
def geo_name
|
|
7
15
|
get_ext_name Phonelib::Core::EXT_GEO_NAMES,
|
|
8
16
|
Phonelib::Core::EXT_GEO_NAME_KEY
|
|
@@ -10,6 +18,7 @@ module Phonelib
|
|
|
10
18
|
|
|
11
19
|
# Returns timezone of parsed phone number or nil if number is invalid or
|
|
12
20
|
# there is no timezone specified in db for this number
|
|
21
|
+
# @return [String|nil] timezone for parsed phone
|
|
13
22
|
def timezone
|
|
14
23
|
get_ext_name Phonelib::Core::EXT_TIMEZONES,
|
|
15
24
|
Phonelib::Core::EXT_TIMEZONE_KEY
|
|
@@ -17,6 +26,7 @@ module Phonelib
|
|
|
17
26
|
|
|
18
27
|
# Returns carrier of parsed phone number or nil if number is invalid or
|
|
19
28
|
# there is no carrier specified in db for this number
|
|
29
|
+
# @return [String|nil] carrier for parsed phone
|
|
20
30
|
def carrier
|
|
21
31
|
get_ext_name Phonelib::Core::EXT_CARRIERS,
|
|
22
32
|
Phonelib::Core::EXT_CARRIER_KEY
|
|
@@ -24,7 +34,7 @@ module Phonelib
|
|
|
24
34
|
|
|
25
35
|
private
|
|
26
36
|
|
|
27
|
-
# get name from extended phone data by keys
|
|
37
|
+
# @private get name from extended phone data by keys
|
|
28
38
|
#
|
|
29
39
|
# ==== Attributes
|
|
30
40
|
#
|
|
@@ -32,37 +42,37 @@ module Phonelib
|
|
|
32
42
|
# * +id_key+ - parameter id key in resolved extended data for number
|
|
33
43
|
#
|
|
34
44
|
def get_ext_name(names_key, id_key)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
return nil unless ext_data[id_key] > 0
|
|
46
|
+
|
|
47
|
+
res = Phonelib.phone_ext_data[names_key][ext_data[id_key]]
|
|
48
|
+
res.size == 1 ? res.first : res
|
|
39
49
|
end
|
|
40
50
|
|
|
41
|
-
# returns extended data ids for current number
|
|
51
|
+
# @private returns extended data ids for current number
|
|
42
52
|
def ext_data
|
|
43
53
|
return @ext_data if @ext_data
|
|
44
54
|
|
|
45
|
-
|
|
46
|
-
Phonelib::Core::EXT_GEO_NAME_KEY,
|
|
47
|
-
Phonelib::Core::EXT_TIMEZONE_KEY,
|
|
48
|
-
Phonelib::Core::EXT_CARRIER_KEY
|
|
49
|
-
]
|
|
50
|
-
result = {}
|
|
51
|
-
ext_keys.each { |key| result[key] = 0 }
|
|
52
|
-
|
|
55
|
+
result = default_ext_data
|
|
53
56
|
return result unless possible?
|
|
54
57
|
|
|
55
58
|
drill = Phonelib.phone_ext_data[Phonelib::Core::EXT_PREFIXES]
|
|
56
59
|
|
|
57
|
-
e164.
|
|
60
|
+
e164.delete('+').each_char do |num|
|
|
58
61
|
drill = drill[num.to_i] || break
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
EXT_KEYS.each do |key|
|
|
61
64
|
result[key] = drill[key] if drill[key]
|
|
62
65
|
end
|
|
63
66
|
end
|
|
64
67
|
|
|
65
68
|
@ext_data = result
|
|
66
69
|
end
|
|
70
|
+
|
|
71
|
+
# @private default extended data
|
|
72
|
+
def default_ext_data
|
|
73
|
+
result = {}
|
|
74
|
+
EXT_KEYS.each { |key| result[key] = 0 }
|
|
75
|
+
result
|
|
76
|
+
end
|
|
67
77
|
end
|
|
68
|
-
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
module Phonelib
|
|
2
|
+
# module includes all formatting methods
|
|
3
|
+
module PhoneFormatter
|
|
4
|
+
# Returns formatted national number
|
|
5
|
+
# @param formatted [Boolean] whether to return numbers only or formatted
|
|
6
|
+
# @return [String] formatted national number
|
|
7
|
+
def national(formatted = true)
|
|
8
|
+
return @national_number unless valid?
|
|
9
|
+
format_match, format_string = formatting_data
|
|
10
|
+
|
|
11
|
+
if format_match
|
|
12
|
+
out = format_string.gsub(/\$\d/) { |el| format_match[el[1].to_i] }
|
|
13
|
+
formatted ? out : out.gsub(/[^0-9]/, '')
|
|
14
|
+
else
|
|
15
|
+
@national_number
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Returns the country code from the original phone number.
|
|
20
|
+
# @return [String] matched country phone code
|
|
21
|
+
def country_code
|
|
22
|
+
Phonelib.phone_data[country] && \
|
|
23
|
+
Phonelib.phone_data[country][Core::COUNTRY_CODE]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns e164 formatted phone number
|
|
27
|
+
# @param formatted [Boolean] whether to return numbers only or formatted
|
|
28
|
+
# @return [String] formatted international number
|
|
29
|
+
def international(formatted = true)
|
|
30
|
+
return nil if sanitized.nil? || sanitized.empty?
|
|
31
|
+
return "+#{country_prefix_or_not}#{sanitized}" unless valid?
|
|
32
|
+
return "#{country_code}#{@national_number}" unless formatted
|
|
33
|
+
|
|
34
|
+
format = @data[country][:format]
|
|
35
|
+
if (matches = @national_number.match(/#{format[Core::PATTERN]}/))
|
|
36
|
+
fmt = format[:intl_format] || format[:format]
|
|
37
|
+
national = fmt.gsub(/\$\d/) { |el| matches[el[1].to_i] }
|
|
38
|
+
else
|
|
39
|
+
national = @national_number
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
"+#{country_code} #{national}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# returns national formatted number with extension added
|
|
46
|
+
# @return [String] formatted national number with extension
|
|
47
|
+
def full_national
|
|
48
|
+
"#{national}#{formatted_extension}"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# returns international formatted number with extension added
|
|
52
|
+
# @return [String] formatted internation phone number with extension
|
|
53
|
+
def full_international
|
|
54
|
+
"#{international}#{formatted_extension}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# returns e164 format of phone with extension added
|
|
58
|
+
# @return [String] phone formatted in E164 format with extension
|
|
59
|
+
def full_e164
|
|
60
|
+
"#{e164}#{formatted_extension}"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Returns e164 unformatted phone number
|
|
64
|
+
# @return [String] phone formatted in E164 format
|
|
65
|
+
def e164
|
|
66
|
+
international = self.international
|
|
67
|
+
international && international.gsub(/[^+0-9]/, '')
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# returns area code of parsed number
|
|
71
|
+
# @return [String|nil] parsed phone area code if available
|
|
72
|
+
def area_code
|
|
73
|
+
return nil unless area_code_possible?
|
|
74
|
+
|
|
75
|
+
format_match, _format_string = formatting_data
|
|
76
|
+
take_group = 1
|
|
77
|
+
if type == Core::MOBILE && Core::AREA_CODE_MOBILE_TOKENS[country] && \
|
|
78
|
+
format_match[1] == Core::AREA_CODE_MOBILE_TOKENS[country]
|
|
79
|
+
take_group = 2
|
|
80
|
+
end
|
|
81
|
+
format_match[take_group]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
# @private defines if phone can have area code
|
|
87
|
+
def area_code_possible?
|
|
88
|
+
return false unless possible?
|
|
89
|
+
|
|
90
|
+
# has national prefix
|
|
91
|
+
return false unless @data[country][Core::NATIONAL_PREFIX] || country == 'IT'
|
|
92
|
+
# fixed or mobile
|
|
93
|
+
return false unless Core::AREA_CODE_TYPES.include?(type)
|
|
94
|
+
# mobile && mexico, argentina, brazil
|
|
95
|
+
return false if type == Core::MOBILE && !Core::AREA_CODE_MOBILE_COUNTRIES.include?(country)
|
|
96
|
+
true
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @private defines whether to put country prefix or not
|
|
100
|
+
def country_prefix_or_not
|
|
101
|
+
return '' unless country_code
|
|
102
|
+
sanitized.start_with?(country_code) ? '' : country_code
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @private returns extension with separator defined
|
|
106
|
+
def formatted_extension
|
|
107
|
+
return '' if @extension.nil? || @extension.empty?
|
|
108
|
+
|
|
109
|
+
"#{Phonelib.extension_separator}#{@extension}"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# @private Get needable data for formatting phone as national number
|
|
113
|
+
def formatting_data
|
|
114
|
+
return @formatting_data if @formatting_data
|
|
115
|
+
|
|
116
|
+
format = @data[country][:format]
|
|
117
|
+
prefix = @data[country][Core::NATIONAL_PREFIX]
|
|
118
|
+
rule = (format[Core::NATIONAL_PREFIX_RULE] ||
|
|
119
|
+
@data[country][Core::NATIONAL_PREFIX_RULE] || '$1')
|
|
120
|
+
|
|
121
|
+
# change rule's constants to values
|
|
122
|
+
rule.gsub!(/(\$NP|\$FG)/, '$NP' => prefix, '$FG' => '$1')
|
|
123
|
+
|
|
124
|
+
# add space to format groups, change first group to rule,
|
|
125
|
+
format_string = format[:format].gsub(/(\d)\$/, '\\1 $').gsub('$1', rule)
|
|
126
|
+
|
|
127
|
+
@formatting_data =
|
|
128
|
+
[@national_number.match(/#{format[Core::PATTERN]}/), format_string]
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
data/lib/phonelib/version.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
namespace :phonelib do
|
|
2
|
-
|
|
3
2
|
desc 'Create database for tests in Rails dummy application'
|
|
4
3
|
task :create_test_db do
|
|
5
4
|
exit unless defined? Rails
|
|
@@ -13,5 +12,4 @@ namespace :phonelib do
|
|
|
13
12
|
require 'phonelib/data_importer'
|
|
14
13
|
Phonelib::DataImporter.import
|
|
15
14
|
end
|
|
16
|
-
|
|
17
15
|
end
|
|
@@ -36,7 +36,6 @@
|
|
|
36
36
|
# validates :mobile, phone: { possible: true, types: :mobile }
|
|
37
37
|
# end
|
|
38
38
|
#
|
|
39
|
-
|
|
40
39
|
class PhoneValidator < ActiveModel::EachValidator
|
|
41
40
|
# Include all core methods
|
|
42
41
|
include Phonelib::Core
|
|
@@ -46,26 +45,37 @@ class PhoneValidator < ActiveModel::EachValidator
|
|
|
46
45
|
return if options[:allow_blank] && value.blank?
|
|
47
46
|
|
|
48
47
|
phone = parse(value)
|
|
49
|
-
if
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
valid = (phone_types & types).size > 0
|
|
56
|
-
else
|
|
57
|
-
method = options[:possible] ? :possible? : :valid?
|
|
58
|
-
valid = phone.send(method)
|
|
59
|
-
end
|
|
48
|
+
valid = if simple_validation?
|
|
49
|
+
method = options[:possible] ? :possible? : :valid?
|
|
50
|
+
phone.send(method)
|
|
51
|
+
else
|
|
52
|
+
(phone_types(phone) & types).size > 0
|
|
53
|
+
end
|
|
60
54
|
|
|
61
55
|
record.errors.add(attribute, options[:message] || :invalid) unless valid
|
|
62
56
|
end
|
|
63
57
|
|
|
64
58
|
private
|
|
65
59
|
|
|
60
|
+
# @private
|
|
61
|
+
def simple_validation?
|
|
62
|
+
options[:types].nil?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# @private
|
|
66
|
+
# @param phone [Phonelib::Phone] parsed phone
|
|
67
|
+
def phone_types(phone)
|
|
68
|
+
method = options[:possible] ? :possible_types : :types
|
|
69
|
+
phone_types = phone.send(method)
|
|
70
|
+
if (phone_types & [Phonelib::Core::FIXED_OR_MOBILE]).size > 0
|
|
71
|
+
phone_types += [Phonelib::Core::FIXED_LINE, Phonelib::Core::MOBILE]
|
|
72
|
+
end
|
|
73
|
+
phone_types
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @private
|
|
66
77
|
def types
|
|
67
78
|
types = options[:types].is_a?(Array) ? options[:types] : [options[:types]]
|
|
68
|
-
types.map
|
|
79
|
+
types.map(&:to_sym)
|
|
69
80
|
end
|
|
70
|
-
|
|
71
81
|
end
|