time_distribution 1.1.0 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dccb31c666eb18ba4851cada37bb34f75e7bf3f7
4
- data.tar.gz: dd41ba2827bbc35cb11615438c281eeec6b177fc
3
+ metadata.gz: 012a184af7a05689a0630e43e9c313e0b113f760
4
+ data.tar.gz: 3c317bb55c5975a74b533df95a9c41ae737ad20b
5
5
  SHA512:
6
- metadata.gz: 64d466ee3beeaf7163d5dce34952d5ef69cce65f968aeb20e6ed57c3ef5676c3757b57763ecbc49c6578b674d942281afff1bcf2e3a48ad73b9018f1cc928eab
7
- data.tar.gz: 80e798da6b384012b3c6f448ab9a19c4c6ef49bc692cf95fd890837d9837321d487d87ea4baeadd8c1f2fdb8e5d43e7c7e1fdef4431ed418931a7318819cf4b3
6
+ metadata.gz: fb4e33e7f23e2f97e0c55c6df47d50282702dae2b1cda502e9717fb13c2d382c29147f806ce36d5505e69420a339509b4855568343dcc01f2a583aec703b9ff3
7
+ data.tar.gz: 0c6553388a4124e172df1669db9d011ea460bb375f8134d0f61c08a6fdac2fb97dc64431f5ecfba8cd7195ce9853a9a713297f2a0d62e90633a0b6de21b18f6f
@@ -12,5 +12,25 @@ module TimeDistribution
12
12
  @time_taken = SmartDuration.parse(time_taken)
13
13
  @desc = desc
14
14
  end
15
+
16
+ def to_s() "#{to_headline}: #{to_desc}" end
17
+
18
+ def to_desc() @desc.strip end
19
+
20
+ def to_headline
21
+ "#{to_hours_s} hours of #{@subject}"
22
+ end
23
+
24
+ def to_hours
25
+ @time_taken.total / (60 * 60).to_f
26
+ end
27
+
28
+ def to_hours_s
29
+ format('%0.2f', to_hours)
30
+ end
31
+
32
+ def to_ssv
33
+ format("%-25s%10s", @subject, to_hours_s)
34
+ end
15
35
  end
16
36
  end
@@ -0,0 +1,43 @@
1
+ require 'chronic'
2
+ require 'ruby-duration'
3
+
4
+ module TimeDistribution
5
+ class TaskList < Array
6
+ attr_reader :date, :tasks
7
+
8
+ def time_worked(*subjects)
9
+ inject({}) do |times, t|
10
+ t_subject = t.subject
11
+ if subjects.empty? || subjects.include?(t_subject)
12
+ if times[t_subject]
13
+ times[t_subject] += t.time_taken
14
+ else
15
+ times[t_subject] = Duration.new(t.time_taken)
16
+ end
17
+ end
18
+ times
19
+ end
20
+ end
21
+
22
+ def to_hours(*subjects)
23
+ inject(0) do |hours, task|
24
+ if subjects.empty? || subjects.include?(task.subject)
25
+ hours += task.to_hours
26
+ end
27
+ hours
28
+ end
29
+ end
30
+
31
+ def to_md
32
+ inject('') do |task_string, t|
33
+ task_string += "- #{t.to_s}\n"
34
+ end
35
+ end
36
+
37
+ def to_ssv
38
+ inject('') do |task_string, t|
39
+ task_string += "#{t.to_ssv}\n"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module TimeDistribution
2
- VERSION = "1.1.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -1,45 +1,42 @@
1
1
  require 'chronic'
2
2
  require 'ruby-duration'
3
3
 
4
+ require 'time_distribution/task_list'
5
+
4
6
  module TimeDistribution
5
7
  class WorkDay
6
8
  attr_reader :date, :tasks
7
9
 
8
10
  # @param [#to_s] date Date of this work day in +Chronic+ compatible format.
9
11
  # @param [Array<Task>] tasks List of tasks done in this work day. Defaults to an empty list.
10
- def initialize(date, tasks=[])
12
+ def initialize(date, *tasks)
11
13
  @date = Chronic.parse(date)
12
- @tasks = tasks
14
+ @tasks = TaskList.new(*tasks)
13
15
  end
14
16
 
15
17
  # @param [Task] task Adds +task+ to the list of tasks completed on this work day.
16
18
  def add_task!(task)
17
19
  @tasks << task
18
-
19
20
  self
20
21
  end
21
22
 
22
- def time_worked(*subjects)
23
- subjects.flatten!
24
- times = {}
25
- unless subjects.empty? || subjects.kind_of?(Set)
26
- subjects = Set.new(subjects) # To take advantage of Set's faster include? check
27
- end
28
-
29
- times_to_return = @tasks.inject({}) do |times, t|
30
- t_subject = t.subject
31
- next times unless subjects.empty? || subjects.include?(t_subject)
32
-
33
- times[t_subject] = Duration.new(0) unless times[t_subject]
34
- times[t_subject] += t.time_taken
35
- times
36
- end
37
-
38
- if times_to_return.length == 1
39
- times_to_return.values.first
40
- else
41
- times_to_return
42
- end
23
+ def time_worked(*subjects) @tasks.time_worked *subjects end
24
+
25
+ def to_hours(*subjects) @tasks.to_hours *subjects end
26
+
27
+ def to_md
28
+ (
29
+ @date.strftime('%b %-d, %Y') +
30
+ "\n============================\n" +
31
+ @tasks.to_md
32
+ )
33
+ end
34
+
35
+ def to_ssv
36
+ (
37
+ "# #{@date.strftime('%b %-d, %Y')}\n" +
38
+ @tasks.to_ssv
39
+ )
43
40
  end
44
41
  end
45
42
  end
@@ -0,0 +1,72 @@
1
+ require 'time'
2
+
3
+ require_relative 'smart_duration'
4
+ require_relative 'task'
5
+ require_relative 'work_day'
6
+
7
+ module TimeDistribution
8
+ class WorkDayCollection < Array
9
+ # @returns [Hash<symbol,Integer>] Hash from calendar month to the
10
+ # => number of official work days in that month. Initialized to zero.
11
+ attr_reader :official_work_days
12
+
13
+ MONTHS = [:january, :february, :march, :april, :may, :june, :july, :august, :september, :october, :november, :december]
14
+
15
+ private
16
+ def provide_methods_for_setting_work_days_in_months
17
+ MONTHS.each do |m|
18
+ self.class().send(:define_method, "set_official_work_days_in_#{m.to_s}") do |num_days|
19
+ @official_work_days[m] = num_days
20
+ end
21
+ end
22
+ end
23
+
24
+ public
25
+
26
+ def initialize(*days, official_work_days: {})
27
+ super(days)
28
+ provide_methods_for_setting_work_days_in_months
29
+ @official_work_days = official_work_days.dup
30
+ MONTHS.each do |m|
31
+ @official_work_days[m] ||= 0
32
+ end
33
+ end
34
+
35
+ def time_worked
36
+ inject({}) do |hash, d|
37
+ t = d.time_worked
38
+ if t.respond_to?(:each_key)
39
+ t.each_key do |key|
40
+ hash[key] = Duration.new(0) unless hash[key]
41
+ hash[key] += t[key]
42
+ end
43
+ else
44
+ d_subject = d.tasks.first.subject
45
+ hash[d_subject] = Duration.new(0) unless hash[d_subject]
46
+ hash[d_subject] += t
47
+ end
48
+ hash
49
+ end
50
+ end
51
+
52
+ def avg_hours_per_official_work_day(*subjects)
53
+ hours(*subjects) / @official_work_days.values.inject(:+).to_f
54
+ end
55
+
56
+ def avg_hours_per_day_worked(*subjects)
57
+ hours(*subjects) / length.to_f
58
+ end
59
+
60
+ def hours(*subjects)
61
+ inject(0) { |sum, d| sum += d.to_hours(*subjects) }
62
+ end
63
+
64
+ def to_md
65
+ inject('') { |s, d| s += "#{d.to_md}\n" }
66
+ end
67
+
68
+ def to_ssv
69
+ inject('') { |s, d| s += "#{d.to_ssv}" }
70
+ end
71
+ end
72
+ end
@@ -3,22 +3,9 @@ SimpleCov.start
3
3
 
4
4
  require 'minitest/spec'
5
5
  require 'minitest/mock'
6
+ require 'minitest/autorun'
6
7
 
7
8
  begin
8
- require 'turn/autorun'
9
- Turn.config do |c|
10
- # use one of output formats:
11
- # :outline - turn's original case/test outline mode [default]
12
- # :progress - indicates progress with progress bar
13
- # :dotted - test/unit's traditional dot-progress mode
14
- # :pretty - new pretty reporter
15
- # :marshal - dump output as YAML (normal run mode only)
16
- # :cue - interactive testing
17
- c.format = :dotted
18
- # use humanized test names (works only with :outline format)
19
- c.natural = true
20
- end
21
-
22
9
  require 'awesome_print'
23
10
  module Minitest::Assertions
24
11
  def mu_pp(obj)
@@ -26,7 +13,7 @@ begin
26
13
  end
27
14
  end
28
15
 
29
- require 'pry-rescue/minitest'
16
+ # require 'pry-rescue/minitest'
30
17
  rescue LoadError
31
18
  end
32
19
 
@@ -19,4 +19,26 @@ describe Task do
19
19
  patient.desc.must_equal x_description
20
20
  end
21
21
  end
22
+ describe 'to_s' do
23
+ it 'works' do
24
+ x_subject = 'subject'
25
+ x_time_taken = '10 min'
26
+ x_description = 'interesting description'
27
+
28
+ patient = Task.new(x_subject, x_time_taken, x_description)
29
+
30
+ patient.to_s.must_equal "#{format('%0.2f', (10/60.0))} hours of #{x_subject}: #{x_description}"
31
+ end
32
+ end
33
+ describe 'to_hours' do
34
+ it 'works' do
35
+ x_subject = 'subject'
36
+ x_time_taken = '10 min'
37
+ x_description = 'interesting description'
38
+
39
+ patient = Task.new(x_subject, x_time_taken, x_description)
40
+
41
+ patient.to_hours.must_equal (10/60.0)
42
+ end
43
+ end
22
44
  end
