phony_rails 0.14.7 → 0.15.0
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 +5 -5
- data/.gitignore +1 -0
- data/.rubocop.yml +2 -1
- data/.rubocop_todo.yml +16 -0
- data/.travis.yml +4 -2
- data/CHANGELOG.md +83 -0
- data/Gemfile +1 -3
- data/README.md +28 -19
- data/lib/data/country_codes.yaml +2 -0
- data/lib/phony_rails/locales/es.yml +4 -0
- data/lib/phony_rails/locales/ko.yml +4 -0
- data/lib/phony_rails/string_extensions.rb +5 -0
- data/lib/phony_rails/version.rb +1 -1
- data/lib/phony_rails.rb +60 -26
- data/lib/validators/phony_validator.rb +3 -0
- data/phony_rails.gemspec +7 -5
- data/spec/lib/phony_rails_spec.rb +87 -11
- data/spec/lib/validators/phony_validator_spec.rb +111 -24
- data/spec/spec_helper.rb +19 -15
- metadata +16 -15
- data/Gemfile.lock +0 -143
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9f5029f29270fa190a8d6bb493268065d2abed1652c3bb63622340309018cced
|
4
|
+
data.tar.gz: f6f307074a3348693e6ef4bce515b81b3890ff396a35dd4ed343bcefa3476a8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9153aa4dfd473744cd30b227d1429b0766fd27a0b58c8003aba6677e851390adc0f1b8c237d8b77e0f386c5e3c5f05958aff5a1f1f842a495b68caba5511ffe5
|
7
|
+
data.tar.gz: 8cc31c41aceec40c3d0ea203a1e8cec344bc9e0e5fbc407bd78456e9a4fe16b020c5b8b4895eedc3a9e19247dd8f55e41e8349283512871a0282289ea825216a
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -13,6 +13,13 @@ Lint/AssignmentInCondition:
|
|
13
13
|
- 'lib/phony_rails.rb'
|
14
14
|
|
15
15
|
# Offense count: 2
|
16
|
+
# Cop supports --auto-correct.
|
17
|
+
Lint/SendWithMixinArgument:
|
18
|
+
Exclude:
|
19
|
+
- 'lib/phony_rails.rb'
|
20
|
+
|
21
|
+
# Offense count: 2
|
22
|
+
# Configuration parameters: AllowKeywordBlockArguments.
|
16
23
|
Lint/UnderscorePrefixedVariableName:
|
17
24
|
Exclude:
|
18
25
|
- 'lib/phony_rails.rb'
|
@@ -46,6 +53,12 @@ Performance/StartWith:
|
|
46
53
|
Exclude:
|
47
54
|
- 'lib/phony_rails.rb'
|
48
55
|
|
56
|
+
# Offense count: 1
|
57
|
+
# Cop supports --auto-correct.
|
58
|
+
Performance/RegexpMatch:
|
59
|
+
Exclude:
|
60
|
+
- 'lib/phony_rails.rb'
|
61
|
+
|
49
62
|
# Offense count: 1
|
50
63
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
51
64
|
# SupportedStyles: nested, compact
|
@@ -61,3 +74,6 @@ Style/Documentation:
|
|
61
74
|
- 'lib/phony_rails.rb'
|
62
75
|
- 'lib/phony_rails/string_extensions.rb'
|
63
76
|
- 'lib/validators/phony_validator.rb'
|
77
|
+
|
78
|
+
Style/RescueModifier:
|
79
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,88 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.14.13](https://github.com/joost/phony_rails/tree/v0.14.13) (2019-07-03)
|
4
|
+
[Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.12...v0.14.13)
|
5
|
+
|
6
|
+
**Closed issues:**
|
7
|
+
|
8
|
+
- 0.4.11 was the latest release. However the new normalize\_when\_valid has been sitting here for a while... Release? [\#194](https://github.com/joost/phony_rails/issues/194)
|
9
|
+
|
10
|
+
**Merged pull requests:**
|
11
|
+
|
12
|
+
- Fixing \#195 - Original value should be cached in correct instance var [\#196](https://github.com/joost/phony_rails/pull/196) ([dlikhten](https://github.com/dlikhten))
|
13
|
+
|
14
|
+
## [v0.14.12](https://github.com/joost/phony_rails/tree/v0.14.12) (2019-06-21)
|
15
|
+
[Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.11...v0.14.12)
|
16
|
+
|
17
|
+
**Closed issues:**
|
18
|
+
|
19
|
+
- Some German numbers not passing plausible\_numbers? without country\_code [\#193](https://github.com/joost/phony_rails/issues/193)
|
20
|
+
|
21
|
+
**Merged pull requests:**
|
22
|
+
|
23
|
+
- Upgrade Ruby versions and Relax dependancies [\#192](https://github.com/joost/phony_rails/pull/192) ([berkos](https://github.com/berkos))
|
24
|
+
- Add possibility to return original phone number when is not valid [\#190](https://github.com/joost/phony_rails/pull/190) ([synion](https://github.com/synion))
|
25
|
+
- Add UK country\_code. [\#189](https://github.com/joost/phony_rails/pull/189) ([ayghor](https://github.com/ayghor))
|
26
|
+
|
27
|
+
## [v0.14.11](https://github.com/joost/phony_rails/tree/v0.14.11) (2018-10-11)
|
28
|
+
[Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.10...v0.14.11)
|
29
|
+
|
30
|
+
**Closed issues:**
|
31
|
+
|
32
|
+
- Problem with normalizing Estonian number [\#187](https://github.com/joost/phony_rails/issues/187)
|
33
|
+
|
34
|
+
**Merged pull requests:**
|
35
|
+
|
36
|
+
- Add Korean translation\(including spec\) [\#186](https://github.com/joost/phony_rails/pull/186) ([freelyageha](https://github.com/freelyageha))
|
37
|
+
|
38
|
+
## [v0.14.10](https://github.com/joost/phony_rails/tree/v0.14.10) (2018-10-11)
|
39
|
+
[Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.9...v0.14.10)
|
40
|
+
|
41
|
+
**Closed issues:**
|
42
|
+
|
43
|
+
- PhonyRails.default\_country\_code too intrusive in plausible\_number? method [\#179](https://github.com/joost/phony_rails/issues/179)
|
44
|
+
- default\_country\_code overrides 00-prefix country code [\#175](https://github.com/joost/phony_rails/issues/175)
|
45
|
+
- Valid 260 area code number is reported as invalid [\#168](https://github.com/joost/phony_rails/issues/168)
|
46
|
+
- Croatian number not validating as plausible. [\#165](https://github.com/joost/phony_rails/issues/165)
|
47
|
+
- phony\_formatted not returning original String for non-digit only strings [\#163](https://github.com/joost/phony_rails/issues/163)
|
48
|
+
- should all normalized numbers be valid? [\#162](https://github.com/joost/phony_rails/issues/162)
|
49
|
+
- Extensions not working out of the box for validator [\#160](https://github.com/joost/phony_rails/issues/160)
|
50
|
+
|
51
|
+
**Merged pull requests:**
|
52
|
+
|
53
|
+
- Remove errant `puts` [\#188](https://github.com/joost/phony_rails/pull/188) ([stevenharman](https://github.com/stevenharman))
|
54
|
+
- Close issues [\#185](https://github.com/joost/phony_rails/pull/185) ([joost](https://github.com/joost))
|
55
|
+
- Better PhonyRails.plausible\_number? method. Closes \#179. [\#184](https://github.com/joost/phony_rails/pull/184) ([joost](https://github.com/joost))
|
56
|
+
- Allow numbers starting with 00 country codes. Closes \#175. [\#183](https://github.com/joost/phony_rails/pull/183) ([joost](https://github.com/joost))
|
57
|
+
|
58
|
+
## [v0.14.9](https://github.com/joost/phony_rails/tree/v0.14.9) (2018-09-05)
|
59
|
+
[Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.7...v0.14.9)
|
60
|
+
|
61
|
+
**Closed issues:**
|
62
|
+
|
63
|
+
- Cut new release 0.14.7 to include new extension removal logic [\#177](https://github.com/joost/phony_rails/issues/177)
|
64
|
+
- default\_country\_code based on relation [\#174](https://github.com/joost/phony_rails/issues/174)
|
65
|
+
|
66
|
+
**Merged pull requests:**
|
67
|
+
|
68
|
+
- Allow brackets. Closes \#170. [\#182](https://github.com/joost/phony_rails/pull/182) ([joost](https://github.com/joost))
|
69
|
+
- add lambda support for default country code [\#181](https://github.com/joost/phony_rails/pull/181) ([kimyu92](https://github.com/kimyu92))
|
70
|
+
- Add Spanish translation for validation error [\#178](https://github.com/joost/phony_rails/pull/178) ([r-sierra](https://github.com/r-sierra))
|
71
|
+
|
72
|
+
## [v0.14.7](https://github.com/joost/phony_rails/tree/v0.14.7) (2018-05-25)
|
73
|
+
[Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.6...v0.14.7)
|
74
|
+
|
75
|
+
**Closed issues:**
|
76
|
+
|
77
|
+
- Country code wrapped in brackets is not recognized [\#170](https://github.com/joost/phony_rails/issues/170)
|
78
|
+
- Invalid number in countryCode VN [\#159](https://github.com/joost/phony_rails/issues/159)
|
79
|
+
|
80
|
+
**Merged pull requests:**
|
81
|
+
|
82
|
+
- Extension option added to normalize\_number [\#176](https://github.com/joost/phony_rails/pull/176) ([ramaboo](https://github.com/ramaboo))
|
83
|
+
- return country from phone number [\#169](https://github.com/joost/phony_rails/pull/169) ([aovertus](https://github.com/aovertus))
|
84
|
+
- Fix code example in README to match description [\#167](https://github.com/joost/phony_rails/pull/167) ([mattruzicka](https://github.com/mattruzicka))
|
85
|
+
|
3
86
|
## [v0.14.6](https://github.com/joost/phony_rails/tree/v0.14.6) (2017-06-20)
|
4
87
|
[Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.5...v0.14.6)
|
5
88
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# PhonyRails [](https://travis-ci.org/joost/phony_rails) [](https://coveralls.io/r/joost/phony_rails) ](https://travis-ci.org/joost/phony_rails) [](https://coveralls.io/r/joost/phony_rails) 
|
2
2
|
|
3
3
|
This small Gem adds useful methods to your Rails app to validate, display and save phone numbers.
|
4
4
|
It uses the super awesome Phony gem (https://github.com/floere/phony).
|
@@ -7,10 +7,10 @@ Find version information in the [CHANGELOG](CHANGELOG.md).
|
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
10
|
-
Add this line to your application's Gemfile:
|
10
|
+
Add this line to your application's Gemfile (requires Ruby > 2.3):
|
11
11
|
|
12
12
|
```ruby
|
13
|
-
gem 'phony_rails'
|
13
|
+
gem 'phony_rails'
|
14
14
|
```
|
15
15
|
|
16
16
|
And then execute:
|
@@ -66,18 +66,10 @@ class SomeModel
|
|
66
66
|
end
|
67
67
|
```
|
68
68
|
|
69
|
-
#### Mongoid
|
69
|
+
#### Mongoid (DEPRECATED)
|
70
70
|
|
71
|
-
|
71
|
+
WARNING: From v0.15.0 Mongoid support has been removed!
|
72
72
|
|
73
|
-
```ruby
|
74
|
-
class SomeModel
|
75
|
-
include Mongoid::Document
|
76
|
-
include Mongoid::Phony
|
77
|
-
|
78
|
-
# methods are same as ActiveRecord usage
|
79
|
-
end
|
80
|
-
```
|
81
73
|
#### General info
|
82
74
|
|
83
75
|
The `:default_country_code` options is used to specify a country_code when normalizing.
|
@@ -114,6 +106,7 @@ In your model use the Phony.plausible method to validate an attribute:
|
|
114
106
|
```ruby
|
115
107
|
validates :phone_number, phony_plausible: true
|
116
108
|
```
|
109
|
+
|
117
110
|
or the helper method:
|
118
111
|
|
119
112
|
```ruby
|
@@ -121,8 +114,9 @@ validates_plausible_phone :phone_number
|
|
121
114
|
```
|
122
115
|
|
123
116
|
this method use other validators under the hood to provide:
|
124
|
-
|
125
|
-
|
117
|
+
|
118
|
+
- presence validation using `ActiveModel::Validations::PresenceValidator`
|
119
|
+
- format validation using `ActiveModel::Validations::FormatValidator`
|
126
120
|
|
127
121
|
so we can use:
|
128
122
|
|
@@ -133,7 +127,7 @@ validates_plausible_phone :phone_number, without: /\A\+\d+/
|
|
133
127
|
validates_plausible_phone :phone_number, presence: true, with: /\A\+\d+/
|
134
128
|
```
|
135
129
|
|
136
|
-
the i18n key is `:improbable_phone`. Languages supported by default: de, en, fr, it, ja, kh, nl, tr, ua and ru.
|
130
|
+
the i18n key is `:improbable_phone`. Languages supported by default: de, en, es, fr, it, ja, kh, ko, nl, tr, ua and ru.
|
137
131
|
|
138
132
|
You can also validate if a number has the correct country number:
|
139
133
|
|
@@ -156,13 +150,29 @@ validates_plausible_phone :phone_number_normalized, presence: true, if: :phone_n
|
|
156
150
|
|
157
151
|
Validation supports phone numbers with extension, such as `+18181231234 x1234` or `'+1 (818)151-5483 #4312'` out-of-the-box.
|
158
152
|
|
153
|
+
Return original value after validation:
|
154
|
+
|
155
|
+
The flag normalize_when_valid (disabled by default), allows to return the original phone_number when is the object is not valid. When phone validation fails, normalization is not triggered at all. It could prevent a situation where user fills in the phone number and after validation, he gets back different, already normalized phone number value, even if phone number was wrong.
|
156
|
+
|
157
|
+
Example usage:
|
158
|
+
|
159
|
+
```ruby
|
160
|
+
validates_plausible_phone :phone_number
|
161
|
+
phony_normalize :phone_number, country_code: :country_code, normalize_when_valid: true
|
162
|
+
```
|
163
|
+
|
164
|
+
Filling in the number will result with following:
|
165
|
+
|
166
|
+
When the number is incorrect (e.g. phone_number: `+44 888 888 888` for country_code 'PL'), the original validation behavior is preserved, but if the number is still invalid, the original value is returned.
|
167
|
+
When number is valid, it will save the normalized number (e.g. `+48 888 888 888` will be saved as `+48888888888`).
|
168
|
+
|
159
169
|
#### Allowing records country codes to not match phone number country codes
|
160
170
|
|
161
|
-
You may have a record specifying one country (via a `country_code` attribute) but using a phone number from another country.
|
171
|
+
You may have a record specifying one country (via a `country_code` attribute) but using a phone number from another country. For example, your record may be from Japan but have a phone number from the Philippines. By default, `phony_rails` will consider your record's `country_code` as part of the validation. If that country doesn't match the country code in the phone number, validation will fail.
|
162
172
|
|
163
173
|
Additionally, `phony_normalize` will always add the records country code as the country number (eg. the user enters '+81xxx' for Japan and the records `country_code` is 'DE' then `phony_normalize` will change the number to '+4981'). You can turn this off by adding `enforce_record_country: false` to the validation options. The country_code will then only be added if no country code is specified.
|
164
174
|
|
165
|
-
If you want to allow records from one country to have phone numbers from a different one, there are a couple of options you can use: `ignore_record_country_number` and `ignore_record_country_code`.
|
175
|
+
If you want to allow records from one country to have phone numbers from a different one, there are a couple of options you can use: `ignore_record_country_number` and `ignore_record_country_code`. Use them like so:
|
166
176
|
|
167
177
|
```ruby
|
168
178
|
validates :phone_number, phony_plausible: { ignore_record_country_code: true, ignore_record_country_number: true }
|
@@ -216,7 +226,6 @@ Extensions are supported (identified by "ext", "ex", "x", "xt", "#", or ":") and
|
|
216
226
|
"+31 (0)30 1234 123 #999".phony_normalized # => '31301234123 x999'
|
217
227
|
```
|
218
228
|
|
219
|
-
|
220
229
|
### Find by normalized number
|
221
230
|
|
222
231
|
Say you want to find a record by a phone number. Best is to normalize user input and compare to an attribute stored in the db.
|
data/lib/data/country_codes.yaml
CHANGED
@@ -7,6 +7,7 @@ class String
|
|
7
7
|
# "(0)30 1234 123".phony_normalized(country_code: 'NL') # => '301234123'
|
8
8
|
def phony_normalized(options = {})
|
9
9
|
raise ArgumentError, "Expected options to be a Hash, got #{options.inspect}" unless options.is_a?(Hash)
|
10
|
+
|
10
11
|
options = options.dup
|
11
12
|
PhonyRails.normalize_number(self, options)
|
12
13
|
end
|
@@ -24,21 +25,25 @@ class String
|
|
24
25
|
# "somestring".phone_formatted(raise: true)
|
25
26
|
def phony_formatted(options = {})
|
26
27
|
raise ArgumentError, "Expected options to be a Hash, got #{options.inspect}" unless options.is_a?(Hash)
|
28
|
+
|
27
29
|
options = options.dup
|
28
30
|
normalize_country_code = options.delete(:normalize)
|
29
31
|
s, ext = PhonyRails.extract_extension(self)
|
30
32
|
s = (normalize_country_code ? PhonyRails.normalize_number(s, default_country_code: normalize_country_code.to_s, add_plus: false) : s.gsub(/\D/, ''))
|
31
33
|
return if s.blank?
|
32
34
|
return if options[:strict] && !Phony.plausible?(s)
|
35
|
+
|
33
36
|
PhonyRails.format_extension(Phony.format(s, options.reverse_merge(format: :national)), ext)
|
34
37
|
rescue StandardError
|
35
38
|
raise if options[:raise]
|
39
|
+
|
36
40
|
s
|
37
41
|
end
|
38
42
|
|
39
43
|
# The bang method
|
40
44
|
def phony_formatted!(options = {})
|
41
45
|
raise ArgumentError, 'The :strict options is only supported in the phony_formatted (non bang) method.' if options[:strict]
|
46
|
+
|
42
47
|
replace(phony_formatted(options))
|
43
48
|
end
|
44
49
|
end
|
data/lib/phony_rails/version.rb
CHANGED
data/lib/phony_rails.rb
CHANGED
@@ -44,21 +44,21 @@ module PhonyRails
|
|
44
44
|
# :extension => Include the extension. (default: true)
|
45
45
|
# This idea came from:
|
46
46
|
# http://www.redguava.com.au/2011/06/rails-convert-phone-numbers-to-international-format-for-sms/
|
47
|
-
def self.normalize_number(number, options = {})
|
47
|
+
def self.normalize_number(number, options = {}, current_instance = nil)
|
48
48
|
return if number.nil?
|
49
|
+
|
49
50
|
original_number = number
|
50
51
|
number = number.dup # Just to be sure, we don't want to change the original.
|
51
52
|
number, ext = extract_extension(number)
|
52
|
-
number.gsub!(/[
|
53
|
+
number.gsub!(/[^()\d+]/, '') # Strips weird stuff from the number
|
53
54
|
return if number.blank?
|
55
|
+
|
54
56
|
if _country_number = options[:country_number] || country_number_for(options[:country_code])
|
55
57
|
options[:add_plus] = true if options[:add_plus].nil?
|
56
58
|
# (Force) add country_number if missing
|
57
59
|
# NOTE: do we need to force adding country code? Otherwise we can share logic with next block
|
58
|
-
if !Phony.plausible?(number) || _country_number != country_code_from_number(number)
|
59
|
-
|
60
|
-
end
|
61
|
-
elsif _default_country_number = extract_default_country_number(options)
|
60
|
+
number = "#{_country_number}#{number}" if !Phony.plausible?(number) || _country_number != country_code_from_number(number)
|
61
|
+
elsif _default_country_number = extract_default_country_number(options, current_instance)
|
62
62
|
options[:add_plus] = true if options[:add_plus].nil?
|
63
63
|
number = normalize_number_default_country(number, _default_country_number)
|
64
64
|
end
|
@@ -67,8 +67,7 @@ module PhonyRails
|
|
67
67
|
normalized_number = options[:add_plus] ? "+#{normalized_number}" : normalized_number
|
68
68
|
|
69
69
|
options[:extension] = true if options[:extension].nil?
|
70
|
-
|
71
|
-
normalized_number
|
70
|
+
options[:extension] ? format_extension(normalized_number, ext) : normalized_number
|
72
71
|
rescue StandardError
|
73
72
|
original_number # If all goes wrong .. we still return the original input.
|
74
73
|
end
|
@@ -76,7 +75,7 @@ module PhonyRails
|
|
76
75
|
def self.normalize_number_default_country(number, default_country_number)
|
77
76
|
# We try to add the default country number and see if it is a
|
78
77
|
# correct phone number. See https://github.com/joost/phony_rails/issues/87#issuecomment-89324426
|
79
|
-
unless number =~ /\A
|
78
|
+
unless number =~ /\A\(?(\+|00)/ # if we don't have a + or 00
|
80
79
|
return "#{default_country_number}#{number}" if Phony.plausible?("#{default_country_number}#{number}") || !Phony.plausible?(number) || country_code_from_number(number).nil?
|
81
80
|
# If the number starts with ONE zero (two might indicate a country code)
|
82
81
|
# and this is a plausible number for the default_country
|
@@ -88,27 +87,40 @@ module PhonyRails
|
|
88
87
|
number
|
89
88
|
end
|
90
89
|
|
91
|
-
def self.extract_default_country_number(options = {})
|
92
|
-
|
90
|
+
def self.extract_default_country_number(options = {}, current_instance = nil)
|
91
|
+
country_code = if current_instance.present? && options[:default_country_code].respond_to?(:call)
|
92
|
+
options[:default_country_code].call(current_instance) rescue nil
|
93
|
+
else
|
94
|
+
options[:default_country_code]
|
95
|
+
end
|
96
|
+
options[:default_country_number] || country_number_for(country_code) || default_country_number
|
93
97
|
end
|
94
98
|
|
99
|
+
# Returns the country dail code (eg. '31') for a number (eg. +31612341234).
|
100
|
+
# Should probably be named 'country_number_from_number'.
|
95
101
|
def self.country_code_from_number(number)
|
96
102
|
return nil unless Phony.plausible?(number)
|
103
|
+
|
97
104
|
Phony.split(Phony.normalize(number)).first
|
98
105
|
end
|
99
106
|
|
107
|
+
# Returns the country (eg. 'NL') for a number (eg. +31612341234).
|
100
108
|
def self.country_from_number(number)
|
101
109
|
return nil unless Phony.plausible?(number)
|
110
|
+
|
102
111
|
country_codes_hash.select { |_country, hash| hash['country_code'] == country_code_from_number(number) }.keys[0]
|
103
112
|
end
|
104
113
|
|
105
114
|
# Wrapper for Phony.plausible?. Takes the same options as #normalize_number.
|
106
115
|
# NB: This method calls #normalize_number and passes _options_ directly to that method.
|
116
|
+
# It uses the 'cc' option for Phony. This was a required param before?
|
107
117
|
def self.plausible_number?(number, options = {})
|
108
118
|
return false if number.blank?
|
119
|
+
|
109
120
|
number = extract_extension(number).first
|
110
121
|
number = normalize_number(number, options)
|
111
122
|
country_number = options[:country_number] || country_number_for(options[:country_code]) ||
|
123
|
+
country_code_from_number(number) ||
|
112
124
|
options[:default_country_number] || country_number_for(options[:default_country_code]) ||
|
113
125
|
default_country_number
|
114
126
|
Phony.plausible? number, cc: country_number
|
@@ -116,10 +128,11 @@ module PhonyRails
|
|
116
128
|
false
|
117
129
|
end
|
118
130
|
|
119
|
-
COMMON_EXTENSIONS = /
|
131
|
+
COMMON_EXTENSIONS = / *(ext|ex|x|xt|#|:)+[^0-9]*\(?([-0-9]{1,})\)?#?$/i.freeze
|
120
132
|
|
121
133
|
def self.extract_extension(number_and_ext)
|
122
134
|
return [nil, nil] if number_and_ext.nil?
|
135
|
+
|
123
136
|
subbed = number_and_ext.sub(COMMON_EXTENSIONS, '')
|
124
137
|
[subbed, Regexp.last_match(2)]
|
125
138
|
end
|
@@ -136,7 +149,7 @@ module PhonyRails
|
|
136
149
|
|
137
150
|
# This methods sets the attribute to the normalized version.
|
138
151
|
# It also adds the country_code (number), eg. 31 for NL numbers.
|
139
|
-
def set_phony_normalized_numbers(attributes, options = {})
|
152
|
+
def set_phony_normalized_numbers(current_instance, attributes, options = {})
|
140
153
|
options = options.dup
|
141
154
|
assign_values_for_phony_symbol_options(options)
|
142
155
|
if respond_to?(:country_code)
|
@@ -146,8 +159,10 @@ module PhonyRails
|
|
146
159
|
attributes.each do |attribute|
|
147
160
|
attribute_name = options[:as] || attribute
|
148
161
|
raise("No attribute #{attribute_name} found on #{self.class.name} (PhonyRails)") unless self.class.attribute_method?(attribute_name)
|
149
|
-
|
150
|
-
|
162
|
+
|
163
|
+
cache_original_attribute(current_instance, attribute) if options[:normalize_when_valid]
|
164
|
+
new_value = PhonyRails.normalize_number(send(attribute), options, current_instance)
|
165
|
+
current_instance.public_send("#{attribute_name}=", new_value) if new_value || attribute_name != attribute
|
151
166
|
end
|
152
167
|
end
|
153
168
|
|
@@ -159,7 +174,26 @@ module PhonyRails
|
|
159
174
|
end
|
160
175
|
end
|
161
176
|
|
177
|
+
def cache_original_attribute(current_instance, attribute)
|
178
|
+
attribute_name = "#{attribute}_original"
|
179
|
+
current_instance.define_singleton_method("#{attribute_name}=") { |value| instance_variable_set("@#{attribute_name}", value) }
|
180
|
+
current_instance.define_singleton_method(attribute_name) { instance_variable_get("@#{attribute_name}") }
|
181
|
+
current_instance.public_send("#{attribute}_original=", current_instance.public_send(attribute.to_s))
|
182
|
+
end
|
183
|
+
|
162
184
|
module ClassMethods
|
185
|
+
PHONY_RAILS_COLLECTION_VALID_KEYS = %i[
|
186
|
+
add_plus
|
187
|
+
as
|
188
|
+
country_code
|
189
|
+
country_number
|
190
|
+
default_country_code
|
191
|
+
default_country_number
|
192
|
+
enforce_record_country
|
193
|
+
if
|
194
|
+
normalize_when_valid
|
195
|
+
unless
|
196
|
+
].freeze
|
163
197
|
# Use this method on the class level like:
|
164
198
|
# phony_normalize :phone_number, :fax_number, :default_country_code => 'NL'
|
165
199
|
#
|
@@ -167,10 +201,8 @@ module PhonyRails
|
|
167
201
|
# you've geocoded before calling this method!
|
168
202
|
def phony_normalize(*attributes)
|
169
203
|
options = attributes.last.is_a?(Hash) ? attributes.pop : {}
|
170
|
-
options.assert_valid_keys
|
171
|
-
if options[:as].present?
|
172
|
-
raise ArgumentError, ':as option can not be used on phony_normalize with multiple attribute names! (PhonyRails)' if attributes.size > 1
|
173
|
-
end
|
204
|
+
options.assert_valid_keys(*PHONY_RAILS_COLLECTION_VALID_KEYS)
|
205
|
+
raise ArgumentError, ':as option can not be used on phony_normalize with multiple attribute names! (PhonyRails)' if options[:as].present? && (attributes.size > 1)
|
174
206
|
|
175
207
|
options[:enforce_record_country] = true if options[:enforce_record_country].nil?
|
176
208
|
|
@@ -178,7 +210,7 @@ module PhonyRails
|
|
178
210
|
|
179
211
|
# Add before validation that saves a normalized version of the phone number
|
180
212
|
before_validation conditional do
|
181
|
-
set_phony_normalized_numbers(attributes, options)
|
213
|
+
set_phony_normalized_numbers(self, attributes, options)
|
182
214
|
end
|
183
215
|
end
|
184
216
|
|
@@ -190,10 +222,12 @@ module PhonyRails
|
|
190
222
|
main_options.assert_valid_keys :country_code, :default_country_code
|
191
223
|
attributes.each do |attribute|
|
192
224
|
raise(StandardError, "Instance method normalized_#{attribute} already exists on #{name} (PhonyRails)") if method_defined?(:"normalized_#{attribute}")
|
225
|
+
|
193
226
|
define_method :"normalized_#{attribute}" do |*args|
|
194
227
|
options = main_options.merge(args.first || {})
|
195
228
|
assign_values_for_phony_symbol_options(options)
|
196
229
|
raise(ArgumentError, "No attribute/method #{attribute} found on #{self.class.name} (PhonyRails)") unless respond_to?(attribute)
|
230
|
+
|
197
231
|
options[:country_code] ||= country_code if respond_to?(:country_code)
|
198
232
|
PhonyRails.normalize_number(send(attribute), options)
|
199
233
|
end
|
@@ -241,12 +275,12 @@ end
|
|
241
275
|
|
242
276
|
ActiveModel::Model.send :include, PhonyRails::Extension if defined?(ActiveModel::Model)
|
243
277
|
|
244
|
-
if defined?(Mongoid)
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
end
|
278
|
+
# if defined?(Mongoid)
|
279
|
+
# module Mongoid::Phony
|
280
|
+
# extend ActiveSupport::Concern
|
281
|
+
# include PhonyRails::Extension
|
282
|
+
# end
|
283
|
+
# end
|
250
284
|
|
251
285
|
Dir["#{File.dirname(__FILE__)}/phony_rails/locales/*.yml"].each do |file|
|
252
286
|
I18n.load_path << file
|
@@ -4,6 +4,7 @@
|
|
4
4
|
# Usage:
|
5
5
|
# validate :phone_number, :phony_plausible => true
|
6
6
|
require 'active_model'
|
7
|
+
|
7
8
|
class PhonyPlausibleValidator < ActiveModel::EachValidator
|
8
9
|
# Validates a String using Phony.plausible? method.
|
9
10
|
def validate_each(record, attribute, value)
|
@@ -13,6 +14,8 @@ class PhonyPlausibleValidator < ActiveModel::EachValidator
|
|
13
14
|
value = PhonyRails.normalize_number(value.dup, default_country_code: normalized_country_code) if normalized_country_code
|
14
15
|
value = PhonyRails.extract_extension(value).first
|
15
16
|
@record.errors.add(attribute, error_message) unless Phony.plausible?(value, cc: country_number)
|
17
|
+
@record.public_send("#{attribute}=", @record.public_send("#{attribute}_original")) if @record.respond_to?("#{attribute}_original") &&
|
18
|
+
!Phony.plausible?(value, cc: country_number)
|
16
19
|
end
|
17
20
|
|
18
21
|
private
|
data/phony_rails.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require File.expand_path('
|
3
|
+
require File.expand_path('lib/phony_rails/version', __dir__)
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.authors = ['Joost Hietbrink']
|
@@ -16,12 +16,14 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.name = 'phony_rails'
|
17
17
|
gem.require_paths = ['lib']
|
18
18
|
gem.version = PhonyRails::VERSION
|
19
|
+
gem.required_ruby_version = '>= 2.4'
|
19
20
|
|
20
|
-
gem.post_install_message =
|
21
|
-
gem.post_install_message = "It now adds a '+' to the normalized number when it starts with a country number!"
|
21
|
+
gem.post_install_message = "PhonyRails v0.10.0 changes the way numbers are stored!\nIt now adds a ' + ' to the normalized number when it starts with a country number!"
|
22
22
|
|
23
23
|
gem.add_runtime_dependency 'activesupport', '>= 3.0'
|
24
|
-
gem.add_runtime_dependency 'phony', '
|
24
|
+
gem.add_runtime_dependency 'phony', '>= 2.18.12'
|
25
25
|
gem.add_development_dependency 'activerecord', '>= 3.0'
|
26
|
-
|
26
|
+
|
27
|
+
# For testing
|
28
|
+
gem.add_development_dependency 'sqlite3', '>= 1.4.0'
|
27
29
|
end
|