tamarillo 0.1.1 → 0.2.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.
data/CHANGES CHANGED
@@ -1,3 +1,6 @@
1
+ Version 0.2.0, 2012-06-24
2
+ - Switchd to GLI for binary
3
+
1
4
  Version 0.1.1, 2012-06-18
2
5
  - Add help command
3
6
 
data/README.md CHANGED
@@ -29,55 +29,48 @@ can.
29
29
 
30
30
  ## Examples
31
31
 
32
- These examples are just thought experiments, this interface has not been
33
- implemented yet.
34
-
35
32
  ### Starting and stopping a tomato
36
33
 
37
34
  ```
38
35
  $ tam start
39
- > tamarillo started
36
+ > Pomodoro started, about 25 minutes.
40
37
 
41
38
  $ tam stop
42
- > tomato stopped around ~17m
43
-
44
- $ tam pause
45
- > tomato paused around ~16m
46
-
47
- $ tam interrupt
48
- > tomato interrupted around ~14m
39
+ > Pomorodo stopped, around 17 minutes.
49
40
  ```
50
41
 
51
42
  ### Status of current tomato
52
43
 
53
44
  ```
54
45
  $ tam status
55
- > ~19m # rough time only, don't sweat the seconds
46
+ > About 19 minutes.
56
47
 
57
- $ tam
58
- > ~19m
59
-
60
- $ tam status --full
61
- > active 19:21
48
+ $ tam status --prompt
49
+ > 19:21 1161 1500
62
50
  ```
63
51
 
64
52
  ### Configuration
65
53
 
66
54
  ```
67
- $ tam config --duration=25
68
- > tamarillo duration is 25 minutes
69
-
70
- $ tam config --alert=growl
71
- > tamarillo will use Growl for notifications
72
-
73
- $ tam config --daemon ~/.tamarillo/pid
74
- > tamarillo will monitor the current tomato from here
55
+ $ tam config
56
+ > --
57
+ > duration: 25
58
+ > notifier: bell
59
+
60
+ $ tam config duration=10
61
+ > --
62
+ > duration: 10
63
+ > notifier: bell
64
+
65
+ $ tam config notifier=growl
66
+ > --
67
+ > duration: 10
68
+ > notifier: growl
75
69
  ```
76
70
 
77
71
 
78
72
  ## Future ideas
79
73
 
80
74
  * task management, tomatoes are assigned to a task
81
- * daemon process for monitoring the current tomato
82
- * notification helper app for various environments
83
75
  * instaweb view of history
76
+ * helpers for shell and prompt integration
data/bin/tam CHANGED
@@ -1,4 +1,64 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'tamarillo/command'
4
- Tamarillo::Command.new.execute(*ARGV)
3
+ $: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
4
+
5
+ gem 'gli', '~>1.6.0'
6
+ require 'gli'
7
+ require 'tamarillo'
8
+
9
+ # Setup paths
10
+ path = ENV['TAMARILLO_PATH']
11
+ path ||= ENV['HOME'] + '/.tamarillo'
12
+ tamarillo_path = Pathname.new(File.expand_path(path))
13
+ config_path = tamarillo_path.join('config.yml')
14
+
15
+ # Setup environment
16
+ config = Tamarillo::Config.load(config_path)
17
+ storage = Tamarillo::Storage.new(tamarillo_path, config)
18
+ controller = Tamarillo::Controller.new(config, storage)
19
+
20
+ include GLI
21
+
22
+ program_desc "Command line pomodoro timer."
23
+ version Tamarillo::VERSION
24
+
25
+ desc "Status of the current pomodoro."
26
+ command :status do |c|
27
+ c.desc 'Format status for display in prompt.'
28
+ c.switch [:p, :prompt]
29
+
30
+ c.action do |global_options, options, args|
31
+ format = options[:prompt] ? Tamarillo::Formats::PROMPT : Tamarillo::Formats::HUMAN
32
+ status = controller.status(format)
33
+ printf "%s\n", status unless status.nil? || status.empty?
34
+ end
35
+ end
36
+
37
+ desc "Start a new pomodoro."
38
+ command :start do |c|
39
+ c.action do |global_options, options, args|
40
+ if tomato = controller.start_new_tomato
41
+ printf "Started new pomodoro, about %d minutes.\n", tomato.approx_minutes_remaining
42
+ end
43
+ end
44
+ end
45
+
46
+ desc "Stops the current pomodoro."
47
+ command :stop do |c|
48
+ c.action do |global_options, options, args|
49
+ if tomato = controller.interrupt_current_tomato
50
+ printf "Pomodoro stopped, about %d minutes.\n", tomato.approx_minutes_remaining
51
+ end
52
+ end
53
+ end
54
+
55
+ desc "View and update the configuration."
56
+ command :config do |c|
57
+ c.action do |global_options, options, args|
58
+ params = Hash[args.map { |pair| pair.split('=', 2) }]
59
+ controller.update_config(params)
60
+ print controller.config.to_yaml
61
+ end
62
+ end
63
+
64
+ exit run(ARGV)
@@ -47,10 +47,12 @@ module Tamarillo
47
47
  stop_monitor
48
48
 
49
49
  tomato = @storage.latest
50
- return if tomato.nil?
50
+ return if tomato.nil? || tomato.interrupted?
51
51
 
52
52
  tomato.interrupt!
53
53
  @storage.write_tomato(tomato)
54
+
55
+ tomato
54
56
  end
55
57
 
56
58
  # Public: Returns the current config.
@@ -43,12 +43,16 @@ module Tamarillo
43
43
 
44
44
  # Public: Returns the number of seconds until completion.
45
45
  def remaining
46
- return 0 if @interrupted
47
-
48
46
  d = @duration - @clock.elapsed
49
47
  d > 0 ? d : 0
