TimeLogger 0.0.1 → 0.0.2
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 +1 -0
- data/Rakefile +3 -1
- data/features/TimeLogger.feature +35 -9
- data/features/step_definitions/TimeLogger_steps.rb +63 -0
- data/features/support/env.rb +1 -0
- data/lib/TimeLogger.rb +130 -0
- metadata +2 -2
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ begin
|
|
6
6
|
require 'jeweler'
|
7
7
|
Jeweler::Tasks.new do |gem|
|
8
8
|
gem.name = "TimeLogger"
|
9
|
-
gem.version = "0.0.
|
9
|
+
gem.version = "0.0.2"
|
10
10
|
gem.summary = %Q{}
|
11
11
|
gem.description = %Q{}
|
12
12
|
gem.email = "marcin.bialon@gmail.com"
|
@@ -46,6 +46,8 @@ rescue LoadError
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
task :cucumber => :features
|
50
|
+
|
49
51
|
task :default => :spec
|
50
52
|
|
51
53
|
require 'rake/rdoctask'
|
data/features/TimeLogger.feature
CHANGED
@@ -1,9 +1,35 @@
|
|
1
|
-
Feature:
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
Feature: time logger
|
2
|
+
|
3
|
+
Scenario: start task
|
4
|
+
Given no task is active
|
5
|
+
When I start task "Foo"
|
6
|
+
Then I should see "Started task: Foo"
|
7
|
+
|
8
|
+
Scenario: stop task
|
9
|
+
Given an active task "Foo"
|
10
|
+
When I do some work for 3 minutes
|
11
|
+
And I stop task "Foo"
|
12
|
+
Then I should see "Stopped task: Foo (3 minutes)"
|
13
|
+
|
14
|
+
Scenario: start task which you already worked on
|
15
|
+
Given an inactive task "Foo" I worked on for 5 minutes
|
16
|
+
When I start task "Foo"
|
17
|
+
And I do some work for 4 minutes
|
18
|
+
And I stop task "Foo"
|
19
|
+
Then I should see "Started task: Foo"
|
20
|
+
And I should see "Stopped task: Foo (9 minutes)"
|
21
|
+
|
22
|
+
Scenario: start new task when there is an active one
|
23
|
+
Given an active task "Foo" I worked on for 2 minutes
|
24
|
+
When I start task "Bar"
|
25
|
+
Then I should see "Stopped task: Foo (2 minutes)"
|
26
|
+
And I should see "Started task: Bar"
|
27
|
+
|
28
|
+
Scenario: list
|
29
|
+
Given I worked on the following tasks:
|
30
|
+
| name | minutes |
|
31
|
+
| Foo | 4 |
|
32
|
+
| Bar | 7 |
|
33
|
+
When I list tasks
|
34
|
+
Then I should see "Foo (4 minutes)"
|
35
|
+
And I should see "Bar (7 minutes)"
|
@@ -0,0 +1,63 @@
|
|
1
|
+
Given /^no task is active$/ do
|
2
|
+
setup
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I start task "(.*)"$/ do |name|
|
6
|
+
@logger.start(name)
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^I should see "([^\"]*)"$/ do |msg|
|
10
|
+
@ui.msgs.should include(msg)
|
11
|
+
end
|
12
|
+
|
13
|
+
Given /^an active task "([^\"]*)"$/ do |task_name|
|
14
|
+
setup
|
15
|
+
|
16
|
+
@logger.start(task_name)
|
17
|
+
end
|
18
|
+
|
19
|
+
Given /^an active task "([^\"]*)" I worked on for (\d+) minutes$/ do |name, minutes|
|
20
|
+
setup
|
21
|
+
|
22
|
+
@logger.start(name)
|
23
|
+
@timer.add_minutes(minutes.to_i)
|
24
|
+
end
|
25
|
+
|
26
|
+
Given /^an inactive task "([^\"]*)" I worked on for (\d+) minutes$/ do |name, minutes|
|
27
|
+
setup
|
28
|
+
|
29
|
+
@logger.start(name)
|
30
|
+
@timer.add_minutes(minutes.to_i)
|
31
|
+
@logger.stop(name)
|
32
|
+
end
|
33
|
+
|
34
|
+
When /^I do some work for (\d+) minutes$/ do |minutes|
|
35
|
+
@timer.add_minutes(minutes.to_i)
|
36
|
+
end
|
37
|
+
|
38
|
+
When /^I stop task "([^\"]*)"$/ do |task_name|
|
39
|
+
@logger.stop(task_name)
|
40
|
+
end
|
41
|
+
|
42
|
+
Given /^I worked on the following tasks:$/ do |table|
|
43
|
+
setup
|
44
|
+
|
45
|
+
table.hashes.each do |hash|
|
46
|
+
name = hash["name"]
|
47
|
+
minutes = hash["minutes"].to_i
|
48
|
+
|
49
|
+
@logger.start(name)
|
50
|
+
@timer.add_minutes(minutes)
|
51
|
+
@logger.stop(name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
When /^I list tasks$/ do
|
56
|
+
@logger.list
|
57
|
+
end
|
58
|
+
|
59
|
+
def setup
|
60
|
+
@ui = TimeLogger::UI.new
|
61
|
+
@timer = TimeLogger::Timer.new
|
62
|
+
@logger = TimeLogger::TimeLogger.new(@timer, @ui)
|
63
|
+
end
|
data/features/support/env.rb
CHANGED
data/lib/TimeLogger.rb
CHANGED
@@ -0,0 +1,130 @@
|
|
1
|
+
module TimeLogger
|
2
|
+
class TimeLogger
|
3
|
+
|
4
|
+
def initialize(timer, ui)
|
5
|
+
@timer, @ui = timer, ui
|
6
|
+
end
|
7
|
+
|
8
|
+
def start(name)
|
9
|
+
unless @current_task.nil?
|
10
|
+
if @current_task.name != name
|
11
|
+
stop(@current_task.name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
@current_task = tasks[name]
|
15
|
+
if @current_task.nil?
|
16
|
+
@current_task = Task.new(name)
|
17
|
+
tasks[name] = @current_task
|
18
|
+
end
|
19
|
+
@current_task.start(@timer)
|
20
|
+
|
21
|
+
@ui.start(@current_task)
|
22
|
+
end
|
23
|
+
|
24
|
+
def stop(name)
|
25
|
+
task = tasks[name]
|
26
|
+
task.stop(@timer)
|
27
|
+
@current_task = nil
|
28
|
+
|
29
|
+
@ui.stop(task)
|
30
|
+
end
|
31
|
+
|
32
|
+
def list
|
33
|
+
@ui.list(tasks.values)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def tasks
|
39
|
+
@tasks ||= {}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Task
|
44
|
+
|
45
|
+
def initialize(name)
|
46
|
+
@name = name
|
47
|
+
end
|
48
|
+
|
49
|
+
def name
|
50
|
+
@name
|
51
|
+
end
|
52
|
+
|
53
|
+
def start(timer)
|
54
|
+
@activity = TaskActivity.new(timer)
|
55
|
+
@activity.start
|
56
|
+
end
|
57
|
+
|
58
|
+
def stop(timer)
|
59
|
+
@activity.stop
|
60
|
+
past_activities << @activity
|
61
|
+
@activity = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def time
|
65
|
+
past_activities.inject(0) { |t, a| t + a.time }
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def past_activities
|
71
|
+
@past_activities ||= []
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class TaskActivity
|
76
|
+
|
77
|
+
def initialize(timer)
|
78
|
+
@timer = timer
|
79
|
+
end
|
80
|
+
|
81
|
+
def start
|
82
|
+
@started_at = @timer.now()
|
83
|
+
end
|
84
|
+
|
85
|
+
def stop
|
86
|
+
@stopped_at = @timer.now()
|
87
|
+
end
|
88
|
+
|
89
|
+
def time
|
90
|
+
diff = @stopped_at.to_i - @started_at.to_i
|
91
|
+
mins = diff / 60
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class Timer
|
96
|
+
|
97
|
+
def now
|
98
|
+
@now ||= Time.now
|
99
|
+
end
|
100
|
+
|
101
|
+
def add_minutes(val)
|
102
|
+
@now = Time.at(@now.to_i + val * 60)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
class UI
|
107
|
+
|
108
|
+
def start(task)
|
109
|
+
message("Started task: #{task.name}")
|
110
|
+
end
|
111
|
+
|
112
|
+
def stop(task)
|
113
|
+
message("Stopped task: #{task.name} (#{task.time} minutes)")
|
114
|
+
end
|
115
|
+
|
116
|
+
def list(tasks)
|
117
|
+
tasks.each do |task|
|
118
|
+
message("#{task.name} (#{task.time} minutes)")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def message(msg)
|
123
|
+
msgs << msg
|
124
|
+
end
|
125
|
+
|
126
|
+
def msgs
|
127
|
+
@msgs ||= []
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: TimeLogger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Marcin Bia\xC5\x82o\xC5\x84"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-04-
|
12
|
+
date: 2010-04-02 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|