From e695c83cb362d9a5382f8162bb3cbfc64e26edf0 Mon Sep 17 00:00:00 2001 From: Jerry Clinesmith Date: Sat, 2 Apr 2016 11:23:19 -0500 Subject: [PATCH 1/4] Add support for rake console --- Rakefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Rakefile b/Rakefile index c478802..0283904 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 \ No newline at end of file From 6465ad6ed3d09f2ca41623b658e8f20b42c4db78 Mon Sep 17 00:00:00 2001 From: Jerry Clinesmith Date: Sat, 2 Apr 2016 11:25:14 -0500 Subject: [PATCH 2/4] Add support for PhonyRails.default_country_code that would be used by normalize_number and plausible_number? --- lib/phony_rails.rb | 23 +++++++++++++++++-- spec/lib/phony_rails_spec.rb | 43 ++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/lib/phony_rails.rb b/lib/phony_rails.rb index 81855bf..84dc94a 100644 --- a/lib/phony_rails.rb +++ b/lib/phony_rails.rb @@ -5,6 +5,24 @@ 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 +55,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 = options[:default_country_number] || country_number_for(options[:default_country_code]) || default_country_number 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 @@ -71,7 +89,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..ab412e3 100644 --- a/spec/lib/phony_rails_spec.rb +++ b/spec/lib/phony_rails_spec.rb @@ -320,6 +320,31 @@ 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 +392,24 @@ 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 shared_examples_for 'model with PhonyRails' do From ce7576c0b79ab392505f3133599ca04f9bca2fc4 Mon Sep 17 00:00:00 2001 From: Jerry Clinesmith Date: Sat, 2 Apr 2016 14:48:53 -0500 Subject: [PATCH 3/4] Additional tests, corrected formatting for rubocop --- Rakefile | 2 +- lib/phony_rails.rb | 7 +++++-- spec/lib/phony_rails_spec.rb | 19 ++++++++++++++++--- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Rakefile b/Rakefile index 0283904..e90f4d8 100755 --- a/Rakefile +++ b/Rakefile @@ -11,4 +11,4 @@ task :console do require 'phony_rails' ARGV.clear IRB.start -end \ No newline at end of file +end diff --git a/lib/phony_rails.rb b/lib/phony_rails.rb index 84dc94a..12d49fa 100644 --- a/lib/phony_rails.rb +++ b/lib/phony_rails.rb @@ -5,7 +5,6 @@ require 'yaml' module PhonyRails - def self.default_country_code @default_country_code ||= nil end @@ -55,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]) || default_country_number + 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 @@ -78,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 diff --git a/spec/lib/phony_rails_spec.rb b/spec/lib/phony_rails_spec.rb index ab412e3..cf1168f 100644 --- a/spec/lib/phony_rails_spec.rb +++ b/spec/lib/phony_rails_spec.rb @@ -322,7 +322,6 @@ class NormalHome < ActiveRecord::Base end context 'with default_country_code set' do - before { PhonyRails.default_country_code = 'NL' } after { PhonyRails.default_country_code = nil } @@ -343,7 +342,6 @@ class NormalHome < ActiveRecord::Base 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 @@ -394,7 +392,6 @@ class NormalHome < ActiveRecord::Base end context 'with default_country_code set' do - before { PhonyRails.default_country_code = 'FR' } after { PhonyRails.default_country_code = nil } @@ -407,9 +404,25 @@ class NormalHome < ActiveRecord::Base 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 From 384bab0b4303b44e7d7533054ecd68211a5ce290 Mon Sep 17 00:00:00 2001 From: Jerry Clinesmith Date: Tue, 19 Apr 2016 14:47:09 -0500 Subject: [PATCH 4/4] Document default in README --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) 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: