time_distribution 0.0.1 → 1.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 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