mirror of
https://github.com/ditkrg/validates_timeliness.git
synced 2026-01-22 22:06:45 +00:00
Convert README to markdown
Also: - Highlight syntax - Change http to https - Update License - Fix default value of today (Date.current)
This commit is contained in:
parent
f25ab5671c
commit
af3e6ff774
2
LICENSE
2
LICENSE
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2008-2010 Adam Meehan
|
Copyright (c) 2008-2021 Adam Meehan
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
|
|||||||
353
README.md
Normal file
353
README.md
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
# ValidatesTimeliness [](https://travis-ci.org/adzap/validates_timeliness)
|
||||||
|
|
||||||
|
* Source: https://github.com/adzap/validates_timeliness
|
||||||
|
* Issues: https://github.com/adzap/validates_timeliness/issues
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Complete validation of dates, times and datetimes for Rails 5.x, 6.x, and
|
||||||
|
ActiveModel.
|
||||||
|
|
||||||
|
If you a looking for the old version for Rails 4.x go here
|
||||||
|
[https://github.com/adzap/validates_timeliness/tree/4-0-stable].
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* Adds validation for dates, times and datetimes to ActiveModel
|
||||||
|
* Handles timezones and type casting of values for you
|
||||||
|
* Only Rails date/time validation plugin offering complete validation (See
|
||||||
|
ORM/ODM support)
|
||||||
|
* Uses extensible date/time parser (Using [timeliness
|
||||||
|
gem](https://github.com/adzap/timeliness). See Plugin Parser)
|
||||||
|
* Adds extensions to fix Rails date/time select issues (See Extensions)
|
||||||
|
* Supports I18n for the error messages. For multi-language support try
|
||||||
|
[timeliness-i18n gem](https://github.com/pedrofurtado/timeliness-i18n).
|
||||||
|
* Supports all the Rubies (that any sane person would be using in
|
||||||
|
production).
|
||||||
|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```
|
||||||
|
# in Gemfile
|
||||||
|
gem 'validates_timeliness', '~> 5.0.0.beta1'
|
||||||
|
|
||||||
|
# Run bundler
|
||||||
|
$ bundle install
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ rails generate validates_timeliness:install
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates configuration initializer and locale files. In the initializer,
|
||||||
|
there are a number of config options to customize the plugin.
|
||||||
|
|
||||||
|
NOTE: You may wish to enable the plugin parser and the extensions to start.
|
||||||
|
Please read those sections first.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
validates_datetime :occurred_at
|
||||||
|
|
||||||
|
validates_date :date_of_birth, before: lambda { 18.years.ago },
|
||||||
|
before_message: "must be at least 18 years old"
|
||||||
|
|
||||||
|
validates_datetime :finish_time, after: :start_time # Method symbol
|
||||||
|
|
||||||
|
validates_date :booked_at, on: :create, on_or_after: :today # See Restriction Shorthand.
|
||||||
|
|
||||||
|
validates_time :booked_at, between: ['9:00am', '5:00pm'] # On or after 9:00AM and on or before 5:00PM
|
||||||
|
validates_time :booked_at, between: '9:00am'..'5:00pm' # The same as previous example
|
||||||
|
validates_time :booked_at, between: '9:00am'...'5:00pm' # On or after 9:00AM and strictly before 5:00PM
|
||||||
|
|
||||||
|
validates_time :breakfast_time, on_or_after: '6:00am',
|
||||||
|
on_or_after_message: 'must be after opening time',
|
||||||
|
before: :lunchtime,
|
||||||
|
before_message: 'must be before lunch time'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
To validate a model with a date, time or datetime attribute you just use the
|
||||||
|
validation method
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class Person < ActiveRecord::Base
|
||||||
|
validates_date :date_of_birth, on_or_before: lambda { Date.current }
|
||||||
|
# or
|
||||||
|
validates :date_of_birth, timeliness: { on_or_before: lambda { Date.current }, type: :date }
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
or even on a specific record, per ActiveModel API.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
@person.validates_date :date_of_birth, on_or_before: lambda { Date.current }
|
||||||
|
```
|
||||||
|
|
||||||
|
The list of validation methods available are as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
validates_date - validate value as date
|
||||||
|
validates_time - validate value as time only i.e. '12:20pm'
|
||||||
|
validates_datetime - validate value as a full date and time
|
||||||
|
validates - use the :timeliness key and set the type in the hash.
|
||||||
|
```
|
||||||
|
|
||||||
|
The validation methods take the usual options plus some specific ones to
|
||||||
|
restrict the valid range of dates or times allowed
|
||||||
|
|
||||||
|
Temporal options (or restrictions):
|
||||||
|
|
||||||
|
```
|
||||||
|
:is_at - Attribute must be equal to value to be valid
|
||||||
|
:before - Attribute must be before this value to be valid
|
||||||
|
:on_or_before - Attribute must be equal to or before this value to be valid
|
||||||
|
:after - Attribute must be after this value to be valid
|
||||||
|
:on_or_after - Attribute must be equal to or after this value to be valid
|
||||||
|
:between - Attribute must be between the values to be valid. Range or Array of 2 values.
|
||||||
|
```
|
||||||
|
|
||||||
|
Regular validation options:
|
||||||
|
|
||||||
|
```
|
||||||
|
:allow_nil - Allow a nil value to be valid
|
||||||
|
:allow_blank - Allows a nil or empty string value to be valid
|
||||||
|
:if - Execute validation when :if evaluates true
|
||||||
|
:unless - Execute validation when :unless evaluates false
|
||||||
|
:on - Specify validation context e.g :save, :create or :update. Default is :save.
|
||||||
|
```
|
||||||
|
|
||||||
|
Special options:
|
||||||
|
|
||||||
|
```
|
||||||
|
:ignore_usec - Ignores microsecond value on datetime restrictions
|
||||||
|
:format - Limit validation to a single format for special cases. Requires plugin parser.
|
||||||
|
```
|
||||||
|
|
||||||
|
The temporal restrictions can take 4 different value types:
|
||||||
|
|
||||||
|
* Date, Time, or DateTime object value
|
||||||
|
* Proc or lambda object which may take an optional parameter, being the
|
||||||
|
record object
|
||||||
|
* A symbol matching a method name in the model
|
||||||
|
* String value
|
||||||
|
|
||||||
|
|
||||||
|
When an attribute value is compared to temporal restrictions, they are
|
||||||
|
compared as the same type as the validation method type. So using
|
||||||
|
validates_date means all values are compared as dates.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### ORM/ODM Support
|
||||||
|
|
||||||
|
The plugin adds date/time validation to ActiveModel for any ORM/ODM that
|
||||||
|
supports the ActiveModel validations component. However, there is an issue
|
||||||
|
with most ORM/ODMs which does not allow 100% date/time validation by default.
|
||||||
|
Specifically, when you assign an invalid date/time value to an attribute, most
|
||||||
|
ORM/ODMs will only store a nil value for the attribute. This causes an issue
|
||||||
|
for date/time validation, since we need to know that a value was assigned but
|
||||||
|
was invalid. To fix this, we need to cache the original invalid value to know
|
||||||
|
that the attribute is not just nil.
|
||||||
|
|
||||||
|
Each ORM/ODM requires a specific shim to fix it. The plugin includes a shim
|
||||||
|
for ActiveRecord and Mongoid. You can activate them like so
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
ValidatesTimeliness.setup do |config|
|
||||||
|
# Extend ORM/ODMs for full support (:active_record).
|
||||||
|
config.extend_orms = [ :active_record ]
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
By default the plugin extends ActiveRecord if loaded. If you wish to extend
|
||||||
|
another ORM then look at the [wiki
|
||||||
|
page](https://github.com/adzap/validates_timeliness/wiki/ORM-Support) for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
It is not required that you use a shim, but you will not catch errors when the
|
||||||
|
attribute value is invalid and evaluated to nil.
|
||||||
|
|
||||||
|
### Error Messages
|
||||||
|
|
||||||
|
Using the I18n system to define new defaults:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
en:
|
||||||
|
errors:
|
||||||
|
messages:
|
||||||
|
invalid_date: "is not a valid date"
|
||||||
|
invalid_time: "is not a valid time"
|
||||||
|
invalid_datetime: "is not a valid datetime"
|
||||||
|
is_at: "must be at %{restriction}"
|
||||||
|
before: "must be before %{restriction}"
|
||||||
|
on_or_before: "must be on or before %{restriction}"
|
||||||
|
after: "must be after %{restriction}"
|
||||||
|
on_or_after: "must be on or after %{restriction}"
|
||||||
|
```
|
||||||
|
|
||||||
|
The `%{restriction}` signifies where the interpolation value for the restriction
|
||||||
|
will be inserted.
|
||||||
|
|
||||||
|
You can also use validation options for custom error messages. The following
|
||||||
|
option keys are available:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
:invalid_date_message
|
||||||
|
:invalid_time_message
|
||||||
|
:invalid_datetime_message
|
||||||
|
:is_at_message
|
||||||
|
:before_message
|
||||||
|
:on_or_before_message
|
||||||
|
:after_message
|
||||||
|
:on_or_after_message
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: There is no `:between_message` option. The between error message should be
|
||||||
|
defined using the `:on_or_after` and `:on_or_before` (`:before` in case when
|
||||||
|
`:between` argument is a Range with excluded high value, see Examples) messages.
|
||||||
|
|
||||||
|
It is highly recommended you use the I18n system for error messages.
|
||||||
|
|
||||||
|
### Plugin Parser
|
||||||
|
|
||||||
|
The plugin uses the [timeliness gem](https://github.com/adzap/timeliness) as a
|
||||||
|
fast, configurable and extensible date and time parser. You can add or remove
|
||||||
|
valid formats for dates, times, and datetimes. It is also more strict than the
|
||||||
|
Ruby parser, which means it won't accept day of the month if it's not a valid
|
||||||
|
number for the month.
|
||||||
|
|
||||||
|
By default the parser is disabled. To enable it:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in the setup block
|
||||||
|
config.use_plugin_parser = true
|
||||||
|
```
|
||||||
|
|
||||||
|
Enabling the parser will mean that strings assigned to attributes validated
|
||||||
|
with the plugin will be parsed using the gem. See the
|
||||||
|
[wiki](https://github.com/adzap/validates_timeliness/wiki/Plugin-Parser) for
|
||||||
|
more details about the parser configuration.
|
||||||
|
|
||||||
|
### Restriction Shorthand
|
||||||
|
|
||||||
|
It is common to restrict an attribute to being on or before the current time
|
||||||
|
or current day. To specify this you need to use a lambda as an option value
|
||||||
|
e.g. `lambda { Time.current }`. This can be tedious noise amongst your
|
||||||
|
validations for something so common. To combat this the plugin allows you to
|
||||||
|
use shorthand symbols for often used relative times or dates.
|
||||||
|
|
||||||
|
Just provide the symbol as the option value like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
validates_date :birth_date, on_or_before: :today
|
||||||
|
```
|
||||||
|
|
||||||
|
The `:today` symbol is evaluated as `lambda { Date.current }`. The `:now` and
|
||||||
|
`:today` symbols are pre-configured. Configure your own like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in the setup block
|
||||||
|
config.restriction_shorthand_symbols.update(
|
||||||
|
yesterday: lambda { 1.day.ago }
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Default Timezone
|
||||||
|
|
||||||
|
The plugin needs to know the default timezone you are using when parsing or
|
||||||
|
type casting values. If you are using ActiveRecord then the default is
|
||||||
|
automatically set to the same default zone as ActiveRecord. If you are using
|
||||||
|
another ORM you may need to change this setting.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in the setup block
|
||||||
|
config.default_timezone = :utc
|
||||||
|
```
|
||||||
|
|
||||||
|
By default it will be UTC if ActiveRecord is not loaded.
|
||||||
|
|
||||||
|
### Dummy Date For Time Types
|
||||||
|
|
||||||
|
Given that Ruby has no support for a time-only type, all time type columns are
|
||||||
|
evaluated as a regular Time class objects with a dummy date value set. Rails
|
||||||
|
defines the dummy date as 2000-01-01. So a time of '12:30' is evaluated as a
|
||||||
|
Time value of '2000-01-01 12:30'. If you need to customize this for some
|
||||||
|
reason you can do so as follows
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in the setup block
|
||||||
|
config.dummy_date_for_time_type = [2009, 1, 1]
|
||||||
|
```
|
||||||
|
|
||||||
|
The value should be an array of 3 values being year, month and day in that
|
||||||
|
order.
|
||||||
|
|
||||||
|
### Temporal Restriction Errors
|
||||||
|
|
||||||
|
When using the validation temporal restrictions there are times when the
|
||||||
|
restriction option value itself may be invalid. This will add an error to the
|
||||||
|
model such as 'Error occurred validating birth_date for :before restriction'.
|
||||||
|
These can be annoying in development or production as you most likely just
|
||||||
|
want to skip the option if no valid value was returned. By default these
|
||||||
|
errors are displayed in Rails test mode.
|
||||||
|
|
||||||
|
To turn them on/off:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in the setup block
|
||||||
|
config.ignore_restriction_errors = true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Extensions
|
||||||
|
|
||||||
|
### Strict Parsing for Select Helpers
|
||||||
|
|
||||||
|
When using date/time select helpers, the component values are handled by
|
||||||
|
ActiveRecord using the Time class to instantiate them into a time value. This
|
||||||
|
means that some invalid dates, such as 31st June, are shifted forward and
|
||||||
|
treated as valid. To handle these cases in a strict way, you can enable the
|
||||||
|
plugin extension to treat them as invalid dates.
|
||||||
|
|
||||||
|
To activate it, uncomment this line in the initializer:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in the setup block
|
||||||
|
config.enable_multiparameter_extension!
|
||||||
|
```
|
||||||
|
|
||||||
|
### Display Invalid Values in Select Helpers
|
||||||
|
|
||||||
|
The plugin offers an extension for ActionView to allowing invalid date and
|
||||||
|
time values to be redisplayed to the user as feedback, instead of a blank
|
||||||
|
field which happens by default in Rails. Though the date helpers make this a
|
||||||
|
pretty rare occurrence, given the select dropdowns for each date/time
|
||||||
|
component, but it may be something of interest.
|
||||||
|
|
||||||
|
To activate it, uncomment this line in the initializer:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in the setup block
|
||||||
|
config.enable_date_time_select_extension!
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
To see the generous people who have contributed code, take a look at the
|
||||||
|
[contributors
|
||||||
|
list](https://github.com/adzap/validates_timeliness/contributors).
|
||||||
|
|
||||||
|
## Maintainers
|
||||||
|
|
||||||
|
* [Adam Meehan](https://github.com/adzap)
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright (c) 2008 Adam Meehan, released under the MIT license
|
||||||
299
README.rdoc
299
README.rdoc
@ -1,299 +0,0 @@
|
|||||||
= ValidatesTimeliness {<img src="https://travis-ci.org/adzap/validates_timeliness.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/adzap/validates_timeliness]
|
|
||||||
|
|
||||||
* Source: http://github.com/adzap/validates_timeliness
|
|
||||||
* Issues: http://github.com/adzap/validates_timeliness/issues
|
|
||||||
|
|
||||||
== Description
|
|
||||||
|
|
||||||
Complete validation of dates, times and datetimes for Rails 5.x and ActiveModel.
|
|
||||||
|
|
||||||
If you a looking for the old version for Rails 4.x go here [https://github.com/adzap/validates_timeliness/tree/4-0-stable].
|
|
||||||
|
|
||||||
|
|
||||||
== Features
|
|
||||||
|
|
||||||
* Adds validation for dates, times and datetimes to ActiveModel
|
|
||||||
|
|
||||||
* Handles timezones and type casting of values for you
|
|
||||||
|
|
||||||
* Only Rails date/time validation plugin offering complete validation (See ORM/ODM support)
|
|
||||||
|
|
||||||
* Uses extensible date/time parser (Using {timeliness gem}[http://github.com/adzap/timeliness]. See Plugin Parser)
|
|
||||||
|
|
||||||
* Adds extensions to fix Rails date/time select issues (See Extensions)
|
|
||||||
|
|
||||||
* Supports I18n for the error messages. For multi-language support try {timeliness-i18n gem}[https://github.com/pedrofurtado/timeliness-i18n].
|
|
||||||
|
|
||||||
* Supports all the Rubies (that any sane person would be using in production).
|
|
||||||
|
|
||||||
|
|
||||||
== Installation
|
|
||||||
|
|
||||||
# in Gemfile
|
|
||||||
gem 'validates_timeliness', '~> 5.0.0.beta1'
|
|
||||||
|
|
||||||
# Run bundler
|
|
||||||
$ bundle install
|
|
||||||
|
|
||||||
Then run
|
|
||||||
|
|
||||||
$ rails generate validates_timeliness:install
|
|
||||||
|
|
||||||
This creates configuration initializer and locale files. In the initializer, there are a number of config
|
|
||||||
options to customize the plugin.
|
|
||||||
|
|
||||||
NOTE: You may wish to enable the plugin parser and the extensions to start. Please read those sections first.
|
|
||||||
|
|
||||||
|
|
||||||
== Examples
|
|
||||||
|
|
||||||
validates_datetime :occurred_at
|
|
||||||
|
|
||||||
validates_date :date_of_birth, before: lambda { 18.years.ago },
|
|
||||||
before_message: "must be at least 18 years old"
|
|
||||||
|
|
||||||
validates_datetime :finish_time, after: :start_time # Method symbol
|
|
||||||
|
|
||||||
validates_date :booked_at, on: :create, on_or_after: :today # See Restriction Shorthand.
|
|
||||||
|
|
||||||
validates_time :booked_at, between: ['9:00am', '5:00pm'] # On or after 9:00AM and on or before 5:00PM
|
|
||||||
validates_time :booked_at, between: '9:00am'..'5:00pm' # The same as previous example
|
|
||||||
validates_time :booked_at, between: '9:00am'...'5:00pm' # On or after 9:00AM and strictly before 5:00PM
|
|
||||||
|
|
||||||
validates_time :breakfast_time, on_or_after: '6:00am',
|
|
||||||
on_or_after_message: 'must be after opening time',
|
|
||||||
before: :lunchtime,
|
|
||||||
before_message: 'must be before lunch time'
|
|
||||||
|
|
||||||
|
|
||||||
== Usage
|
|
||||||
|
|
||||||
To validate a model with a date, time or datetime attribute you just use the
|
|
||||||
validation method
|
|
||||||
|
|
||||||
class Person < ActiveRecord::Base
|
|
||||||
validates_date :date_of_birth, on_or_before: lambda { Date.current }
|
|
||||||
# or
|
|
||||||
validates :date_of_birth, timeliness: {on_or_before: lambda { Date.current }, type: :date}
|
|
||||||
end
|
|
||||||
|
|
||||||
or even on a specific record, per ActiveModel API.
|
|
||||||
|
|
||||||
@person.validates_date :date_of_birth, on_or_before: lambda { Date.current }
|
|
||||||
|
|
||||||
|
|
||||||
The list of validation methods available are as follows:
|
|
||||||
validates_date - validate value as date
|
|
||||||
validates_time - validate value as time only i.e. '12:20pm'
|
|
||||||
validates_datetime - validate value as a full date and time
|
|
||||||
validates - use the :timeliness key and set the type in the hash.
|
|
||||||
|
|
||||||
The validation methods take the usual options plus some specific ones to restrict
|
|
||||||
the valid range of dates or times allowed
|
|
||||||
|
|
||||||
Temporal options (or restrictions):
|
|
||||||
:is_at - Attribute must be equal to value to be valid
|
|
||||||
:before - Attribute must be before this value to be valid
|
|
||||||
:on_or_before - Attribute must be equal to or before this value to be valid
|
|
||||||
:after - Attribute must be after this value to be valid
|
|
||||||
:on_or_after - Attribute must be equal to or after this value to be valid
|
|
||||||
:between - Attribute must be between the values to be valid. Range or Array of 2 values.
|
|
||||||
|
|
||||||
Regular validation options:
|
|
||||||
:allow_nil - Allow a nil value to be valid
|
|
||||||
:allow_blank - Allows a nil or empty string value to be valid
|
|
||||||
:if - Execute validation when :if evaluates true
|
|
||||||
:unless - Execute validation when :unless evaluates false
|
|
||||||
:on - Specify validation context e.g :save, :create or :update. Default is :save.
|
|
||||||
|
|
||||||
Special options:
|
|
||||||
:ignore_usec - Ignores microsecond value on datetime restrictions
|
|
||||||
:format - Limit validation to a single format for special cases. Requires plugin parser.
|
|
||||||
|
|
||||||
The temporal restrictions can take 4 different value types:
|
|
||||||
|
|
||||||
* Date, Time, or DateTime object value
|
|
||||||
* Proc or lambda object which may take an optional parameter, being the record object
|
|
||||||
* A symbol matching a method name in the model
|
|
||||||
* String value
|
|
||||||
|
|
||||||
When an attribute value is compared to temporal restrictions, they are compared as
|
|
||||||
the same type as the validation method type. So using validates_date means all
|
|
||||||
values are compared as dates.
|
|
||||||
|
|
||||||
|
|
||||||
== Configuration
|
|
||||||
|
|
||||||
=== ORM/ODM Support
|
|
||||||
|
|
||||||
The plugin adds date/time validation to ActiveModel for any ORM/ODM that supports the ActiveModel validations component.
|
|
||||||
However, there is an issue with most ORM/ODMs which does not allow 100% date/time validation by default. Specifically, when you
|
|
||||||
assign an invalid date/time value to an attribute, most ORM/ODMs will only store a nil value for the attribute. This causes an
|
|
||||||
issue for date/time validation, since we need to know that a value was assigned but was invalid. To fix this, we need to cache
|
|
||||||
the original invalid value to know that the attribute is not just nil.
|
|
||||||
|
|
||||||
Each ORM/ODM requires a specific shim to fix it. The plugin includes a shim for ActiveRecord and Mongoid. You can activate them
|
|
||||||
like so
|
|
||||||
|
|
||||||
ValidatesTimeliness.setup do |config|
|
|
||||||
|
|
||||||
# Extend ORM/ODMs for full support (:active_record).
|
|
||||||
config.extend_orms = [ :active_record ]
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
By default the plugin extends ActiveRecord if loaded. If you wish to extend another ORM then look at the {wiki page}[http://github.com/adzap/validates_timeliness/wiki/ORM-Support] for more information.
|
|
||||||
|
|
||||||
It is not required that you use a shim, but you will not catch errors when the attribute value is invalid and evaluated to nil.
|
|
||||||
|
|
||||||
|
|
||||||
=== Error Messages
|
|
||||||
|
|
||||||
Using the I18n system to define new defaults:
|
|
||||||
|
|
||||||
en:
|
|
||||||
errors:
|
|
||||||
messages:
|
|
||||||
invalid_date: "is not a valid date"
|
|
||||||
invalid_time: "is not a valid time"
|
|
||||||
invalid_datetime: "is not a valid datetime"
|
|
||||||
is_at: "must be at %{restriction}"
|
|
||||||
before: "must be before %{restriction}"
|
|
||||||
on_or_before: "must be on or before %{restriction}"
|
|
||||||
after: "must be after %{restriction}"
|
|
||||||
on_or_after: "must be on or after %{restriction}"
|
|
||||||
|
|
||||||
The %{restriction} signifies where the interpolation value for the restriction will be inserted.
|
|
||||||
|
|
||||||
You can also use validation options for custom error messages. The following option keys are available:
|
|
||||||
|
|
||||||
:invalid_date_message
|
|
||||||
:invalid_time_message
|
|
||||||
:invalid_datetime_message
|
|
||||||
:is_at_message
|
|
||||||
:before_message
|
|
||||||
:on_or_before_message
|
|
||||||
:after_message
|
|
||||||
:on_or_after_message
|
|
||||||
|
|
||||||
Note: There is no :between_message option. The between error message should be defined using the :on_or_after and :on_or_before
|
|
||||||
(:before in case when :between argument is a Range with excluded high value, see Examples) messages.
|
|
||||||
|
|
||||||
It is highly recommended you use the I18n system for error messages.
|
|
||||||
|
|
||||||
|
|
||||||
=== Plugin Parser
|
|
||||||
|
|
||||||
The plugin uses the {timeliness gem}[http://github.com/adzap/timeliness] as a fast, configurable and extensible date and time parser.
|
|
||||||
You can add or remove valid formats for dates, times, and datetimes. It is also more strict than the
|
|
||||||
Ruby parser, which means it won't accept day of the month if it's not a valid number for the month.
|
|
||||||
|
|
||||||
By default the parser is disabled. To enable it:
|
|
||||||
|
|
||||||
# in the setup block
|
|
||||||
config.use_plugin_parser = true
|
|
||||||
|
|
||||||
Enabling the parser will mean that strings assigned to attributes validated with the plugin will be parsed
|
|
||||||
using the gem. See the wiki[http://github.com/adzap/validates_timeliness/wiki/Plugin-Parser] for more details about the parser configuration.
|
|
||||||
|
|
||||||
|
|
||||||
=== Restriction Shorthand
|
|
||||||
|
|
||||||
It is common to restrict an attribute to being on or before the current time or current day.
|
|
||||||
To specify this you need to use a lambda as an option value e.g. <tt>lambda { Time.current }</tt>.
|
|
||||||
This can be tedious noise amongst your validations for something so common. To combat this the
|
|
||||||
plugin allows you to use shorthand symbols for often used relative times or dates.
|
|
||||||
|
|
||||||
Just provide the symbol as the option value like so:
|
|
||||||
|
|
||||||
validates_date :birth_date, on_or_before: :today
|
|
||||||
|
|
||||||
The :today symbol is evaluated as <tt>lambda { Date.today }</tt>. The :now and :today
|
|
||||||
symbols are pre-configured. Configure your own like so:
|
|
||||||
|
|
||||||
# in the setup block
|
|
||||||
config.restriction_shorthand_symbols.update(
|
|
||||||
yesterday: lambda { 1.day.ago }
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
=== Default Timezone
|
|
||||||
|
|
||||||
The plugin needs to know the default timezone you are using when parsing or type casting values. If you are using
|
|
||||||
ActiveRecord then the default is automatically set to the same default zone as ActiveRecord. If you are using
|
|
||||||
another ORM you may need to change this setting.
|
|
||||||
|
|
||||||
# in the setup block
|
|
||||||
config.default_timezone = :utc
|
|
||||||
|
|
||||||
By default it will be UTC if ActiveRecord is not loaded.
|
|
||||||
|
|
||||||
|
|
||||||
=== Dummy Date For Time Types
|
|
||||||
|
|
||||||
Given that Ruby has no support for a time-only type, all time type columns are evaluated
|
|
||||||
as a regular Time class objects with a dummy date value set. Rails defines the dummy date as
|
|
||||||
2000-01-01. So a time of '12:30' is evaluated as a Time value of '2000-01-01 12:30'. If you
|
|
||||||
need to customize this for some reason you can do so as follows
|
|
||||||
|
|
||||||
# in the setup block
|
|
||||||
config.dummy_date_for_time_type = [2009, 1, 1]
|
|
||||||
|
|
||||||
The value should be an array of 3 values being year, month and day in that order.
|
|
||||||
|
|
||||||
|
|
||||||
=== Temporal Restriction Errors
|
|
||||||
|
|
||||||
When using the validation temporal restrictions there are times when the restriction
|
|
||||||
option value itself may be invalid. This will add an error to the model such as
|
|
||||||
'Error occurred validating birth_date for :before restriction'. These can be annoying
|
|
||||||
in development or production as you most likely just want to skip the option if no
|
|
||||||
valid value was returned. By default these errors are displayed in Rails test mode.
|
|
||||||
|
|
||||||
To turn them on/off:
|
|
||||||
|
|
||||||
# in the setup block
|
|
||||||
config.ignore_restriction_errors = true
|
|
||||||
|
|
||||||
|
|
||||||
== Extensions
|
|
||||||
|
|
||||||
=== Strict Parsing for Select Helpers
|
|
||||||
|
|
||||||
When using date/time select helpers, the component values are handled by ActiveRecord using
|
|
||||||
the Time class to instantiate them into a time value. This means that some invalid dates,
|
|
||||||
such as 31st June, are shifted forward and treated as valid. To handle these cases in a strict
|
|
||||||
way, you can enable the plugin extension to treat them as invalid dates.
|
|
||||||
|
|
||||||
To activate it, uncomment this line in the initializer:
|
|
||||||
|
|
||||||
# in the setup block
|
|
||||||
config.enable_multiparameter_extension!
|
|
||||||
|
|
||||||
|
|
||||||
=== Display Invalid Values in Select Helpers
|
|
||||||
|
|
||||||
The plugin offers an extension for ActionView to allowing invalid date and time values to be
|
|
||||||
redisplayed to the user as feedback, instead of a blank field which happens by default in
|
|
||||||
Rails. Though the date helpers make this a pretty rare occurrence, given the select dropdowns
|
|
||||||
for each date/time component, but it may be something of interest.
|
|
||||||
|
|
||||||
To activate it, uncomment this line in the initializer:
|
|
||||||
|
|
||||||
# in the setup block
|
|
||||||
config.enable_date_time_select_extension!
|
|
||||||
|
|
||||||
|
|
||||||
== Contributors
|
|
||||||
|
|
||||||
To see the generous people who have contributed code, take a look at the {contributors list}[http://github.com/adzap/validates_timeliness/contributors].
|
|
||||||
|
|
||||||
|
|
||||||
== Maintainers
|
|
||||||
|
|
||||||
* {Adam Meehan}[http://github.com/adzap]
|
|
||||||
|
|
||||||
|
|
||||||
== License
|
|
||||||
|
|
||||||
Copyright (c) 2008 Adam Meehan, released under the MIT license
|
|
||||||
3
Rakefile
3
Rakefile
@ -19,10 +19,11 @@ end
|
|||||||
|
|
||||||
desc 'Generate documentation for plugin.'
|
desc 'Generate documentation for plugin.'
|
||||||
Rake::RDocTask.new(:rdoc) do |rdoc|
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
||||||
|
rdoc.main = 'README.md'
|
||||||
rdoc.rdoc_dir = 'rdoc'
|
rdoc.rdoc_dir = 'rdoc'
|
||||||
rdoc.title = 'ValidatesTimeliness'
|
rdoc.title = 'ValidatesTimeliness'
|
||||||
rdoc.options << '--line-numbers' << '--inline-source'
|
rdoc.options << '--line-numbers' << '--inline-source'
|
||||||
rdoc.rdoc_files.include('README')
|
rdoc.rdoc_files.include('README.md')
|
||||||
rdoc.rdoc_files.include('lib/**/*.rb')
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|||||||
s.require_paths = ["lib"]
|
s.require_paths = ["lib"]
|
||||||
s.files = `git ls-files`.split("\n") - %w{ .gitignore .rspec Gemfile Gemfile.lock autotest/discover.rb Appraisals Travis.yml } - Dir['gemsfiles/*']
|
s.files = `git ls-files`.split("\n") - %w{ .gitignore .rspec Gemfile Gemfile.lock autotest/discover.rb Appraisals Travis.yml } - Dir['gemsfiles/*']
|
||||||
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
||||||
s.extra_rdoc_files = ["README.rdoc", "CHANGELOG.rdoc", "LICENSE"]
|
s.extra_rdoc_files = ["README.md", "CHANGELOG.rdoc", "LICENSE"]
|
||||||
|
|
||||||
s.add_runtime_dependency(%q<timeliness>, [">= 0.3.10", "< 1"])
|
s.add_runtime_dependency(%q<timeliness>, [">= 0.3.10", "< 1"])
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user