time_distribution 2.1.3 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca61f02b3f75d9e133ad3d1b67f0772608d3b632
4
- data.tar.gz: de0caf7ebe59a0f171d6e320cde5a6ec2e9fd823
3
+ metadata.gz: 9692efc1b44adc211fba77adeccdafa2430c81d2
4
+ data.tar.gz: e7978438e95415dfe89328420cbfdfbd6acb7331
5
5
  SHA512:
6
- metadata.gz: ea6124b5235f268aa59db971b0562129d0a330f0e481af4f5fda3f1683ade077dc03ba8da9bb118c8fe0ed8457ecdbe27da9e62c1fd7d9102a8bb641c70d2297
7
- data.tar.gz: 0c1a08594abed6da6335186e0279a806eb2b186c50b4ab2a926af4dcfb1b762ff808704d9cbc6216f0b22895052e823d7993bb4c3384b2a4c978e2355df418df
6
+ metadata.gz: 80f72a82d439b9f0a2e964d22caf2478a8a5d72d4886f57a0958a238ab01159a3055c76163083892e85a448d1a2a619f9bee3e3023ef6bc86bdcabdc26b5aa70
7
+ data.tar.gz: 4d88e5afb1142fa65d999b990cc8a53bf43519e48a46a767b1432cb0df4c6b68956c377ee441f56ccbe86aa4c0be62640e2d651f395d0f348652ec433135ad74
@@ -4,6 +4,14 @@ module TimeDistribution
4
4
  class Task
5
5
  attr_reader :subject, :time_taken, :desc
6
6
 
7
+ def self.from_map(map_data)
8
+ self.new(
9
+ map_data['subject'].to_sym,
10
+ map_data['duration'],
11
+ map_data['description']
12
+ )
13
+ end
14
+
7
15
  # @param [#to_s] subject The subject on which the task was completed. E.g. A course or project.
8
16
  # @param [#to_s] time_taken The amount of time taken on the task (Compatible with +ChronicDuration+ parsing, or a range of times that conform to +Chronic+ parsing).
9
17
  # @param [#to_s] desc The task's description.
@@ -13,6 +21,14 @@ module TimeDistribution
13
21
  @desc = desc
14
22
  end
15
23
 
24
+ def ==(other)
25
+ (
26
+ other.subject == @subject &&
27
+ other.time_taken == @time_taken &&
28
+ other.desc == @desc
29
+ )
30
+ end
31
+
16
32
  def to_s() "#{to_headline}: #{to_desc}" end
17
33
 
18
34
  def to_desc() @desc.strip end
@@ -43,4 +59,4 @@ module TimeDistribution
43
59
  )
44
60
  end
45
61
  end
46
- end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module TimeDistribution
2
- VERSION = "2.1.3"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -2,16 +2,35 @@ require 'chronic'
2
2
  require 'ruby-duration'
3
3
 
4
4
  require 'time_distribution/task_list'
5
+ require 'time_distribution/task'
5
6
 
6
7
  module TimeDistribution
7
8
  class WorkDay
8
9
  attr_reader :date, :tasks
9
10
 
11
+ def self.from_map(map_data)
12
+ self.new(
13
+ map_data['date'],
14
+ *(map_data['tasks'].map { |t| Task.from_map t })
15
+ )
16
+ end
17
+
10
18
  # @param [#to_s] date Date of this work day in +Chronic+ compatible format.
11
19
  # @param [Array<Task>] tasks List of tasks done in this work day. Defaults to an empty list.
12
20
  def initialize(date, *tasks)
13
21
  @date = Chronic.parse(date)
14
- @tasks = TaskList.new(*tasks)
22
+ @tasks = if tasks.length == 1 && !tasks.first.is_a?(Task)
23
+ TaskList.new(*tasks)
24
+ else
25
+ TaskList.new(tasks)
26
+ end
27
+ end
28
+
29
+ def ==(other)
30
+ (
31
+ @date == other.date &&
32
+ @tasks == other.tasks
33
+ )
15
34
  end
16
35
 
17
36
  # @param [Task] task Adds +task+ to the list of tasks completed on this work day.
@@ -44,4 +63,4 @@ module TimeDistribution
44
63
  )
45
64
  end
46
65
  end
47
- end
66
+ end
@@ -12,6 +12,10 @@ module TimeDistribution
12
12
 
13
13
  MONTHS = [:january, :february, :march, :april, :may, :june, :july, :august, :september, :october, :november, :december]
14
14
 
15
+ def self.from_map(map_data)
16
+ self.new(*map_data.map { |t| WorkDay.from_map t })
17
+ end
18
+
15
19
  private
16
20
  def provide_methods_for_setting_work_days_in_months
17
21
  MONTHS.each do |m|
data/spec/task_spec.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require_relative 'support/spec_helper'
2
+ require 'yaml'
2
3
 
3
4
  require 'time_distribution/task'
4
5
  require 'time_distribution/smart_duration'
@@ -6,6 +7,28 @@ require 'time_distribution/smart_duration'
6
7
  include TimeDistribution
7
8
 
8
9
  describe Task do
10
+ let(:yml_string_data) do
11
+ <<-END
12
+ subject: :time_distribution
13
+ duration: 3:38pm to 4pm
14
+ description: |
15
+ - Comment 1
16
+ - Comment 2
17
+ END
18
+ end
19
+
20
+
21
+ describe '#from_map' do
22
+ it 'works' do
23
+ map_data = YAML.load(yml_string_data)
24
+ patient = Task.from_map(map_data)
25
+
26
+ patient.subject.must_equal map_data['subject']
27
+ patient.time_taken.must_equal SmartDuration.parse(map_data['duration'])
28
+ patient.desc.must_equal map_data['description']
29
+ end
30
+ end
31
+
9
32
  describe '#new' do
10
33
  it 'works for three arguments' do
11
34
  x_subject = 'subject'
@@ -1,9 +1,58 @@
1
1
  require_relative 'support/spec_helper'
2
2
 
3
3
  require 'time_distribution/work_day_collection'
4
+ require 'time_distribution/work_day'
4
5
 
5
6
  include TimeDistribution
7
+
8
+
6
9
  describe WorkDayCollection do
10
+ let(:yml_string_data) do
11
+ <<-END
12
+ -
13
+ date: April 21, 2016
14
+ tasks:
15
+ -
16
+ subject: :time_distribution
17
+ duration: 6:38pm to 7pm
18
+ description: |
19
+ - Comment 1
20
+ - Comment 2
21
+ -
22
+ subject: :aaaaaa
23
+ duration: 4:38am to 6pm
24
+ description: |
25
+ - Ahdkjlan akjdlnkfn
26
+ -
27
+ date: April 20, 2016
28
+ tasks:
29
+ -
30
+ subject: :time_distribution
31
+ duration: 6:38pm to 7pm
32
+ description: |
33
+ - Comment 3
34
+ - Comment 4
35
+ -
36
+ subject: :bbbbb
37
+ duration: 4:38am to 6pm
38
+ description: |
39
+ - jkljkljlkj syowueiorue
40
+ END
41
+ end
42
+
43
+
44
+ describe '#from_map' do
45
+ let(:patient) do
46
+ map_data = YAML.load(yml_string_data)
47
+ _patient = WorkDayCollection.from_map map_data
48
+ _patient.must_equal map_data.map { |t| WorkDay.from_map t }
49
+ _patient
50
+ end
51
+ it 'works' do
52
+ patient
53
+ end
54
+ end
55
+
7
56
  describe '#new' do
8
57
  it 'with days only' do
9
58
  patient = WorkDayCollection.new('d1', 'd2')
@@ -295,4 +344,4 @@ END
295
344
  }
296
345
  )
297
346
  end
298
- end
347
+ end
@@ -1,52 +1,89 @@
1
1
  require_relative 'support/spec_helper'
2
+ require 'yaml'
2
3
 
3
4
  require 'time_distribution/work_day'
5
+ require 'time_distribution/task'
4
6
 
5
7
  include TimeDistribution
8
+
9
+
6
10
  describe WorkDay do
7
- before do
8
- t1 = MiniTest::Mock.new
9
- t2 = MiniTest::Mock.new
10
- @x_date = 'May 7, 2013'
11
- @x_tasks = [t1, t2]
12
- @patient = WorkDay.new @x_date, @x_tasks
13
-
14
- @patient.date.must_equal Chronic.parse(@x_date)
15
- @patient.tasks.must_equal @x_tasks
11
+ let(:yml_string_data) do
12
+ <<-END
13
+ date: April 21, 2016
14
+ tasks:
15
+ -
16
+ subject: :time_distribution
17
+ duration: 6:38pm to 7pm
18
+ description: |
19
+ - Comment 1
20
+ - Comment 2
21
+ -
22
+ subject: :aaaaaa
23
+ duration: 4:38am to 6pm
24
+ description: |
25
+ - Ahdkjlan akjdlnkfn
26
+ END
27
+ end
28
+
29
+
30
+ describe '#from_map' do
31
+ let(:patient) do
32
+ map_data = YAML.load(yml_string_data)
33
+ _patient = WorkDay.from_map map_data
34
+ _patient.date.must_equal Chronic.parse(map_data['date'])
35
+ _patient.tasks.must_equal map_data['tasks'].map { |t| Task.from_map t }
36
+ _patient
37
+ end
38
+ it 'works' do
39
+ patient
40
+ end
41
+ end
42
+
43
+
44
+ let(:x_tasks) { [MiniTest::Mock.new, MiniTest::Mock.new] }
45
+ let(:x_date) { 'May 7, 2013' }
46
+ let(:patient) do
47
+ _patient = WorkDay.new x_date, *x_tasks
48
+ _patient.date.must_equal Chronic.parse(x_date)
49
+ _patient.tasks.must_equal x_tasks
50
+ _patient
16
51
  end
52
+
53
+
17
54
  describe 'to_hours' do
18
55
  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
56
+ x_tasks[0].expect(:to_hours, 1.1)
57
+ x_tasks[1].expect(:to_hours, 2.6)
58
+ patient.to_hours.must_equal 1.1 + 2.6
22
59
  end
23
60
  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
61
+ x_tasks[0].expect(:to_hours, 1.1)
62
+ x_tasks[1].expect(:to_hours, 2.6)
63
+ x_tasks[0].expect(:subject, :relevant_task)
64
+ x_tasks[1].expect(:subject, :irrelevant_task)
65
+ patient.to_hours(:relevant_task).must_equal 1.1
66
+
67
+ x_tasks[0].expect(:to_hours, 1.1)
68
+ x_tasks[1].expect(:to_hours, 2.6)
69
+ x_tasks[0].expect(:subject, :relevant_task)
70
+ x_tasks[1].expect(:subject, :irrelevant_task)
71
+ patient.to_hours(:irrelevant_task).must_equal 2.6
72
+
73
+ x_tasks[0].expect(:to_hours, 1.1)
74
+ x_tasks[1].expect(:to_hours, 2.6)
75
+ x_tasks[0].expect(:subject, :relevant_task)
76
+ x_tasks[1].expect(:subject, :irrelevant_task)
77
+ patient.to_hours(:relevant_task, :irrelevant_task).must_equal 1.1 + 2.6
41
78
  end
42
79
  end
43
80
  describe 'to_md' do
44
81
  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 (
82
+ x_tasks[0].expect(:to_s, 'Task 1')
83
+ x_tasks[1].expect(:to_s, 'Task 2')
84
+ patient.to_md.must_equal (
48
85
  <<-END
49
- #{@x_date}
86
+ #{x_date}
50
87
  ============================
51
88
  - Task 1
52
89
  - Task 2
@@ -57,8 +94,8 @@ END
57
94
  describe '#add_task!' do
58
95
  it 'works' do
59
96
  t3 = MiniTest::Mock.new
60
- @patient.add_task!(t3).must_equal @patient
61
- @patient.tasks.must_equal (@x_tasks << t3)
97
+ patient.add_task!(t3).must_equal patient
98
+ patient.tasks.must_equal (x_tasks << t3)
62
99
  end
63
100
  end
64
101
  describe 'time_worked' do
@@ -66,34 +103,34 @@ END
66
103
  it 'when all tasks have the same subject' do
67
104
  time_taken_for_each_task = 23
68
105
  x_subject = 'my subject'
69
- @x_tasks.each do |mock_task|
106
+ x_tasks.each do |mock_task|
70
107
  mock_task.expect(:subject, x_subject)
71
108
  mock_task.expect(:time_taken, time_taken_for_each_task)
72
109
  end
73
- @patient.time_worked.must_equal ({x_subject => (Duration.new(@x_tasks.length * time_taken_for_each_task)) })
110
+ patient.time_worked.must_equal ({x_subject => (Duration.new(x_tasks.length * time_taken_for_each_task)) })
74
111
  end
75
112
  it 'when more than one subject is present' do
76
113
  time_taken_for_each_task = 23
77
114
  subject_1 = 'subject 1'
78
- @x_tasks.each do |mock_task|
115
+ x_tasks.each do |mock_task|
79
116
  mock_task.expect(:subject, subject_1)
80
117
  mock_task.expect(:time_taken, time_taken_for_each_task)
81
118
  end
82
- num_subject_1_tasks = @x_tasks.length
119
+ num_subject_1_tasks = x_tasks.length
83
120
  t3 = MiniTest::Mock.new
84
121
  subject_2 = 'subject 2'
85
122
  t3.expect(:subject, subject_2)
86
123
  t3.expect(:time_taken, time_taken_for_each_task)
87
- @x_tasks << t3
124
+ x_tasks << t3
88
125
  t4 = MiniTest::Mock.new
89
126
  subject_3 = 'subject 3'
90
127
  t4.expect(:subject, subject_3)
91
128
  t4.expect(:time_taken, time_taken_for_each_task)
92
- @x_tasks << t4
129
+ x_tasks << t4
93
130
 
94
- @patient = WorkDay.new @x_date, @x_tasks
131
+ patient = WorkDay.new x_date, x_tasks
95
132
 
96
- @patient.time_worked.must_equal (
133
+ patient.time_worked.must_equal (
97
134
  {
98
135
  subject_1 => Duration.new(num_subject_1_tasks * time_taken_for_each_task),
99
136
  subject_2 => Duration.new(time_taken_for_each_task),
@@ -105,24 +142,24 @@ END
105
142
  it 'returns a hash of duration sums when given a list of subjects' do
106
143
  time_taken_for_each_task = 23
107
144
  subject_1 = 'subject 1'
108
- @x_tasks.each do |mock_task|
145
+ x_tasks.each do |mock_task|
109
146
  mock_task.expect(:subject, subject_1)
110
147
  mock_task.expect(:time_taken, time_taken_for_each_task)
111
148
  end
112
- num_subject_1_tasks = @x_tasks.length
149
+ num_subject_1_tasks = x_tasks.length
113
150
  t3 = MiniTest::Mock.new
114
151
  subject_2 = 'subject 2'
115
152
  t3.expect(:subject, subject_2)
116
153
  t3.expect(:time_taken, time_taken_for_each_task)
117
- @x_tasks << t3
154
+ x_tasks << t3
118
155
  t4 = MiniTest::Mock.new
119
156
  subject_3 = 'subject 3'
120
157
  t4.expect(:subject, subject_3)
121
- @x_tasks << t4
158
+ x_tasks << t4
122
159
 
123
- @patient = WorkDay.new @x_date, @x_tasks
160
+ patient = WorkDay.new x_date, x_tasks
124
161
 
125
- @patient.time_worked(subject_1, subject_2).must_equal (
162
+ patient.time_worked(subject_1, subject_2).must_equal (
126
163
  {
127
164
  subject_1 => Duration.new(num_subject_1_tasks * time_taken_for_each_task),
128
165
  subject_2 => Duration.new(time_taken_for_each_task)
@@ -133,27 +170,27 @@ END
133
170
  it 'as a scalar' do
134
171
  time_taken_for_each_task = 23
135
172
  subject_1 = 'subject 1'
136
- @x_tasks.each do |mock_task|
173
+ x_tasks.each do |mock_task|
137
174
  mock_task.expect(:subject, subject_1)
138
175
  mock_task.expect(:time_taken, time_taken_for_each_task)
139
176
  end
140
- num_subject_1_tasks = @x_tasks.length
177
+ num_subject_1_tasks = x_tasks.length
141
178
  t3 = MiniTest::Mock.new
142
179
  subject_2 = 'subject 2'
143
180
  t3.expect(:subject, subject_2)
144
181
  t3.expect(:time_taken, time_taken_for_each_task)
145
- @x_tasks << t3
182
+ x_tasks << t3
146
183
  t4 = MiniTest::Mock.new
147
184
  subject_3 = 'subject 3'
148
185
  t4.expect(:subject, subject_3)
149
- @x_tasks << t4
186
+ x_tasks << t4
150
187
 
151
- @patient = WorkDay.new @x_date, @x_tasks
188
+ patient = WorkDay.new x_date, x_tasks
152
189
 
153
- @patient.time_worked(subject_1).must_equal (
190
+ patient.time_worked(subject_1).must_equal (
154
191
  {subject_1 => Duration.new(num_subject_1_tasks * time_taken_for_each_task)}
155
192
  )
156
193
  end
157
194
  end
158
195
  end
159
- end
196
+ 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: 2.1.3
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dustin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-14 00:00:00.000000000 Z
11
+ date: 2016-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chronic
@@ -169,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
169
  version: '0'
170
170
  requirements: []
171
171
  rubyforge_project:
172
- rubygems_version: 2.2.2
172
+ rubygems_version: 2.5.1
173
173
  signing_key:
174
174
  specification_version: 4
175
175
  summary: Gem for creating time distribution management systems
@@ -180,4 +180,3 @@ test_files:
180
180
  - spec/time_spec.rb
181
181
  - spec/work_day_collection_spec.rb
182
182
  - spec/work_day_spec.rb
183
- has_rdoc: