workpattern 0.2.0 → 0.3.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 +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:
|