@@ -0,0 +1,239 @@
1
+ require_relative 'support/spec_helper'
2
+
3
+ require 'time_distribution/work_day_collection'
4
+
5
+ include TimeDistribution
6
+ describe WorkDayCollection do
7
+ describe '#new' do
8
+ it 'with days only' do
9
+ patient = WorkDayCollection.new('d1', 'd2')
10
+ patient.to_a.must_equal ['d1', 'd2']
11
+ patient.official_work_days.must_equal ({
12
+ january: 0,
13
+ february: 0,
14
+ march: 0,
15
+ april: 0,
16
+ may: 0,
17
+ june: 0,
18
+ july: 0,
19
+ august: 0,
20
+ september: 0,
21
+ october: 0,
22
+ november: 0,
23
+ december: 0
24
+ })
25
+ patient.respond_to?(:set_official_work_days_in_january).must_equal true
26
+ patient.respond_to?(:set_official_work_days_in_february).must_equal true
27
+ patient.respond_to?(:set_official_work_days_in_march).must_equal true
28
+ patient.respond_to?(:set_official_work_days_in_april).must_equal true
29
+ patient.respond_to?(:set_official_work_days_in_may).must_equal true
30
+ patient.respond_to?(:set_official_work_days_in_june).must_equal true
31
+ patient.respond_to?(:set_official_work_days_in_july).must_equal true
32
+ patient.respond_to?(:set_official_work_days_in_august).must_equal true
33
+ patient.respond_to?(:set_official_work_days_in_september).must_equal true
34
+ patient.respond_to?(:set_official_work_days_in_october).must_equal true
35
+ patient.respond_to?(:set_official_work_days_in_november).must_equal true
36
+ patient.respond_to?(:set_official_work_days_in_december).must_equal true
37
+ end
38
+ it 'with days and official work schedule' do
39
+ x_official_work_days = {
40
+ january: 0,
41
+ february: 20,
42
+ march: 0,
43
+ april: 30,
44
+ may: 14,
45
+ june: 0,
46
+ july: 0,
47
+ august: 16,
48
+ september: 0,
49
+ october: 0,
50
+ november: 0,
51
+ december: 12
52
+ }
53
+ patient = WorkDayCollection.new('d1', 'd2', official_work_days: x_official_work_days.dup)
54
+ patient.to_a.must_equal ['d1', 'd2']
55
+ patient.official_work_days.must_equal x_official_work_days
56
+ patient.respond_to?(:set_official_work_days_in_january).must_equal true
57
+ patient.respond_to?(:set_official_work_days_in_february).must_equal true
58
+ patient.respond_to?(:set_official_work_days_in_march).must_equal true
59
+ patient.respond_to?(:set_official_work_days_in_april).must_equal true
60
+ patient.respond_to?(:set_official_work_days_in_may).must_equal true
61
+ patient.respond_to?(:set_official_work_days_in_june).must_equal true
62
+ patient.respond_to?(:set_official_work_days_in_july).must_equal true
63
+ patient.respond_to?(:set_official_work_days_in_august).must_equal true
64
+ patient.respond_to?(:set_official_work_days_in_september).must_equal true
65
+ patient.respond_to?(:set_official_work_days_in_october).must_equal true
66
+ patient.respond_to?(:set_official_work_days_in_november).must_equal true
67
+ patient.respond_to?(:set_official_work_days_in_december).must_equal true
68
+ end
69
+ end
70
+
71
+ describe '#time_worked' do
72
+ it 'works' do
73
+ patient = new_full_patient
74
+ patient.time_worked.must_equal ({
75
+ :taxes => Duration.new(14760),
76
+ :cmput659 => Duration.new(31920),
77
+ :cprg => Duration.new(3600),
78
+ :masters_research => Duration.new(3600)
79
+ })
80
+ end
81
+ end
82
+
83
+ describe '#avg_hours_per_official_work_day' do
84
+ it 'works without argument' do
85
+ patient = new_full_patient
86
+ patient.avg_hours_per_official_work_day.must_equal (
87
+ 14.9666666666666667 / (1 + 20 + 10 + 30 + 14 + 0 + 0 + 16 + 0 + 0 + 0 + 12)
88
+ )
89
+ end
90
+ it 'works with arguments' do
91
+ patient = new_full_patient
92
+ patient.avg_hours_per_official_work_day(:cprg, :taxes).must_equal (
93
+ 5.1 / (1 + 20 + 10 + 30 + 14 + 0 + 0 + 16 + 0 + 0 + 0 + 12)
94
+ )
95
+ end
96
+ end
97
+
98
+ describe '#hours' do
99
+ it 'works without argument' do
100
+ patient = new_full_patient
101
+ patient.hours.must_equal 14.9666666666666667
102
+ end
103
+ it 'works with argument' do
104
+ patient = new_full_patient
105
+ patient.hours(:cprg, :taxes).must_equal 5.1
106
+ end
107
+ end
108
+
109
+ describe '#avg_hours_per_day_worked' do
110
+ it 'works without argument' do
111
+ patient = new_full_patient
112
+ patient.avg_hours_per_day_worked.must_equal 14.9666666666666667 / 2.0
113
+ end
114
+ it 'works without argument' do
115
+ patient = new_full_patient
116
+ patient.avg_hours_per_day_worked(:cprg, :taxes).must_equal 5.1 / 2.0
117
+ end
118
+ end
119
+
120
+ describe '#to_md' do
121
+ it 'works' do
122
+ patient = new_full_patient
123
+ patient.to_md.must_equal (
124
+ <<-END
125
+ Mar 14, 2015
126
+ ============================
127
+ - 2.60 hours of taxes: Worked on taxes some more
128
+ - 1.50 hours of taxes: Worked on taxes
129
+
130
+ Mar 13, 2015
131
+ ============================
132
+ - 6.92 hours of cmput659: Finished A7. Used my fourth late day, so I have one left for two assignments
133
+ - 1.00 hours of cprg: Fixed a bug in no-limit interface
134
+ - 1.00 hours of masters_research: Attended AI lecture by Gabor on theory related to convex regression
135
+ - 0.25 hours of cmput659: Listened to a Koller lecture
136
+ - 1.70 hours of cmput659: Worked on A7
137
+
138
+ END
139
+ )
140
+ end
141
+ end
142
+
143
+ describe '#to_ssv' do
144
+ it 'works' do
145
+ patient = new_full_patient
146
+ patient.to_ssv.must_equal (
147
+ <<-END
148
+ # Mar 14, 2015
149
+ taxes 2.60
150
+ taxes 1.50
151
+ # Mar 13, 2015
152
+ cmput659 6.92
153
+ cprg 1.00
154
+ masters_research 1.00
155
+ cmput659 0.25
156
+ cmput659 1.70
157
+ END
158
+ )
159
+ end
160
+ end
161
+
162
+ def new_full_patient
163
+ WorkDayCollection.new(
164
+ WorkDay.new(
165
+ 'March 14, 2015',
166
+ [
167
+ Task.new(
168
+ :taxes,
169
+ '12:54pm to 3:30pm',
170
+ "
171
+ Worked on taxes some more
172
+ "
173
+ ),
174
+ Task.new(
175
+ :taxes,
176
+ '11am to 12:30pm',
177
+ "
178
+ Worked on taxes
179
+ "
180
+ )
181
+ ]
182
+ ),
183
+ WorkDay.new(
184
+ 'March 13, 2015',
185
+ [
186
+ Task.new(
187
+ :cmput659,
188
+ '5:30pm to 12:25am',
189
+ "
190
+ Finished A7. Used my fourth late day, so I have one left for two assignments
191
+ "
192
+ ),
193
+ Task.new(
194
+ :cprg,
195
+ '1 hour',
196
+ "
197
+ Fixed a bug in no-limit interface
198
+ "
199
+ ),
200
+ Task.new(
201
+ :masters_research,
202
+ '12pm to 1pm',
203
+ "
204
+ Attended AI lecture by Gabor on theory related to convex regression
205
+ "
206
+ ),
207
+ Task.new(
208
+ :cmput659,
209
+ '11:35am to 11:50am',
210
+ "
211
+ Listened to a Koller lecture
212
+ "
213
+ ),
214
+ Task.new(
215
+ :cmput659,
216
+ '9:53am to 11:35am',
217
+ "
218
+ Worked on A7
219
+ "
220
+ )
221
+ ]
222
+ ),
223
+ official_work_days: {
224
+ january: 1,
225
+ february: 20,
226
+ march: 10,
227
+ april: 30,
228
+ may: 14,
229
+ june: 0,
230
+ july: 0,
231
+ august: 16,
232
+ september: 0,
233
+ october: 0,
234
+ november: 0,
235
+ december: 12
236
+ }
237
+ )
238
+ end
239
+ end
@@ -14,6 +14,46 @@ describe WorkDay do
14
14
  @patient.date.must_equal Chronic.parse(@x_date)
15
15
  @patient.tasks.must_equal @x_tasks
16
16
  end
17
+ describe 'to_hours' do
18
+ it 'works without argument' do
19
+ @x_tasks[0].expect(:to_hours, 1.1)
20
+ @x_tasks[1].expect(:to_hours, 2.6)
21
+ @patient.to_hours.must_equal 1.1 + 2.6
22
+ end
23
+ it 'works with arguments' do
24
+ @x_tasks[0].expect(:to_hours, 1.1)
25
+ @x_tasks[1].expect(:to_hours, 2.6)
26
+ @x_tasks[0].expect(:subject, :relevant_task)
27
+ @x_tasks[1].expect(:subject, :irrelevant_task)
28
+ @patient.to_hours(:relevant_task).must_equal 1.1
29
+
30
+ @x_tasks[0].expect(:to_hours, 1.1)
31
+ @x_tasks[1].expect(:to_hours, 2.6)
32
+ @x_tasks[0].expect(:subject, :relevant_task)
33
+ @x_tasks[1].expect(:subject, :irrelevant_task)
34
+ @patient.to_hours(:irrelevant_task).must_equal 2.6
35
+
36
+ @x_tasks[0].expect(:to_hours, 1.1)
37
+ @x_tasks[1].expect(:to_hours, 2.6)
38
+ @x_tasks[0].expect(:subject, :relevant_task)
39
+ @x_tasks[1].expect(:subject, :irrelevant_task)
40
+ @patient.to_hours(:relevant_task, :irrelevant_task).must_equal 1.1 + 2.6
41
+ end
42
+ end
43
+ describe 'to_md' do
44
+ it 'works' do
45
+ @x_tasks[0].expect(:to_s, 'Task 1')
46
+ @x_tasks[1].expect(:to_s, 'Task 2')
47
+ @patient.to_md.must_equal (
48
+ <<-END
49
+ #{@x_date}
50
+ ============================
51
+ - Task 1
52
+ - Task 2
53
+ END
54
+ )
55
+ end
56
+ end
17
57
  describe '#add_task!' do
