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 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