workpattern 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +5 -0
- data/CHANGELOG +8 -0
- data/Gemfile.lock +16 -0
- data/README.md +2 -0
- data/lib/workpattern/day.rb +5 -4
- data/lib/workpattern/version.rb +1 -1
- data/lib/workpattern/week.rb +105 -19
- data/test/test_day.rb +2 -1
- data/test/test_week.rb +132 -26
- data/workpattern.gemspec +1 -0
- metadata +23 -4
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## Workpattern v0.3.0 (Jul 19, 2012) ##
|
2
|
+
|
3
|
+
* incomplete tests for week (#2) * Barrie Callender *
|
4
|
+
* getting wrong time when hour had exactly the right number of minutes (#9) * Barrie Callender *
|
5
|
+
* jruby-19mode failed with SystemStackError: stack level too deep (#8) * Barrie Callender *
|
6
|
+
* midnight flag should override hour and minutes (#7) * Barrie Callender *
|
7
|
+
* available minutes not calculating correctly for a time of 00:01 (#6) * Barrie Callender *
|
8
|
+
|
1
9
|
## Workpattern v0.2.0 (May 31, 2012) ##
|
2
10
|
|
3
11
|
* Rewritten from scratch effectively first version * Barrie Callender *
|
data/Gemfile.lock
ADDED
data/README.md
CHANGED
data/lib/workpattern/day.rb
CHANGED
@@ -124,7 +124,7 @@ module Workpattern
|
|
124
124
|
# Returns the total number of minutes between and including two minutes.
|
125
125
|
#
|
126
126
|
def minutes(start_hour,start_min,finish_hour,finish_min)
|
127
|
-
|
127
|
+
|
128
128
|
if (start_hour > finish_hour) || ((finish_hour==start_hour) && (start_min > finish_min))
|
129
129
|
start_hour,start_min,finish_hour,finish_min=finish_hour,finish_min,start_hour,finish_min
|
130
130
|
end
|
@@ -219,14 +219,15 @@ module Workpattern
|
|
219
219
|
# for the start of the following
|
220
220
|
#
|
221
221
|
def add(time,duration)
|
222
|
-
available_minutes=minutes(time.hour,time.min,@hours-1,59)
|
222
|
+
available_minutes=minutes(time.hour,time.min,@hours-1,59)
|
223
223
|
if ((duration-available_minutes)>0) # not enough minutes left in the day
|
224
|
+
|
224
225
|
result_date= time.next_day - (HOUR*time.hour) - (MINUTE*time.min)
|
225
226
|
duration = duration - available_minutes
|
226
227
|
else
|
227
228
|
total=@values[time.hour].minutes(time.min,59)
|
228
|
-
if (total==duration) # this hour satisfies
|
229
|
-
result_date=time
|
229
|
+
if (total==duration) # this hour satisfies
|
230
|
+
result_date=time - (MINUTE*time.min) + (MINUTE*@values[time.hour].last) + MINUTE
|
230
231
|
duration = 0
|
231
232
|
else
|
232
233
|
result_date = time
|
data/lib/workpattern/version.rb
CHANGED
data/lib/workpattern/week.rb
CHANGED
@@ -1,14 +1,30 @@
|
|
1
1
|
module Workpattern
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
3
|
+
# @author Barrie Callender
|
4
|
+
# @!attribute values
|
5
|
+
# @return [Array] each day of the week
|
6
|
+
# @!attribute days
|
7
|
+
# @return [Fixnum] number of days in the week
|
8
|
+
# @!attribute start
|
9
|
+
# @return [DateTime] first date in the range
|
10
|
+
# @!attribute finish
|
11
|
+
# @return [DateTime] last date in the range
|
12
|
+
# @!attribute week_total
|
13
|
+
# @return [Fixnum] total number of minutes in a week
|
14
|
+
# @!attribute total
|
15
|
+
# @return [Fixnum] total number of minutes in the range
|
16
|
+
#
|
17
|
+
# Represents working and resting periods for each day in a week for a specified date range.
|
5
18
|
#
|
6
19
|
class Week
|
7
20
|
|
8
21
|
attr_accessor :values, :days, :start, :finish, :week_total, :total
|
9
|
-
|
10
|
-
#
|
11
|
-
#
|
22
|
+
|
23
|
+
# Initialises an instance of class Week
|
24
|
+
# @param [DateTime] start first date in the range
|
25
|
+
# @param [DateTime] finish last date in the range
|
26
|
+
# @param [Fixnum] type working (1) or resting (0)
|
27
|
+
# @return [Week] newly initialised Week object
|
12
28
|
#
|
13
29
|
def initialize(start,finish,type=1)
|
14
30
|
hours_in_days_in_week=[24,24,24,24,24,24,24]
|
@@ -20,6 +36,9 @@ module Workpattern
|
|
20
36
|
set_attributes
|
21
37
|
end
|
22
38
|
|
39
|
+
# Duplicates the current Week object
|
40
|
+
# @return [Week] a duplicated instance of the current Week object
|
41
|
+
#
|
23
42
|
def duplicate()
|
24
43
|
duplicate_week=Week.new(@start,@finish)
|
25
44
|
duplicate_values=Array.new(@values.size)
|
@@ -36,27 +55,48 @@ module Workpattern
|
|
36
55
|
return duplicate_week
|
37
56
|
end
|
38
57
|
|
58
|
+
# Recalculates the attributes that defines a Week object.
|
59
|
+
# This was made public for #duplicate to work
|
60
|
+
#
|
39
61
|
def refresh
|
40
62
|
set_attributes
|
41
63
|
end
|
42
64
|
|
65
|
+
# Changes the date range.
|
66
|
+
# This method calls #refresh to update the attributes.
|
67
|
+
#
|
43
68
|
def adjust(start,finish)
|
44
69
|
@start=DateTime.new(start.year,start.month,start.day)
|
45
70
|
@finish=DateTime.new(finish.year,finish.month,finish.day)
|
46
71
|
refresh
|
47
72
|
end
|
48
73
|
|
74
|
+
# Sets a range of minutes in a week to be working or resting. The parameters supplied
|
75
|
+
# to this method determine exactly what should be changed
|
76
|
+
# @param [Hash] days identifies the days to be included in the range
|
77
|
+
# @param [DateTime] from_time where the time portion is used to specify the first minute to be set
|
78
|
+
# @param [DateTime] to_time where the time portion is used to specify the last minute to be set
|
79
|
+
# @param [Fixnum] type where a 1 sets it to working and a 0 to resting
|
49
80
|
def workpattern(days,from_time,to_time,type)
|
50
81
|
DAYNAMES[days].each {|day| @values[day].workpattern(from_time,to_time,type)}
|
51
82
|
refresh
|
52
83
|
end
|
53
84
|
|
85
|
+
# Calculates a new date by adding or subtracting a duration in minutes.
|
86
|
+
# @param [DateTime] start original date
|
87
|
+
# @param [Fixnum] duration minutes to add or subtract
|
88
|
+
# @param [Boolean] midnight flag used for subtraction that indicates the start date is midnight
|
89
|
+
#
|
54
90
|
def calc(start,duration, midnight=false)
|
55
|
-
return start,duration if duration==0
|
91
|
+
return start,duration,false if duration==0
|
56
92
|
return add(start,duration) if duration > 0
|
93
|
+
return subtract(@start,duration, midnight) if (@total==0) && (duration <0)
|
57
94
|
return subtract(start,duration, midnight) if duration <0
|
58
95
|
end
|
59
96
|
|
97
|
+
# Comparison — Returns an integer (-1, 0, or +1) if week is less than, equal to, or greater than other_week
|
98
|
+
# @param [Week] other_week object to compare to
|
99
|
+
# @return [Integer] -1,0 or +1 if week is less than, equal to or greater than other_week
|
60
100
|
def <=>(obj)
|
61
101
|
if @start < obj.start
|
62
102
|
return -1
|
@@ -67,16 +107,19 @@ module Workpattern
|
|
67
107
|
end
|
68
108
|
end
|
69
109
|
|
70
|
-
#
|
71
|
-
#
|
110
|
+
# Returns true if the supplied DateTime is working and false if resting
|
111
|
+
# @param [DateTime] start DateTime to be tested
|
112
|
+
# @return [Boolean] true if the minute is working otherwise false if it is a resting minute
|
72
113
|
#
|
73
114
|
def working?(start)
|
74
115
|
@values[start.wday].working?(start)
|
75
116
|
end
|
76
117
|
|
77
|
-
|
78
|
-
#
|
79
|
-
#
|
118
|
+
# Returns the difference in minutes between two DateTime values.
|
119
|
+
# @param [DateTime] start starting DateTime
|
120
|
+
# @param [DateTime] finish ending DateTime
|
121
|
+
# @return [Fixnum] number of minutes
|
122
|
+
# @return [DateTime] start date for rest of calculation. The calculation is complete when this is the same as the finish date
|
80
123
|
#
|
81
124
|
def diff(start,finish)
|
82
125
|
start,finish=finish,start if ((start <=> finish))==1
|
@@ -94,6 +137,8 @@ module Workpattern
|
|
94
137
|
|
95
138
|
private
|
96
139
|
|
140
|
+
# Recalculates all the attributes for a Week object
|
141
|
+
#
|
97
142
|
def set_attributes
|
98
143
|
@total=0
|
99
144
|
@week_total=0
|
@@ -113,6 +158,11 @@ module Workpattern
|
|
113
158
|
end
|
114
159
|
end
|
115
160
|
|
161
|
+
# Calculates the total number of minutes between two dates
|
162
|
+
# @param [DateTime] start is the first date in the range
|
163
|
+
# @param [DateTime] finish is the last date in the range
|
164
|
+
# @return [Fixnum] total number of minutes between supplied dates
|
165
|
+
#
|
116
166
|
def total_hours(start,finish)
|
117
167
|
total=0
|
118
168
|
start.upto(finish) {|day|
|
@@ -121,10 +171,18 @@ module Workpattern
|
|
121
171
|
return total
|
122
172
|
end
|
123
173
|
|
174
|
+
# Adds a duration in minutes to a date
|
175
|
+
# @param [DateTime] start original date
|
176
|
+
# @param [Fixnum] duration minutes to add
|
177
|
+
# @param [Boolean] midnight flag used for subtraction that indicates the start date is midnight
|
178
|
+
# @return [DateTime] the calculated date
|
179
|
+
# @return [Fixnum] the number of minutes still to be added
|
180
|
+
# @return [Boolean] Always false, this is the flag used for subtraction
|
181
|
+
#
|
124
182
|
def add(start,duration)
|
125
183
|
# aim to calculate to the end of the day
|
126
|
-
start,duration = @values[start.wday].calc(start,duration)
|
127
|
-
return start,duration if (duration==0) || (start.jd > @finish.jd)
|
184
|
+
start,duration = @values[start.wday].calc(start,duration)
|
185
|
+
return start,duration,false if (duration==0) || (start.jd > @finish.jd)
|
128
186
|
# aim to calculate to the end of the next week day that is the same as @finish
|
129
187
|
while((duration!=0) && (start.wday!=@finish.next_day.wday) && (start.jd <= @finish.jd))
|
130
188
|
if (duration>@values[start.wday].total)
|
@@ -138,17 +196,17 @@ module Workpattern
|
|
138
196
|
end
|
139
197
|
end
|
140
198
|
|
141
|
-
return start,duration if (duration==0) || (start.jd > @finish.jd)
|
199
|
+
return start,duration,false if (duration==0) || (start.jd > @finish.jd)
|
142
200
|
|
143
|
-
#while duration accomodates full weeks
|
201
|
+
# while duration accomodates full weeks
|
144
202
|
while ((duration!=0) && (duration>=@week_total) && ((start.jd+6) <= @finish.jd))
|
145
203
|
duration=duration - @week_total
|
146
204
|
start=start+7
|
147
205
|
end
|
148
206
|
|
149
|
-
return start,duration if (duration==0) || (start.jd > @finish.jd)
|
207
|
+
return start,duration,false if (duration==0) || (start.jd > @finish.jd)
|
150
208
|
|
151
|
-
#while duration accomodates full days
|
209
|
+
# while duration accomodates full days
|
152
210
|
while ((duration!=0) && (start.jd<= @finish.jd))
|
153
211
|
if (duration>@values[start.wday].total)
|
154
212
|
duration = duration - @values[start.wday].total
|
@@ -157,10 +215,18 @@ module Workpattern
|
|
157
215
|
start,duration = @values[start.wday].calc(start,duration)
|
158
216
|
end
|
159
217
|
end
|
160
|
-
return start, duration
|
218
|
+
return start, duration, false
|
161
219
|
|
162
220
|
end
|
163
|
-
|
221
|
+
|
222
|
+
# Subtracts a duration in minutes from a date
|
223
|
+
# @param [DateTime] start original date
|
224
|
+
# @param [Fixnum] duration minutes to subtract - always a negative
|
225
|
+
# @param [Boolean] midnight flag indicates the start date is midnight when true
|
226
|
+
# @return [DateTime] the calculated date
|
227
|
+
# @return [Fixnum] the number of minutes still to be subtracted
|
228
|
+
# @return [Boolean] When set to true indicates the time is midnight on the given date
|
229
|
+
#
|
164
230
|
def subtract(start,duration,midnight=false)
|
165
231
|
|
166
232
|
# Handle subtraction from start of day
|
@@ -218,12 +284,25 @@ module Workpattern
|
|
218
284
|
|
219
285
|
end
|
220
286
|
|
287
|
+
# Supports calculating from midnight by updating the given duration depending on whether the
|
288
|
+
# last minute in the day is resting or working. It then sets the time to this minute.
|
289
|
+
# @param [DateTime] start is the date whose midnight is to be used as the start date
|
290
|
+
# @param [Fixnum] duration is the number of minutes to subtract
|
291
|
+
# @return [DateTime] the date with a time of 23:59
|
292
|
+
# @return [Fixnum] the duration adjusted according to whether 23:59 is resting or not
|
293
|
+
#
|
221
294
|
def minute_b4_midnight(start,duration)
|
295
|
+
start -= start.hour * HOUR
|
296
|
+
start -= start.min * MINUTE
|
222
297
|
duration += @values[start.wday].minutes(23,59,23,59)
|
223
298
|
start = start.next_day - MINUTE
|
224
299
|
return start,duration
|
225
300
|
end
|
226
301
|
|
302
|
+
# Calculates the date and time after the last working minute of the current date
|
303
|
+
# @param [DateTime] start is the current date
|
304
|
+
# @return [DateTime] the new date
|
305
|
+
#
|
227
306
|
def after_last_work(start)
|
228
307
|
if @values[start.wday].last_hour.nil?
|
229
308
|
return start.next_day
|
@@ -234,6 +313,13 @@ module Workpattern
|
|
234
313
|
end
|
235
314
|
end
|
236
315
|
|
316
|
+
# Calculates the difference between two dates that exist in this Week object.
|
317
|
+
# @param [DateTime] start first date
|
318
|
+
# @param [DateTime] finish last date
|
319
|
+
# @param [DateTime] finish_on the range to be used in this Week object.
|
320
|
+
# @return [DateTime] new date for rest of calculation otherwise same as finish if completed calculation
|
321
|
+
# @return [Fixnum] total number of minutes calculated thus far.
|
322
|
+
#
|
237
323
|
def diff_detail(start,finish,finish_on)
|
238
324
|
duration, start=@values[start.wday].diff(start,finish)
|
239
325
|
#rest of week to finish day
|
data/test/test_day.rb
CHANGED
@@ -184,6 +184,7 @@ class TestDay < Test::Unit::TestCase #:nodoc:
|
|
184
184
|
# y ,m ,d ,h ,n ,dur ,yr ,mr,dr,hr,nr,rem ,midnight,midnightr
|
185
185
|
tests=[
|
186
186
|
[2000,1 ,1 ,0 ,0 ,-3 ,1999,12,31,0 ,0 ,-3 ,false ,true],
|
187
|
+
[2000,1 ,1 ,0 ,1 ,-2 ,1999,12,31,0 ,0 ,-1 ,false ,true], #Issue 6 - available minutes not calculating correctly for a time of 00:01
|
187
188
|
[2000,1 ,1 ,23,59,0 ,2000,1 ,1 ,23,59,0 ,false ,false],
|
188
189
|
[2000,1 ,1 ,23,59,-1 ,2000,1 ,1 ,23,58,0 ,false ,false],
|
189
190
|
[2000,1 ,1 ,23,59,-2 ,2000,1 ,1 ,23,57,0 ,false ,false],
|
@@ -197,7 +198,7 @@ class TestDay < Test::Unit::TestCase #:nodoc:
|
|
197
198
|
[2000,1 ,1 ,0 ,0 ,-2 ,2000,1 ,1 ,23,58,0 ,true ,false],
|
198
199
|
[2000,1 ,1 ,0 ,0 ,-33 ,2000,1 ,1 ,23,27,0 ,true ,false],
|
199
200
|
[2000,1 ,1 ,0 ,0 ,-60 ,2000,1 ,1 ,23,0 ,0 ,true ,false],
|
200
|
-
[2000,1 ,1 ,0 ,0 ,-931,2000,1 ,1 ,8 ,29,0 ,true ,false]
|
201
|
+
[2000,1 ,1 ,0 ,0 ,-931,2000,1 ,1 ,8 ,29,0 ,true ,false]
|
201
202
|
]
|
202
203
|
clue="subtract minutes in a working day"
|
203
204
|
calc_test(day,tests,clue)
|
data/test/test_week.rb
CHANGED
@@ -66,49 +66,153 @@ class TestWeek < Test::Unit::TestCase #:nodoc:
|
|
66
66
|
start=DateTime.new(2000,1,1,0,0)
|
67
67
|
finish=DateTime.new(2005,12,31,8,59)
|
68
68
|
working_week=week(start,finish,1)
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
69
|
+
|
70
|
+
[# yyyy,mm,dd,hh,mn,durtn,ryyyy,rmm,rdd,rhh,rmn,rdurtn
|
71
|
+
[ 2000, 1, 1, 0, 0, 0, 2000, 1, 1, 0, 0, 0],
|
72
|
+
[ 2005,12,31, 8,59, 10, 2005, 12, 31, 9, 9, 0],
|
73
|
+
[ 2005,12,31,23,59, 1, 2006, 1, 1, 0, 0, 0],
|
74
|
+
[ 2005,12,31,23,59, 2, 2006, 1, 1, 0, 0, 1],
|
75
|
+
[ 2005,11,30,23,59, 2, 2005, 12, 1, 0, 1, 0]
|
76
|
+
].each {|yyyy,mm,dd,hh,mn,durtn,ryyyy,rmm,rdd,rhh,rmn,rdurtn|
|
77
|
+
start=DateTime.new(yyyy,mm,dd,hh,mn)
|
78
|
+
result_date, result_duration= working_week.calc(start,durtn)
|
79
|
+
assert_equal DateTime.new(ryyyy,rmm,rdd,rhh,rmn), result_date, "result_date for working_week.calc(#{start},#{durtn})"
|
80
|
+
assert_equal rdurtn, result_duration,"result_duration for working_week.calc(#{start},#{durtn})"
|
81
|
+
}
|
75
82
|
end
|
76
83
|
|
77
84
|
must 'add minutes in a resting week' do
|
78
|
-
|
85
|
+
start=DateTime.new(2000,1,1,0,0)
|
86
|
+
finish=DateTime.new(2005,12,31,8,59)
|
87
|
+
resting_week=week(start,finish,0)
|
88
|
+
|
89
|
+
[# yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight
|
90
|
+
[ 2000, 1, 1, 0, 0, 0, false, 2000, 1, 1, 0, 0, 0, false],
|
91
|
+
[ 2005,12,31, 8,59, 10, false, 2006, 1, 1, 0, 0, 10, false],
|
92
|
+
[ 2005,12,31,23,59, 1, false, 2006, 1, 1, 0, 0, 1, false],
|
93
|
+
[ 2005,12,31,23,59, 2, false, 2006, 1, 1, 0, 0, 2, false],
|
94
|
+
[ 2005,11,30,23,59, 2, false, 2006, 1, 1, 0, 0, 2, false],
|
95
|
+
[ 2000, 1, 1, 0, 0, 0, true, 2000, 1, 1, 0, 0, 0, false],
|
96
|
+
[ 2005,12,31, 8,59, 10, true, 2006, 1, 1, 0, 0, 10, false],
|
97
|
+
[ 2005,12,31,23,59, 1, true, 2006, 1, 1, 0, 0, 1, false],
|
98
|
+
[ 2005,12,31,23,59, 2, true, 2006, 1, 1, 0, 0, 2, false],
|
99
|
+
[ 2005,11,30,23,59, 2, true, 2006, 1, 1, 0, 0, 2, false]
|
100
|
+
].each {|yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight|
|
101
|
+
start=DateTime.new(yyyy,mm,dd,hh,mn)
|
102
|
+
result_date, result_duration,result_midnight= resting_week.calc(start,durtn,midnight)
|
103
|
+
assert_equal DateTime.new(ryyyy,rmm,rdd,rhh,rmn), result_date, "result_date for resting_week.calc(#{start},#{durtn},#{midnight})"
|
104
|
+
assert_equal rdurtn, result_duration,"result_duration for resting_week.calc(#{start},#{durtn},#{midnight})"
|
105
|
+
assert_equal rmidnight, result_midnight,"result_midnight for resting_week.calc(#{start},#{durtn},#{midnight})"
|
106
|
+
}
|
79
107
|
end
|
80
108
|
|
81
109
|
must 'add minutes in a patterned week' do
|
82
|
-
|
110
|
+
start=DateTime.new(2000,1,1,0,0) #saturday
|
111
|
+
finish=DateTime.new(2005,12,31,8,59) #saturday
|
112
|
+
working_week=week(start,finish,0)
|
113
|
+
working_week.workpattern(:sun,clock(9,0),clock(9,13),1)
|
114
|
+
|
115
|
+
working_week.workpattern(:weekday,clock(9,0),clock(11,59),1)
|
116
|
+
working_week.workpattern(:weekday,clock(13,0),clock(17,59),1)
|
117
|
+
|
118
|
+
working_week.workpattern(:mon,clock(0,0),clock(23,59),0)
|
119
|
+
working_week.workpattern(:mon,clock(9,0),clock(9,13),1)
|
120
|
+
working_week.workpattern(:mon,clock(10,1),clock(10,1),1)
|
121
|
+
|
122
|
+
|
123
|
+
[# yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight
|
124
|
+
[ 2000, 1, 1, 0, 0, 0, false, 2000, 1, 1, 0, 0, 0, false],
|
125
|
+
[ 2000, 1, 1, 0, 0, 1, false, 2000, 1, 2, 9, 1, 0, false],
|
126
|
+
[ 2000, 1, 2, 9, 0, 14, false, 2000, 1, 2, 9, 14, 0, false], #Issue #9 - getting wrong time when hour had exactly the right number of minutes
|
127
|
+
[ 2000, 1, 2, 9, 0, 15, false, 2000, 1, 3, 9, 1, 0, false],
|
128
|
+
[ 2000, 1, 2, 9, 0, 29, false, 2000, 1, 3, 10, 2, 0, false],
|
129
|
+
[ 2000, 1, 2, 9, 0, 1950, false, 2000, 1, 9, 9, 1, 0, false],
|
130
|
+
[ 2005,12,25, 9, 0, 1950, false, 2006, 1, 1, 0, 0, 1, false],
|
131
|
+
[ 2005,12,25, 9, 0, 1949, false, 2005, 12, 30, 18, 0, 0, false]#,
|
132
|
+
].each {|yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight|
|
133
|
+
start=DateTime.new(yyyy,mm,dd,hh,mn)
|
134
|
+
result_date, result_duration,result_midnight= working_week.calc(start,durtn,midnight)
|
135
|
+
assert_equal DateTime.new(ryyyy,rmm,rdd,rhh,rmn), result_date, "result_date for working_week.calc(#{start},#{durtn},#{midnight})"
|
136
|
+
assert_equal rdurtn, result_duration,"result_duration for working_week.calc(#{start},#{durtn},#{midnight})"
|
137
|
+
assert_equal rmidnight, result_midnight,"result_midnight for working_week.calc(#{start},#{durtn},#{midnight})"
|
138
|
+
}
|
83
139
|
end
|
84
140
|
|
85
141
|
must 'subtract minutes in a working week' do
|
86
142
|
start=DateTime.new(2000,1,1,0,0)
|
87
143
|
finish=DateTime.new(2005,12,31,8,59)
|
88
144
|
working_week=week(start,finish,1)
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
145
|
+
[# yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight
|
146
|
+
[ 2000, 1, 1, 0, 0, 0, false, 2000, 1, 1, 0, 0, 0, false],
|
147
|
+
[ 2005,12,31, 0, 0, -10, false, 2005, 12, 30, 23, 50, 0, false],
|
148
|
+
[ 2005,12,31, 0, 0, -1, false, 2005, 12, 30, 23, 59, 0, false],
|
149
|
+
[ 2005,12,31, 0, 1, -2, false, 2005, 12, 30, 23, 59, 0, false], #Issue 6 - available minutes not calculating correctly for a time of 00:01
|
150
|
+
[ 2000, 1, 1, 0, 1, -2, false, 1999, 12, 31, 0, 0, -1, true], #Issue 6 - available minutes not calculating correctly for a time of 00:01
|
151
|
+
[ 2000, 1, 1, 0, 0, 0, true, 2000, 1, 1, 0, 0, 0, false],
|
152
|
+
[ 2005,12,31, 0, 0, -10, true, 2005, 12, 31, 23, 50, 0, false],
|
153
|
+
[ 2005,12,31, 0, 0, -1, true, 2005, 12, 31, 23, 59, 0, false],
|
154
|
+
[ 2005,12,31, 0, 1, -2, true, 2005, 12, 31, 23, 58, 0, false],#Issue 7 - midnight flag should override hour and minutes
|
155
|
+
[ 2000, 1, 1, 0, 1, -2, true, 2000, 1, 1, 23, 58, 0, false] #Issue 7 - midnight flag should override hour and minutes
|
156
|
+
].each {|yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight|
|
157
|
+
start=DateTime.new(yyyy,mm,dd,hh,mn)
|
158
|
+
result_date, result_duration,result_midnight= working_week.calc(start,durtn,midnight)
|
159
|
+
assert_equal DateTime.new(ryyyy,rmm,rdd,rhh,rmn), result_date, "result_date for working_week.calc(#{start},#{durtn},#{midnight})"
|
160
|
+
assert_equal rdurtn, result_duration,"result_duration for working_week.calc(#{start},#{durtn},#{midnight})"
|
161
|
+
assert_equal rmidnight, result_midnight,"result_midnight for working_week.calc(#{start},#{durtn},#{midnight})"
|
162
|
+
}
|
97
163
|
end
|
98
164
|
|
99
165
|
must 'subtract minutes in a resting week' do
|
100
|
-
|
166
|
+
start=DateTime.new(2000,1,1,0,0)
|
167
|
+
finish=DateTime.new(2005,12,31,8,59)
|
168
|
+
resting_week=week(start,finish,0)
|
169
|
+
[# yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight
|
170
|
+
[ 2000, 1, 1, 0, 0, 0, false, 2000, 1, 1, 0, 0, 0, false],
|
171
|
+
[ 2005,12,31, 0, 0, -10, false, 1999, 12, 31, 0, 0, -10, true],
|
172
|
+
[ 2005,12,31, 0, 0, -1, false, 1999, 12, 31, 0, 0, -1, true],
|
173
|
+
[ 2005,12,31, 0, 1, -2, false, 1999, 12, 31, 0, 0, -2, true],
|
174
|
+
[ 2000, 1, 1, 0, 1, -2, false, 1999, 12, 31, 0, 0, -2, true]
|
175
|
+
].each {|yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight|
|
176
|
+
start=DateTime.new(yyyy,mm,dd,hh,mn)
|
177
|
+
result_date, result_duration, result_midnight= resting_week.calc(start,durtn,midnight)
|
178
|
+
assert_equal DateTime.new(ryyyy,rmm,rdd,rhh,rmn), result_date, "result_date for resting_week.calc(#{start},#{durtn},#{midnight})"
|
179
|
+
assert_equal rdurtn, result_duration,"result_duration for resting_week.calc(#{start},#{durtn},#{midnight})"
|
180
|
+
assert_equal rmidnight, result_midnight,"result_midnight for resting_week.calc(#{start},#{durtn},#{midnight})"
|
181
|
+
}
|
101
182
|
end
|
102
183
|
|
103
184
|
must 'subtract minutes in a patterned week' do
|
104
|
-
|
185
|
+
start=DateTime.new(2000,1,1,0,0) #saturday
|
186
|
+
finish=DateTime.new(2005,12,31,8,59) #saturday
|
187
|
+
working_week=week(start,finish,0)
|
188
|
+
working_week.workpattern(:sun,clock(9,0),clock(9,13),1)
|
189
|
+
|
190
|
+
working_week.workpattern(:weekday,clock(9,0),clock(11,59),1)
|
191
|
+
working_week.workpattern(:weekday,clock(13,0),clock(17,59),1)
|
192
|
+
|
193
|
+
working_week.workpattern(:mon,clock(0,0),clock(23,59),0)
|
194
|
+
working_week.workpattern(:mon,clock(9,0),clock(9,13),1)
|
195
|
+
working_week.workpattern(:mon,clock(10,1),clock(10,1),1)
|
196
|
+
|
197
|
+
|
198
|
+
[# yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight
|
199
|
+
[ 2000, 1, 1, 0, 0, 0, false, 2000, 1, 1, 0, 0, 0, false],
|
200
|
+
[ 2000, 1, 1, 0, 0, -1, false, 1999, 12, 31, 0, 0, -1, true],
|
201
|
+
[ 2000, 1, 2, 9, 0, 14, false, 2000, 1, 2, 9, 14, 0, false],
|
202
|
+
[ 2000, 1, 2, 9, 0, 15, false, 2000, 1, 3, 9, 1, 0, false],
|
203
|
+
[ 2000, 1, 2, 9, 0, 29, false, 2000, 1, 3, 10, 2, 0, false],
|
204
|
+
[ 2000, 1, 2, 9, 0, 1950, false, 2000, 1, 9, 9, 1, 0, false],
|
205
|
+
[ 2005,12,25, 9, 0, 1950, false, 2006, 1, 1, 0, 0, 1, false],
|
206
|
+
[ 2005,12,25, 9, 0, 1949, false, 2005, 12, 30, 18, 0, 0, false]#,
|
207
|
+
].each {|yyyy,mm,dd,hh,mn,durtn,midnight,ryyyy,rmm,rdd,rhh,rmn,rdurtn,rmidnight|
|
208
|
+
start=DateTime.new(yyyy,mm,dd,hh,mn)
|
209
|
+
result_date, result_duration,result_midnight= working_week.calc(start,durtn,midnight)
|
210
|
+
assert_equal DateTime.new(ryyyy,rmm,rdd,rhh,rmn), result_date, "result_date for working_week.calc(#{start},#{durtn},#{midnight})"
|
211
|
+
assert_equal rdurtn, result_duration,"result_duration for working_week.calc(#{start},#{durtn},#{midnight})"
|
212
|
+
assert_equal rmidnight, result_midnight,"result_midnight for working_week.calc(#{start},#{durtn},#{midnight})"
|
213
|
+
}
|
105
214
|
end
|
106
215
|
|
107
|
-
|
108
|
-
must 'create complex patterns' do
|
109
|
-
assert true
|
110
|
-
end
|
111
|
-
|
112
216
|
must "calculate difference between dates in working week" do
|
113
217
|
start=DateTime.new(2012,10,1)
|
114
218
|
finish=DateTime.new(2012,10,7)
|
@@ -178,13 +282,15 @@ class TestWeek < Test::Unit::TestCase #:nodoc:
|
|
178
282
|
end
|
179
283
|
|
180
284
|
must "calculate difference between dates in pattern week" do
|
181
|
-
|
182
|
-
|
285
|
+
start=DateTime.new(2000,1,1)
|
286
|
+
finish=DateTime.new(2012,12,31)
|
287
|
+
week=week(start,finish,1)
|
288
|
+
return
|
183
289
|
[[0,0,8,59],
|
184
290
|
[12,0,12,59],
|
185
291
|
[17,0,22,59]
|
186
292
|
].each {|start_hour,start_min,finish_hour,finish_min|
|
187
|
-
|
293
|
+
week.workpattern(clock(start_hour, start_min),
|
188
294
|
clock(finish_hour, finish_min),
|
189
295
|
0)
|
190
296
|
}
|
data/workpattern.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workpattern
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-07-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.9.2
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.2
|
14
30
|
description: Workpattern performs date calculations that take into account working
|
15
31
|
and resting periods.
|
16
32
|
email:
|
@@ -20,8 +36,10 @@ extensions: []
|
|
20
36
|
extra_rdoc_files: []
|
21
37
|
files:
|
22
38
|
- .gitignore
|
39
|
+
- .travis.yml
|
23
40
|
- CHANGELOG
|
24
41
|
- Gemfile
|
42
|
+
- Gemfile.lock
|
25
43
|
- README.md
|
26
44
|
- Rakefile
|
27
45
|
- config/website.yml
|
@@ -65,8 +83,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
83
|
version: '0'
|
66
84
|
requirements: []
|
67
85
|
rubyforge_project: workpattern
|
68
|
-
rubygems_version: 1.8.
|
86
|
+
rubygems_version: 1.8.24
|
69
87
|
signing_key:
|
70
88
|
specification_version: 3
|
71
89
|
summary: temporal calculations
|
72
90
|
test_files: []
|
91
|
+
has_rdoc:
|