time_distribution 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c080fc58f25088d05f155ce39623ac9c2e3fe478
4
+ data.tar.gz: 7725aa3312d2d3150d2c81cfc41f39887f512125
5
+ SHA512:
6
+ metadata.gz: 2dca2300f821cc40577f766f0a6d857ac4aad9c1a5e645896fd2ff2f9f4a8ce9fcbe46d8101dc86acbe797f79096fa69e8f168f9e439b824e66126d7a04e6ac9
7
+ data.tar.gz: 020146a4fbe9ed8008d39baecc586d54b49f22a0160b0a0ee0ac10d22a1388c2f242257e9468a673a5dac65c30b3c3212e80876003c0f912e0771c851f564ef1
data/Rakefile CHANGED
@@ -1 +1,12 @@
1
+ #!/usr/bin/env rake
1
2
  require "bundler/gem_tasks"
3
+
4
+ require 'rake'
5
+ require 'rake/testtask'
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.libs << "lib" << 'spec/support'
9
+ t.test_files = FileList['spec/**/*_spec.rb']
10
+ t.verbose = false
11
+ t.warning = false # pry-rescue has a lot of warnings
12
+ end
@@ -2,21 +2,24 @@ require 'chronic'
2
2
  require 'chronic_duration'
3
3
  require 'ruby-duration'
4
4
 
5
- require_relative 'time'
5
+ require 'time_distribution/time'
6
6
 
