Skip to content

Commit

Permalink
Merge pull request #137 from jerryclinesmith/default-country-code
Browse files Browse the repository at this point in the history
Add support for a default country code
  • Loading branch information
Joost Hietbrink committed Apr 19, 2016
2 parents cfb90f5 + 384bab0 commit 337f886
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 2 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
8 changes: 8 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
26 changes: 24 additions & 2 deletions lib/phony_rails.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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?

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
56 changes: 56 additions & 0 deletions spec/lib/phony_rails_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 337f886

Please sign in to comment.