TimeLogger 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -19,3 +19,4 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
+ *.gemspec
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.1"
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'
@@ -1,9 +1,35 @@
1
- Feature: something something
2
- In order to something something
3
- A user something something
4
- something something something
5
-
6
- Scenario: something something
7
- Given inspiration
8
- When I create a sweet new gem
9
- Then everyone should see how awesome I am
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
@@ -1,4 +1,5 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
2
  require 'TimeLogger'
3
+ require 'chronic'
3
4
 
4
5
  require 'spec/expectations'
@@ -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.1
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-01 00:00:00 +02:00
12
+ date: 2010-04-02 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency