texp 0.0.7 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ChangeLog +4 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +12 -0
- data/{README → README.rdoc} +7 -2
- data/Rakefile +9 -25
- data/TAGS +400 -323
- data/lib/texp.rb +5 -2
- data/lib/texp/base.rb +10 -0
- data/lib/texp/day_interval.rb +19 -5
- data/lib/texp/day_of_week.rb +4 -2
- data/lib/texp/day_of_week_interval.rb +38 -0
- data/lib/texp/dsl.rb +1 -1
- data/lib/texp/month_interval.rb +29 -0
- data/lib/texp/parse.rb +10 -6
- data/lib/texp/version.rb +1 -1
- data/lib/texp/week_interval.rb +13 -0
- data/test/test_helper.rb +4 -0
- data/test/texp/base_test.rb +9 -4
- data/test/texp/day_interval_test.rb +2 -5
- data/test/texp/day_of_month_test.rb +2 -7
- data/test/texp/day_of_week_test.rb +2 -7
- data/test/texp/dsl_test.rb +16 -17
- data/test/texp/every_day_test.rb +2 -9
- data/test/texp/ext_test.rb +2 -7
- data/test/texp/inspect_test.rb +8 -13
- data/test/texp/logic_test.rb +2 -7
- data/test/texp/month_test.rb +2 -7
- data/test/texp/operators_test.rb +2 -5
- data/test/texp/parse_test.rb +19 -16
- data/test/texp/time_ext_test.rb +2 -3
- data/test/texp/week_interval_test.rb +32 -0
- data/test/texp/week_test.rb +2 -7
- data/test/texp/window_test.rb +2 -7
- data/test/texp/year_test.rb +3 -8
- data/test/texp_tests.rb +2 -2
- metadata +37 -37
- data/lib/texp/builder.rb +0 -254
data/test/texp/inspect_test.rb
CHANGED
@@ -1,19 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require 'date'
|
5
|
-
require 'texp'
|
6
|
-
require 'flexmock/test_unit'
|
1
|
+
require 'test_helper'
|
7
2
|
|
8
3
|
######################################################################
|
9
|
-
class InspectTest < Test
|
4
|
+
class InspectTest < Minitest::Test
|
10
5
|
def test_inspect
|
11
6
|
assert_inspect "e", "every day"
|
12
7
|
|
13
|
-
assert_inspect "0w", "
|
14
|
-
assert_inspect "[0,1]w", "
|
8
|
+
assert_inspect "0w", "on Sunday"
|
9
|
+
assert_inspect "[0,1]w", "on Sunday and Monday"
|
15
10
|
assert_inspect "[0,1,4,2,3,6,5]w",
|
16
|
-
"
|
11
|
+
"on Sunday, Monday, Tuesday, Wednesday, Thursday, Friday and Saturday"
|
17
12
|
|
18
13
|
assert_inspect "1d", "the day of the month is the 1st"
|
19
14
|
assert_inspect "2d", "the day of the month is the 2nd"
|
@@ -33,8 +28,8 @@ class InspectTest < Test::Unit::TestCase
|
|
33
28
|
assert_inspect "20d", "the day of the month is the 20th"
|
34
29
|
assert_inspect "[1,10,15]d", "the day of the month is the 1st, 10th or 15th"
|
35
30
|
|
36
|
-
assert_inspect "2008-02-15,3i", "every
|
37
|
-
assert_inspect "2008-02-15,1i", "every day
|
31
|
+
assert_inspect "2008-02-15,3i", "every 3 days"
|
32
|
+
assert_inspect "2008-02-15,1i", "every day"
|
38
33
|
|
39
34
|
assert_inspect "1k", "it is the 1st week of the month"
|
40
35
|
assert_inspect "[1,3]k", "it is the 1st or 3rd week of the month"
|
@@ -56,7 +51,7 @@ class InspectTest < Test::Unit::TestCase
|
|
56
51
|
"it is not the case that the day of the month is the 1st or the month is January"
|
57
52
|
|
58
53
|
assert_inspect "3w2,1s",
|
59
|
-
"
|
54
|
+
"on Wednesday, or up to 2 days prior, or up to 1 day after"
|
60
55
|
end
|
61
56
|
|
62
57
|
def assert_inspect(texp, string)
|
data/test/texp/logic_test.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
require 'date'
|
5
|
-
require 'texp'
|
6
|
-
|
7
|
-
class LogicTest < Test::Unit::TestCase
|
3
|
+
class LogicTest < Minitest::Test
|
8
4
|
|
9
5
|
DATE = Date.parse("Feb 14, 2008")
|
10
6
|
LEFT = TExp::DayInterval.new(DATE, 2)
|
@@ -48,4 +44,3 @@ class LogicTest < Test::Unit::TestCase
|
|
48
44
|
end
|
49
45
|
|
50
46
|
end
|
51
|
-
|
data/test/texp/month_test.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
require 'date'
|
5
|
-
require 'texp'
|
6
|
-
|
7
|
-
class MonthTest < Test::Unit::TestCase
|
3
|
+
class MonthTest < Minitest::Test
|
8
4
|
|
9
5
|
def setup
|
10
6
|
@date = Date.parse("Feb 14, 2008")
|
@@ -17,4 +13,3 @@ class MonthTest < Test::Unit::TestCase
|
|
17
13
|
assert ! te.includes?(@date + 30)
|
18
14
|
end
|
19
15
|
end
|
20
|
-
|
data/test/texp/operators_test.rb
CHANGED
data/test/texp/parse_test.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require 'date'
|
5
|
-
require 'texp'
|
6
|
-
require 'flexmock/test_unit'
|
1
|
+
require 'test_helper'
|
7
2
|
|
8
3
|
######################################################################
|
9
|
-
class TExpParseLexicalTest < Test
|
4
|
+
class TExpParseLexicalTest < Minitest::Test
|
5
|
+
XTEXP = class << TExp; self; end
|
6
|
+
|
10
7
|
def setup
|
8
|
+
@compile_method = TExp.method(:compile)
|
11
9
|
@tokens = []
|
12
|
-
|
13
|
-
|
10
|
+
tk = @tokens
|
11
|
+
XTEXP.send(:define_method, :compile) { |tok|
|
12
|
+
tk << tok
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
XTEXP.send(:define_method, :compile, @compile_method)
|
14
18
|
end
|
15
19
|
|
16
20
|
def test_letters
|
@@ -49,7 +53,7 @@ class TExpParseLexicalTest < Test::Unit::TestCase
|
|
49
53
|
'[', '[', '2008', 'y', '2', 'm', '14', 'd', ']', 'a', '12', 'm',
|
50
54
|
'[', '1', '15', ']', 'd', '2008-02-14', '3', 'i', ']', 'o'
|
51
55
|
]
|
52
|
-
|
56
|
+
|
53
57
|
def test_mixed
|
54
58
|
assert_lex "[[2008y2m14d]a12m[1,15]d2008-02-14,3i]o", *EXPECTED
|
55
59
|
end
|
@@ -68,25 +72,25 @@ end
|
|
68
72
|
|
69
73
|
|
70
74
|
######################################################################
|
71
|
-
class ParseTest < Test
|
75
|
+
class ParseTest < Minitest::Test
|
72
76
|
def setup
|
73
77
|
@date = Date.parse("Feb 14, 2008")
|
74
78
|
end
|
75
79
|
|
76
80
|
def test_bad_parse_string
|
77
|
-
|
81
|
+
assert_raises TExp::ParseError do
|
78
82
|
TExp.parse("(1,2)d")
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
82
86
|
def test_unbalanced_list
|
83
|
-
|
87
|
+
assert_raises TExp::ParseError do
|
84
88
|
TExp.parse("[1")
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
88
92
|
def test_unbalanced_list2
|
89
|
-
|
93
|
+
assert_raises TExp::ParseError do
|
90
94
|
TExp.parse("1]")
|
91
95
|
end
|
92
96
|
end
|
@@ -197,7 +201,7 @@ class ParseTest < Test::Unit::TestCase
|
|
197
201
|
end
|
198
202
|
|
199
203
|
######################################################################
|
200
|
-
class ParseReverseTest < Test
|
204
|
+
class ParseReverseTest < Minitest::Test
|
201
205
|
def setup
|
202
206
|
@date = Date.parse("Feb 14, 2008")
|
203
207
|
end
|
@@ -230,4 +234,3 @@ class ParseReverseTest < Test::Unit::TestCase
|
|
230
234
|
assert_equal string, te.to_s
|
231
235
|
end
|
232
236
|
end
|
233
|
-
|
data/test/texp/time_ext_test.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class WeekIntervalTest < Minitest::Test
|
4
|
+
|
5
|
+
def test_week_interval
|
6
|
+
te = TExp::WeekInterval.new(Date.parse("Feb 10, 2008"), 1)
|
7
|
+
assert ! te.includes?(Date.parse("Feb 9, 2008"))
|
8
|
+
assert te.includes?(Date.parse("Feb 10, 2008"))
|
9
|
+
assert ! te.includes?(Date.parse("Feb 11, 2008"))
|
10
|
+
assert ! te.includes?(Date.parse("Feb 12, 2008"))
|
11
|
+
assert ! te.includes?(Date.parse("Feb 16, 2008"))
|
12
|
+
assert te.includes?(Date.parse("Feb 17, 2008"))
|
13
|
+
assert ! te.includes?(Date.parse("Feb 18, 2008"))
|
14
|
+
assert ! te.includes?(Date.parse("Feb 23, 2008"))
|
15
|
+
assert te.includes?(Date.parse("Feb 24, 2008"))
|
16
|
+
assert ! te.includes?(Date.parse("Feb 25, 2008"))
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_day_interval_without_start_date
|
20
|
+
te = TExp::DayInterval.new(0, 3)
|
21
|
+
assert ! te.includes?(Date.parse("Feb 10, 2008"))
|
22
|
+
assert_equal "0,3i", te.to_s
|
23
|
+
assert_equal "0,3i", TExp.parse("0,3i").to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_day_interval_excludes_dates_before_start
|
27
|
+
date = d("Mar 1, 2008")
|
28
|
+
te = TExp::DayInterval.new(date, 3)
|
29
|
+
|
30
|
+
assert_not_includes te, date-3, date-2, date-1
|
31
|
+
end
|
32
|
+
end
|
data/test/texp/week_test.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
require 'test/unit'
|
5
|
-
require 'texp'
|
6
|
-
|
7
|
-
class WeekTest < Test::Unit::TestCase
|
3
|
+
class WeekTest < Minitest::Test
|
8
4
|
|
9
5
|
def test_week_include_with_one_week
|
10
6
|
te = TExp::Week.new([1])
|
@@ -55,4 +51,3 @@ class WeekTest < Test::Unit::TestCase
|
|
55
51
|
assert_equal 31, te.send(:last_day_of_month, Date.parse("Dec 1, 2007"))
|
56
52
|
end
|
57
53
|
end
|
58
|
-
|
data/test/texp/window_test.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
require 'test/unit'
|
5
|
-
require 'texp'
|
6
|
-
|
7
|
-
class WindowTest < Test::Unit::TestCase
|
3
|
+
class WindowTest < Minitest::Test
|
8
4
|
|
9
5
|
def test_window
|
10
6
|
wed = TExp.parse("3w")
|
@@ -58,4 +54,3 @@ class WindowTest < Test::Unit::TestCase
|
|
58
54
|
end
|
59
55
|
|
60
56
|
end
|
61
|
-
|
data/test/texp/year_test.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
require 'date'
|
5
|
-
require 'texp'
|
6
|
-
|
7
|
-
class YearTest < Test::Unit::TestCase
|
3
|
+
class YearTest < Minitest::Test
|
8
4
|
|
9
5
|
def setup
|
10
6
|
@date = Date.parse("Feb 14, 2008")
|
@@ -17,7 +13,7 @@ class YearTest < Test::Unit::TestCase
|
|
17
13
|
assert ! te.includes?(@date + 365)
|
18
14
|
end
|
19
15
|
|
20
|
-
def
|
16
|
+
def test_two_args
|
21
17
|
te = TExp::Year.new([2007,2008])
|
22
18
|
assert te.includes?(@date - 365)
|
23
19
|
assert te.includes?(@date)
|
@@ -25,4 +21,3 @@ class YearTest < Test::Unit::TestCase
|
|
25
21
|
assert ! te.includes?(@date + 365)
|
26
22
|
end
|
27
23
|
end
|
28
|
-
|
data/test/texp_tests.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'minitest/autorun'
|
2
2
|
require 'texp'
|
3
3
|
|
4
4
|
# Convenience method for parsing dates.
|
@@ -22,6 +22,6 @@ module TExpAssertions
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
class Test
|
25
|
+
class Minitest::Test
|
26
26
|
include TExpAssertions
|
27
27
|
end
|
metadata
CHANGED
@@ -1,55 +1,56 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: texp
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Jim Weirich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2008-03-10 00:00:00 -04:00
|
13
|
-
default_executable:
|
11
|
+
date: 2013-06-10 00:00:00.000000000 Z
|
14
12
|
dependencies: []
|
15
|
-
|
16
|
-
|
13
|
+
description: |2
|
14
|
+
TExp is a temporal expression library for Ruby with a modular,
|
15
|
+
extensible expression serialization language.
|
17
16
|
email: jim.weirich@gmail.com
|
18
17
|
executables: []
|
19
|
-
|
20
18
|
extensions: []
|
21
|
-
|
22
|
-
|
23
|
-
- README
|
19
|
+
extra_rdoc_files:
|
20
|
+
- README.rdoc
|
24
21
|
- MIT-LICENSE
|
25
22
|
- ChangeLog
|
26
|
-
files:
|
23
|
+
files:
|
27
24
|
- ChangeLog
|
25
|
+
- Gemfile
|
26
|
+
- Gemfile.lock
|
28
27
|
- INFO
|
29
28
|
- MIT-LICENSE
|
29
|
+
- README.rdoc
|
30
30
|
- Rakefile
|
31
|
-
- README
|
32
31
|
- TAGS
|
33
32
|
- lib/texp.rb
|
34
33
|
- lib/texp/base.rb
|
35
|
-
- lib/texp/builder.rb
|
36
34
|
- lib/texp/day_interval.rb
|
37
35
|
- lib/texp/day_of_month.rb
|
38
36
|
- lib/texp/day_of_week.rb
|
37
|
+
- lib/texp/day_of_week_interval.rb
|
39
38
|
- lib/texp/dsl.rb
|
40
39
|
- lib/texp/errors.rb
|
41
40
|
- lib/texp/every_day.rb
|
42
41
|
- lib/texp/ext.rb
|
43
42
|
- lib/texp/logic.rb
|
44
43
|
- lib/texp/month.rb
|
44
|
+
- lib/texp/month_interval.rb
|
45
45
|
- lib/texp/operators.rb
|
46
46
|
- lib/texp/parse.rb
|
47
47
|
- lib/texp/time_ext.rb
|
48
48
|
- lib/texp/version.rb
|
49
49
|
- lib/texp/week.rb
|
50
|
+
- lib/texp/week_interval.rb
|
50
51
|
- lib/texp/window.rb
|
51
52
|
- lib/texp/year.rb
|
52
|
-
- test/
|
53
|
+
- test/test_helper.rb
|
53
54
|
- test/texp/base_test.rb
|
54
55
|
- test/texp/day_interval_test.rb
|
55
56
|
- test/texp/day_of_month_test.rb
|
@@ -63,40 +64,39 @@ files:
|
|
63
64
|
- test/texp/operators_test.rb
|
64
65
|
- test/texp/parse_test.rb
|
65
66
|
- test/texp/time_ext_test.rb
|
67
|
+
- test/texp/week_interval_test.rb
|
66
68
|
- test/texp/week_test.rb
|
67
69
|
- test/texp/window_test.rb
|
68
70
|
- test/texp/year_test.rb
|
71
|
+
- test/texp_tests.rb
|
69
72
|
- doc/jamis.rb
|
70
|
-
has_rdoc: true
|
71
73
|
homepage: http://texp.rubyforge.org
|
74
|
+
licenses: []
|
75
|
+
metadata: {}
|
72
76
|
post_install_message:
|
73
|
-
rdoc_options:
|
77
|
+
rdoc_options:
|
74
78
|
- --line-numbers
|
75
79
|
- --inline-source
|
76
80
|
- --main
|
77
|
-
- README
|
81
|
+
- README.rdoc
|
78
82
|
- --title
|
79
83
|
- TExp - Temporal Expressions
|
80
|
-
require_paths:
|
84
|
+
require_paths:
|
81
85
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version:
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
version: "0"
|
93
|
-
version:
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
94
96
|
requirements: []
|
95
|
-
|
96
97
|
rubyforge_project: texp
|
97
|
-
rubygems_version:
|
98
|
+
rubygems_version: 2.0.3
|
98
99
|
signing_key:
|
99
|
-
specification_version:
|
100
|
+
specification_version: 4
|
100
101
|
summary: Temporal Expressions for Ruby.
|
101
102
|
test_files: []
|
102
|
-
|
data/lib/texp/builder.rb
DELETED
@@ -1,254 +0,0 @@
|
|
1
|
-
module TExp
|
2
|
-
|
3
|
-
# Builder methods are available as methods on TExp
|
4
|
-
# (e.g. +TExp.day()+). Alternatively, you can include the
|
5
|
-
# +TExp::Builder+ module into whatever namespace to get direct
|
6
|
-
# access to these methods.
|
7
|
-
module Builder
|
8
|
-
|
9
|
-
# Return a temporal expression that matches any date that falls on
|
10
|
-
# a day of the month given in the argument list.
|
11
|
-
# Examples:
|
12
|
-
#
|
13
|
-
# day(1) # Match any date that falls on the 1st of any month
|
14
|
-
# day(1, 15) # Match any date that falls on the 1st or 15th of any month
|
15
|
-
#
|
16
|
-
def day(*days_of_month)
|
17
|
-
TExp::DayOfMonth.new(days_of_month)
|
18
|
-
end
|
19
|
-
|
20
|
-
# Return a temporal expression that matches any date in the
|
21
|
-
# specified week of the month. Days 1 through 7 are considered
|
22
|
-
# the first week of the month; days 8 through 14 are the second
|
23
|
-
# week; and so on.
|
24
|
-
#
|
25
|
-
# The week is specified by a numeric argument. Negative arguments
|
26
|
-
# are calculated from the end of the month (e.g. -1 would request
|
27
|
-
# the _last_ 7 days of the month). The symbols <tt>:first</tt>,
|
28
|
-
# <tt>:second</tt>, <tt>:third</tt>, <tt>:fourth</tt>,
|
29
|
-
# <tt>:fifth</tt>, and <tt>:last</tt> are also recognized.
|
30
|
-
#
|
31
|
-
# Examples:
|
32
|
-
#
|
33
|
-
# week(1) # Match any date in the first 7 days of any month.
|
34
|
-
# week(1, 2) # Match any date in the first or second 7 days of any month.
|
35
|
-
# week(:first) # Match any date in the first 7 days of any month.
|
36
|
-
# week(:last) # Match any date in the last 7 days of any month.
|
37
|
-
#
|
38
|
-
def week(*weeks)
|
39
|
-
TExp::Week.new(weeks)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Return a temporal expression that matches any date in the list
|
43
|
-
# of given months.
|
44
|
-
#
|
45
|
-
# <b>Examples:</b>
|
46
|
-
#
|
47
|
-
# month(2) # Match any date in February
|
48
|
-
# month(2, 8) # Match any date in February or August
|
49
|
-
# month("February") # Match any date in February
|
50
|
-
# month("Sep", "Apr", "Jun", "Nov")
|
51
|
-
# # Match any date in any month with 30 days.
|
52
|
-
#
|
53
|
-
def month(*month)
|
54
|
-
TExp::Month.new(month)
|
55
|
-
end
|
56
|
-
|
57
|
-
# Return a temporal expression that matches the given list of
|
58
|
-
# years.
|
59
|
-
#
|
60
|
-
# <b>Examples:</b>
|
61
|
-
#
|
62
|
-
# year(2008) # Match any date in 2008
|
63
|
-
# year(2000, 2004, 2008) # Match any date in any of the three years
|
64
|
-
def year(*years)
|
65
|
-
TExp::Year.new(years)
|
66
|
-
end
|
67
|
-
|
68
|
-
# :call-seq:
|
69
|
-
# on(day, month)
|
70
|
-
# on(day, month_string)
|
71
|
-
# on(day, month, year)
|
72
|
-
# on(day, month_string, year)
|
73
|
-
# on(date)
|
74
|
-
# on(date_string)
|
75
|
-
# on(time)
|
76
|
-
# on(object_with_to_date)
|
77
|
-
# on(object_with_to_s)
|
78
|
-
#
|
79
|
-
# Return a temporal expression that matches a particular date of
|
80
|
-
# the year. The temporal expression will be pinned to a
|
81
|
-
# particular year if a year is given (either explicity as a
|
82
|
-
# parameter or implicitly via a +Date+ object). If no year is
|
83
|
-
# given, then the temporal expression will match that date in any
|
84
|
-
# year.
|
85
|
-
#
|
86
|
-
# If only a single argument is given, then the argument may be a
|
87
|
-
# string (which is parsed), a Date, a Time, or an object that
|
88
|
-
# responds to +to_date+. If the single argument is none of the
|
89
|
-
# above, then it is converted to a string (via +to_s+) and given
|
90
|
-
# to <tt>Date.parse()</tt>.
|
91
|
-
#
|
92
|
-
# Invalid arguments will cause +on+ to throw an ArgumentError
|
93
|
-
# exception.
|
94
|
-
#
|
95
|
-
# <b>Examples:</b>
|
96
|
-
#
|
97
|
-
# The following examples all match Feb 14 of any year.
|
98
|
-
#
|
99
|
-
# on(14, 2)
|
100
|
-
# on(14, "February")
|
101
|
-
# on(14, "Feb")
|
102
|
-
# on(14, :feb)
|
103
|
-
#
|
104
|
-
# The following examples all match Feb 14 of the year 2008.
|
105
|
-
#
|
106
|
-
# on(14, 2, 2008)
|
107
|
-
# on(14, "February", 2008)
|
108
|
-
# on(14, "Feb", 2008)
|
109
|
-
# on(14, :feb, 2008)
|
110
|
-
# on("Feb 14, 2008")
|
111
|
-
# on(Date.new(2008, 2, 14))
|
112
|
-
#
|
113
|
-
def on(*args)
|
114
|
-
if args.size == 1
|
115
|
-
arg = args.first
|
116
|
-
case arg
|
117
|
-
when String
|
118
|
-
date = Date.parse(arg)
|
119
|
-
when Date
|
120
|
-
date = arg
|
121
|
-
else
|
122
|
-
if arg.respond_to?(:to_date)
|
123
|
-
date = arg.to_date
|
124
|
-
else
|
125
|
-
date = try_parsing(arg.to_s)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
on(date.day, date.month, date.year)
|
129
|
-
elsif args.size == 2
|
130
|
-
day, month = dm_args(args)
|
131
|
-
TExp::And.new(
|
132
|
-
TExp::DayOfMonth.new(day),
|
133
|
-
TExp::Month.new(month))
|
134
|
-
elsif args.size == 3
|
135
|
-
day, month, year = dmy_args(args)
|
136
|
-
TExp::And.new(
|
137
|
-
TExp::DayOfMonth.new(day),
|
138
|
-
TExp::Month.new(normalize_month(month)),
|
139
|
-
TExp::Year.new(year))
|
140
|
-
else
|
141
|
-
fail DateArgumentError
|
142
|
-
end
|
143
|
-
rescue DateArgumentError
|
144
|
-
fail ArgumentError, "Invalid arguents for on(): #{args.inspect}"
|
145
|
-
end
|
146
|
-
|
147
|
-
# Return a temporal expression matching the given days of the
|
148
|
-
# week.
|
149
|
-
#
|
150
|
-
# <b>Examples:</b>
|
151
|
-
#
|
152
|
-
# dow(2) # Match any date on a Tuesday
|
153
|
-
# dow("Tuesday") # Match any date on a Tuesday
|
154
|
-
# dow(:mon, :wed, :fr) # Match any date on a Monday, Wednesday or Friday
|
155
|
-
#
|
156
|
-
def dow(*dow)
|
157
|
-
TExp::DayOfWeek.new(normalize_dows(dow))
|
158
|
-
end
|
159
|
-
|
160
|
-
# Return a temporal expression that matches
|
161
|
-
def every(n, unit, start_date=Date.today)
|
162
|
-
value = apply_units(unit, n)
|
163
|
-
TExp::DayInterval.new(start_date, value)
|
164
|
-
end
|
165
|
-
|
166
|
-
def normalize_units(args) # :nodoc:
|
167
|
-
result = []
|
168
|
-
while ! args.empty?
|
169
|
-
arg = args.shift
|
170
|
-
case arg
|
171
|
-
when Numeric
|
172
|
-
result.push(arg)
|
173
|
-
when Symbol
|
174
|
-
result.push(apply_units(arg, result.pop))
|
175
|
-
else
|
176
|
-
fail ArgumentError, "Unabled to recognize #{arg}"
|
177
|
-
end
|
178
|
-
end
|
179
|
-
result
|
180
|
-
end
|
181
|
-
|
182
|
-
private
|
183
|
-
|
184
|
-
MONTHNAMES = Date::MONTHNAMES.collect { |mn| mn ? mn[0,3].downcase : nil }
|
185
|
-
DAYNAMES = Date::DAYNAMES.collect { |dn| dn[0,2].downcase }
|
186
|
-
|
187
|
-
UNIT_MULTIPLIERS = {
|
188
|
-
:day => 1, :days => 1,
|
189
|
-
:week => 7, :weeks => 7,
|
190
|
-
:month => 30, :months => 30,
|
191
|
-
:year => 365, :years => 365,
|
192
|
-
}
|
193
|
-
|
194
|
-
def apply_units(unit, value)
|
195
|
-
UNIT_MULTIPLIERS[unit] * value
|
196
|
-
end
|
197
|
-
|
198
|
-
def try_parsing(string)
|
199
|
-
Date.parse(string)
|
200
|
-
rescue ArgumentError
|
201
|
-
fail DateArgumentError
|
202
|
-
end
|
203
|
-
|
204
|
-
def dm_args(args)
|
205
|
-
day, month = args
|
206
|
-
month = normalize_month(month)
|
207
|
-
check_valid_day_month(day, month)
|
208
|
-
[day, month]
|
209
|
-
end
|
210
|
-
|
211
|
-
def dmy_args(args)
|
212
|
-
day, month, year = args
|
213
|
-
month = normalize_month(month)
|
214
|
-
check_valid_day_month(day, month)
|
215
|
-
[day, month, year]
|
216
|
-
end
|
217
|
-
|
218
|
-
def check_valid_day_month(day, month)
|
219
|
-
unless day.kind_of?(Integer) &&
|
220
|
-
month.kind_of?(Integer) &&
|
221
|
-
month >= 1 &&
|
222
|
-
month <= 12 &&
|
223
|
-
day >= 1 &&
|
224
|
-
day <= 31
|
225
|
-
fail DateArgumentError
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
def normalize_month(month_thing)
|
230
|
-
case month_thing
|
231
|
-
when Integer
|
232
|
-
month_thing
|
233
|
-
else
|
234
|
-
MONTHNAMES.index(month_thing.to_s[0,3].downcase)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
def normalize_dows(dow_list)
|
239
|
-
dow_list.collect { |dow| normalize_dow(dow) }
|
240
|
-
end
|
241
|
-
|
242
|
-
def normalize_dow(dow_thing)
|
243
|
-
case dow_thing
|
244
|
-
when Integer
|
245
|
-
dow_thing
|
246
|
-
else
|
247
|
-
DAYNAMES.index(dow_thing.to_s[0,2].downcase)
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
end
|
252
|
-
|
253
|
-
extend Builder
|
254
|
-
end
|