validates_timeliness 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +12 -3
- data/README.rdoc +54 -45
- data/Rakefile +5 -9
- data/TODO +3 -0
- data/lib/validates_timeliness.rb +6 -6
- data/lib/validates_timeliness/action_view/instance_tag.rb +27 -23
- data/lib/validates_timeliness/active_record/attribute_methods.rb +5 -3
- data/lib/validates_timeliness/active_record/multiparameter_attributes.rb +7 -8
- data/lib/validates_timeliness/formats.rb +55 -56
- data/lib/validates_timeliness/locale/en.yml +1 -1
- data/lib/validates_timeliness/spec/rails/matchers/validate_timeliness.rb +38 -39
- data/lib/validates_timeliness/validator.rb +31 -34
- data/lib/validates_timeliness/version.rb +1 -1
- data/spec/action_view/instance_tag_spec.rb +177 -25
- data/spec/active_record/attribute_methods_spec.rb +18 -16
- data/spec/active_record/multiparameter_attributes_spec.rb +90 -24
- data/spec/formats_spec.rb +67 -55
- data/spec/ginger_scenarios.rb +3 -3
- data/spec/spec/rails/matchers/validate_timeliness_spec.rb +52 -52
- data/spec/spec_helper.rb +3 -1
- data/spec/validator_spec.rb +88 -25
- metadata +19 -19
data/CHANGELOG
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
+
= 2.3.0 [2010-02-04]
|
2
|
+
- Backwards incompatible change to :equal_to option. Fixed error message clash with :equal_to option which exists in Rails already. Option is now :is_at.
|
3
|
+
- Fixed I18n support so it returns missing translation message instead of error
|
4
|
+
- Fixed attribute method bug. Write method was bypassed when method was first generated and used Rails default parser.
|
5
|
+
- Fixed date/time selects when using enable_datetime_select_extension! when some values empty
|
6
|
+
- Fixed ISO8601 datetime format which is now split into two formats
|
7
|
+
- Changed I18n error value format to fallback to global default if missing in locale
|
8
|
+
- Refactored date/time select invalid value extension to use param values. Functionality will be extracted from plugin for v3.
|
9
|
+
|
1
10
|
= 2.2.2 [2009-09-19]
|
2
|
-
- Fixed dummy_time using make_time to respect timezone. Fixes 1.9.1 bug.
|
11
|
+
- Fixed dummy_time using make_time to respect timezone. Fixes 1.9.1 bug.
|
3
12
|
|
4
13
|
= 2.2.1 [2009-09-12]
|
5
14
|
- Fixed dummy date part for time types in Validator.type_cast_value
|
@@ -8,7 +17,7 @@
|
|
8
17
|
= 2.2.0 [2009-09-12]
|
9
18
|
- Ruby 1.9 support!
|
10
19
|
- Customise dummy date values for time types. See DUMMY DATE FOR TIME TYPES.
|
11
|
-
- Fixed matcher conflict with Shoulda. Load plugin matcher manually now see matcher section in README
|
20
|
+
- Fixed matcher conflict with Shoulda. Load plugin matcher manually now see matcher section in README
|
12
21
|
- Fixed :ignore_usec when used with :with_time or :with_date
|
13
22
|
- Some clean up and refactoring
|
14
23
|
|
@@ -65,7 +74,7 @@
|
|
65
74
|
- Added Rails 2.2 i18n support. Plugin error messages can specified in locale files. See README.
|
66
75
|
- ignore_datetime_restriction_errors setting has been moved from AR to ValidatesTimeliness::Validator.ignore_restriction_errors
|
67
76
|
- date_time_error_value_formats setting has been moved from AR to ValidatesTimeliness::Validator.error_value_formats
|
68
|
-
- Namespaced modules and specs
|
77
|
+
- Namespaced modules and specs
|
69
78
|
- Clean up of specs
|
70
79
|
- fixed a few bugs
|
71
80
|
- accessor methods not generating properly due method name stored as symbol in generated_attributes which fails on lookup
|
data/README.rdoc
CHANGED
@@ -5,10 +5,10 @@
|
|
5
5
|
|
6
6
|
== DESCRIPTION:
|
7
7
|
|
8
|
-
Validate dates, times and datetimes for Rails 2.x. Plays nicely with
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
Validate dates, times and datetimes for Rails 2.x. Plays nicely with Rails
|
9
|
+
automatic timezone handling. Allows you to add custom formats or remove defaults
|
10
|
+
easily. This allows you to control what you think should be a valid date or
|
11
|
+
time string.
|
12
12
|
|
13
13
|
|
14
14
|
== FEATURES:
|
@@ -46,24 +46,24 @@ As gem
|
|
46
46
|
|
47
47
|
== USAGE:
|
48
48
|
|
49
|
-
To validate a model with a date, time or datetime attribute you just use the
|
49
|
+
To validate a model with a date, time or datetime attribute you just use the
|
50
50
|
validation method
|
51
51
|
|
52
52
|
class Person < ActiveRecord::Base
|
53
53
|
validates_date :date_of_birth
|
54
54
|
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
The list of validation methods available are as follows:
|
58
58
|
validates_date - validate value as date
|
59
59
|
validates_time - validate value as time only i.e. '12:20pm'
|
60
60
|
validates_datetime - validate value as a full date and time
|
61
|
-
|
61
|
+
|
62
62
|
The validation methods take the usual options plus some specific ones to restrict
|
63
63
|
the valid range of dates or times allowed
|
64
64
|
|
65
65
|
Temporal options (or restrictions):
|
66
|
-
:
|
66
|
+
:is_at - Attribute must be equal to value to be valid
|
67
67
|
:before - Attribute must be before this value to be valid
|
68
68
|
:on_or_before - Attribute must be equal to or before this value to be valid
|
69
69
|
:after - Attribute must be after this value to be valid
|
@@ -78,15 +78,15 @@ Regular validation options:
|
|
78
78
|
|
79
79
|
Special options:
|
80
80
|
:with_time - Validate a date attribute value combined with a time value against any temporal restrictions
|
81
|
-
:with_date - Validate a time attribute value combined with a date value against any temporal restrictions
|
81
|
+
:with_date - Validate a time attribute value combined with a date value against any temporal restrictions
|
82
82
|
:ignore_usec - Ignores microsecond value on datetime restrictions
|
83
83
|
:format - Limit validation to a single format for special cases. Takes plugin format value.
|
84
|
-
|
84
|
+
|
85
85
|
Message options: - Use these to override the default error messages
|
86
86
|
:invalid_date_message
|
87
87
|
:invalid_time_message
|
88
88
|
:invalid_datetime_message
|
89
|
-
:
|
89
|
+
:is_at_message
|
90
90
|
:before_message
|
91
91
|
:on_or_before_message
|
92
92
|
:after_message
|
@@ -99,7 +99,7 @@ The temporal restrictions, with_date and with_time can take 4 different value ty
|
|
99
99
|
* Proc or lambda object which may take an optional parameter being the record object
|
100
100
|
* A symbol matching the method name in the model
|
101
101
|
|
102
|
-
When an attribute value is compared to temporal restrictions, they are compared as
|
102
|
+
When an attribute value is compared to temporal restrictions, they are compared as
|
103
103
|
the same type as the validation method type. So using validates_date means all
|
104
104
|
values are compared as dates. This is except in the case of with_time and with_date
|
105
105
|
options which effectively force the value to validated as a datetime against the
|
@@ -109,7 +109,7 @@ temporal options.
|
|
109
109
|
|
110
110
|
validates_date :date_of_birth :before => lambda { 18.years.ago },
|
111
111
|
:before_message => "must be at least 18 years old"
|
112
|
-
|
112
|
+
|
113
113
|
validates_time :breakfast_time, :on_or_after => '6:00am',
|
114
114
|
:on_or_after_message => 'must be after opening time',
|
115
115
|
:before => :second_breakfast_time,
|
@@ -118,16 +118,16 @@ temporal options.
|
|
118
118
|
validates_datetime :appointment_date, :before => lambda { 1.week.from_now }
|
119
119
|
|
120
120
|
validates_date :entry_date, :with_time => '17:00', :on_or_before => :competition_closing
|
121
|
-
|
121
|
+
|
122
122
|
|
123
123
|
=== DATE/TIME FORMATS:
|
124
124
|
|
125
|
-
So what formats does the plugin allow. Well there are default formats which can
|
126
|
-
be added to easily using the plugins format rules. Also formats can be easily
|
127
|
-
removed without hacking the plugin at all.
|
125
|
+
So what formats does the plugin allow. Well there are default formats which can
|
126
|
+
be added to easily using the plugins format rules. Also formats can be easily
|
127
|
+
removed without hacking the plugin at all.
|
128
128
|
|
129
|
-
Below are the default formats. If you think they are easy to read then you will
|
130
|
-
be happy to know that is exactly the format you can use to define your own if
|
129
|
+
Below are the default formats. If you think they are easy to read then you will
|
130
|
+
be happy to know that is exactly the format you can use to define your own if
|
131
131
|
you want. No complex regular expressions or duck punching (monkey patching) the
|
132
132
|
plugin is needed.
|
133
133
|
|
@@ -165,13 +165,14 @@ NOTE: To use non-US date formats see US/EURO FORMATS section
|
|
165
165
|
yyyy-mm-dd hh:nn:ss
|
166
166
|
yyyy-mm-dd h:nn
|
167
167
|
ddd mmm d hh:nn:ss zo yyyy # Ruby time string
|
168
|
-
yyyy-mm-ddThh:nn:
|
168
|
+
yyyy-mm-ddThh:nn:ssZ # ISO 8601 without zone offset
|
169
|
+
yyyy-mm-ddThh:nn:sszo # ISO 8601 with zone offset
|
169
170
|
|
170
171
|
NOTE: To use non-US date formats see US/EURO FORMATS section
|
171
172
|
|
172
173
|
Here is what each format token means:
|
173
174
|
|
174
|
-
Format tokens:
|
175
|
+
Format tokens:
|
175
176
|
y = year
|
176
177
|
m = month
|
177
178
|
d = day
|
@@ -184,10 +185,10 @@ Here is what each format token means:
|
|
184
185
|
tz = Timezone abbreviation (e.g. UTC, GMT, PST, EST)
|
185
186
|
zo = Timezone offset (e.g. +10:00, -08:00, +1000)
|
186
187
|
|
187
|
-
Repeating tokens:
|
188
|
+
Repeating tokens:
|
188
189
|
x = 1 or 2 digits for unit (e.g. 'h' means an hour can be '9' or '09')
|
189
190
|
xx = 2 digits exactly for unit (e.g. 'hh' means an hour can only be '09')
|
190
|
-
|
191
|
+
|
191
192
|
Special Cases:
|
192
193
|
yy = 2 or 4 digit year
|
193
194
|
yyyy = exactly 4 digit year
|
@@ -195,9 +196,9 @@ Here is what each format token means:
|
|
195
196
|
ddd = Day name of 3 to 9 letters (e.g. Wed or Wednesday)
|
196
197
|
u = microseconds matches 1 to 3 digits
|
197
198
|
|
198
|
-
All other characters are considered literal. For the technically minded
|
199
|
-
(well you are developers), these formats are compiled into regular expressions
|
200
|
-
at runtime so don't add any extra overhead than using regular expressions
|
199
|
+
All other characters are considered literal. For the technically minded
|
200
|
+
(well you are developers), these formats are compiled into regular expressions
|
201
|
+
at runtime so don't add any extra overhead than using regular expressions
|
201
202
|
directly. So, no, it won't make your app slow!
|
202
203
|
|
203
204
|
To see all defined formats look in lib/validates_timeliness/formats.rb.
|
@@ -208,18 +209,18 @@ The perenial problem for non-US developers or applications not primarily for the
|
|
208
209
|
US, is the US date format of m/d/yy. This is ambiguous with the European format
|
209
210
|
of d/m/yy. By default the plugin uses the US formats as this is the Ruby default
|
210
211
|
when it does date interpretation, and is in keeping PoLS (principle of least
|
211
|
-
surprise).
|
212
|
+
surprise).
|
212
213
|
|
213
214
|
To switch to using the European (or Rest of The World) formats put this in an
|
214
215
|
initializer or environment.rb
|
215
216
|
|
216
|
-
ValidatesTimeliness::Formats.remove_us_formats
|
217
|
+
ValidatesTimeliness::Formats.remove_us_formats
|
217
218
|
|
218
219
|
Now '01/02/2000' will be parsed as 1st February 2000, instead of 2nd January 2000.
|
219
220
|
|
220
221
|
=== CUSTOMISING FORMATS:
|
221
222
|
|
222
|
-
I hear you say "Thats greats but I don't want X format to be valid". Well to
|
223
|
+
I hear you say "Thats greats but I don't want X format to be valid". Well to
|
223
224
|
remove a format stick this in an initializer file
|
224
225
|
|
225
226
|
ValidatesTimeliness::Formats.remove_formats(:date, 'm\d\yy')
|
@@ -233,15 +234,15 @@ Ahh, then add it yourself. Again stick this in an initializer file
|
|
233
234
|
|
234
235
|
Now "10 o'clock" will be a valid value. So easy, no more whingeing!
|
235
236
|
|
236
|
-
You can embed regular expressions in the format but no gurantees that it will
|
237
|
-
remain intact. If you avoid the use of any token characters and regexp dots or
|
238
|
-
backslashes as special characters in the regexp, it may well work as expected.
|
239
|
-
For special characters use POSIX character classes for safety. See the ISO 8601
|
237
|
+
You can embed regular expressions in the format but no gurantees that it will
|
238
|
+
remain intact. If you avoid the use of any token characters and regexp dots or
|
239
|
+
backslashes as special characters in the regexp, it may well work as expected.
|
240
|
+
For special characters use POSIX character classes for safety. See the ISO 8601
|
240
241
|
datetime for an example of an embedded regular expression.
|
241
242
|
|
242
|
-
Because formats are evaluated in order, adding a format which may be ambiguous
|
243
|
+
Because formats are evaluated in order, adding a format which may be ambiguous
|
243
244
|
with an existing format, will mean your format is ignored. If you need to make
|
244
|
-
your new format higher precedence than an existing format, you can include the
|
245
|
+
your new format higher precedence than an existing format, you can include the
|
245
246
|
before option like so
|
246
247
|
|
247
248
|
ValidatesTimeliness::Formats.add_formats(:time, 'ss:nn:hh', :before => 'hh:nn:ss')
|
@@ -279,7 +280,7 @@ The value should be an array of 3 values being year, month and day in that order
|
|
279
280
|
|
280
281
|
When using the validation temporal restrictions there are times when the restriction
|
281
282
|
value itself may be invalid. Normally this will add an error to the model such as
|
282
|
-
'restriction :before value was invalid'. These can be annoying if you are using
|
283
|
+
'restriction :before value was invalid'. These can be annoying if you are using
|
283
284
|
procs or methods as restrictions and don't care if they don't evaluate properly
|
284
285
|
and you want the validation to complete. In these situations you turn them off.
|
285
286
|
|
@@ -288,8 +289,8 @@ To turn them off:
|
|
288
289
|
ValidatesTimeliness::Validator.ignore_restriction_errors = true
|
289
290
|
|
290
291
|
A word of warning though, as this may hide issues with the model and make those
|
291
|
-
corner cases a little harder to test. In general if you are using procs or
|
292
|
-
model methods and you only care when they return a value, then they should
|
292
|
+
corner cases a little harder to test. In general if you are using procs or
|
293
|
+
model methods and you only care when they return a value, then they should
|
293
294
|
return nil in all other situations. Restrictions are skipped if they are nil.
|
294
295
|
|
295
296
|
|
@@ -305,10 +306,11 @@ To activate it, put this in an initializer:
|
|
305
306
|
|
306
307
|
ValidatesTimeliness.enable_datetime_select_extension!
|
307
308
|
|
309
|
+
This will be removed from v3 as it adds too little to maintain.
|
308
310
|
|
309
311
|
=== OTHER CUSTOMISATION:
|
310
312
|
|
311
|
-
The error messages for each temporal restrictions can also be globally overridden by
|
313
|
+
The error messages for each temporal restrictions can also be globally overridden by
|
312
314
|
updating the default AR error messages like so
|
313
315
|
|
314
316
|
For Rails 2.0/2.1:
|
@@ -317,6 +319,7 @@ For Rails 2.0/2.1:
|
|
317
319
|
:invalid_date => "is not a valid date",
|
318
320
|
:invalid_time => "is not a valid time",
|
319
321
|
:invalid_datetime => "is not a valid datetime",
|
322
|
+
:is_at => "must be at %s",
|
320
323
|
:before => "must be before %s",
|
321
324
|
:on_or_before => "must be on or before %s",
|
322
325
|
:after => "must be after %s",
|
@@ -332,8 +335,14 @@ Rails 2.2+ using the I18n system to define new defaults:
|
|
332
335
|
activerecord:
|
333
336
|
errors:
|
334
337
|
messages:
|
335
|
-
|
336
|
-
|
338
|
+
invalid_date: "is not a valid date"
|
339
|
+
invalid_time: "is not a valid time"
|
340
|
+
invalid_datetime: "is not a valid datetime"
|
341
|
+
is_at: "must be at {{restriction}}"
|
342
|
+
before: "must be before {{restriction}}"
|
343
|
+
on_or_before: "must be on or before {{restriction}}"
|
344
|
+
after: "must be after {{restriction}}"
|
345
|
+
on_or_after: "must be on or after {{restriction}}"
|
337
346
|
between: "must be between {{earliest}} and {{latest}}"
|
338
347
|
|
339
348
|
The {{restriction}} signifies where the interpolation value for the restriction
|
@@ -364,9 +373,9 @@ Those are Ruby strftime formats not the plugin formats.
|
|
364
373
|
=== RSPEC MATCHER:
|
365
374
|
|
366
375
|
To sweeten the deal that little bit more, you have an Rspec matcher available for
|
367
|
-
you model specs. Now you can easily test the validations you have just written
|
368
|
-
with the plugin or better yet *before* you write them! You just use the
|
369
|
-
validation options you want as you would with the validation method. Those
|
376
|
+
you model specs. Now you can easily test the validations you have just written
|
377
|
+
with the plugin or better yet *before* you write them! You just use the
|
378
|
+
validation options you want as you would with the validation method. Those
|
370
379
|
options are then verified and reported if they fail.
|
371
380
|
|
372
381
|
First require it in your spec_helper.rb
|
@@ -391,4 +400,4 @@ The matcher names are just the singular of the validation methods.
|
|
391
400
|
|
392
401
|
== LICENSE:
|
393
402
|
|
394
|
-
Copyright (c) 2008 Adam Meehan, released under the MIT license
|
403
|
+
Copyright (c) 2008-2010 Adam Meehan, released under the MIT license
|
data/Rakefile
CHANGED
@@ -7,10 +7,6 @@ require 'lib/validates_timeliness/version'
|
|
7
7
|
|
8
8
|
GEM = "validates_timeliness"
|
9
9
|
GEM_VERSION = ValidatesTimeliness::VERSION
|
10
|
-
AUTHOR = "Adam Meehan"
|
11
|
-
EMAIL = "adam.meehan@gmail.com"
|
12
|
-
HOMEPAGE = "http://github.com/adzap/validates_timeliness"
|
13
|
-
SUMMARY = "Date and time validation plugin for Rails 2.x which allows custom formats"
|
14
10
|
|
15
11
|
spec = Gem::Specification.new do |s|
|
16
12
|
s.name = GEM
|
@@ -19,12 +15,12 @@ spec = Gem::Specification.new do |s|
|
|
19
15
|
s.rubyforge_project = "validatestime"
|
20
16
|
s.has_rdoc = true
|
21
17
|
s.extra_rdoc_files = ["README.rdoc", "LICENSE", "TODO", "CHANGELOG"]
|
22
|
-
s.summary =
|
18
|
+
s.summary = "Date and time validation plugin for Rails 2.x which allows custom formats"
|
23
19
|
s.description = s.summary
|
24
|
-
s.author =
|
25
|
-
s.email =
|
26
|
-
s.homepage =
|
27
|
-
|
20
|
+
s.author = "Adam Meehan"
|
21
|
+
s.email = "adam.meehan@gmail.com"
|
22
|
+
s.homepage = "http://github.com/adzap/validates_timeliness"
|
23
|
+
|
28
24
|
s.require_path = 'lib'
|
29
25
|
s.autorequire = GEM
|
30
26
|
s.files = %w(LICENSE README.rdoc Rakefile TODO CHANGELOG) + Dir.glob("{lib,spec}/**/*")
|
data/TODO
CHANGED
data/lib/validates_timeliness.rb
CHANGED
@@ -8,9 +8,9 @@ require 'validates_timeliness/active_record/multiparameter_attributes'
|
|
8
8
|
require 'validates_timeliness/action_view/instance_tag'
|
9
9
|
|
10
10
|
module ValidatesTimeliness
|
11
|
-
|
11
|
+
|
12
12
|
mattr_accessor :default_timezone
|
13
|
-
self.default_timezone = :utc
|
13
|
+
self.default_timezone = :utc
|
14
14
|
|
15
15
|
mattr_accessor :use_time_zones
|
16
16
|
self.use_time_zones = false
|
@@ -25,18 +25,18 @@ module ValidatesTimeliness
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def load_error_messages
|
28
|
+
defaults = YAML::load(IO.read(LOCALE_PATH))['en']
|
29
|
+
ValidatesTimeliness::Validator.error_value_formats = defaults['validates_timeliness']['error_value_formats'].symbolize_keys
|
30
|
+
|
28
31
|
if defined?(I18n)
|
29
32
|
I18n.load_path.unshift(LOCALE_PATH)
|
30
33
|
I18n.reload!
|
31
34
|
else
|
32
|
-
defaults = YAML::load(IO.read(LOCALE_PATH))['en']
|
33
35
|
errors = defaults['activerecord']['errors']['messages'].inject({}) {|h,(k,v)| h[k.to_sym] = v.gsub(/\{\{\w*\}\}/, '%s');h }
|
34
36
|
::ActiveRecord::Errors.default_error_messages.update(errors)
|
35
|
-
|
36
|
-
ValidatesTimeliness::Validator.error_value_formats = defaults['validates_timeliness']['error_value_formats'].symbolize_keys
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def setup_for_rails
|
41
41
|
self.default_timezone = ::ActiveRecord::Base.default_timezone
|
42
42
|
self.use_time_zones = ::ActiveRecord::Base.time_zone_aware_attributes rescue false
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# TODO remove this from the plugin for v3.
|
1
2
|
module ValidatesTimeliness
|
2
3
|
|
3
4
|
def self.enable_datetime_select_invalid_value_extension!
|
@@ -6,43 +7,46 @@ module ValidatesTimeliness
|
|
6
7
|
|
7
8
|
module ActionView
|
8
9
|
|
9
|
-
# Intercepts the date and time select helpers to
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
|
10
|
+
# Intercepts the date and time select helpers to reuse the values from the
|
11
|
+
# the params rather than the parsed value. This allows invalid date/time
|
12
|
+
# values to be redisplayed instead of blanks to aid correction by the user.
|
13
|
+
# Its a minor usability improvement which is rarely an issue for the user.
|
14
|
+
#
|
15
|
+
module InstanceTag
|
16
|
+
|
15
17
|
def self.included(base)
|
16
|
-
selector_method = Rails::VERSION::STRING <
|
18
|
+
selector_method = Rails::VERSION::STRING.to_f < 2.2 ? :date_or_time_select : :datetime_selector
|
17
19
|
base.class_eval do
|
18
20
|
alias_method :datetime_selector_without_timeliness, selector_method
|
19
21
|
alias_method selector_method, :datetime_selector_with_timeliness
|
20
22
|
end
|
21
23
|
base.alias_method_chain :value, :timeliness
|
22
24
|
end
|
23
|
-
|
24
|
-
TimelinessDateTime = Struct.new(:year, :month, :day, :hour, :min, :sec)
|
25
|
-
|
25
|
+
|
26
|
+
TimelinessDateTime = Struct.new(:year, :month, :day, :hour, :min, :sec)
|
27
|
+
|
26
28
|
def datetime_selector_with_timeliness(*args)
|
27
29
|
@timeliness_date_or_time_tag = true
|
28
30
|
datetime_selector_without_timeliness(*args)
|
29
31
|
end
|
30
|
-
|
32
|
+
|
31
33
|
def value_with_timeliness(object)
|
32
|
-
|
33
|
-
|
34
|
-
raw_value = value_before_type_cast(object)
|
35
|
-
|
36
|
-
if raw_value.nil? || raw_value.acts_like?(:time) || raw_value.is_a?(Date)
|
34
|
+
unless @timeliness_date_or_time_tag && @template_object.params[@object_name]
|
37
35
|
return value_without_timeliness(object)
|
38
36
|
end
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
37
|
+
|
38
|
+
pairs = @template_object.params[@object_name].select {|k,v| k =~ /^#{@method_name}\(/ }
|
39
|
+
return value_without_timeliness(object) if pairs.empty?
|
40
|
+
|
41
|
+
values = pairs.map do |(param, value)|
|
42
|
+
position = param.scan(/\(([0-9]*).*\)/).first.first
|
43
|
+
[position, value]
|
44
|
+
end.sort {|a,b| a[0] <=> b[0] }.map {|v| v[1] }
|
45
|
+
|
46
|
+
TimelinessDateTime.new(*values)
|
47
|
+
end
|
48
|
+
|
45
49
|
end
|
46
50
|
|
47
|
-
end
|
51
|
+
end
|
48
52
|
end
|
@@ -51,15 +51,17 @@ module ValidatesTimeliness
|
|
51
51
|
if [:date, :time, :datetime].include?(column.type)
|
52
52
|
time_zone_aware = create_time_zone_conversion_attribute?(name, column) rescue false
|
53
53
|
|
54
|
-
|
54
|
+
method_name = "#{name}="
|
55
|
+
define_method(method_name) do |value|
|
55
56
|
write_date_time_attribute(name, value, column.type, time_zone_aware)
|
56
57
|
end
|
57
|
-
timeliness_methods <<
|
58
|
+
timeliness_methods << method_name
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
61
62
|
define_attribute_methods_without_timeliness
|
62
|
-
|
63
|
+
# add generated methods which is a Set object hence no += method
|
64
|
+
timeliness_methods.each {|attr| generated_methods << attr }
|
63
65
|
end
|
64
66
|
|
65
67
|
end
|