Module: PhonyRails
- Defined in:
- lib/phony_rails.rb,
lib/phony_rails/version.rb
Defined Under Namespace
Modules: Extension
Constant Summary collapse
- COMMON_EXTENSIONS =
/[ ]*(ext|ex|x|xt|#|:)+[^0-9]*\(*([-0-9]{1,})\)*#?$/i
- VERSION =
'0.14.4'.freeze
Class Method Summary collapse
- .country_code_from_number(number) ⇒ Object
- .country_codes_hash ⇒ Object
- .country_number_for(country_code) ⇒ Object
- .default_country_code ⇒ Object
- .default_country_code=(new_code) ⇒ Object
- .default_country_number ⇒ Object
- .default_country_number=(new_number) ⇒ Object
- .extract_default_country_number(options = {}) ⇒ Object
- .extract_extension(number_and_ext) ⇒ Object
- .format_extension(number, ext) ⇒ Object
-
.normalize_number(number, options = {}) ⇒ Object
This method requires a country_code attribute (eg. NL) and phone_number to be set.
- .normalize_number_default_country(number, default_country_number) ⇒ Object
-
.plausible_number?(number, options = {}) ⇒ Boolean
Wrapper for Phony.plausible?.
Class Method Details
.country_code_from_number(number) ⇒ Object
90 91 92 93 |
# File 'lib/phony_rails.rb', line 90 def self.country_code_from_number(number) return nil unless Phony.plausible?(number) Phony.split(Phony.normalize(number)).first end |
.country_codes_hash ⇒ Object
32 33 34 |
# File 'lib/phony_rails.rb', line 32 def self.country_codes_hash @country_codes_hash ||= YAML.load_file(File.join(File.dirname(File.(__FILE__)), 'data/country_codes.yaml')) end |
.country_number_for(country_code) ⇒ Object
26 27 28 29 30 |
# File 'lib/phony_rails.rb', line 26 def self.country_number_for(country_code) return if country_code.nil? country_codes_hash.fetch(country_code.to_s.upcase, {})['country_code'] end |
.default_country_code ⇒ Object
9 10 11 |
# File 'lib/phony_rails.rb', line 9 def self.default_country_code @default_country_code ||= nil end |
.default_country_code=(new_code) ⇒ Object
13 14 15 16 |
# File 'lib/phony_rails.rb', line 13 def self.default_country_code=(new_code) @default_country_code = new_code @default_country_number = nil # Reset default country number, will lookup next time its asked for end |
.default_country_number ⇒ Object
18 19 20 |
# File 'lib/phony_rails.rb', line 18 def self.default_country_number @default_country_number ||= default_country_code.present? ? country_number_for(default_country_code) : nil end |
.default_country_number=(new_number) ⇒ Object
22 23 24 |
# File 'lib/phony_rails.rb', line 22 def self.default_country_number=(new_number) @default_country_number = new_number end |
.extract_default_country_number(options = {}) ⇒ Object
86 87 88 |
# File 'lib/phony_rails.rb', line 86 def self.extract_default_country_number( = {}) [:default_country_number] || country_number_for([:default_country_code]) || default_country_number end |
.extract_extension(number_and_ext) ⇒ Object
111 112 113 114 115 116 117 118 119 120 |
# File 'lib/phony_rails.rb', line 111 def self.extract_extension(number_and_ext) return [nil, nil] if number_and_ext.nil? # :nocov: if subbed = number_and_ext.sub(COMMON_EXTENSIONS, '') [subbed, Regexp.last_match(2)] else [number_and_ext, nil] end # :nocov: end |
.format_extension(number, ext) ⇒ Object
122 123 124 |
# File 'lib/phony_rails.rb', line 122 def self.format_extension(number, ext) ext.present? ? "#{number} x#{ext}" : number end |
.normalize_number(number, options = {}) ⇒ Object
This method requires a country_code attribute (eg. NL) and phone_number to be set. Options:
:country_number => The country dial code (eg. 31 for NL).
:default_country_number => Fallback country code.
:country_code => The country code we should use.
:default_country_code => Some fallback code (eg. 'NL') that can be used as default (comes from phony_normalize_numbers method).
:add_plus => Add a '+' in front so we know the country code is added. (default: true)
This idea came from:
http://www.redguava.com.au/2011/06/rails-convert-phone-numbers-to-international-format-for-sms/
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/phony_rails.rb', line 45 def self.normalize_number(number, = {}) return if number.nil? original_number = number number = number.dup # Just to be sure, we don't want to change the original. number, ext = extract_extension(number) number.gsub!(/[^\(\)\d\+]/, '') # Strips weird stuff from the number return if number.blank? if _country_number = [:country_number] || country_number_for([:country_code]) [:add_plus] = true if [:add_plus].nil? # (Force) add country_number if missing # NOTE: do we need to force adding country code? Otherwise we can share logic with next block if !Phony.plausible?(number) || _country_number != country_code_from_number(number) number = "#{_country_number}#{number}" end elsif _default_country_number = extract_default_country_number() [:add_plus] = true if [:add_plus].nil? number = normalize_number_default_country(number, _default_country_number) end normalized_number = Phony.normalize(number) [:add_plus] = true if [:add_plus].nil? && Phony.plausible?(normalized_number) normalized_number = [:add_plus] ? "+#{normalized_number}" : normalized_number format_extension(normalized_number, ext) rescue original_number # If all goes wrong .. we still return the original input. end |
.normalize_number_default_country(number, default_country_number) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/phony_rails.rb', line 71 def self.normalize_number_default_country(number, default_country_number) # We try to add the default country number and see if it is a # correct phone number. See https://github.com/joost/phony_rails/issues/87#issuecomment-89324426 unless number =~ /\A\+/ # if we don't have a + return "#{default_country_number}#{number}" if Phony.plausible?("#{default_country_number}#{number}") || !Phony.plausible?(number) || country_code_from_number(number).nil? # If the number starts with ONE zero (two might indicate a country code) # and this is a plausible number for the default_country # we prefer that one. return "#{default_country_number}#{number.gsub(/^0/, '')}" if (number =~ /^0[^0]/) && Phony.plausible?("#{default_country_number}#{number.gsub(/^0/, '')}") end # number = "#{default_country_number}#{number}" unless Phony.plausible?(number) # Just return the number unchanged number end |
.plausible_number?(number, options = {}) ⇒ Boolean
Wrapper for Phony.plausible?. Takes the same options as #normalize_number. NB: This method calls #normalize_number and passes options directly to that method.
97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/phony_rails.rb', line 97 def self.plausible_number?(number, = {}) return false if number.blank? number = extract_extension(number).first number = normalize_number(number, ) country_number = [:country_number] || country_number_for([:country_code]) || [:default_country_number] || country_number_for([:default_country_code]) || default_country_number Phony.plausible? number, cc: country_number rescue false end |