missing_validators 0.8.3 → 0.9
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 +4 -4
- data/config/locales/en.yml +6 -5
- data/lib/missing_validators.rb +2 -0
- data/lib/missing_validators/matchers/ensure_valid_imei_format_of.rb +20 -0
- data/lib/missing_validators/validators/imei_validator.rb +50 -0
- data/lib/missing_validators/version.rb +1 -1
- data/missing_validators.gemspec +4 -4
- data/spec/spec_helper.rb +1 -4
- data/spec/validators/imei_spec.rb +39 -0
- metadata +32 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fcaba1ca021815135f1424a4ba05e50bb43bcb8
|
4
|
+
data.tar.gz: e4c2defc413858dd7de4f324e5598f338c2289df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91854dee85dce2b8e089afe19dcb22a7c9a0e5a54d61ed09d6e457245a16e721f459d1f5e89943149672679878ba65795aa790de3f5e908e2e27bc05496b0e91
|
7
|
+
data.tar.gz: 81e974d943116e0561728a31cb9eff0b88f50961bf59219cf5b94b719f2c2420150782e4c94e2466f20f081ef68c6271a2cc0c8ae51a0172d1566d20ae335a98
|
data/config/locales/en.yml
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
en:
|
2
2
|
errors:
|
3
3
|
messages:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
imei: "is not a valid IMEI"
|
5
|
+
inequality: "cannot be equal to %{attr}"
|
6
|
+
email: "is not a valid email address"
|
7
|
+
url: "is not a valid URL"
|
8
|
+
mac_address: "is not a valid MAC address"
|
9
|
+
longitude: "is not a valid longitude"
|
9
10
|
missing_validators:
|
10
11
|
matchers:
|
11
12
|
ensure_inequality_of:
|
data/lib/missing_validators.rb
CHANGED
@@ -11,3 +11,5 @@ require 'missing_validators/validators/mac_address_validator'
|
|
11
11
|
require 'missing_validators/matchers/ensure_valid_mac_address_format_of' if defined?(RSpec)
|
12
12
|
require 'missing_validators/validators/longitude_validator'
|
13
13
|
require 'missing_validators/validators/latitude_validator'
|
14
|
+
require 'missing_validators/validators/imei_validator'
|
15
|
+
require 'missing_validators/matchers/ensure_valid_imei_format_of' if defined?(RSpec)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
RSpec::Matchers.define :ensure_valid_imei_format_of do |attribute|
|
2
|
+
match do |model|
|
3
|
+
model.send("#{attribute}=", "invalid.imei")
|
4
|
+
model.valid?
|
5
|
+
|
6
|
+
if model.errors.has_key?(attribute)
|
7
|
+
model.errors[attribute].include?(I18n.t('errors.messages.imei'))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
failure_message_for_should do |model|
|
12
|
+
I18n.t 'missing_validators.matchers.ensure_valid_imei_format_of.failure_message_for_should',
|
13
|
+
model: model.class
|
14
|
+
end
|
15
|
+
|
16
|
+
failure_message_for_should_not do |model|
|
17
|
+
I18n.t 'missing_validators.matchers.ensure_valid_imei_format_of.failure_message_for_should_not',
|
18
|
+
model: model.class
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Allows to check if the value of a specific attribute is a valid IMEI address.
|
2
|
+
#
|
3
|
+
# @example Validate that the device IMEI address is valid.
|
4
|
+
# class Device << ActiveRecord::Base
|
5
|
+
# attr_accessor :imei
|
6
|
+
# validates :imei, imei: true
|
7
|
+
# end
|
8
|
+
class ImeiValidator < ActiveModel::EachValidator
|
9
|
+
# Checks if an attribute value is a valid IMEI address.
|
10
|
+
#
|
11
|
+
# @param [Object] record object to validate
|
12
|
+
# @param [String] attribute name of the object attribute to validate
|
13
|
+
# @param [Object] value attribute value
|
14
|
+
def validate_each(record, attribute, value)
|
15
|
+
allow_blank = options[:allow_blank] || false
|
16
|
+
return if allow_blank && value.blank?
|
17
|
+
|
18
|
+
unless valid?(value.to_s, options)
|
19
|
+
record.errors[attribute] << (options[:message] || I18n.t('errors.messages.imei'))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.validate_format(imei_number)
|
24
|
+
!!(imei_number =~ /\A[\d\.\:\-\s]+\z/i) # 356843052637512 or 35-6843052-637512 or 35.6843052.637512
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.luhn_valid?(input)
|
28
|
+
numbers = input.gsub(/\D/, '').reverse
|
29
|
+
|
30
|
+
sum, i = 0, 0
|
31
|
+
|
32
|
+
numbers.each_char do |ch|
|
33
|
+
n = ch.to_i
|
34
|
+
n *= 2 if i.odd?
|
35
|
+
n = 1 + (n - 10) if n >= 10
|
36
|
+
|
37
|
+
sum += n
|
38
|
+
i += 1
|
39
|
+
end
|
40
|
+
|
41
|
+
(sum % 10).zero?
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def valid?(imei, options)
|
47
|
+
self.class.validate_format(imei) \
|
48
|
+
&& self.class.luhn_valid?(imei)
|
49
|
+
end
|
50
|
+
end
|
data/missing_validators.gemspec
CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |gem|
|
|
5
5
|
gem.authors = ["Andrew Gridnev"]
|
6
6
|
gem.email = ["andrew.gridnev@gmail.com"]
|
7
7
|
gem.summary = %q{Adds some handy validators.}
|
8
|
-
gem.description = %q{Validates email addresses, URLs, MAC addresses and inequality of attributes.}
|
8
|
+
gem.description = %q{Validates email addresses, URLs, IMEI, MAC addresses and inequality of attributes.}
|
9
9
|
gem.homepage = "https://github.com/andrewgr/missing_validators/"
|
10
10
|
gem.license = 'MIT'
|
11
11
|
|
@@ -16,9 +16,9 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = MissingValidators::VERSION
|
18
18
|
|
19
|
-
gem.add_development_dependency 'rspec'
|
20
|
-
gem.add_development_dependency 'shoulda-matchers'
|
21
|
-
|
22
19
|
gem.add_dependency 'activemodel', '> 3.0.0'
|
23
20
|
gem.add_dependency 'activesupport', '> 3.0.0'
|
21
|
+
|
22
|
+
gem.add_development_dependency 'rspec'
|
23
|
+
gem.add_development_dependency 'shoulda-matchers'
|
24
24
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ImeiValidator do
|
4
|
+
context "IMEI has valid format" do
|
5
|
+
let(:klass) do
|
6
|
+
Class.new do
|
7
|
+
include ActiveModel::Validations
|
8
|
+
attr_accessor :imei, :name
|
9
|
+
validates :imei, imei: true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { klass.new }
|
14
|
+
|
15
|
+
it { should ensure_valid_imei_format_of(:imei) }
|
16
|
+
it { should_not ensure_valid_imei_format_of(:name) }
|
17
|
+
|
18
|
+
it { should allow_value(356843052637512).for(:imei) }
|
19
|
+
it { should allow_value("356843052637512").for(:imei) }
|
20
|
+
it { should allow_value("35-684305-2637512").for(:imei) }
|
21
|
+
it { should allow_value("35-684305.263.7512").for(:imei) }
|
22
|
+
|
23
|
+
context "value too short" do
|
24
|
+
it { should_not allow_value("3568430537512").for(:imei) }
|
25
|
+
it { should_not allow_value("3").for(:imei) }
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can't be too long" do
|
29
|
+
should_not allow_value("35684305263751233").for(:imei)
|
30
|
+
end
|
31
|
+
|
32
|
+
context "checksum doesn't match" do
|
33
|
+
it { should_not allow_value("356843052637513").for(:imei) }
|
34
|
+
it { should_not allow_value("156843052637512").for(:imei) }
|
35
|
+
end
|
36
|
+
|
37
|
+
it { should_not allow_value("invalid").for(:imei) }
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,72 +1,73 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: missing_validators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.9'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Gridnev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activemodel
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - '
|
17
|
+
- - '>'
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
19
|
+
version: 3.0.0
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - '
|
24
|
+
- - '>'
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - '
|
31
|
+
- - '>'
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
33
|
+
version: 3.0.0
|
34
|
+
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - '
|
38
|
+
- - '>'
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 3.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - '
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
-
type: :
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - '
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: shoulda-matchers
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - '
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
-
type: :
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - '
|
66
|
+
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
-
description: Validates email addresses, URLs, MAC addresses and inequality of
|
68
|
+
version: '0'
|
69
|
+
description: Validates email addresses, URLs, IMEI, MAC addresses and inequality of
|
70
|
+
attributes.
|
70
71
|
email:
|
71
72
|
- andrew.gridnev@gmail.com
|
72
73
|
executables: []
|
@@ -84,9 +85,11 @@ files:
|
|
84
85
|
- lib/missing_validators.rb
|
85
86
|
- lib/missing_validators/matchers/ensure_inequality_of_matcher.rb
|
86
87
|
- lib/missing_validators/matchers/ensure_valid_email_format_of.rb
|
88
|
+
- lib/missing_validators/matchers/ensure_valid_imei_format_of.rb
|
87
89
|
- lib/missing_validators/matchers/ensure_valid_mac_address_format_of.rb
|
88
90
|
- lib/missing_validators/matchers/ensure_valid_url_format_of.rb
|
89
91
|
- lib/missing_validators/validators/email_validator.rb
|
92
|
+
- lib/missing_validators/validators/imei_validator.rb
|
90
93
|
- lib/missing_validators/validators/inequality_validator.rb
|
91
94
|
- lib/missing_validators/validators/latitude_validator.rb
|
92
95
|
- lib/missing_validators/validators/longitude_validator.rb
|
@@ -96,6 +99,7 @@ files:
|
|
96
99
|
- missing_validators.gemspec
|
97
100
|
- spec/spec_helper.rb
|
98
101
|
- spec/validators/email_validator_spec.rb
|
102
|
+
- spec/validators/imei_spec.rb
|
99
103
|
- spec/validators/inequality_validator_spec.rb
|
100
104
|
- spec/validators/latitude_validator_spec.rb
|
101
105
|
- spec/validators/longitude_validator_spec.rb
|
@@ -128,6 +132,7 @@ summary: Adds some handy validators.
|
|
128
132
|
test_files:
|
129
133
|
- spec/spec_helper.rb
|
130
134
|
- spec/validators/email_validator_spec.rb
|
135
|
+
- spec/validators/imei_spec.rb
|
131
136
|
- spec/validators/inequality_validator_spec.rb
|
132
137
|
- spec/validators/latitude_validator_spec.rb
|
133
138
|
- spec/validators/longitude_validator_spec.rb
|