runt 0.7.0 → 0.9.0
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/.gitignore +19 -0
- data/.travis.yml +5 -0
- data/{CHANGES → CHANGES.txt} +24 -8
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -44
- data/README.md +79 -0
- data/Rakefile +6 -119
- data/doc/tutorial_schedule.md +365 -0
- data/doc/tutorial_sugar.md +170 -0
- data/doc/tutorial_te.md +155 -0
- data/lib/runt.rb +36 -21
- data/lib/runt/dprecision.rb +4 -2
- data/lib/runt/pdate.rb +101 -95
- data/lib/runt/schedule.rb +18 -0
- data/lib/runt/sugar.rb +41 -9
- data/lib/runt/temporalexpression.rb +246 -30
- data/lib/runt/version.rb +3 -0
- data/runt.gemspec +24 -0
- data/site/.cvsignore +1 -0
- data/site/dcl-small.gif +0 -0
- data/site/index-rubforge-www.html +72 -0
- data/site/index.html +75 -60
- data/site/runt-logo.gif +0 -0
- data/site/runt-logo.psd +0 -0
- data/test/baseexpressiontest.rb +10 -8
- data/test/combinedexpressionstest.rb +166 -158
- data/test/daterangetest.rb +4 -6
- data/test/diweektest.rb +32 -32
- data/test/dprecisiontest.rb +2 -4
- data/test/everytetest.rb +6 -0
- data/test/expressionbuildertest.rb +2 -3
- data/test/icalendartest.rb +3 -6
- data/test/minitest_helper.rb +7 -0
- data/test/pdatetest.rb +21 -6
- data/test/redaytest.rb +3 -0
- data/test/reyeartest.rb +1 -1
- data/test/runttest.rb +5 -8
- data/test/scheduletest.rb +13 -14
- data/test/sugartest.rb +28 -6
- data/test/{spectest.rb → temporaldatetest.rb} +14 -4
- data/test/{rspectest.rb → temporalrangetest.rb} +4 -4
- data/test/test_runt.rb +11 -0
- data/test/weekintervaltest.rb +106 -0
- metadata +161 -116
- data/README +0 -106
- data/doc/tutorial_schedule.rdoc +0 -393
- data/doc/tutorial_sugar.rdoc +0 -143
- data/doc/tutorial_te.rdoc +0 -190
- data/setup.rb +0 -1331
data/lib/runt/version.rb
ADDED
data/runt.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'runt/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "runt"
|
8
|
+
spec.version = Runt::VERSION
|
9
|
+
spec.authors = ["Matthew Lipper"]
|
10
|
+
spec.email = ["mlipper@gmail.com"]
|
11
|
+
spec.description = %q{Runt is a Ruby implementation of temporal patterns by Martin Fowler. Runt provides an API for working with recurring events using set expressions.}
|
12
|
+
spec.summary = %q{Ruby Temporal Expressions}
|
13
|
+
spec.homepage = "http://github.com/mlipper/runt"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "minitest"
|
24
|
+
end
|
data/site/.cvsignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
doc
|
data/site/dcl-small.gif
CHANGED
File without changes
|
@@ -0,0 +1,72 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
2
|
+
"http://www.w3.org/TR/html4/strict.dtd">
|
3
|
+
|
4
|
+
<html>
|
5
|
+
<head>
|
6
|
+
<title>Runt - Ruby Temporal Expressions</title>
|
7
|
+
<style type="text/css" media="screen">@import "blue-robot3.css";</style>
|
8
|
+
|
9
|
+
</head>
|
10
|
+
|
11
|
+
<body>
|
12
|
+
|
13
|
+
<div class="content">
|
14
|
+
<h1><a href="http://runt.rubyforge.org"><img id="logo" src="runt-logo.gif" title="Choose your own damn acronym" alt="runt logo"></a>Ruby Temporal Expressions</h1>
|
15
|
+
<p><span class="keyword">Runt</span> is an implementation of select temporal patterns by <a href="http://www.martinfowler.com">Martin Fowler</a> in the super-fantastic <a href="http://ruby-lang.org"><span class="ruby-link">Ruby</span></a> language.
|
16
|
+
<span class="keyword">Runt</span> provides:
|
17
|
+
<ul>
|
18
|
+
<li>ability to define recurring events using simple, set-like expressions</li>
|
19
|
+
<li>an interfaced-based API for creating schedules for arbitrary events/objects</li>
|
20
|
+
<li>precisioned date types using <a href="http://martinfowler.com/ap2/timePoint.html">Time Point</a>s</li>
|
21
|
+
<li>date <a href="http://martinfowler.com/ap2/range.html">Range</a>s</li>
|
22
|
+
<li>everlasting peace and/or eternal life</li>
|
23
|
+
</ul>
|
24
|
+
</p>
|
25
|
+
<p>Visit our <a href="http://rubyforge.org/projects/runt/">project page</a> provided by the generous folks at <a href="http://rubyforge.org">Rubyforge</a>.</p>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div class="content">
|
29
|
+
|
30
|
+
<h2>Getting Started</h2>
|
31
|
+
<p>
|
32
|
+
Check out the <a href="./doc/files/doc/tutorial_te_rdoc.html" title="TE Tutorial">temporal expressions tutorial</a>. Then try
|
33
|
+
<a href="./doc/files/doc/tutorial_schedule_rdoc.html" title="Schedule Tutorial">schedule tutorial</a> and finally,
|
34
|
+
<a href="./doc/files/doc/tutorial_sugar_rdoc.html" title="Sugar Tutorial">sugar tutorial</a> for some useful shortcuts.
|
35
|
+
</p>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<div id="contentFooter" class="content">
|
39
|
+
<a href="http://www.digitalclash.com"><<<img id="dcl-logo" src="dcl-small.gif" title="Digital Clash LLC" alt="Digital Clash logo">©2008, Digital Clash LLC>></a>
|
40
|
+
<br/><i>"The weather is here, wish you were beautiful..."</i>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div id="navAlpha">
|
44
|
+
<h2>Links</h2>
|
45
|
+
<p>
|
46
|
+
<a href="http://rubyforge.org/projects/runt/" title="Download Runt">Download</a><br>
|
47
|
+
----<br/>
|
48
|
+
<a href="./doc/index.html" title="RDoc for Runt">RDocs</a><br>
|
49
|
+
<a href="./doc/files/doc/tutorial_te_rdoc.html" title="TE Tutorial">Expression Tutorial</a><br>
|
50
|
+
<a href="./doc/files/doc/tutorial_schedule_rdoc.html" title="Schedule Tutorial">Schedule Tutorial</a><br>
|
51
|
+
<a href="./doc/files/doc/tutorial_sugar_rdoc.html" title="Sugar Tutorial">Sugar Tutorial</a><br>
|
52
|
+
----<br/>
|
53
|
+
<a href="./doc/files/README.html">README</a><br/>
|
54
|
+
<a href="./doc/files/CHANGES.html">CHANGES</a><br/>
|
55
|
+
</p>
|
56
|
+
</div>
|
57
|
+
|
58
|
+
<div id="navBeta">
|
59
|
+
<h2>Suggested Reading</h2>
|
60
|
+
<p>Most of the usage and design patterns contained in this library are based on a series of articles by Martin Fowler. Some suggested reading:</p>
|
61
|
+
<p>
|
62
|
+
<a href="http://martinfowler.com/ap2/timeNarrative.html">Time Narrative</a><br/>
|
63
|
+
<a href="http://martinfowler.com/apsupp/recurring.pdf">Recurring Events</a><br/>
|
64
|
+
<a href="http://martinfowler.com/ap2/timePoint.html">Time Point</a><br/>
|
65
|
+
<a href="http://martinfowler.com/ap2/range.html">Range</a><br/>
|
66
|
+
</p>
|
67
|
+
</div>
|
68
|
+
|
69
|
+
<!-- BlueRobot was here. -->
|
70
|
+
|
71
|
+
</body>
|
72
|
+
</html>
|
data/site/index.html
CHANGED
@@ -1,72 +1,87 @@
|
|
1
|
-
<!DOCTYPE
|
2
|
-
"
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>We've moved!</title>
|
6
|
+
<style>
|
7
|
+
::-moz-selection {
|
8
|
+
background: #b3d4fc;
|
9
|
+
text-shadow: none;
|
10
|
+
}
|
3
11
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
12
|
+
::selection {
|
13
|
+
background: #b3d4fc;
|
14
|
+
text-shadow: none;
|
15
|
+
}
|
8
16
|
|
9
|
-
|
17
|
+
html {
|
18
|
+
padding: 30px 10px;
|
19
|
+
font-size: 20px;
|
20
|
+
line-height: 1.4;
|
21
|
+
color: #737373;
|
22
|
+
background: #f0f0f0;
|
23
|
+
-webkit-text-size-adjust: 100%;
|
24
|
+
-ms-text-size-adjust: 100%;
|
25
|
+
}
|
10
26
|
|
11
|
-
|
27
|
+
html,
|
28
|
+
input {
|
29
|
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
30
|
+
}
|
12
31
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
</ul>
|
24
|
-
</p>
|
25
|
-
<p>Visit our <a href="http://rubyforge.org/projects/runt/">project page</a> provided by the generous folks at <a href="http://rubyforge.org">Rubyforge</a>.</p>
|
26
|
-
</div>
|
32
|
+
body {
|
33
|
+
max-width: 500px;
|
34
|
+
_width: 500px;
|
35
|
+
padding: 30px 20px 50px;
|
36
|
+
border: 1px solid #b3b3b3;
|
37
|
+
border-radius: 4px;
|
38
|
+
margin: 0 auto;
|
39
|
+
box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;
|
40
|
+
background: #fcfcfc;
|
41
|
+
}
|
27
42
|
|
28
|
-
|
43
|
+
h1 {
|
44
|
+
margin: 0 10px;
|
45
|
+
font-size: 50px;
|
46
|
+
text-align: center;
|
47
|
+
}
|
29
48
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
<a href="./doc/files/doc/tutorial_schedule_rdoc.html" title="Schedule Tutorial">schedule tutorial</a> and finally,
|
34
|
-
<a href="./doc/files/doc/tutorial_sugar_rdoc.html" title="Sugar Tutorial">sugar tutorial</a> for some useful shortcuts.
|
35
|
-
</p>
|
36
|
-
</div>
|
49
|
+
h1 span {
|
50
|
+
color: #bbb;
|
51
|
+
}
|
37
52
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
</div>
|
53
|
+
h3 {
|
54
|
+
margin: 1.5em 0 0.5em;
|
55
|
+
}
|
42
56
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
<a href="http://rubyforge.org/projects/runt/" title="Download Runt">Download</a><br>
|
47
|
-
----<br/>
|
48
|
-
<a href="./doc/index.html" title="RDoc for Runt">RDocs</a><br>
|
49
|
-
<a href="./doc/files/doc/tutorial_te_rdoc.html" title="TE Tutorial">Expression Tutorial</a><br>
|
50
|
-
<a href="./doc/files/doc/tutorial_schedule_rdoc.html" title="Schedule Tutorial">Schedule Tutorial</a><br>
|
51
|
-
<a href="./doc/files/doc/tutorial_sugar_rdoc.html" title="Sugar Tutorial">Sugar Tutorial</a><br>
|
52
|
-
----<br/>
|
53
|
-
<a href="./doc/files/README.html">README</a><br/>
|
54
|
-
<a href="./doc/files/CHANGES.html">CHANGES</a><br/>
|
55
|
-
</p>
|
56
|
-
</div>
|
57
|
+
p {
|
58
|
+
margin: 1em 0;
|
59
|
+
}
|
57
60
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
<a href="http://martinfowler.com/ap2/timeNarrative.html">Time Narrative</a><br/>
|
63
|
-
<a href="http://martinfowler.com/apsupp/recurring.pdf">Recurring Events</a><br/>
|
64
|
-
<a href="http://martinfowler.com/ap2/timePoint.html">Time Point</a><br/>
|
65
|
-
<a href="http://martinfowler.com/ap2/range.html">Range</a><br/>
|
66
|
-
</p>
|
67
|
-
</div>
|
61
|
+
ul {
|
62
|
+
padding: 0 0 0 40px;
|
63
|
+
margin: 1em 0;
|
64
|
+
}
|
68
65
|
|
69
|
-
|
66
|
+
.container {
|
67
|
+
max-width: 380px;
|
68
|
+
_width: 380px;
|
69
|
+
margin: 0 auto;
|
70
|
+
}
|
70
71
|
|
71
|
-
|
72
|
+
input::-moz-focus-inner {
|
73
|
+
padding: 0;
|
74
|
+
border: 0;
|
75
|
+
}
|
76
|
+
</style>
|
77
|
+
</head>
|
78
|
+
<body>
|
79
|
+
<div class="container">
|
80
|
+
<h1>We've moved!</h1>
|
81
|
+
<p>The Runt project is now hosted on <a href="https://github.com/mlipper/runt">GitHub</a>.</p>
|
82
|
+
<ul>
|
83
|
+
<li><a href="https://github.com/mlipper/runt">Official Runt Project Home</a></li>
|
84
|
+
</ul>
|
85
|
+
</div>
|
86
|
+
</body>
|
72
87
|
</html>
|
data/site/runt-logo.gif
CHANGED
File without changes
|
data/site/runt-logo.psd
CHANGED
File without changes
|
data/test/baseexpressiontest.rb
CHANGED
@@ -1,16 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'runt'
|
5
|
-
require 'date'
|
6
|
-
require 'time'
|
3
|
+
require 'minitest_helper.rb'
|
7
4
|
|
8
5
|
$DEBUG=false
|
9
6
|
|
10
7
|
# Base test case for refactored temporal expression unit tests
|
11
8
|
# Author:: Matthew Lipper
|
12
9
|
|
13
|
-
class BaseExpressionTest <
|
10
|
+
class BaseExpressionTest < MiniTest::Unit::TestCase
|
14
11
|
|
15
12
|
include Runt
|
16
13
|
include DPrecision
|
@@ -28,6 +25,7 @@ class BaseExpressionTest < Test::Unit::TestCase
|
|
28
25
|
@pdate_20071028 = PDate.day(2007,10,28) # Sunday, October 28th, 2007
|
29
26
|
@pdate_20071030 = PDate.day(2007,10,30) # Tuesday, October 30th, 2007
|
30
27
|
@pdate_20071114 = PDate.day(2007,11,14) # Wednesday, November 14th, 2007
|
28
|
+
@pdate_20081112 = PDate.day(2008,11,12) # Wednesday, November 12th, 2008
|
31
29
|
@pdate_1922041816 = PDate.hour(1922,4,18,16) # 4pm, Tuesday, April 18th, 1922
|
32
30
|
@pdate_1975060512 = PDate.hour(1975,6,5,12) # 12pm, Thursday, June 5th, 1975
|
33
31
|
@pdate_2004090600 = PDate.hour(2004,9,6,0) # 12am, Monday, September 6th, 2004
|
@@ -80,10 +78,14 @@ class BaseExpressionTest < Test::Unit::TestCase
|
|
80
78
|
@time_20070930235959 = Time.mktime(2007,9,30,23,59,59) # 11:59:59am, Sunday, September 30th, 2007
|
81
79
|
end
|
82
80
|
|
83
|
-
|
84
|
-
|
85
|
-
end
|
81
|
+
# override default_test keeps it from growling about no other tests in this file
|
82
|
+
def default_test; end
|
86
83
|
|
84
|
+
def assert_raise_message(types, matcher, message = nil, &block)
|
85
|
+
args = [types].flatten + [message]
|
86
|
+
exception = assert_raise(*args, &block)
|
87
|
+
assert_match matcher, exception.message, message
|
88
|
+
end
|
87
89
|
end
|
88
90
|
|
89
91
|
class StubExpression
|
@@ -1,158 +1,166 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
dates
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
expr
|
35
|
-
assert expr.include?(@
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
expr
|
41
|
-
assert expr.include?(@
|
42
|
-
assert !expr.include?(@
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
expr
|
49
|
-
assert expr.include?(@
|
50
|
-
assert expr.include?(@
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
expr
|
56
|
-
assert
|
57
|
-
assert expr.include?(@
|
58
|
-
assert
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
#
|
70
|
-
assert job.include?(
|
71
|
-
|
72
|
-
|
73
|
-
job_with_holiday
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
#
|
90
|
-
#
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
june_through_august
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
#
|
114
|
-
|
115
|
-
assert summer_time.include?(@
|
116
|
-
|
117
|
-
#
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
assert mon_wed_fri.include?(@
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
eleven_thirty_to_two
|
139
|
-
assert eleven_thirty_to_two.include?(@
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
#
|
144
|
-
#
|
145
|
-
|
146
|
-
parking_ticket
|
147
|
-
assert parking_ticket.include?(@
|
148
|
-
assert parking_ticket.include?(@
|
149
|
-
assert parking_ticket.include?(@
|
150
|
-
|
151
|
-
|
152
|
-
#
|
153
|
-
#
|
154
|
-
#
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'baseexpressiontest'
|
4
|
+
|
5
|
+
# Unit tests for composite temporal expressions
|
6
|
+
# Author:: Matthew Lipper
|
7
|
+
|
8
|
+
class CombinedExpressionTest < BaseExpressionTest
|
9
|
+
|
10
|
+
def test_dates_on_last_fri_or_first_tues
|
11
|
+
date_range = @date_20050101..@date_20051231
|
12
|
+
expr = DIMonth.new(Last, Friday) | DIMonth.new(First, Tuesday)
|
13
|
+
dates = expr.dates(date_range)
|
14
|
+
assert_equal 24, dates.size, "Expected 24 dates in 2005 which were either on the last Friday or first Tuesday of the month"
|
15
|
+
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
16
|
+
dates.each do |d|
|
17
|
+
unless (d.wday == 2 and d.day < 8) or \
|
18
|
+
(d.wday == 5 and d.day > month_days[d.month-1] - 8)
|
19
|
+
# Fail
|
20
|
+
assert false, d.to_s
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_january_except_from_7th_to_15th
|
26
|
+
date_range = @date_20050101..@date_20050131
|
27
|
+
dates = (REYear.new(1, 1, 1, 31) - REMonth.new(7, 15)).dates(date_range)
|
28
|
+
assert_equal 22, dates.size, "Expected 22 dates: 1/1-1/6, 1/16-1/31"
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_work_day
|
32
|
+
# Should match for 9am to 5pm except for 12pm to 1pm
|
33
|
+
expr = REDay.new(9,0,17,0) - REDay.new(12,0,13,0)
|
34
|
+
assert expr.include?(@pdate_200405030906), "Expression #{expr.to_s} should include #{@pdate_200405030906.to_s}"
|
35
|
+
assert !expr.include?(@pdate_1975060512), "Expression #{expr.to_s} should not include #{@pdate_1975060512.to_s}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_monday_tuesday_8am_to_9am
|
39
|
+
expr = REWeek.new(Mon,Fri) & REDay.new(8,0,9,0)
|
40
|
+
assert expr.include?(@pdate_200405040806), "Expression #{expr.to_s} should include #{@pdate_200405040806.to_s}"
|
41
|
+
assert !expr.include?(@pdate_200405010806), "Expression #{expr.to_s} should not include #{@pdate_200405010806.to_s}"
|
42
|
+
assert !expr.include?(@pdate_200405030906), "Expression #{expr.to_s} should not include #{@pdate_200405030906.to_s}"
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def test_midnight_to_9am_or_tuesday
|
47
|
+
expr = REDay.new(0,0,9,0) | DIWeek.new(Tuesday)
|
48
|
+
assert expr.include?(@pdate_20071030), "Expression #{expr.to_s} should include #{@pdate_20071030.to_s}"
|
49
|
+
assert expr.include?(@pdate_2012050803), "Expression #{expr.to_s} should include #{@pdate_2012050803.to_s}"
|
50
|
+
assert !expr.include?(@pdate_20071116100030), "Expression #{expr.to_s} should not include #{@pdate_20071116100030.to_s}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_wednesday_thru_saturday_6_to_12am
|
54
|
+
expr = REWeek.new(Wed, Sat) & REDay.new(6,0,12,00)
|
55
|
+
assert !expr.include?(@time_20070926000000), "Expression #{expr.to_s} should include #{@time_20070926000000.to_s}"
|
56
|
+
assert expr.include?(@time_20070927065959), "Expression #{expr.to_s} should include #{@time_20070927065959.to_s}"
|
57
|
+
assert !expr.include?(@time_20070928000000), "Expression #{expr.to_s} should include #{@time_20070928000000.to_s}"
|
58
|
+
assert expr.include?(@time_20070929110000), "Expression #{expr.to_s} should include #{@time_20070929110000.to_s}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_memorial_day
|
62
|
+
# Monday through Friday, from 9am to 5pm
|
63
|
+
job = REWeek.new(Mon,Fri) & REDay.new(9,00,17,00)
|
64
|
+
# Memorial Day (U.S.)
|
65
|
+
memorial_day = REYear.new(5) & DIMonth.new(Last,Monday)
|
66
|
+
# May 29th, 2006
|
67
|
+
last_monday_in_may = @pdate_200605291012
|
68
|
+
# Before
|
69
|
+
assert job.include?(last_monday_in_may), "Expression #{job.to_s} should include #{last_monday_in_may.to_s}"
|
70
|
+
assert job.include?(@pdate_200605301400), "Expression #{job.to_s} should include #{@pdate_200605301400.to_s}"
|
71
|
+
# Add Diff expression
|
72
|
+
job_with_holiday = job - last_monday_in_may
|
73
|
+
assert !job_with_holiday.include?(last_monday_in_may), "Expression #{job_with_holiday.to_s} should not include #{last_monday_in_may.to_s}"
|
74
|
+
# Still have to work on Tuesday
|
75
|
+
assert job.include?(@pdate_200605301400), "Expression #{job.to_s} should include #{@pdate_200605301400.to_s}"
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_summertime
|
79
|
+
#This is a hack.....
|
80
|
+
#In the U.S., Memorial Day begins the last Monday of May
|
81
|
+
#
|
82
|
+
#The month of May
|
83
|
+
may=REYear.new(5)
|
84
|
+
#Monday through Saturday
|
85
|
+
monday_to_saturday = REWeek.new(1,6)
|
86
|
+
#Last week of (any) month
|
87
|
+
last_week_in = WIMonth.new(Last_of)
|
88
|
+
#So, to say 'starting from the last Monday in May',
|
89
|
+
#we need to select just that last week of May begining with
|
90
|
+
#the Monday of that week
|
91
|
+
last_week_of_may = may & monday_to_saturday & last_week_in
|
92
|
+
|
93
|
+
#This is another hack similar to the above, except instead of selecting a range
|
94
|
+
#starting at the begining of the month, we need to select only the time period in
|
95
|
+
#September up until Labor Day.
|
96
|
+
#
|
97
|
+
#In the U.S., Labor Day is the first Monday in September
|
98
|
+
#
|
99
|
+
#The month of September
|
100
|
+
september=REYear.new(9)
|
101
|
+
#First week of (any) month
|
102
|
+
first_week_in = WIMonth.new(First)
|
103
|
+
entire_first_week_of_september = september & first_week_in
|
104
|
+
#To exclude everything in the first week which occurs on or after Monday.
|
105
|
+
first_week_of_september=entire_first_week_of_september - monday_to_saturday
|
106
|
+
#June through August
|
107
|
+
june_through_august=REYear.new(6, 1, 8)
|
108
|
+
assert june_through_august.include?(@pdate_20040704), "Expression #{june_through_august.to_s} should include #{@pdate_20040704.to_s}"
|
109
|
+
#Finally!
|
110
|
+
summer_time = last_week_of_may | first_week_of_september | june_through_august
|
111
|
+
|
112
|
+
#Will work, but will be incredibly slow:
|
113
|
+
# assert(summer_time.include?(PDate.min(2004,5,31,0,0)))
|
114
|
+
assert summer_time.include?(@pdate_20040531), "Expression #{summer_time.to_s} should include #{@pdate_20040704.to_s}"
|
115
|
+
assert summer_time.include?(@pdate_20040704), "Expression #{summer_time.to_s} should include #{@pdate_20040704.to_s}"
|
116
|
+
#also works...also slow:
|
117
|
+
# assert(!summer_time.include?(PDate.min(2004,9,6,0,0)))
|
118
|
+
assert !summer_time.include?(@pdate_2004090600), "Expression #{summer_time.to_s} should not include #{@pdate_2004090600.to_s}"
|
119
|
+
|
120
|
+
end
|
121
|
+
def test_nyc_parking_te
|
122
|
+
|
123
|
+
#Monday, Wednesday, Friday
|
124
|
+
mon_wed_fri = DIWeek.new(Mon) | \
|
125
|
+
DIWeek.new(Wed) | \
|
126
|
+
DIWeek.new(Fri)
|
127
|
+
|
128
|
+
assert mon_wed_fri.include?(@datetime_200403101915), "Expression #{mon_wed_fri.to_s} should include #{@datetime_200403101915.to_s}"
|
129
|
+
assert !mon_wed_fri.include?(@datetime_200403140900), "Expression #{mon_wed_fri.to_s} should not include #{@datetime_200403140900.to_s}"
|
130
|
+
# 8am to 11am
|
131
|
+
eight_to_eleven = REDay.new(8,00,11,00)
|
132
|
+
# => Mon,Wed,Fri - 8am to 11am
|
133
|
+
expr1 = mon_wed_fri & eight_to_eleven
|
134
|
+
# Tuesdays, Thursdays
|
135
|
+
tues_thurs = DIWeek.new(Tue) | DIWeek.new(Thu)
|
136
|
+
# 11:30am to 2pm
|
137
|
+
eleven_thirty_to_two = REDay.new(11,30,14,00)
|
138
|
+
assert eleven_thirty_to_two.include?(@datetime_200403081200), "Expression #{eleven_thirty_to_two.to_s} should include #{@datetime_200403081200.to_s}"
|
139
|
+
assert !eleven_thirty_to_two.include?(@datetime_200403110000), "Expression #{eleven_thirty_to_two.to_s} should not include #{@datetime_200403110000.to_s}"
|
140
|
+
# => Tues,Thurs - 11:30am to 2pm
|
141
|
+
expr2 = tues_thurs & eleven_thirty_to_two
|
142
|
+
#
|
143
|
+
# No parking: Mon Wed Fri, 8am - 11am
|
144
|
+
# Tu Thu, 11:30am - 2pm
|
145
|
+
parking_ticket = expr1 | expr2
|
146
|
+
assert parking_ticket.include?(@datetime_200403111215), "Expression #{parking_ticket.to_s} should include #{@datetime_200403111215.to_s}"
|
147
|
+
assert parking_ticket.include?(@datetime_200403100915), "Expression #{parking_ticket.to_s} should include #{@datetime_200403100915.to_s}"
|
148
|
+
assert parking_ticket.include?(@datetime_200403100800), "Expression #{parking_ticket.to_s} should include #{@datetime_200403100800.to_s}"
|
149
|
+
assert !parking_ticket.include?(@datetime_200403110115), "Expression #{parking_ticket.to_s} should not include #{@datetime_200403110115.to_s}"
|
150
|
+
|
151
|
+
# The preceeding example can be condensed to:
|
152
|
+
# e1 = (DIWeek.new(Mon) | DIWeek.new(Wed) | DIWeek.new(Fri)) & REDay.new(8,00,11,00)
|
153
|
+
# e2 = (DIWeek.new(Tue) | DIWeek.new(Thu)) & REDay.new(11,30,14,00)
|
154
|
+
# ticket = e1 | e2
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_dates_every_four_hours_on_tuesdays
|
158
|
+
# 3am, Tuesday, May 8th, 2012 to 3am Wednesday, May 9th, 2012
|
159
|
+
range = DateRange.new(@pdate_2012050803, PDate.new(2012,5,9,15))
|
160
|
+
every_four_hours = EveryTE.new(@pdate_2012050803,4)
|
161
|
+
tuesday = DIWeek.new(Tuesday)
|
162
|
+
every_four_hours_on_tuesday = every_four_hours & tuesday
|
163
|
+
result = every_four_hours_on_tuesday.dates(range)
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|