7
- module SmartDuration
8
- def self.parse(time_period)
9
- # If the time period has is something like 1:00pm to 1:30pm or 1-2, interpret it as a range
10
- time_of_day_pattern = '\d+:?\d*[ap]?m?'
11
-
12
- Duration.new(
13
- if time_period.to_s.downcase.match(
14
- /(#{time_of_day_pattern})\s*(to|-)\s*(#{time_of_day_pattern})/
7
+ using TimeDistribution::TimeRefinement
8
+ module TimeDistribution
9
+ module SmartDuration
10
+ def self.parse(time_period)
11
+ # If the time period has is something like 1:00pm to 1:30pm or 1-2, interpret it as a range
12
+ time_of_day_pattern = '\d+:?\d*[ap]?m?'
13
+
14
+ Duration.new(
15
+ if time_period.to_s.downcase.match(
16
+ /(#{time_of_day_pattern})\s*(to|-)\s*(#{time_of_day_pattern})/
17
+ )
18
+ Chronic.parse($1).count_forward_to(Chronic.parse($3))
19
+ else
20
+ ChronicDuration.parse(time_period)
21
+ end
15
22
  )
16
- Chronic.parse($1).count_forward_to(Chronic.parse($3))
17
- else
18
- ChronicDuration.parse(time_period)
19
- end
20
- )
23
+ end
21
24
  end
22
25
  end
@@ -1,21 +1,16 @@
1
- require 'chronic_duration'
1
+ require 'time_distribution/smart_duration'
2
2
 
3
- require_relative 'smart_duration'
3
+ module TimeDistribution
4
+ class Task
5
+ attr_reader :subject, :time_taken, :desc
4
6
 
5
- class Task
6
- attr_reader :subject, :time_taken, :desc
7
-
8
- # @param [#to_s] subject The subject on which the task was completed. E.g. A course or project.
9
- # @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).
10
- # @param [#to_s] desc The task's description.
11
- def initialize(subject, time_taken, desc)
12
- @subject = subject
13
- @time_taken = SmartDuration.parse(time_taken)
14
- @desc = desc
15
- end
16
-
17
- def to_s
18
- # @todo Format time properly
19
- "#{ChronicDuration.parse(@time_taken.total)} spent on #{@subject}: #{@desc}"
7
+ # @param [#to_s] subject The subject on which the task was completed. E.g. A course or project.
8
+ # @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
+ # @param [#to_s] desc The task's description.
10
+ def initialize(subject, time_taken, desc)
11
+ @subject = subject
12
+ @time_taken = SmartDuration.parse(time_taken)
13
+ @desc = desc
14
+ end
20
15
  end
21
16
  end
@@ -1,11 +1,15 @@
1
1
  require 'chronic'
2
2
 
3
- class Time
4
- def count_forward_to(time)
5
- if self > time
6
- (Chronic.parse('11:59:59pm') - self) + (time - Chronic.parse('12:00:00am')) + 1
7
- else
8
- time - self
3
+ module TimeDistribution
4
+ module TimeRefinement
5
+ refine Time do
6
+ def count_forward_to(time)
7
+ if self > time
8
+ (Chronic.parse('11:59:59pm') - self) + (time - Chronic.parse('12:00:00am')) + 1
9
+ else
10
+ time - self
11
+ end
12
+ end
9
13
  end
10
14
  end
11
- end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module TimeDistribution
2
- VERSION = "0.0.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -1,29 +1,31 @@
1
1
  require 'chronic'
2
2
  require 'ruby-duration'
3
3
 
4
- class WorkDay
5
- attr_reader :date, :tasks
4
+ module TimeDistribution
5
+ class WorkDay
6
+ attr_reader :date, :tasks
6
7
 
7
- # @param [#to_s] date Date of this work day in +Chronic+ compatible format.
8
- # @param [Array<Task>] tasks List of tasks done in this work day. Defaults to an empty list.
9
- def initialize(date, tasks=[])
10
- @date = Chronic.parse(date)
11
- @tasks = tasks
12
- end
8
+ # @param [#to_s] date Date of this work day in +Chronic+ compatible format.
9
+ # @param [Array<Task>] tasks List of tasks done in this work day. Defaults to an empty list.
10
+ def initialize(date, tasks=[])
11
+ @date = Chronic.parse(date)
12
+ @tasks = tasks
13
+ end
13
14
 
14
- # @param [Task] task Adds +task+ to the list of tasks completed on this work day.
15
- def add_task!(task)
16
- @tasks << task
15
+ # @param [Task] task Adds +task+ to the list of tasks completed on this work day.
16
+ def add_task!(task)
17
+ @tasks << task
17
18
 
18
- self
19
- end
19
+ self
20
+ end
20
21
 
21
- def time_worked
22
- times = {}
23
- @tasks.inject({}) do |times, t|
24
- times[t.subject] = Duration.new(0) unless times[t.subject]
25
- times[t.subject] += t.time_taken
26
- times
22
+ def time_worked
23
+ times = {}
24
+ @tasks.inject({}) do |times, t|
25
+ times[t.subject] = Duration.new(0) unless times[t.subject]
26
+ times[t.subject] += t.time_taken
27
+ times
28
+ end
27
29
  end
28
30
  end
29
31
  end
@@ -1,9 +1,10 @@
1
- require_relative "time_distribution/version"
1
+ require "time_distribution/version"
2
2
 
3
- require_relative 'time_distribution/time'
3
+ require 'time_distribution/time'
4
+
5
+ require 'time_distribution/smart_duration'
6
+ require 'time_distribution/task'
7
+ require 'time_distribution/work_day'
4
8
 
5
9
  module TimeDistribution
6
- require_relative 'time_distribution/smart_duration'
7
- require_relative 'time_distribution/task'
8
- require_relative 'time_distribution/work_day'
9
10
  end
@@ -0,0 +1,20 @@
1
+ require_relative 'support/spec_helper'
2
+
3
+ require 'time_distribution/smart_duration'
4
+
5
+ include TimeDistribution
6
+ describe SmartDuration do
7
+ describe '::parse' do
8
+ describe 'can interpret a range of times' do
9
+ it 'written with "to"' do
10
+ SmartDuration.parse('10am to 11:30am').total.must_equal 1.5.hours
11
+ end
12
+ it 'written with "-"' do
13
+ SmartDuration.parse('10am-11:11am').total.must_equal 1.hours + 11.minutes
14
+ end
15
+ end
16
+ it 'can interpret an explicit range' do
17
+ SmartDuration.parse('1 hour 30 minutes').total.must_equal 1.5.hours
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'minitest/spec'
5
+ require 'minitest/pride'
6
+ require 'minitest/mock'
7
+
8
+ require 'turn'
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
+ require 'awesome_print'
23
+ module Minitest::Assertions
24
+ def mu_pp(obj)
25
+ obj.awesome_inspect
26
+ end
27
+ end
28
+
29
+ require 'pry-rescue/minitest'
30
+
31
+ require 'ruby-duration'
data/spec/task_spec.rb ADDED
@@ -0,0 +1,22 @@
1
+ require_relative 'support/spec_helper'
2
+
3
+ require 'time_distribution/task'
4
+ require 'time_distribution/smart_duration'
5
+
6
+ include TimeDistribution
7
+
8
+ describe Task do
9
+ describe '#new' do
10
+ it 'works for three arguments' do
11
+ x_subject = 'subject'
12
+ x_time_taken = '10 min'
13
+ x_description = 'interesting description'
14
+
15
+ patient = Task.new(x_subject, x_time_taken, x_description)
16
+
17
+ patient.subject.must_equal x_subject
18
+ patient.time_taken.must_equal SmartDuration.parse(x_time_taken)
19
+ patient.desc.must_equal x_description
20
+ end
21
+ end
22
+ end
data/spec/time_spec.rb ADDED
@@ -0,0 +1,23 @@
1
+ require_relative 'support/spec_helper'
2
+ require 'time_distribution/time'
3
+ require 'chronic'
4
+
5
+ include TimeDistribution
6
+ using TimeRefinement
7
+
8
+ describe Time do
9
+ describe '#count_forward_to' do
10
+ it 'counts duration properly when both times are in AM' do
11
+ Chronic.parse('10am').count_forward_to(Chronic.parse('11:30am')).must_equal 1.5.hours
12
+ end
13
+ it 'counts duration properly when both times are in PM' do
14
+ Chronic.parse('10pm').count_forward_to(Chronic.parse('11:30pm')).must_equal 1.5.hours
15
+ end
16
+ it 'counts duration properly when it crosses from AM to PM' do
17
+ Chronic.parse('11am').count_forward_to(Chronic.parse('12:30pm')).must_equal 1.5.hours
18
+ end
19
+ it 'counts duration properly when it crosses from PM to AM' do
20
+ Chronic.parse('11pm').count_forward_to(Chronic.parse('12:30am')).must_equal 1.5.hours
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'support/spec_helper'
2
+
3
+ require 'time_distribution/work_day'
4
+
5
+ include TimeDistribution
6
+ 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
16
+ end
17
+ describe '#add_task!' do
18
+ it 'works' do
19
+ t3 = MiniTest::Mock.new
20
+ @patient.add_task!(t3).must_equal @patient
21
+ @patient.tasks.must_equal (@x_tasks << t3)
22
+ end
23
+ end
24
+ describe 'time_worked' do
25
+ it 'works' do
26
+ time_taken_for_each_task = 23
27
+ x_subject = 'my subject'
28
+ @x_tasks.each do |mock_task|
29
+ mock_task.expect(:subject, x_subject)
30
+ mock_task.expect(:subject, x_subject)
31
+ mock_task.expect(:subject, x_subject)
32
+ mock_task.expect(:time_taken, time_taken_for_each_task)
33
+ end
34
+ @patient.time_worked.must_equal ({x_subject => Duration.new(@x_tasks.length * time_taken_for_each_task)})
35
+ end
36
+ end
37
+ end
@@ -18,9 +18,14 @@ 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"
22
- gem.add_dependency "chronic_duration"
23
- gem.add_dependency "ruby-duration"
24
-
25
- gem.add_development_dependency "rake"
21
+ gem.add_dependency "chronic", '~> 0.9'
22
+ gem.add_dependency "chronic_duration", '~> 0.10'
23
+ gem.add_dependency "ruby-duration", '~> 3.0'
24
+
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
31
  end
metadata CHANGED
@@ -1,80 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_distribution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Dustin
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-01 00:00:00.000000000 Z
11
+ date: 2013-05-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: chronic
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: '0.9'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: '0'
26
+ version: '0.9'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: chronic_duration
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ~>
36
32
  - !ruby/object:Gem::Version
37
- version: '0'
33
+ version: '0.10'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ~>
44
39
  - !ruby/object:Gem::Version
45
- version: '0'
40
+ version: '0.10'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: ruby-duration
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ~>
52
46
  - !ruby/object:Gem::Version
53
- version: '0'
47
+ version: '3.0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ~>
60
53
  - !ruby/object:Gem::Version
61
- version: '0'
54
+ version: '3.0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rake
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ~>
68
60
  - !ruby/object:Gem::Version
69
- version: '0'
61
+ version: '10.0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ~>
76
67
  - !ruby/object:Gem::Version
77
- version: '0'
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
+ - !ruby/object:Gem::Dependency
84
+ name: awesome_print
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '4.7'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '4.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-rescue
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '1.1'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: '1.1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: '0.7'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '0.7'
78
139
  description: Gem for creating time distribution management systems
79
140
  email:
80
141
  - morrill@ualberta.ca
@@ -93,31 +154,39 @@ files:
93
154
  - lib/time_distribution/time.rb
94
155
  - lib/time_distribution/version.rb
95
156
  - lib/time_distribution/work_day.rb
157
+ - spec/smart_duration_spec.rb
158
+ - spec/support/spec_helper.rb
159
+ - spec/task_spec.rb
160
+ - spec/time_spec.rb
161
+ - spec/work_day_spec.rb
96
162
  - time_distribution.gemspec
97
163
  homepage: ''
98
164
  licenses:
99
165
  - MIT
166
+ metadata: {}
100
167
  post_install_message:
101
168
  rdoc_options: []
102
169
  require_paths:
103
170
  - lib
104
171
  required_ruby_version: !ruby/object:Gem::Requirement
105
- none: false
106
172
  requirements:
107
- - - ! '>='
173
+ - - '>='
108
174
  - !ruby/object:Gem::Version
109
175
  version: '0'
110
176
  required_rubygems_version: !ruby/object:Gem::Requirement
111
- none: false
112
177
  requirements:
113
- - - ! '>='
178
+ - - '>='
114
179
  - !ruby/object:Gem::Version
115
180
  version: '0'
116
181
  requirements: []
117
182
  rubyforge_project:
118
- rubygems_version: 1.8.24
183
+ rubygems_version: 2.0.0.rc.2
119
184
  signing_key:
120
- specification_version: 3
185
+ specification_version: 4
121
186
  summary: Gem for creating time distribution management systems
122
- test_files: []
123
- has_rdoc:
187
+ test_files:
188
+ - spec/smart_duration_spec.rb
189
+ - spec/support/spec_helper.rb
190
+ - spec/task_spec.rb
191
+ - spec/time_spec.rb
192
+ - spec/work_day_spec.rb