diff --git a/README.md b/README.md index 59278b6..d5dd432 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,14 @@ PhonyRails.normalize_number('+4790909090', default_country_code: 'SE') # => '+47 The country_code should always be a ISO 3166-1 alpha-2 (http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). +#### Default for all models + +You can set the default_country_code for all models using: + +```ruby +PhonyRails.default_country_code = "US" +``` + ### Validation In your model use the Phony.plausible method to validate an attribute: diff --git a/Rakefile b/Rakefile index c478802..e90f4d8 100755 --- a/Rakefile +++ b/Rakefile @@ -4,3 +4,11 @@ require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) task default: :spec + +task :console do + require 'irb' + require 'irb/completion' + require 'phony_rails' + ARGV.clear + IRB.start +end diff --git a/lib/phony_rails.rb b/lib/phony_rails.rb index 81855bf..12d49fa 100644 --- a/lib/phony_rails.rb +++ b/lib/phony_rails.rb @@ -5,6 +5,23 @@ require 'yaml' module PhonyRails + def self.default_country_code + @default_country_code ||= nil + end + + 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 + + def self.default_country_number + @default_country_number ||= default_country_code.present? ? country_number_for(default_country_code) : nil + end + + def self.default_country_number=(new_number) + @default_country_number = new_number + end + def self.country_number_for(country_code) return if country_code.nil? @@ -37,7 +54,7 @@ def self.normalize_number(number, options = {}) if !Phony.plausible?(number) || _country_number != country_code_from_number(number) number = "#{_country_number}#{number}" end - elsif _default_country_number = options[:default_country_number] || country_number_for(options[:default_country_code]) + elsif _default_country_number = extract_default_country_number(options) options[:add_plus] = true if options[:add_plus].nil? # 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 @@ -60,6 +77,10 @@ def self.normalize_number(number, options = {}) original_number # If all goes wrong .. we still return the original input. end + def self.extract_default_country_number(options = {}) + options[:default_country_number] || country_number_for(options[:default_country_code]) || default_country_number + end + def self.country_code_from_number(number) return nil unless Phony.plausible?(number) Phony.split(Phony.normalize(number)).first @@ -71,7 +92,8 @@ def self.plausible_number?(number, options = {}) return false if number.nil? || number.blank? number = normalize_number(number, options) country_number = options[:country_number] || country_number_for(options[:country_code]) || - options[:default_country_number] || country_number_for(options[:default_country_code]) + options[:default_country_number] || country_number_for(options[:default_country_code]) || + default_country_number Phony.plausible? number, cc: country_number rescue false diff --git a/spec/lib/phony_rails_spec.rb b/spec/lib/phony_rails_spec.rb index d451500..cf1168f 100644 --- a/spec/lib/phony_rails_spec.rb +++ b/spec/lib/phony_rails_spec.rb @@ -320,6 +320,29 @@ class NormalHome < ActiveRecord::Base it 'should normalize even an implausible number' do expect(PhonyRails.normalize_number('01')).to eql('1') end + + context 'with default_country_code set' do + before { PhonyRails.default_country_code = 'NL' } + after { PhonyRails.default_country_code = nil } + + it 'normalize using the default' do + expect(PhonyRails.normalize_number('010-1234123')).to eql('+31101234123') + expect(PhonyRails.normalize_number('010-1234123')).to eql('+31101234123') + expect(PhonyRails.normalize_number('070-4157134')).to eql('+31704157134') + expect(PhonyRails.normalize_number('0031-70-4157134')).to eql('+31704157134') + expect(PhonyRails.normalize_number('+31-70-4157134')).to eql('+31704157134') + end + + it 'allows default_country_code to be overridden' do + expect(PhonyRails.normalize_number('0322-69497', country_code: 'BE')).to eql('+3232269497') + expect(PhonyRails.normalize_number('+32 3 226 94 97', country_code: 'BE')).to eql('+3232269497') + expect(PhonyRails.normalize_number('0450 764 000', country_code: 'AU')).to eql('+61450764000') + + expect(PhonyRails.normalize_number('0322-69497', default_country_code: 'BE')).to eql('+3232269497') + expect(PhonyRails.normalize_number('+32 3 226 94 97', default_country_code: 'BE')).to eql('+3232269497') + expect(PhonyRails.normalize_number('0450 764 000', default_country_code: 'AU')).to eql('+61450764000') + end + end end describe 'PhonyRails.plausible_number?' do @@ -367,6 +390,39 @@ class NormalHome < ActiveRecord::Base expect(Phony).to receive(:plausible?).twice.and_raise('unexpected error') is_expected.not_to be_plausible_number normalizable_number, country_code: 'US' end + + context 'with default_country_code set' do + before { PhonyRails.default_country_code = 'FR' } + after { PhonyRails.default_country_code = nil } + + it 'uses the default' do + is_expected.not_to be_plausible_number normalizable_number + is_expected.to be_plausible_number formatted_french_number_with_country_code + end + + it 'allows default_country_code to be overridden' do + is_expected.not_to be_plausible_number empty_number, country_code: 'US' + is_expected.not_to be_plausible_number nil_number, country_code: 'US' + end + end + end + + describe 'PhonyRails.default_country' do + before { PhonyRails.default_country_code = 'US' } + after { PhonyRails.default_country_code = nil } + + it 'can set a global default country code' do + expect(PhonyRails.default_country_code). to eq 'US' + end + + it 'can set a global default country code' do + PhonyRails.default_country_number = '1' + expect(PhonyRails.default_country_number).to eq '1' + end + + it 'default country code affects default country number' do + expect(PhonyRails.default_country_number).to eq '1' + end end shared_examples_for 'model with PhonyRails' do