smarter_dates 0.2.7.14 → 0.2.8
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/Gemfile +1 -1
- data/lib/smarter_dates/chronic_parsable_validator.rb +51 -0
- data/lib/smarter_dates/parser.rb +9 -11
- data/lib/smarter_dates/version.rb +1 -1
- data/lib/smarter_dates.rb +5 -2
- data/smarter_dates.gemspec +27 -14
- data/test/smarter_dates_test.rb +9 -9
- metadata +28 -6
data/Gemfile
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
# validates attributes are parsable by the chronic gem
|
2
|
+
class ChronicParsableValidator < ActiveModel::EachValidator
|
3
|
+
|
4
|
+
# == Creation
|
5
|
+
# To use this Validator, initialize it as any other validator
|
6
|
+
#
|
7
|
+
# class ExampleValidator < ActiveRecord::Base
|
8
|
+
# validates :attr1, :chronic_parsable => true
|
9
|
+
# end
|
10
|
+
|
11
|
+
def initialize(*args) # :nodoc:
|
12
|
+
@errors = []
|
13
|
+
super(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
# :call-seq:
|
17
|
+
# validate_each :record, :attribute, :value
|
18
|
+
#
|
19
|
+
# <tt>:record</tt>:: AR instance
|
20
|
+
# <tt>:attribute</tt>:: symbol for attribute
|
21
|
+
# <tt>:value</tt>:: value to check validity
|
22
|
+
|
23
|
+
def validate_each(record, attribute, value = "") #:nodoc:
|
24
|
+
@value = value
|
25
|
+
unless is_valid?
|
26
|
+
record.errors[attribute] << 'not a valid Date or DateTime'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# :call-seq:
|
31
|
+
# is_valid?
|
32
|
+
#
|
33
|
+
# alias for :is_valid_datetime?
|
34
|
+
|
35
|
+
def is_valid?
|
36
|
+
is_valid_datetime?
|
37
|
+
end
|
38
|
+
|
39
|
+
# :call-seq:
|
40
|
+
# is_valid_datetime?
|
41
|
+
#
|
42
|
+
# returns true if the string is parsable by chronic
|
43
|
+
|
44
|
+
def is_valid_datetime?
|
45
|
+
obj = Chronic.parse(@value.respond_to?(:to_date) ?
|
46
|
+
@value.to_date : @value.to_s)
|
47
|
+
!obj.nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
data/lib/smarter_dates/parser.rb
CHANGED
@@ -2,23 +2,21 @@ require 'smarter_dates/version'
|
|
2
2
|
require 'chronic'
|
3
3
|
|
4
4
|
module SmarterDates
|
5
|
-
def self.included(
|
5
|
+
def self.included(klass) # :nodoc:
|
6
6
|
attr_accessor :dt_attributes
|
7
7
|
|
8
8
|
@dt_attributes = []
|
9
9
|
db_migrated = true
|
10
10
|
if defined?(Rails)
|
11
11
|
begin
|
12
|
-
@dt_attributes.concat(klass.column_names.select{|k|k.match(/_(?:at|on|dt|d)$/)})
|
13
|
-
Rails.logger.debug(RuntimeError,"unused include - #{klass.class.to_s} does not have any attributes ending in _at, _on, _dt, or _d") if db_migrated && @dt_attributes.empty?
|
14
|
-
rescue ActiveRecord::StatementInvalid =>
|
15
|
-
|
16
|
-
|
17
|
-
Rails.logger.debug(e.inspect)
|
18
|
-
db_migrated = false
|
12
|
+
@dt_attributes.concat(klass.column_names.select { |k| k.match(/_(?:at|on|dt|d)$/) })
|
13
|
+
Rails.logger.debug(RuntimeError, "unused include - #{klass.class.to_s} does not have any attributes ending in _at, _on, _dt, or _d") if db_migrated && @dt_attributes.empty?
|
14
|
+
rescue ActiveRecord::StatementInvalid => _
|
15
|
+
rescue => err
|
16
|
+
Rails.logger.debug(err.inspect)
|
19
17
|
end
|
20
18
|
else
|
21
|
-
@dt_attributes.concat(klass.instance_methods.select{|k|k.match(/_(?:at|on|dt|d)$/)})
|
19
|
+
@dt_attributes.concat(klass.instance_methods.select { |k| k.match(/_(?:at|on|dt|d)$/) })
|
22
20
|
end
|
23
21
|
|
24
22
|
# :call-seq:
|
@@ -38,7 +36,7 @@ def self.included( klass ) # :nodoc:
|
|
38
36
|
begin
|
39
37
|
dt = Chronic.parse(val.to_s)
|
40
38
|
rescue
|
41
|
-
dt = DateTime.parse(val)
|
39
|
+
dt = DateTime.parse(val.to_s)
|
42
40
|
rescue
|
43
41
|
dt = Date.parse(val)
|
44
42
|
rescue
|
@@ -53,7 +51,7 @@ def self.included( klass ) # :nodoc:
|
|
53
51
|
self[k] = dt
|
54
52
|
end
|
55
53
|
else
|
56
|
-
instance_variable_set(:"@#{k}",dt)
|
54
|
+
instance_variable_set(:"@#{k}", dt)
|
57
55
|
end
|
58
56
|
end
|
59
57
|
klass.send(:define_method, "#{k}=".to_sym, &parse)
|
data/lib/smarter_dates.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
-
require File.join('smarter_dates','version')
|
2
|
-
require File.join('smarter_dates','parser')
|
1
|
+
require File.join('smarter_dates', 'version')
|
2
|
+
require File.join('smarter_dates', 'parser')
|
3
|
+
if defined? ActiveModel
|
4
|
+
require File.join('smarter_dates', 'chronic_parsable_validator')
|
5
|
+
end
|
3
6
|
|
data/smarter_dates.gemspec
CHANGED
@@ -2,22 +2,35 @@
|
|
2
2
|
$:.push File.expand_path('../lib', __FILE__)
|
3
3
|
require 'smarter_dates/version'
|
4
4
|
|
5
|
-
Gem::Specification.new do |
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'smarter_dates'
|
7
|
+
spec.version = SmarterDates::VERSION
|
8
|
+
spec.authors = ['Paul Belt']
|
9
|
+
spec.email = %w(paul.belt@gmail.com)
|
10
|
+
spec.homepage = 'http://github.com/belt/smarter_dates'
|
11
|
+
spec.summary = %q{Natural language date processing}
|
12
|
+
spec.description = %q{Humans want to think of date and datetime attributes in a natural manner. Standard ruby Date and DateTime objects do not support this well.}
|
13
13
|
|
14
|
-
|
14
|
+
spec.rubyforge_project = 'smarter_dates'
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
spec.files = `git ls-files`.split("\n")
|
17
|
+
spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
spec.require_paths = %w(lib)
|
20
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 1.8.7')
|
21
|
+
spec.required_rubygems_version = Gem::Requirement.new('>= 0') if spec.respond_to? :required_rubygems_version=
|
20
22
|
|
21
|
-
|
23
|
+
if spec.respond_to? :specification_version
|
24
|
+
spec.specification_version = 3
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0')
|
26
|
+
spec.add_runtime_dependency 'chronic', ['>= 0']
|
27
|
+
spec.add_development_dependency 'bundler', ['~> 1.3']
|
28
|
+
spec.add_development_dependency 'rake', ['>= 0']
|
29
|
+
else
|
30
|
+
spec.add_dependency('chronic')
|
31
|
+
end
|
32
|
+
else
|
33
|
+
spec.add_dependency('chronic')
|
34
|
+
end
|
22
35
|
end
|
23
36
|
|
data/test/smarter_dates_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
|
3
|
-
if $LOAD_PATH.include?(File.expand_path(File.join(File.dirname(__FILE__),'..','lib')))
|
3
|
+
if $LOAD_PATH.include?(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
4
4
|
require 'smarter_dates'
|
5
5
|
else
|
6
6
|
raise RuntimeError, "Try ruby -Ilib test/#{File.basename(__FILE__)}"
|
@@ -26,13 +26,13 @@ class SmarterDatesTest < Test::Unit::TestCase
|
|
26
26
|
last_week = now - 60 * 60 * 24 * 7
|
27
27
|
yesterday = now - 60 * 60 * 24
|
28
28
|
|
29
|
-
@model.name =
|
30
|
-
@model.birth_d =
|
31
|
-
@model.meeting_dt =
|
32
|
-
@model.created_on =
|
33
|
-
@model.updated_at =
|
29
|
+
@model.name = 'Paul Belt'
|
30
|
+
@model.birth_d = '22 April 1976'
|
31
|
+
@model.meeting_dt = 'today'
|
32
|
+
@model.created_on = 'one week ago'
|
33
|
+
@model.updated_at = 'yesterday'
|
34
34
|
|
35
|
-
assert_equal
|
35
|
+
assert_equal 'Paul Belt', @model.name
|
36
36
|
|
37
37
|
assert_equal 1976, @model.birth_d.year
|
38
38
|
assert_equal 4, @model.birth_d.mon
|
@@ -53,7 +53,7 @@ class SmarterDatesTest < Test::Unit::TestCase
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_parsing_failures
|
56
|
-
@model.birth_d =
|
56
|
+
@model.birth_d = '32 April 1976'
|
57
57
|
assert_equal nil, @model.birth_d
|
58
58
|
|
59
59
|
@model.birth_d = nil
|
@@ -61,7 +61,7 @@ class SmarterDatesTest < Test::Unit::TestCase
|
|
61
61
|
|
62
62
|
# TODO: fix this in chronic
|
63
63
|
if false
|
64
|
-
@model.birth_d =
|
64
|
+
@model.birth_d = '30 Feb 1976'
|
65
65
|
assert_equal nil, @model.birth_d
|
66
66
|
end
|
67
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smarter_dates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-11 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chronic
|
16
|
-
requirement: &
|
16
|
+
requirement: &2267243440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,29 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2267243440
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: bundler
|
27
|
+
requirement: &2267242960 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '1.3'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2267242960
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
requirement: &2267242480 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2267242480
|
25
47
|
description: Humans want to think of date and datetime attributes in a natural manner.
|
26
48
|
Standard ruby Date and DateTime objects do not support this well.
|
27
49
|
email:
|
@@ -37,6 +59,7 @@ files:
|
|
37
59
|
- Rakefile
|
38
60
|
- VERSION.yml
|
39
61
|
- lib/smarter_dates.rb
|
62
|
+
- lib/smarter_dates/chronic_parsable_validator.rb
|
40
63
|
- lib/smarter_dates/parser.rb
|
41
64
|
- lib/smarter_dates/version.rb
|
42
65
|
- smarter_dates.gemspec
|
@@ -52,7 +75,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
52
75
|
requirements:
|
53
76
|
- - ! '>='
|
54
77
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
78
|
+
version: 1.8.7
|
56
79
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
80
|
none: false
|
58
81
|
requirements:
|
@@ -67,4 +90,3 @@ specification_version: 3
|
|
67
90
|
summary: Natural language date processing
|
68
91
|
test_files:
|
69
92
|
- test/smarter_dates_test.rb
|
70
|
-
has_rdoc:
|