50
48
  end
51
49
 
50
+ # Public: Returns the approximate number of minutes until
51
+ # completetion.
52
+ def approx_minutes_remaining
53
+ (remaining / 60.0).round.to_i
54
+ end
55
+
52
56
  # Public: Returns the number of seconds elapsed since start.
53
57
  def elapsed
54
58
  @clock.elapsed
@@ -1,3 +1,3 @@
1
1
  module Tamarillo
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -85,6 +85,7 @@ describe Tamarillo::Controller do
85
85
 
86
86
  it "interrupts the current tomato" do
87
87
  tomato = double('tomato')
88
+ tomato.stub(:interrupted?) { false }
88
89
  tomato.should_receive(:interrupt!)
89
90
  storage.stub(:write_tomato)
90
91
  storage.should_receive(:latest).and_return(tomato)
@@ -98,14 +99,30 @@ describe Tamarillo::Controller do
98
99
  .should_not raise_error(NoMethodError)
99
100
  end
100
101
 
102
+ it "returns nil if the tomato is already interrupted" do
103
+ tomato = double('tomato')
104
+ tomato.stub(:interrupted?) { true }
105
+ storage.stub(:latest => tomato)
106
+ subject.interrupt_current_tomato.should be_nil
107
+ end
108
+
101
109
  it "writes the tomato" do
102
110
  tomato = double('tomato')
111
+ tomato.stub(:interrupted?) { false }
103
112
  tomato.stub(:interrupt!)
104
113
  storage.stub(:latest => tomato)
105
114
  storage.should_receive(:write_tomato).with(tomato)
106
115
 
107
116
  subject.interrupt_current_tomato
108
117
  end
118
+
119
+ it "returns the interrupted tomato" do
120
+ tomato = double('tomato').as_null_object
121
+ tomato.stub(:interrupted?) { false }
122
+ storage.stub(:latest => tomato, :write_tomato => nil)
123
+
124
+ subject.interrupt_current_tomato.should == tomato
125
+ end
109
126
  end
110
127
 
111
128
  describe "#config" do
@@ -71,7 +71,23 @@ describe Tomato do
71
71
  subject.interrupt!
72
72
  end
73
73
 
74
- its(:remaining) { should == 0 }
74
+ its(:remaining) { should == 25.minutes }
75
+ end
76
+
77
+ end
78
+
79
+ describe "approximate time remaining" do
80
+ let(:clock) { stub(:elapsed => elapsed) }
81
+ subject { Tomato.new(10.minutes, clock) }
82
+
83
+ context "when more than 30 seconds between minutes" do
84
+ let(:elapsed) { 5.minutes + 10.seconds }
85
+ its(:approx_minutes_remaining) { should == 5 }
86
+ end
87
+
88
+ context "when less than 30 seconds between minutes" do
89
+ let(:elapsed) { 5.minutes + 50.seconds }
90
+ its(:approx_minutes_remaining) { should == 4 }
75
91
  end
76
92
  end
77
93
 
data/tamarillo.gemspec CHANGED
@@ -2,6 +2,7 @@
2
2
  require File.expand_path('../lib/tamarillo/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
+
5
6
  gem.name = "tamarillo"
6
7
  gem.version = Tamarillo::VERSION
7
8
  gem.authors = ["Tim Uruski"]
@@ -21,6 +22,6 @@ Gem::Specification.new do |gem|
21
22
  gem.add_development_dependency 'rspec', '~> 2.9.0'
22
23
  gem.add_development_dependency 'timecop', '~> 0.3.5'
23
24
 
24
- gem.add_runtime_dependency 'gli', '~> 2.0.0.rc4'
25
+ gem.add_runtime_dependency 'gli', '~> 1.6.0'
25
26
 
26
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tamarillo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-18 00:00:00.000000000 Z
12
+ date: 2012-06-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aruba
16
- requirement: &70337279930920 !ruby/object:Gem::Requirement
16
+ requirement: &70093955101400 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.11
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70337279930920
24
+ version_requirements: *70093955101400
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: active_support
27
- requirement: &70337279930300 !ruby/object:Gem::Requirement
27
+ requirement: &70093955068320 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70337279930300
35
+ version_requirements: *70093955068320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: fakefs
38
- requirement: &70337279929700 !ruby/object:Gem::Requirement
38
+ requirement: &70093938686480 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.4.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70337279929700
46
+ version_requirements: *70093938686480
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70337279928780 !ruby/object:Gem::Requirement
49
+ requirement: &70093938600700 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.9.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70337279928780
57
+ version_requirements: *70093938600700
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: timecop
60
- requirement: &70337279928040 !ruby/object:Gem::Requirement
60
+ requirement: &70093937676840 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,18 +65,18 @@ dependencies:
65
65
  version: 0.3.5
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70337279928040
68
+ version_requirements: *70093937676840
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: gli
71
- requirement: &70337279879600 !ruby/object:Gem::Requirement
71
+ requirement: &70093937644740 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: 2.0.0.rc4
76
+ version: 1.6.0
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70337279879600
79
+ version_requirements: *70093937644740
80
80
  description: Manage pomodoros from the command-line.
81
81
  email:
82
82
  - timuruski@gmail.com
@@ -142,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
142
142
  version: '0'
143
143
  segments:
144
144
  - 0
145
- hash: 1744679301037157510
145
+ hash: 3768224559069028415
146
146
  required_rubygems_version: !ruby/object:Gem::Requirement
147
147
  none: false
148
148
  requirements:
@@ -151,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
151
  version: '0'
152
152
  segments:
153
153
  - 0
154
- hash: 1744679301037157510
154
+ hash: 3768224559069028415
155
155
  requirements: []
156
156
  rubyforge_project:
157
157
  rubygems_version: 1.8.11