18
58
  it 'works' do
19
59
  t3 = MiniTest::Mock.new
@@ -30,7 +70,7 @@ describe WorkDay do
30
70
  mock_task.expect(:subject, x_subject)
31
71
  mock_task.expect(:time_taken, time_taken_for_each_task)
32
72
  end
33
- @patient.time_worked.must_equal (Duration.new(@x_tasks.length * time_taken_for_each_task))
73
+ @patient.time_worked.must_equal ({x_subject => (Duration.new(@x_tasks.length * time_taken_for_each_task)) })
34
74
  end
35
75
  it 'when more than one subject is present' do
36
76
  time_taken_for_each_task = 23
@@ -51,6 +91,8 @@ describe WorkDay do
51
91
  t4.expect(:time_taken, time_taken_for_each_task)
52
92
  @x_tasks << t4
53
93
 
94
+ @patient = WorkDay.new @x_date, @x_tasks
95
+
54
96
  @patient.time_worked.must_equal (
55
97
  {
56
98
  subject_1 => Duration.new(num_subject_1_tasks * time_taken_for_each_task),
@@ -78,7 +120,9 @@ describe WorkDay do
78
120
  t4.expect(:subject, subject_3)
79
121
  @x_tasks << t4
80
122
 
81
- @patient.time_worked([subject_1, subject_2]).must_equal (
123
+ @patient = WorkDay.new @x_date, @x_tasks
124
+
125
+ @patient.time_worked(subject_1, subject_2).must_equal (
82
126
  {
83
127
  subject_1 => Duration.new(num_subject_1_tasks * time_taken_for_each_task),
84
128
  subject_2 => Duration.new(time_taken_for_each_task)
@@ -104,12 +148,12 @@ describe WorkDay do
104
148
  t4.expect(:subject, subject_3)
105
149
  @x_tasks << t4
106
150
 
151
+ @patient = WorkDay.new @x_date, @x_tasks
152
+
107
153
  @patient.time_worked(subject_1).must_equal (
108
- Duration.new(num_subject_1_tasks * time_taken_for_each_task)
154
+ {subject_1 => Duration.new(num_subject_1_tasks * time_taken_for_each_task)}
109
155
  )
110
156
  end
111
- it 'as a single element list' do
112
- end
113
157
  end
114
158
  end
115
159
  end
@@ -18,14 +18,13 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
- gem.add_dependency "chronic", '~> 0.9'
21
+ gem.add_dependency "chronic", '~> 0.10'
22
22
  gem.add_dependency "chronic_duration", '~> 0.10'
23
- gem.add_dependency "ruby-duration", '~> 3.0'
23
+ gem.add_dependency "ruby-duration", '~> 3.2'
24
24
 
25
25
  gem.add_development_dependency "rake", '~> 10.0'
26
- gem.add_development_dependency "turn", '~> 0.9'
27
- gem.add_development_dependency "awesome_print", '~> 1.1'
28
- gem.add_development_dependency "minitest", '~> 4.7'
29
- gem.add_development_dependency "pry-rescue", '~> 1.1'
30
- gem.add_development_dependency "simplecov", '~> 0.7'
26
+ gem.add_development_dependency "awesome_print", '~> 1.6'
27
+ gem.add_development_dependency "minitest", '~> 5.5'
28
+ gem.add_development_dependency "pry-rescue", '~> 1.4'
29
+ gem.add_development_dependency "simplecov", '~> 0.9'
31
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_distribution
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dustin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-13 00:00:00.000000000 Z
11
+ date: 2015-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chronic
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '0.9'
19
+ version: '0.10'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: '0.9'
26
+ version: '0.10'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: chronic_duration
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '3.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: '3.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,76 +66,62 @@ dependencies:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10.0'
69
- - !ruby/object:Gem::Dependency
70
- name: turn
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- version: '0.9'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ~>
81
- - !ruby/object:Gem::Version
82
- version: '0.9'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: awesome_print
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - ~>
88
74
  - !ruby/object:Gem::Version
89
- version: '1.1'
75
+ version: '1.6'
90
76
  type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - ~>
95
81
  - !ruby/object:Gem::Version
96
- version: '1.1'
82
+ version: '1.6'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: minitest
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ~>
102
88
  - !ruby/object:Gem::Version
103
- version: '4.7'
89
+ version: '5.5'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - ~>
109
95
  - !ruby/object:Gem::Version
110
- version: '4.7'
96
+ version: '5.5'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: pry-rescue
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - ~>
116
102
  - !ruby/object:Gem::Version
117
- version: '1.1'
103
+ version: '1.4'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - ~>
123
109
  - !ruby/object:Gem::Version
124
- version: '1.1'
110
+ version: '1.4'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: simplecov
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - ~>
130
116
  - !ruby/object:Gem::Version
131
- version: '0.7'
117
+ version: '0.9'
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - ~>
137
123
  - !ruby/object:Gem::Version
138
- version: '0.7'
124
+ version: '0.9'
139
125
  description: Gem for creating time distribution management systems
140
126
  email:
141
127
  - morrill@ualberta.ca
@@ -151,13 +137,16 @@ files:
151
137
  - lib/time_distribution.rb
152
138
  - lib/time_distribution/smart_duration.rb
153
139
  - lib/time_distribution/task.rb
140
+ - lib/time_distribution/task_list.rb
154
141
  - lib/time_distribution/time.rb
155
142
  - lib/time_distribution/version.rb
156
143
  - lib/time_distribution/work_day.rb
144
+ - lib/time_distribution/work_day_collection.rb
157
145
  - spec/smart_duration_spec.rb
158
146
  - spec/support/spec_helper.rb
159
147
  - spec/task_spec.rb
160
148
  - spec/time_spec.rb
149
+ - spec/work_day_collection_spec.rb
161
150
  - spec/work_day_spec.rb
162
151
  - time_distribution.gemspec
163
152
  homepage: ''
@@ -180,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
169
  version: '0'
181
170
  requirements: []
182
171
  rubyforge_project:
183
- rubygems_version: 2.0.0.rc.2
172
+ rubygems_version: 2.0.3
184
173
  signing_key:
185
174
  specification_version: 4
186
175
  summary: Gem for creating time distribution management systems
@@ -189,4 +178,6 @@ test_files:
189
178
  - spec/support/spec_helper.rb
190
179
  - spec/task_spec.rb
191
180
  - spec/time_spec.rb
181
+ - spec/work_day_collection_spec.rb
192
182
  - spec/work_day_spec.rb
183
+ has_rdoc: