DateSetter 1.1.1 → 1.2.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/DateSetter.gemspec +1 -0
- data/lib/DateSetter.rb +71 -18
- data/test/date_setter_test.rb +67 -4
- data/test/test_helper.rb +2 -1
- data/version.rb +1 -1
- metadata +18 -2
data/DateSetter.gemspec
CHANGED
data/lib/DateSetter.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class DateSetter
|
2
2
|
Infinity = 1.0 / 0.0
|
3
|
-
attr_accessor :reference_date, :min_date, :max_date, :result, :range, :
|
3
|
+
attr_accessor :reference_date, :min_date, :max_date, :result, :range, :start_of_day, :end_of_day
|
4
4
|
|
5
5
|
def initialize(options = {})
|
6
6
|
options.each do |key, value|
|
@@ -14,7 +14,7 @@ class DateSetter
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def valid?
|
17
|
-
return if !reference_date || !range || !valid_ranges?
|
17
|
+
return false if !reference_date || !range || !valid_ranges?
|
18
18
|
(min_date.to_f..max_date.to_f).cover?(reference_date.to_f)
|
19
19
|
end
|
20
20
|
|
@@ -27,43 +27,96 @@ class DateSetter
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def min_date
|
30
|
-
@min_date.try(:to_datetime) || -
|
30
|
+
@min_date.try(:to_datetime) || min_date_range - 1.second
|
31
31
|
end
|
32
32
|
|
33
33
|
def max_date
|
34
|
-
@max_date.try(:to_datetime) ||
|
34
|
+
@max_date.try(:to_datetime) || max_date_range + 1.second
|
35
35
|
end
|
36
36
|
|
37
37
|
def result
|
38
|
-
|
38
|
+
if valid?
|
39
|
+
if the_same_day?
|
40
|
+
min_date_in_range + rand(intersection_of_range_and_hours_range)
|
41
|
+
elsif result_day == min_date_in_range
|
42
|
+
result_day + rand(hours_range_when_min_date)
|
43
|
+
elsif result_day == max_date_in_range
|
44
|
+
result_day + rand(hours_range_when_max_date)
|
45
|
+
else
|
46
|
+
result_day + rand(start_of_day..end_of_day)
|
47
|
+
end
|
48
|
+
else
|
49
|
+
raise ArgumentError, "Some argument is invalid"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def result_day
|
54
|
+
rand(min_date_in_range..max_date_in_range)
|
55
|
+
end
|
56
|
+
|
57
|
+
def start_of_day
|
58
|
+
@start_of_day ||= 0.hours
|
59
|
+
end
|
60
|
+
|
61
|
+
def end_of_day
|
62
|
+
@end_of_day ||= 24.hours - 1.second
|
63
|
+
end
|
64
|
+
|
65
|
+
def intersection(first_range, second_range)
|
66
|
+
return nil if (first_range.max < second_range.begin or second_range.max < first_range.begin)
|
67
|
+
[first_range.begin, second_range.begin].max..[first_range.max, second_range.max].min
|
68
|
+
end
|
69
|
+
|
70
|
+
def intersection_of_range_and_hours_range
|
71
|
+
intersection((min_date_time_in_range.hour.hours..max_date_time_in_range.hour.hours), (start_of_day..end_of_day))
|
72
|
+
end
|
73
|
+
|
74
|
+
def hours_range_when_min_date
|
75
|
+
(min_date_time_in_range.hour.hours..end_of_day)
|
39
76
|
end
|
40
77
|
|
41
|
-
def
|
42
|
-
|
78
|
+
def hours_range_when_max_date
|
79
|
+
(start_of_day..max_date_time_in_range.hour.hours)
|
43
80
|
end
|
44
81
|
|
45
|
-
def
|
46
|
-
|
82
|
+
def the_same_day?
|
83
|
+
min_date_in_range == max_date_in_range
|
47
84
|
end
|
48
85
|
|
49
86
|
private
|
50
87
|
def valid_ranges?
|
51
|
-
min_date.to_f <= max_date.to_f
|
88
|
+
min_date.to_f <= max_date.to_f && start_of_day.to_f <= end_of_day.to_f && intersection_of_range_and_hours_range != nil
|
52
89
|
end
|
53
90
|
|
54
|
-
def
|
55
|
-
if (
|
56
|
-
min_date
|
91
|
+
def min_date_time_in_range
|
92
|
+
if (min_date_range).to_f < min_date.to_f
|
93
|
+
min_date
|
57
94
|
else
|
58
|
-
|
95
|
+
min_date_range
|
59
96
|
end
|
60
97
|
end
|
61
98
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
99
|
+
def min_date_in_range
|
100
|
+
min_date_time_in_range.to_date
|
101
|
+
end
|
102
|
+
|
103
|
+
def max_date_time_in_range
|
104
|
+
if (max_date_range).to_f > max_date.to_f
|
105
|
+
max_date
|
65
106
|
else
|
66
|
-
|
107
|
+
max_date_range
|
67
108
|
end
|
68
109
|
end
|
110
|
+
|
111
|
+
def max_date_in_range
|
112
|
+
max_date_time_in_range.to_date
|
113
|
+
end
|
114
|
+
|
115
|
+
def min_date_range
|
116
|
+
reference_date - range
|
117
|
+
end
|
118
|
+
|
119
|
+
def max_date_range
|
120
|
+
reference_date + range
|
121
|
+
end
|
69
122
|
end
|
data/test/date_setter_test.rb
CHANGED
@@ -104,11 +104,23 @@ class DateSetterTest < MiniTest::Unit::TestCase
|
|
104
104
|
assert (0.days.ago.at_midnight..1.days.from_now.at_midnight).cover?(@date_setter.result)
|
105
105
|
end
|
106
106
|
|
107
|
-
def
|
108
|
-
@date_setter.
|
109
|
-
@date_setter.
|
107
|
+
def test_should_return_exception_when_result_can_t_be_between_min_date_and_max_date
|
108
|
+
@date_setter.min_date = 2.days.ago
|
109
|
+
@date_setter.max_date = 1.day.ago
|
110
|
+
|
111
|
+
assert_raises ArgumentError do
|
112
|
+
@date_setter.result
|
113
|
+
end
|
114
|
+
end
|
110
115
|
|
111
|
-
|
116
|
+
def test_should_return_exception_when_hours_range_is_incorrect
|
117
|
+
@date_setter.reference_date = Date.today + 10.hours
|
118
|
+
@date_setter.start_of_day = 8.hours
|
119
|
+
@date_setter.end_of_day = 9.hours
|
120
|
+
|
121
|
+
assert_raises ArgumentError do
|
122
|
+
@date_setter.result
|
123
|
+
end
|
112
124
|
end
|
113
125
|
|
114
126
|
def test_set_function_should_generate_correct_date
|
@@ -125,4 +137,55 @@ class DateSetterTest < MiniTest::Unit::TestCase
|
|
125
137
|
|
126
138
|
assert @date_setter.valid?
|
127
139
|
end
|
140
|
+
|
141
|
+
def test_intersection_method_should_return_common_part_of_two_ranges
|
142
|
+
assert_equal (11..11), @date_setter.intersection((10..11), (11..20))
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_result_should_be_between_min_date_and_max_date_hours_when_this_is_the_same_day
|
146
|
+
@date_setter.reference_date = Date.today + 10.hours
|
147
|
+
@date_setter.range = 1.day
|
148
|
+
@date_setter.min_date = Date.today + 9.hours
|
149
|
+
@date_setter.max_date = Date.today + 11.hours
|
150
|
+
@date_setter.start_of_day = 11.hours
|
151
|
+
@date_setter.end_of_day = 14.hours
|
152
|
+
|
153
|
+
assert (9..11).cover?(@date_setter.result.hour)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_result_should_be_between_min_date_and_end_of_day_hours_when_result_day_is_min_date
|
157
|
+
@date_setter.reference_date = Date.today + 10.hours
|
158
|
+
@date_setter.range = 5.days
|
159
|
+
@date_setter.min_date = Date.yesterday + 9.hours
|
160
|
+
@date_setter.max_date = Date.tomorrow + 11.hours
|
161
|
+
@date_setter.start_of_day = 7.hours
|
162
|
+
@date_setter.end_of_day = 14.hours
|
163
|
+
@date_setter.stubs(:result_day).returns(@date_setter.min_date.to_date)
|
164
|
+
|
165
|
+
assert (9..14).cover?(@date_setter.result.hour)
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_result_should_be_between_start_of_day_and_max_date_hours_when_result_day_is_max_date
|
169
|
+
@date_setter.reference_date = Date.today + 10.hours
|
170
|
+
@date_setter.range = 5.days
|
171
|
+
@date_setter.min_date = Date.yesterday + 9.hours
|
172
|
+
@date_setter.max_date = Date.tomorrow + 11.hours
|
173
|
+
@date_setter.start_of_day = 7.hours
|
174
|
+
@date_setter.end_of_day = 14.hours
|
175
|
+
@date_setter.stubs(:result_day).returns(@date_setter.max_date.to_date)
|
176
|
+
|
177
|
+
assert (7..11).cover?(@date_setter.result.hour)
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_result_should_be_between_start_of_day_and_end_of_day_hours_when_result_day_is_other_than_min_or_max_date
|
181
|
+
@date_setter.reference_date = Date.today + 10.hours
|
182
|
+
@date_setter.range = 5.days
|
183
|
+
@date_setter.min_date = Date.yesterday + 9.hours
|
184
|
+
@date_setter.max_date = Date.tomorrow + 11.hours
|
185
|
+
@date_setter.start_of_day = 7.hours
|
186
|
+
@date_setter.end_of_day = 14.hours
|
187
|
+
@date_setter.stubs(:result_day).returns(@date_setter.reference_date.to_date)
|
188
|
+
|
189
|
+
assert (7..14).cover?(@date_setter.result.hour)
|
190
|
+
end
|
128
191
|
end
|
data/test/test_helper.rb
CHANGED
data/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: DateSetter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: mocha
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
description:
|
31
47
|
email:
|
32
48
|
- rut.szymon@gmail.com
|