validators 0.1.1 → 0.1.2
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.
- data/.rspec +1 -0
- data/Gemfile +1 -3
- data/Gemfile.lock +27 -27
- data/README.rdoc +11 -0
- data/lib/validators/validates_datetime.rb +91 -0
- data/lib/validators/version.rb +1 -1
- data/lib/validators.rb +1 -0
- data/spec/schema.rb +2 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/dates.rb +19 -0
- data/spec/support/translations.yml +3 -0
- data/spec/validators/validates_datetime_spec.rb +124 -0
- data/validators.gemspec +3 -3
- metadata +14 -28
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format documentation
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,40 +1,39 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
validators (0.1.
|
5
|
-
activerecord (
|
4
|
+
validators (0.1.2)
|
5
|
+
activerecord (~> 3.0.5)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activemodel (3.0.
|
11
|
-
activesupport (= 3.0.
|
10
|
+
activemodel (3.0.5)
|
11
|
+
activesupport (= 3.0.5)
|
12
12
|
builder (~> 2.1.2)
|
13
|
-
i18n (~> 0.4
|
14
|
-
activerecord (3.0.
|
15
|
-
activemodel (= 3.0.
|
16
|
-
activesupport (= 3.0.
|
17
|
-
arel (~>
|
13
|
+
i18n (~> 0.4)
|
14
|
+
activerecord (3.0.5)
|
15
|
+
activemodel (= 3.0.5)
|
16
|
+
activesupport (= 3.0.5)
|
17
|
+
arel (~> 2.0.2)
|
18
18
|
tzinfo (~> 0.3.23)
|
19
|
-
activesupport (3.0.
|
19
|
+
activesupport (3.0.5)
|
20
20
|
archive-tar-minitar (0.5.2)
|
21
|
-
arel (
|
22
|
-
activesupport (~> 3.0.0)
|
21
|
+
arel (2.0.9)
|
23
22
|
builder (2.1.2)
|
24
23
|
columnize (0.3.2)
|
25
24
|
diff-lcs (1.1.2)
|
26
|
-
i18n (0.
|
27
|
-
linecache19 (0.5.
|
25
|
+
i18n (0.5.0)
|
26
|
+
linecache19 (0.5.12)
|
28
27
|
ruby_core_source (>= 0.1.4)
|
29
|
-
rspec (2.
|
30
|
-
rspec-core (~> 2.
|
31
|
-
rspec-expectations (~> 2.
|
32
|
-
rspec-mocks (~> 2.
|
33
|
-
rspec-core (2.1
|
34
|
-
rspec-expectations (2.
|
28
|
+
rspec (2.5.0)
|
29
|
+
rspec-core (~> 2.5.0)
|
30
|
+
rspec-expectations (~> 2.5.0)
|
31
|
+
rspec-mocks (~> 2.5.0)
|
32
|
+
rspec-core (2.5.1)
|
33
|
+
rspec-expectations (2.5.0)
|
35
34
|
diff-lcs (~> 1.1.2)
|
36
|
-
rspec-mocks (2.
|
37
|
-
ruby-debug-base19 (0.11.
|
35
|
+
rspec-mocks (2.5.0)
|
36
|
+
ruby-debug-base19 (0.11.25)
|
38
37
|
columnize (>= 0.3.1)
|
39
38
|
linecache19 (>= 0.5.11)
|
40
39
|
ruby_core_source (>= 0.1.4)
|
@@ -42,17 +41,18 @@ GEM
|
|
42
41
|
columnize (>= 0.3.1)
|
43
42
|
linecache19 (>= 0.5.11)
|
44
43
|
ruby-debug-base19 (>= 0.11.19)
|
45
|
-
ruby_core_source (0.1.
|
44
|
+
ruby_core_source (0.1.5)
|
46
45
|
archive-tar-minitar (>= 0.5.2)
|
47
|
-
sqlite3
|
48
|
-
|
46
|
+
sqlite3 (1.3.3)
|
47
|
+
sqlite3-ruby (1.3.3)
|
48
|
+
sqlite3 (>= 1.3.3)
|
49
|
+
tzinfo (0.3.26)
|
49
50
|
|
50
51
|
PLATFORMS
|
51
52
|
ruby
|
52
53
|
|
53
54
|
DEPENDENCIES
|
54
|
-
|
55
|
-
rspec (>= 2.0.0)
|
55
|
+
rspec (~> 2.5.0)
|
56
56
|
ruby-debug19
|
57
57
|
sqlite3-ruby
|
58
58
|
validators!
|
data/README.rdoc
CHANGED
@@ -59,6 +59,17 @@ Then add it to your Gemfile:
|
|
59
59
|
validates_ip_address :address, :only => :v6
|
60
60
|
end
|
61
61
|
|
62
|
+
=== validates_datetime
|
63
|
+
|
64
|
+
class Server < ActiveRecord::Base
|
65
|
+
validates_datetime :starts_at
|
66
|
+
validates_datetime :ends_at, :after => :starts_at, :if => :starts_at?
|
67
|
+
validates_datetime :ends_at, :after => :now
|
68
|
+
validates_datetime :ends_at, :before => :today
|
69
|
+
|
70
|
+
validates :starts_at, :datetime => true
|
71
|
+
end
|
72
|
+
|
62
73
|
== Maintainer
|
63
74
|
|
64
75
|
* Nando Vieira - http://simplesideias.com.br
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
module Validations
|
3
|
+
class DatetimeValidator < EachValidator
|
4
|
+
def date?(value)
|
5
|
+
value.kind_of?(Date) || value.kind_of?(Time)
|
6
|
+
end
|
7
|
+
|
8
|
+
def validate_each(record, attribute, value)
|
9
|
+
unless date?(value)
|
10
|
+
record.errors.add(attribute, :invalid_date,
|
11
|
+
:message => options[:message], :value => value
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
if date?(value)
|
16
|
+
validate_after_option(record, attribute, value)
|
17
|
+
validate_before_option(record, attribute, value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def date_for(record, value, option)
|
23
|
+
date = case option
|
24
|
+
when :today
|
25
|
+
Date.today
|
26
|
+
when :now
|
27
|
+
Time.now
|
28
|
+
when Time, Date, DateTime, ActiveSupport::TimeWithZone
|
29
|
+
option
|
30
|
+
when Proc
|
31
|
+
option.call(record)
|
32
|
+
else
|
33
|
+
record.__send__(option) if record.respond_to?(option)
|
34
|
+
end
|
35
|
+
|
36
|
+
if date.kind_of?(Time)
|
37
|
+
value = value.to_time
|
38
|
+
elsif date.kind_of?(Date)
|
39
|
+
value = value.to_date
|
40
|
+
end
|
41
|
+
|
42
|
+
[date, value]
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate_after_option(record, attribute, value)
|
46
|
+
return unless options[:after]
|
47
|
+
|
48
|
+
date, value = date_for(record, value, options[:after])
|
49
|
+
|
50
|
+
record.errors.add(attribute, :invalid_date_after, {
|
51
|
+
:message => options[:after_message],
|
52
|
+
:value => value,
|
53
|
+
:date => (date?(date) ? I18n.l(date) : date.inspect)
|
54
|
+
}) unless value.present? && date.present? && (value && date && value > date)
|
55
|
+
end
|
56
|
+
|
57
|
+
def validate_before_option(record, attribute, value)
|
58
|
+
return unless options[:before]
|
59
|
+
|
60
|
+
date, value = date_for(record, value, options[:before])
|
61
|
+
|
62
|
+
record.errors.add(attribute, :invalid_date_before, {
|
63
|
+
:message => options[:before_message],
|
64
|
+
:value => value,
|
65
|
+
:date => I18n.l(date)
|
66
|
+
}) unless value.present? && date.present? && (value && date && value < date)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module ClassMethods
|
71
|
+
# Validates weather or not the specified e-mail address is valid.
|
72
|
+
#
|
73
|
+
# class User < ActiveRecord::Base
|
74
|
+
# validates_datetime :birth
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# Other usages:
|
78
|
+
#
|
79
|
+
# validates_datetime :starts_at, :after => 2.years.ago
|
80
|
+
# validates_datetime :starts_at, :before => 2.years.ago
|
81
|
+
# validates_datetime :starts_at, :before => :today
|
82
|
+
# validates_datetime :starts_at, :before => :now
|
83
|
+
# validates_datetime :starts_at, :before => :ends_at
|
84
|
+
# validates_datetime :ends_at, :after => :starts_at
|
85
|
+
#
|
86
|
+
def validates_datetime(*attr_names)
|
87
|
+
validates_with DatetimeValidator, _merge_attributes(attr_names)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/lib/validators/version.rb
CHANGED
data/lib/validators.rb
CHANGED
data/spec/schema.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require "validators"
|
2
|
+
require "active_support/all"
|
3
|
+
|
4
|
+
Time.zone = "America/Sao_Paulo"
|
2
5
|
|
3
6
|
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
|
4
7
|
|
@@ -10,6 +13,7 @@ I18n.load_path << File.dirname(__FILE__) + "/support/translations.yml"
|
|
10
13
|
RSpec.configure do |config|
|
11
14
|
config.before do
|
12
15
|
I18n.locale = :en
|
16
|
+
Time.zone = "America/Sao_Paulo"
|
13
17
|
|
14
18
|
ActiveRecord::Base.descendants.each do |model|
|
15
19
|
model.delete_all
|
@@ -0,0 +1,19 @@
|
|
1
|
+
VALID_DATES = [
|
2
|
+
"2010-04-26",
|
3
|
+
"2010-04-26 23:59:00",
|
4
|
+
"26/04/2010",
|
5
|
+
"2000-08-01 00:00:00 +0900",
|
6
|
+
"Aug 21 2000",
|
7
|
+
"Thu Nov 29 14:33:20 GMT 2001",
|
8
|
+
Time.now,
|
9
|
+
Date.today,
|
10
|
+
DateTime.now,
|
11
|
+
Time.zone.now
|
12
|
+
]
|
13
|
+
|
14
|
+
INVALID_DATES = [
|
15
|
+
"invalid",
|
16
|
+
nil,
|
17
|
+
"",
|
18
|
+
"4/26"
|
19
|
+
]
|
@@ -3,6 +3,9 @@ en:
|
|
3
3
|
errors:
|
4
4
|
messages:
|
5
5
|
record_invalid: "Errors: %{errors}"
|
6
|
+
invalid_date: "is not a valid date"
|
7
|
+
invalid_date_before: "needs to be before %{date}"
|
8
|
+
invalid_date_after: "needs to be after %{date}"
|
6
9
|
invalid_email: "is not a valid address"
|
7
10
|
invalid_url: "is not a valid address"
|
8
11
|
invalid_ipv4_address: "is not a valid IPv4 address"
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ".validates_datetime" do
|
4
|
+
subject { User.new }
|
5
|
+
|
6
|
+
context "default options" do
|
7
|
+
before do
|
8
|
+
User.validates_datetime :registered_at
|
9
|
+
User.validates :birthday, :datetime => true
|
10
|
+
end
|
11
|
+
|
12
|
+
VALID_DATES.each do |date|
|
13
|
+
it "accepts #{date.inspect} as valid date" do
|
14
|
+
subject.registered_at = date
|
15
|
+
subject.birthday = date
|
16
|
+
|
17
|
+
subject.should be_valid
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
INVALID_DATES.each do |date|
|
22
|
+
it "rejects #{date.inspect} as valid date" do
|
23
|
+
subject.registered_at = date
|
24
|
+
subject.birthday = date
|
25
|
+
subject.should_not be_valid
|
26
|
+
|
27
|
+
subject.errors[:registered_at].should_not be_empty
|
28
|
+
subject.errors[:birthday].should_not be_empty
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "includes default error message" do
|
33
|
+
subject.registered_at = nil
|
34
|
+
subject.should_not be_valid
|
35
|
+
|
36
|
+
subject.errors[:registered_at].should == ["is not a valid date"]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "after option" do
|
41
|
+
it "rejects when date is set to before :after option" do
|
42
|
+
User.validates_datetime :registered_at, :after => 1.week.from_now
|
43
|
+
subject.registered_at = Time.now
|
44
|
+
|
45
|
+
subject.should_not be_valid
|
46
|
+
subject.errors[:registered_at].should == ["needs to be after #{I18n.l(1.week.from_now)}"]
|
47
|
+
end
|
48
|
+
|
49
|
+
it "accepts when date is set accordingly to the :after option" do
|
50
|
+
User.validates_datetime :registered_at, :after => 1.week.from_now
|
51
|
+
subject.registered_at = 2.weeks.from_now
|
52
|
+
|
53
|
+
subject.should be_valid
|
54
|
+
end
|
55
|
+
|
56
|
+
it "validates using today as date" do
|
57
|
+
User.validates_datetime :registered_at, :after => :today
|
58
|
+
|
59
|
+
subject.registered_at = Time.now
|
60
|
+
subject.should_not be_valid
|
61
|
+
|
62
|
+
subject.registered_at = Date.today
|
63
|
+
subject.should_not be_valid
|
64
|
+
|
65
|
+
subject.registered_at = Date.tomorrow
|
66
|
+
subject.should be_valid
|
67
|
+
|
68
|
+
subject.registered_at = 1.day.from_now
|
69
|
+
subject.should be_valid
|
70
|
+
end
|
71
|
+
|
72
|
+
it "validates using now as date" do
|
73
|
+
User.validates_datetime :registered_at, :after => :now
|
74
|
+
|
75
|
+
subject.registered_at = Time.now
|
76
|
+
subject.should_not be_valid
|
77
|
+
|
78
|
+
subject.registered_at = Date.today
|
79
|
+
subject.should_not be_valid
|
80
|
+
|
81
|
+
subject.registered_at = Date.tomorrow
|
82
|
+
subject.should be_valid
|
83
|
+
|
84
|
+
subject.registered_at = 1.day.from_now
|
85
|
+
subject.should be_valid
|
86
|
+
end
|
87
|
+
|
88
|
+
it "validates using method as date" do
|
89
|
+
User.validates_datetime :starts_at
|
90
|
+
User.validates_datetime :ends_at, :after => :starts_at, :if => :starts_at?
|
91
|
+
|
92
|
+
subject.starts_at = nil
|
93
|
+
subject.ends_at = Time.now
|
94
|
+
subject.should_not be_valid
|
95
|
+
subject.errors[:ends_at].should be_empty
|
96
|
+
|
97
|
+
subject.starts_at = Time.parse("Apr 26 2010")
|
98
|
+
subject.ends_at = Time.parse("Apr 25 2010")
|
99
|
+
subject.should_not be_valid
|
100
|
+
subject.errors[:ends_at].should == ["needs to be after #{I18n.l(Time.parse("Apr 26 2010"))}"]
|
101
|
+
|
102
|
+
subject.starts_at = Time.now
|
103
|
+
subject.ends_at = 1.hour.from_now
|
104
|
+
subject.should be_valid
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context "before option" do
|
109
|
+
it "rejects when date is set to after :before option" do
|
110
|
+
User.validates_datetime :registered_at, :before => 1.week.ago
|
111
|
+
subject.registered_at = Time.now
|
112
|
+
|
113
|
+
subject.should_not be_valid
|
114
|
+
subject.errors[:registered_at].should == ["needs to be before #{I18n.l(1.week.ago)}"]
|
115
|
+
end
|
116
|
+
|
117
|
+
it "accepts when date is set accordingly to the :before option" do
|
118
|
+
User.validates_datetime :registered_at, :before => 1.week.ago
|
119
|
+
subject.registered_at = 2.weeks.ago
|
120
|
+
|
121
|
+
subject.should be_valid
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/validators.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_dependency "activerecord", "
|
21
|
-
s.add_development_dependency "rspec", "
|
20
|
+
s.add_dependency "activerecord", "~> 3.0.5"
|
21
|
+
s.add_development_dependency "rspec", "~> 2.5.0"
|
22
22
|
s.add_development_dependency "sqlite3-ruby"
|
23
|
-
s.add_development_dependency "ruby-debug19"
|
23
|
+
s.add_development_dependency "ruby-debug19" if RUBY_VERSION >= "1.9"
|
24
24
|
end
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 1
|
9
|
-
version: 0.1.1
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.2
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Nando Vieira
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date:
|
13
|
+
date: 2011-04-05 00:00:00 -03:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
@@ -23,13 +19,9 @@ dependencies:
|
|
23
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
20
|
none: false
|
25
21
|
requirements:
|
26
|
-
- -
|
22
|
+
- - ~>
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 3
|
30
|
-
- 0
|
31
|
-
- 0
|
32
|
-
version: 3.0.0
|
24
|
+
version: 3.0.5
|
33
25
|
type: :runtime
|
34
26
|
version_requirements: *id001
|
35
27
|
- !ruby/object:Gem::Dependency
|
@@ -38,13 +30,9 @@ dependencies:
|
|
38
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
31
|
none: false
|
40
32
|
requirements:
|
41
|
-
- -
|
33
|
+
- - ~>
|
42
34
|
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
- 2
|
45
|
-
- 0
|
46
|
-
- 0
|
47
|
-
version: 2.0.0
|
35
|
+
version: 2.5.0
|
48
36
|
type: :development
|
49
37
|
version_requirements: *id002
|
50
38
|
- !ruby/object:Gem::Dependency
|
@@ -55,8 +43,6 @@ dependencies:
|
|
55
43
|
requirements:
|
56
44
|
- - ">="
|
57
45
|
- !ruby/object:Gem::Version
|
58
|
-
segments:
|
59
|
-
- 0
|
60
46
|
version: "0"
|
61
47
|
type: :development
|
62
48
|
version_requirements: *id003
|
@@ -68,8 +54,6 @@ dependencies:
|
|
68
54
|
requirements:
|
69
55
|
- - ">="
|
70
56
|
- !ruby/object:Gem::Version
|
71
|
-
segments:
|
72
|
-
- 0
|
73
57
|
version: "0"
|
74
58
|
type: :development
|
75
59
|
version_requirements: *id004
|
@@ -84,6 +68,7 @@ extra_rdoc_files: []
|
|
84
68
|
|
85
69
|
files:
|
86
70
|
- .gitignore
|
71
|
+
- .rspec
|
87
72
|
- Gemfile
|
88
73
|
- Gemfile.lock
|
89
74
|
- README.rdoc
|
@@ -91,6 +76,7 @@ files:
|
|
91
76
|
- lib/validators.rb
|
92
77
|
- lib/validators/constants.rb
|
93
78
|
- lib/validators/ip.rb
|
79
|
+
- lib/validators/validates_datetime.rb
|
94
80
|
- lib/validators/validates_email_format_of.rb
|
95
81
|
- lib/validators/validates_ip_address.rb
|
96
82
|
- lib/validators/validates_ownership_of.rb
|
@@ -98,12 +84,14 @@ files:
|
|
98
84
|
- lib/validators/version.rb
|
99
85
|
- spec/schema.rb
|
100
86
|
- spec/spec_helper.rb
|
87
|
+
- spec/support/dates.rb
|
101
88
|
- spec/support/emails.rb
|
102
89
|
- spec/support/ips.rb
|
103
90
|
- spec/support/models.rb
|
104
91
|
- spec/support/translations.yml
|
105
92
|
- spec/support/urls.rb
|
106
93
|
- spec/validators/ip_spec.rb
|
94
|
+
- spec/validators/validates_datetime_spec.rb
|
107
95
|
- spec/validators/validates_email_format_of_spec.rb
|
108
96
|
- spec/validators/validates_ip_address_spec.rb
|
109
97
|
- spec/validators/validates_ownership_of_spec.rb
|
@@ -123,33 +111,31 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
111
|
requirements:
|
124
112
|
- - ">="
|
125
113
|
- !ruby/object:Gem::Version
|
126
|
-
segments:
|
127
|
-
- 0
|
128
114
|
version: "0"
|
129
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
116
|
none: false
|
131
117
|
requirements:
|
132
118
|
- - ">="
|
133
119
|
- !ruby/object:Gem::Version
|
134
|
-
segments:
|
135
|
-
- 0
|
136
120
|
version: "0"
|
137
121
|
requirements: []
|
138
122
|
|
139
123
|
rubyforge_project:
|
140
|
-
rubygems_version: 1.
|
124
|
+
rubygems_version: 1.6.0
|
141
125
|
signing_key:
|
142
126
|
specification_version: 3
|
143
127
|
summary: Add some nice Rails 3 ActiveRecord validators.
|
144
128
|
test_files:
|
145
129
|
- spec/schema.rb
|
146
130
|
- spec/spec_helper.rb
|
131
|
+
- spec/support/dates.rb
|
147
132
|
- spec/support/emails.rb
|
148
133
|
- spec/support/ips.rb
|
149
134
|
- spec/support/models.rb
|
150
135
|
- spec/support/translations.yml
|
151
136
|
- spec/support/urls.rb
|
152
137
|
- spec/validators/ip_spec.rb
|
138
|
+
- spec/validators/validates_datetime_spec.rb
|
153
139
|
- spec/validators/validates_email_format_of_spec.rb
|
154
140
|
- spec/validators/validates_ip_address_spec.rb
|
155
141
|
- spec/validators/validates_ownership_of_spec.rb
|