validates_timeliness 1.1.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/Rakefile +1 -1
- data/TODO +2 -4
- data/lib/validates_timeliness/formats.rb +35 -20
- data/lib/validates_timeliness/spec/rails/matchers/validate_timeliness.rb +2 -1
- data/lib/validates_timeliness/validator.rb +1 -1
- data/spec/spec/rails/matchers/validate_timeliness_spec.rb +23 -11
- data/spec/validator_spec.rb +34 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
data/TODO
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
- :format option
|
2
2
|
- :with_date and :with_time options
|
3
|
-
- Merb and Data Mapper support
|
4
|
-
- does it have before_type_cast
|
5
|
-
- timezone handling
|
6
|
-
- view helper support
|
7
3
|
- valid formats could come from locale file
|
4
|
+
- formats to use month and day names from i18n
|
5
|
+
- add replace_formats instead add_formats :before
|
@@ -10,16 +10,14 @@ module ValidatesTimeliness
|
|
10
10
|
# string values.
|
11
11
|
#
|
12
12
|
class Formats
|
13
|
-
cattr_accessor :time_formats
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
cattr_accessor :format_tokens
|
22
|
-
cattr_accessor :format_proc_args
|
13
|
+
cattr_accessor :time_formats,
|
14
|
+
:date_formats,
|
15
|
+
:datetime_formats,
|
16
|
+
:time_expressions,
|
17
|
+
:date_expressions,
|
18
|
+
:datetime_expressions,
|
19
|
+
:format_tokens,
|
20
|
+
:format_proc_args
|
23
21
|
|
24
22
|
# Format tokens:
|
25
23
|
# y = year
|
@@ -139,13 +137,13 @@ module ValidatesTimeliness
|
|
139
137
|
# should just be the arg name.
|
140
138
|
#
|
141
139
|
@@format_proc_args = {
|
142
|
-
:year => [0,
|
143
|
-
:month => [1,
|
144
|
-
:day => [2,
|
145
|
-
:hour => [3,
|
146
|
-
:min => [4,
|
147
|
-
:sec => [5,
|
148
|
-
:usec => [6,
|
140
|
+
:year => [0, 'y', 'unambiguous_year(y)'],
|
141
|
+
:month => [1, 'm', 'month_index(m)'],
|
142
|
+
:day => [2, 'd', 'd'],
|
143
|
+
:hour => [3, 'h', 'full_hour(h,md)'],
|
144
|
+
:min => [4, 'n', 'n'],
|
145
|
+
:sec => [5, 's', 's'],
|
146
|
+
:usec => [6, 'u', 'microseconds(u)'],
|
149
147
|
:meridian => [nil, 'md', nil]
|
150
148
|
}
|
151
149
|
|
@@ -165,6 +163,7 @@ module ValidatesTimeliness
|
|
165
163
|
return string unless string.is_a?(String)
|
166
164
|
|
167
165
|
expressions = expression_set(type, string)
|
166
|
+
# TODO cleanup using select
|
168
167
|
time_array = nil
|
169
168
|
expressions.each do |(regexp, processor)|
|
170
169
|
regexp = strict || type == :datetime ? /\A#{regexp}\Z/ : (type == :date ? /\A#{regexp}/ : /#{regexp}\Z/)
|
@@ -173,7 +172,7 @@ module ValidatesTimeliness
|
|
173
172
|
break
|
174
173
|
end
|
175
174
|
end
|
176
|
-
|
175
|
+
time_array
|
177
176
|
end
|
178
177
|
|
179
178
|
# Delete formats of specified type. Error raised if format not found.
|
@@ -223,7 +222,7 @@ module ValidatesTimeliness
|
|
223
222
|
def format_expression_generator(string_format)
|
224
223
|
regexp = string_format.dup
|
225
224
|
order = {}
|
226
|
-
regexp.gsub!(/([\.\\])/, '\\\\\1') # escapes dots and backslashes
|
225
|
+
regexp.gsub!(/([\.\\])/, '\\\\\1') # escapes dots and backslashes
|
227
226
|
|
228
227
|
format_tokens.each do |token|
|
229
228
|
token_name = token.keys.first
|
@@ -260,7 +259,7 @@ module ValidatesTimeliness
|
|
260
259
|
end
|
261
260
|
|
262
261
|
def compile_formats(formats)
|
263
|
-
formats.
|
262
|
+
formats.map { |format| regexp, format_proc = format_expression_generator(format) }
|
264
263
|
end
|
265
264
|
|
266
265
|
# Pick expression set and combine date and datetimes for
|
@@ -300,6 +299,22 @@ module ValidatesTimeliness
|
|
300
299
|
return month.to_i if month.to_i.nonzero?
|
301
300
|
Date::ABBR_MONTHNAMES.index(month.capitalize) || Date::MONTHNAMES.index(month.capitalize)
|
302
301
|
end
|
302
|
+
|
303
|
+
def month_names
|
304
|
+
@@month_names = if defined?(I18n)
|
305
|
+
I18n('dates.months')
|
306
|
+
else
|
307
|
+
Date::MONTHNAMES
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def abbreviated_month_names
|
312
|
+
@@abbreviated_month_names = if defined?(I18n)
|
313
|
+
I18n('dates.months')
|
314
|
+
else
|
315
|
+
Date::ABBR_MONTHNAMES
|
316
|
+
end
|
317
|
+
end
|
303
318
|
|
304
319
|
def microseconds(usec)
|
305
320
|
(".#{usec}".to_f * 1_000_000).to_i
|
@@ -123,7 +123,8 @@ module Spec
|
|
123
123
|
restriction = [restriction] unless restriction.is_a?(Array)
|
124
124
|
restriction.map! {|r| @validator.send(:type_cast_value, r) }
|
125
125
|
interpolate = @validator.send(:interpolation_values, option, restriction )
|
126
|
-
if defined
|
126
|
+
# get I18n message if defined and has interpolation keys in msg
|
127
|
+
if defined?(I18n) && !@validator.send(:custom_error_messages).include?(option)
|
127
128
|
msg = @record.errors.generate_message(@expected, option, interpolate)
|
128
129
|
else
|
129
130
|
msg = msg % interpolate
|
@@ -115,7 +115,7 @@ module ValidatesTimeliness
|
|
115
115
|
return @custom_error_messages if defined?(@custom_error_messages)
|
116
116
|
@custom_error_messages = configuration.inject({}) {|msgs, (k, v)|
|
117
117
|
if md = /(.*)_message$/.match(k.to_s)
|
118
|
-
msgs[md[
|
118
|
+
msgs[md[1].to_sym] = v
|
119
119
|
end
|
120
120
|
msgs
|
121
121
|
}
|
@@ -5,27 +5,39 @@ end
|
|
5
5
|
|
6
6
|
class WithValidation < Person
|
7
7
|
validates_date :birth_date,
|
8
|
-
:before => '2000-01-10',
|
9
|
-
:
|
8
|
+
:before => '2000-01-10',
|
9
|
+
:after => '2000-01-01',
|
10
|
+
:on_or_before => '2000-01-09',
|
11
|
+
:on_or_after => '2000-01-02',
|
10
12
|
:between => ['2000-01-01', '2000-01-03']
|
11
13
|
|
12
14
|
validates_time :birth_time,
|
13
|
-
:before => '23:00',
|
14
|
-
:
|
15
|
+
:before => '23:00',
|
16
|
+
:after => '09:00',
|
17
|
+
:on_or_before => '22:00',
|
18
|
+
:on_or_after => '10:00',
|
15
19
|
:between => ['09:00', '17:00']
|
20
|
+
|
16
21
|
validates_datetime :birth_date_and_time,
|
17
|
-
:before => '2000-01-10 23:00',
|
18
|
-
:
|
22
|
+
:before => '2000-01-10 23:00',
|
23
|
+
:after => '2000-01-01 09:00',
|
24
|
+
:on_or_before => '2000-01-09 23:00',
|
25
|
+
:on_or_after => '2000-01-02 09:00',
|
19
26
|
:between => ['2000-01-01 09:00', '2000-01-01 17:00']
|
20
27
|
|
21
28
|
end
|
22
29
|
|
23
30
|
class CustomMessages < Person
|
24
|
-
validates_date :birth_date,
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
31
|
+
validates_date :birth_date,
|
32
|
+
:invalid_date_message => 'is not really a date',
|
33
|
+
:before => '2000-01-10',
|
34
|
+
:before_message => 'is too late',
|
35
|
+
:after => '2000-01-01',
|
36
|
+
:after_message => 'is too early',
|
37
|
+
:on_or_before => '2000-01-09',
|
38
|
+
:on_or_before_message => 'is just too late',
|
39
|
+
:on_or_after => '2000-01-02',
|
40
|
+
:on_or_after_message => 'is just too early'
|
29
41
|
end
|
30
42
|
|
31
43
|
describe "ValidateTimeliness matcher" do
|
data/spec/validator_spec.rb
CHANGED
@@ -363,6 +363,40 @@ describe ValidatesTimeliness::Validator do
|
|
363
363
|
end
|
364
364
|
end
|
365
365
|
|
366
|
+
describe "custom_error_messages" do
|
367
|
+
it "should return hash of custom error messages from configuration with _message truncated from keys" do
|
368
|
+
configure_validator(:type => :date, :invalid_date_message => 'thats no date')
|
369
|
+
validator.send(:custom_error_messages)[:invalid_date].should == 'thats no date'
|
370
|
+
end
|
371
|
+
|
372
|
+
it "should return empty hash if no custom error messages in configuration" do
|
373
|
+
configure_validator(:type => :date)
|
374
|
+
validator.send(:custom_error_messages).should be_empty
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
describe "interpolation_values" do
|
379
|
+
if defined?(I18n)
|
380
|
+
it "should return hash of interpolation keys with restriction values" do
|
381
|
+
before = '1900-01-01'
|
382
|
+
configure_validator(:type => :date, :before => before)
|
383
|
+
validator.send(:interpolation_values, :before, before.to_date).should == {:restriction => before}
|
384
|
+
end
|
385
|
+
|
386
|
+
it "should return empty hash if no interpolation keys are in message" do
|
387
|
+
before = '1900-01-01'
|
388
|
+
configure_validator(:type => :date, :before => before, :before_message => 'too late')
|
389
|
+
validator.send(:interpolation_values, :before, before.to_date).should be_empty
|
390
|
+
end
|
391
|
+
else
|
392
|
+
it "should return array of interpolation values" do
|
393
|
+
before = '1900-01-01'
|
394
|
+
configure_validator(:type => :date, :before => before)
|
395
|
+
validator.send(:interpolation_values, :before, before.to_date).should == [before]
|
396
|
+
end
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
366
400
|
describe "restriction errors" do
|
367
401
|
before :each do
|
368
402
|
configure_validator(:type => :date, :before => lambda { raise })
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validates_timeliness
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Meehan
|
@@ -9,7 +9,7 @@ autorequire: validates_timeliness
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-01-
|
12
|
+
date: 2009-01-12 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|