validates_timeliness 1.1.1 → 1.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/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
|
|