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 CHANGED
@@ -1,2 +1,3 @@
1
1
  doc
2
2
  pkg
3
+ .yardoc
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - jruby-19mode # JRuby in 1.9 mode
5
+ - rbx-19mode
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
@@ -0,0 +1,16 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ workpattern (0.3.0.beta)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ rake (0.9.2.2)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ rake (~> 0.9.2)
16
+ workpattern!
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ # Workpattern [![Build Status](https://secure.travis-ci.org/callenb/workpattern.png)](https://secure.travis-ci.org/callenb/workpattern.png)
2
+
1
3
  ## What?
2
4
 
3
5
  Simple addition and subtraction of minutes on dates taking account of real-life working and resting periods.
@@ -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
- return 0 if (start_hour==finish_hour && start_hour==0 && start_min==finish_min && start_min==0)
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 + HOUR - (MINUTE*time.min)
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
@@ -1,3 +1,3 @@
1
1
  module Workpattern
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -1,14 +1,30 @@
1
1
  module Workpattern
2
2
 
3
- # Represents working and resting times of each day in a week from one date to another.
4
- # The two dates could be the same day or they could be several weeks or years apart.
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
- # :call-seq: new(start,finish,type) => Week
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
- # :call-seq: working?(start) => Boolean
71
- # Returns true if the given minute is working and false if it isn't
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
- # :call-seq: diff(start,finish) => Duration, Date
79
- # Returns the difference in minutes between two times.
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
- result_date, result_duration= working_week.calc(start,0)
70
- assert_equal start,result_date, "#{start} + #{0}"
71
- result_date,result_duration=working_week.calc(finish,0)
72
- assert_equal finish,result_date, "#{finish} + #{0}"
73
- result_date,result_duration=working_week.calc(finish,10)
74
- assert_equal DateTime.new(2005,12,31,9,9),result_date, "#{finish} + #{10}"
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
- assert true
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
- assert true
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
- result_date, result_duration= working_week.calc(start,0)
90
- assert_equal start,result_date, "#{start} + #{0}"
91
- result_date,result_duration=working_week.calc(finish,0)
92
- assert_equal finish,result_date, "#{finish} + #{0}"
93
- result_date,result_duration=working_week.calc(finish,-10)
94
- assert_equal DateTime.new(2005,12,31,8,49),result_date, "#{finish} - #{10}"
95
- result_date,result_duration=working_week.calc(DateTime.new(2005,12,31,0,0),-10)
96
- assert_equal DateTime.new(2005,12,30,23,50),result_date, "#{DateTime.new(2005,12,31,0,0)} - #{10}"
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
- assert true
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
- assert true
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
- day = Workpattern::Day.new(1)
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
- day.workpattern(clock(start_hour, start_min),
293
+ week.workpattern(clock(start_hour, start_min),
188
294
  clock(finish_hour, finish_min),
189
295
  0)
190
296
  }
data/workpattern.gemspec CHANGED
@@ -21,4 +21,5 @@ Gem::Specification.new do |s|
21
21
  # specify any dependencies here; for example:
22
22
  # s.add_development_dependency "rspec"
23
23
  # s.add_runtime_dependency "rest-client"
24
+ s.add_development_dependency('rake', ['~> 0.9.2'])
24
25
  end
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.2.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-05-31 00:00:00.000000000Z
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.15
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: