tempr 0.1.3 → 0.1.4
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/CHANGELOG.markdown +4 -0
- data/lib/tempr/date_time_range.rb +32 -0
- data/lib/tempr/version.rb +1 -1
- data/test/range_adjacency.rb +257 -0
- metadata +7 -6
data/CHANGELOG.markdown
CHANGED
@@ -31,6 +31,10 @@ module Tempr
|
|
31
31
|
#
|
32
32
|
# Or check for inclusion of a date/time:
|
33
33
|
#
|
34
|
+
# subrange.cover? Time.parse("2012-05-17 2:30pm")
|
35
|
+
#
|
36
|
+
# which is a shortcut for
|
37
|
+
#
|
34
38
|
# subrange.any? {|r| r.cover?(Time.parse("2012-05-17 2:30pm")) }
|
35
39
|
#
|
36
40
|
# Note that the order of the chained rules is important, they must be defined
|
@@ -511,6 +515,22 @@ module Tempr
|
|
511
515
|
!!intersection_with(other)
|
512
516
|
end
|
513
517
|
|
518
|
+
# true iff self immediately precedes other range
|
519
|
+
def precedes?(other)
|
520
|
+
range_precedes(self, other)
|
521
|
+
end
|
522
|
+
|
523
|
+
# true iff self immediately succeeds (follows) other range
|
524
|
+
def succeeds?(other)
|
525
|
+
range_precedes(other, self)
|
526
|
+
end
|
527
|
+
alias follows? succeeds?
|
528
|
+
|
529
|
+
# true iff self either succeeds or follows other range
|
530
|
+
def adjacent_to?(other)
|
531
|
+
succeeds?(other) || precedes?(other)
|
532
|
+
end
|
533
|
+
|
514
534
|
# ---
|
515
535
|
|
516
536
|
# convenience wrapper for SubRangeIterator.new(self) { ... }
|
@@ -539,6 +559,18 @@ module Tempr
|
|
539
559
|
end
|
540
560
|
end
|
541
561
|
|
562
|
+
# note that date ranges will always be adjusted to exclude the end,
|
563
|
+
# so only inclusive time ranges will need to add +1 second to check adjacency
|
564
|
+
def range_precedes(rng,oth)
|
565
|
+
r1, r2 = matched_range_types(rng,oth)
|
566
|
+
diff = if r1.respond_to?(:exclude_end?) && r1.exclude_end?
|
567
|
+
0
|
568
|
+
else
|
569
|
+
1
|
570
|
+
end
|
571
|
+
(r1.end + diff) == r2.begin
|
572
|
+
end
|
573
|
+
|
542
574
|
# ---
|
543
575
|
|
544
576
|
# Iterators are defined by
|
data/lib/tempr/version.rb
CHANGED
@@ -0,0 +1,257 @@
|
|
1
|
+
require File.expand_path('test_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
module RangeAdjacencyTests
|
4
|
+
|
5
|
+
Fixtures = [
|
6
|
+
{
|
7
|
+
:case => "inclusive date ranges, other equals self",
|
8
|
+
:subject => (Date.civil(2012,2,13)..
|
9
|
+
Date.civil(2012,2,17)).extend(Tempr::DateTimeRange),
|
10
|
+
:other => Date.civil(2012,2,13)..Date.civil(2012,2,17),
|
11
|
+
:precedes => false,
|
12
|
+
:succeeds => false,
|
13
|
+
:adjacent => false
|
14
|
+
},
|
15
|
+
{
|
16
|
+
:case => "inclusive date ranges, other within self",
|
17
|
+
:subject => (Date.civil(2012,2,13)..
|
18
|
+
Date.civil(2012,2,17)).extend(Tempr::DateTimeRange),
|
19
|
+
:other => Date.civil(2012,2,13)..Date.civil(2012,2,16),
|
20
|
+
:precedes => false,
|
21
|
+
:succeeds => false,
|
22
|
+
:adjacent => false
|
23
|
+
},
|
24
|
+
{
|
25
|
+
:case => "inclusive date ranges, other precedes self",
|
26
|
+
:subject => (Date.civil(2012,2,13)..
|
27
|
+
Date.civil(2012,2,17)).extend(Tempr::DateTimeRange),
|
28
|
+
:other => Date.civil(2012,2,1)..Date.civil(2012,2,12),
|
29
|
+
:precedes => false,
|
30
|
+
:succeeds => true,
|
31
|
+
:adjacent => true
|
32
|
+
},
|
33
|
+
{
|
34
|
+
:case => "inclusive date ranges, self precedes other",
|
35
|
+
:subject => (Date.civil(2012,2,13)..
|
36
|
+
Date.civil(2012,2,17)).extend(Tempr::DateTimeRange),
|
37
|
+
:other => Date.civil(2012,2,18)..Date.civil(2012,2,25),
|
38
|
+
:precedes => true,
|
39
|
+
:succeeds => false,
|
40
|
+
:adjacent => true
|
41
|
+
},
|
42
|
+
{
|
43
|
+
:case => "exclusive date ranges, other equals self",
|
44
|
+
:subject => (Date.civil(2012,2,13)...
|
45
|
+
Date.civil(2012,2,18)).extend(Tempr::DateTimeRange),
|
46
|
+
:other => Date.civil(2012,2,13)...Date.civil(2012,2,18),
|
47
|
+
:precedes => false,
|
48
|
+
:succeeds => false,
|
49
|
+
:adjacent => false
|
50
|
+
},
|
51
|
+
{
|
52
|
+
:case => "exclusive date ranges, other within self",
|
53
|
+
:subject => (Date.civil(2012,2,13)...
|
54
|
+
Date.civil(2012,2,18)).extend(Tempr::DateTimeRange),
|
55
|
+
:other => Date.civil(2012,2,13)...Date.civil(2012,2,17),
|
56
|
+
:precedes => false,
|
57
|
+
:succeeds => false,
|
58
|
+
:adjacent => false
|
59
|
+
},
|
60
|
+
{
|
61
|
+
:case => "exclusive date ranges, other precedes self",
|
62
|
+
:subject => (Date.civil(2012,2,13)...
|
63
|
+
Date.civil(2012,2,18)).extend(Tempr::DateTimeRange),
|
64
|
+
:other => Date.civil(2012,2,1)...Date.civil(2012,2,13),
|
65
|
+
:precedes => false,
|
66
|
+
:succeeds => true,
|
67
|
+
:adjacent => true
|
68
|
+
},
|
69
|
+
{
|
70
|
+
:case => "exclusive date ranges, self precedes other",
|
71
|
+
:subject => (Date.civil(2012,2,13)...
|
72
|
+
Date.civil(2012,2,18)).extend(Tempr::DateTimeRange),
|
73
|
+
:other => Date.civil(2012,2,18)...Date.civil(2012,2,25),
|
74
|
+
:precedes => true,
|
75
|
+
:succeeds => false,
|
76
|
+
:adjacent => true
|
77
|
+
},
|
78
|
+
|
79
|
+
#---------- time range cases
|
80
|
+
|
81
|
+
{
|
82
|
+
:case => "inclusive time ranges, other equals self",
|
83
|
+
:subject => (Time.new(2012,2,13,12,11,10)..
|
84
|
+
Time.new(2012,2,17,16,15,14)).extend(Tempr::DateTimeRange),
|
85
|
+
:other => (Time.new(2012,2,13,12,11,10)..
|
86
|
+
Time.new(2012,2,17,16,15,14)),
|
87
|
+
:precedes => false,
|
88
|
+
:succeeds => false,
|
89
|
+
:adjacent => false
|
90
|
+
},
|
91
|
+
{
|
92
|
+
:case => "inclusive time ranges, other within self",
|
93
|
+
:subject => (Time.new(2012,2,13,12,11,10)..
|
94
|
+
Time.new(2012,2,17,16,15,14)).extend(Tempr::DateTimeRange),
|
95
|
+
:other => (Time.new(2012,2,13,12,11,10)..
|
96
|
+
Time.new(2012,2,17,16,15,13)),
|
97
|
+
:precedes => false,
|
98
|
+
:succeeds => false,
|
99
|
+
:adjacent => false
|
100
|
+
},
|
101
|
+
{
|
102
|
+
:case => "inclusive time ranges, self precedes other",
|
103
|
+
:subject => (Time.new(2012,2,13,12,11,10)..
|
104
|
+
Time.new(2012,2,17,16,15,14)).extend(Tempr::DateTimeRange),
|
105
|
+
:other => (Time.new(2012,2,17,16,15,15)..
|
106
|
+
Time.new(2012,2,17,16,15,16)),
|
107
|
+
:precedes => true,
|
108
|
+
:succeeds => false,
|
109
|
+
:adjacent => true
|
110
|
+
},
|
111
|
+
{
|
112
|
+
:case => "inclusive time ranges, other precedes self",
|
113
|
+
:subject => (Time.new(2012,2,13,0,0,0)..
|
114
|
+
Time.new(2012,2,17,0,0,0)).extend(Tempr::DateTimeRange),
|
115
|
+
:other => (Time.new(2012,2,1,0,0,0)..
|
116
|
+
Time.new(2012,2,12,23,59,59)),
|
117
|
+
:precedes => false,
|
118
|
+
:succeeds => true,
|
119
|
+
:adjacent => true
|
120
|
+
},
|
121
|
+
{
|
122
|
+
:case => "exclusive time ranges, other equals self",
|
123
|
+
:subject => (Time.new(2012,2,13,12,11,10)...
|
124
|
+
Time.new(2012,2,17,16,15,14)).extend(Tempr::DateTimeRange),
|
125
|
+
:other => (Time.new(2012,2,13,12,11,10)...
|
126
|
+
Time.new(2012,2,17,16,15,14)),
|
127
|
+
:precedes => false,
|
128
|
+
:succeeds => false,
|
129
|
+
:adjacent => false
|
130
|
+
},
|
131
|
+
{
|
132
|
+
:case => "inclusive time ranges, other within self",
|
133
|
+
:subject => (Time.new(2012,2,13,12,11,10)...
|
134
|
+
Time.new(2012,2,17,16,15,14)).extend(Tempr::DateTimeRange),
|
135
|
+
:other => (Time.new(2012,2,13,12,11,10)...
|
136
|
+
Time.new(2012,2,17,16,15,13)),
|
137
|
+
:precedes => false,
|
138
|
+
:succeeds => false,
|
139
|
+
:adjacent => false
|
140
|
+
},
|
141
|
+
{
|
142
|
+
:case => "inclusive time ranges, self precedes other",
|
143
|
+
:subject => (Time.new(2012,2,13,12,11,10)...
|
144
|
+
Time.new(2012,2,17,16,15,14)).extend(Tempr::DateTimeRange),
|
145
|
+
:other => (Time.new(2012,2,17,16,15,14)..
|
146
|
+
Time.new(2012,2,17,16,15,16)),
|
147
|
+
:precedes => true,
|
148
|
+
:succeeds => false,
|
149
|
+
:adjacent => true
|
150
|
+
},
|
151
|
+
{
|
152
|
+
:case => "inclusive time ranges, other precedes self",
|
153
|
+
:subject => (Time.new(2012,2,13,0,0,0)..
|
154
|
+
Time.new(2012,2,17,0,0,0)).extend(Tempr::DateTimeRange),
|
155
|
+
:other => (Time.new(2012,2,1,0,0,0)...
|
156
|
+
Time.new(2012,2,13,0,0,0)),
|
157
|
+
:precedes => false,
|
158
|
+
:succeeds => true,
|
159
|
+
:adjacent => true
|
160
|
+
},
|
161
|
+
#---------- date/time range cases
|
162
|
+
|
163
|
+
{
|
164
|
+
:case => "date range intersects other time range, other equivalent to self",
|
165
|
+
:subject => (Date.civil(2012,2,13)..
|
166
|
+
Date.civil(2012,2,17)).extend(Tempr::DateTimeRange),
|
167
|
+
:other => (Time.new(2012,2,13,0,0,0)...
|
168
|
+
Time.new(2012,2,18,0,0,0)),
|
169
|
+
:precedes => false,
|
170
|
+
:succeeds => false,
|
171
|
+
:adjacent => false
|
172
|
+
},
|
173
|
+
{
|
174
|
+
:case => "time range compared to other date range, other within self",
|
175
|
+
:subject => (Time.new(2012,2,13,0,0,0)...
|
176
|
+
Time.new(2012,2,18,0,0,0)).extend(Tempr::DateTimeRange),
|
177
|
+
:other => (Date.civil(2012,2,13)..
|
178
|
+
Date.civil(2012,2,16)),
|
179
|
+
:precedes => false,
|
180
|
+
:succeeds => false,
|
181
|
+
:adjacent => false
|
182
|
+
},
|
183
|
+
{
|
184
|
+
:case => "date range compared to other time range, self precedes other",
|
185
|
+
:subject => (Date.civil(2012,2,13)..
|
186
|
+
Date.civil(2012,2,17)).extend(Tempr::DateTimeRange),
|
187
|
+
:other => (Time.new(2012,2,18,0,0,0)...
|
188
|
+
Time.new(2012,2,19,0,0,0)),
|
189
|
+
:precedes => true,
|
190
|
+
:succeeds => false,
|
191
|
+
:adjacent => true
|
192
|
+
},
|
193
|
+
{
|
194
|
+
:case => "time range compared to other date range, self precedes other",
|
195
|
+
:subject => (Time.new(2012,2,13,0,0,0)...
|
196
|
+
Time.new(2012,2,18,0,0,0)).extend(Tempr::DateTimeRange),
|
197
|
+
:other => (Date.civil(2012,2,18)..
|
198
|
+
Date.civil(2012,2,19)),
|
199
|
+
:precedes => true,
|
200
|
+
:succeeds => false,
|
201
|
+
:adjacent => true
|
202
|
+
},
|
203
|
+
{
|
204
|
+
:case => "date range compared to other time range, other precedes self",
|
205
|
+
:subject => (Date.civil(2012,2,13)..
|
206
|
+
Date.civil(2012,2,17)).extend(Tempr::DateTimeRange),
|
207
|
+
:other => (Time.new(2012,2,1,0,0,0)...
|
208
|
+
Time.new(2012,2,13,0,0,0)),
|
209
|
+
:precedes => false,
|
210
|
+
:succeeds => true,
|
211
|
+
:adjacent => true
|
212
|
+
},
|
213
|
+
{
|
214
|
+
:case => "time range compared to other date range, other precedes self",
|
215
|
+
:subject => (Time.new(2012,2,13,0,0,0)...
|
216
|
+
Time.new(2012,2,18,0,0,0)).extend(Tempr::DateTimeRange),
|
217
|
+
:other => (Date.civil(2012,2,1)..
|
218
|
+
Date.civil(2012,2,12)),
|
219
|
+
:precedes => false,
|
220
|
+
:succeeds => true,
|
221
|
+
:adjacent => true
|
222
|
+
}
|
223
|
+
]
|
224
|
+
|
225
|
+
describe "DateTimeRange#intersection_with, date ranges" do
|
226
|
+
|
227
|
+
Fixtures.each do |fixture|
|
228
|
+
|
229
|
+
describe fixture[:case] do
|
230
|
+
let(:subject) { fixture[:subject] }
|
231
|
+
let(:other) { fixture[:other] }
|
232
|
+
let(:expected_precedes) { fixture[:precedes] }
|
233
|
+
let(:expected_succeeds) { fixture[:succeeds] }
|
234
|
+
let(:expected_adjacent) { fixture[:adjacent] }
|
235
|
+
|
236
|
+
it 'should return expected precedes status' do
|
237
|
+
actual = subject.precedes?(other)
|
238
|
+
assert_equal expected_precedes, actual
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'should return expected succeeds status' do
|
242
|
+
actual = subject.succeeds?(other)
|
243
|
+
assert_equal expected_succeeds, actual
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'should return expected adjacent_to status' do
|
247
|
+
actual = subject.adjacent_to?(other)
|
248
|
+
assert_equal expected_adjacent, actual
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
252
|
+
|
253
|
+
end
|
254
|
+
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tempr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
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: 2012-02-
|
12
|
+
date: 2012-02-20 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
16
|
-
requirement: &
|
16
|
+
requirement: &11232140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *11232140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &11231560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *11231560
|
36
36
|
description: ''
|
37
37
|
email:
|
38
38
|
- ericgj72@gmail.com
|
@@ -49,6 +49,7 @@ files:
|
|
49
49
|
- lib/tempr/date_time_range.rb
|
50
50
|
- lib/tempr/version.rb
|
51
51
|
- test/each_time_of_day.rb
|
52
|
+
- test/range_adjacency.rb
|
52
53
|
- test/range_intersection.rb
|
53
54
|
- test/range_within_other.rb
|
54
55
|
- test/suite.rb
|