domodoro 0.0.4 → 0.1.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.
@@ -0,0 +1,80 @@
1
+ module Domodoro
2
+ class Timepoint
3
+ attr_reader :hour, :min
4
+
5
+ def initialize(*args)
6
+ case args.first
7
+ when String
8
+ @hour, @min = args.first.split(':').map(&:to_i)
9
+ when Fixnum
10
+ @hour, @min = args.first, args.last
11
+ end
12
+ end
13
+
14
+ def +(minutes)
15
+ hours_to_advance = ((@min + minutes) / 60).to_i
16
+
17
+ h = @hour + hours_to_advance
18
+ m = (@min + minutes) % 60
19
+
20
+ Timepoint.new("#{h}:#{m}")
21
+ end
22
+
23
+ def after?(timepoint)
24
+ if @hour > timepoint.hour
25
+ true
26
+ elsif @hour == timepoint.hour
27
+ @min >= timepoint.min
28
+ else
29
+ false
30
+ end
31
+ end
32
+
33
+ def before?(timepoint)
34
+ if @hour < timepoint.hour
35
+ true
36
+ elsif @hour == timepoint.hour
37
+ @min < timepoint.min
38
+ else
39
+ false
40
+ end
41
+ end
42
+
43
+ def ==(timepoint)
44
+ case timepoint
45
+ when String
46
+ Timepoint.new(timepoint) == self
47
+ when Timepoint
48
+ @hour == timepoint.hour && @min == timepoint.min
49
+ end
50
+ end
51
+
52
+ def to_s
53
+ [@hour, @min].map(&:to_s).map do |number|
54
+ number.rjust(2, '0')
55
+ end.join(':')
56
+ end
57
+
58
+ def left_until(timestamp)
59
+ secs = 59 - Time.now.sec
60
+ hours = timestamp.hour - @hour
61
+
62
+ if timestamp.hour == @hour
63
+ remaining_minutes = (timestamp.min - @min - 1).to_s.rjust(2, '0')
64
+ return "00:#{remaining_minutes}:#{secs.to_s.rjust(2, '0')}"
65
+ end
66
+
67
+ if timestamp.min < @min
68
+ hours -= 1
69
+ end
70
+
71
+ mins = ((timestamp.min - @min) % 60) - 1
72
+
73
+ h = hours.to_s.rjust(2, '0')
74
+ m = mins.to_s.rjust(2, '0')
75
+ s = secs.to_s.rjust(2, '0')
76
+
77
+ "#{h}:#{m}:#{s}"
78
+ end
79
+ end
80
+ end
@@ -1,3 +1,3 @@
1
1
  module Domodoro
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -11,123 +11,38 @@ module Domodoro
11
11
  end
12
12
 
13
13
  describe 'broadcast' do
14
- describe 'in the morning' do
15
- it 'broadcasts from 8:00 until 12:59' do
16
- @channel.expects(:morning).with(5).never
17
- @channel.expects(:morning).with(10).once
18
- @channel.expects(:morning).with(15).once
19
- @channel.expects(:morning).with(20).once
20
- @channel.expects(:morning).with(25).once
21
- @channel.expects(:morning).with(30).once
22
- @channel.expects(:morning).with(35).never
23
-
24
- min = 0
25
- (7..13).each do |hour|
26
- min += 5
27
- @channel.broadcast(hour, min)
28
- end
29
- end
30
- end
31
-
32
- describe 'in the afternoon' do
33
- it 'broadcasts from 13:20 on' do
34
- @channel.expects(:afternoon).with(5).never
35
- @channel.expects(:afternoon).with(10).never
36
- @channel.expects(:afternoon).with(15).never
37
- @channel.expects(:afternoon).with(20).once
38
- @channel.expects(:afternoon).with(25).once
39
- @channel.expects(:afternoon).with(30).once
40
- @channel.expects(:afternoon).with(35).once
41
-
42
- min = 0
43
- (13..19).each do |hour|
44
- min += 5
45
- @channel.broadcast(hour, min)
46
- end
47
- end
48
- end
49
-
50
- it 'does not broadcast during lunch time' do
51
- %w(morning afternoon).each do |timespan|
52
- @channel.expects(timespan).with(5).never
53
- end
54
-
55
- (0..19).each do |min|
56
- @channel.broadcast(13, min)
57
- end
14
+ before do
15
+ @schedule = Schedule.new
16
+ @schedule.instance_variable_set(:@times, {
17
+ '08:30' => :start,
18
+ '09:00' => :stop
19
+ })
58
20
  end
59
- end
60
21
 
61
- describe '#morning' do
62
- describe 'pomodoro starts' do
63
- it 'broadcasts a :start message when the time is XX:00' do
64
- @channel.expects(:<<).with(:start)
65
- @channel.morning 0
66
- end
22
+ describe 'if theres an action for the timestamp' do
23
+ it 'broadcasts it' do
24
+ @channel.expects(:<<).with(
25
+ :current_action => ["08:30", :start],
26
+ :next_action => ["09:00", :stop]
27
+ )
28
+ @channel.expects(:<<).with(
29
+ :current_action => ["09:00", :stop],
30
+ :next_action => nil
31
+ )
67
32
 
68
- it 'broadcasts a :start message when the time is XX:30' do
69
- @channel.expects(:<<).with(:start)
70
- @channel.morning 30
33
+ @channel.broadcast("08:30", @schedule)
34
+ @channel.broadcast("09:00", @schedule)
71
35
  end
72
36
  end
73
37
 
74
- describe 'pomodoro stops' do
75
- it 'broadcasts a :stop message when the time is XX:25' do
76
- @channel.expects(:<<).with(:stop)
77
- @channel.morning 25
78
- end
38
+ describe 'otherwise' do
39
+ it 'does not' do
40
+ @channel.expects(:<<).never
79
41
 
80
- it 'broadcasts a :stop message when the time is XX:55' do
81
- @channel.expects(:<<).with(:stop)
82
- @channel.morning 55
42
+ @channel.broadcast("07:30", @schedule)
43
+ @channel.broadcast("08:31", @schedule)
83
44
  end
84
45
  end
85
-
86
- it 'does not broadcast anything at other times' do
87
- @channel.expects(:<<).never
88
-
89
- @channel.morning 5
90
- @channel.morning 10
91
- @channel.morning 20
92
- @channel.morning 40
93
- @channel.morning 50
94
- end
95
- end
96
-
97
- describe '#afternoon' do
98
- describe 'pomodoro starts' do
99
- it 'broadcasts a :start message when the time is XX:20' do
100
- @channel.expects(:<<).with(:start)
101
- @channel.afternoon 20
102
- end
103
-
104
- it 'broadcasts a :start message when the time is XX:50' do
105
- @channel.expects(:<<).with(:start)
106
- @channel.afternoon 50
107
- end
108
- end
109
-
110
- describe 'pomodoro stops' do
111
- it 'broadcasts a :stop message when the time is XX:45' do
112
- @channel.expects(:<<).with(:stop)
113
- @channel.afternoon 45
114
- end
115
-
116
- it 'broadcasts a :stop message when the time is XX:15' do
117
- @channel.expects(:<<).with(:stop)
118
- @channel.afternoon 15
119
- end
120
- end
121
-
122
- it 'does not broadcast anything at other times' do
123
- @channel.expects(:<<).never
124
-
125
- @channel.afternoon 5
126
- @channel.afternoon 10
127
- @channel.afternoon 25
128
- @channel.afternoon 40
129
- @channel.afternoon 55
130
- end
131
46
  end
132
47
  end
133
48
  end
@@ -1,160 +1,96 @@
1
1
  require 'test_helper'
2
2
 
3
- module ExampleServer; end
3
+ module ExampleServer
4
+ include EM::P::ObjectProtocol
5
+ end
4
6
 
5
7
  module Domodoro
6
8
  describe Client do
7
9
  include EM::MiniTest::Spec
8
10
 
9
- it 'calls .work when receives :start', :timeout => 0.3 do
10
- EM.start_server '127.0.0.1', 12345, ExampleServer do |conn|
11
- conn.send_data ":start\n"
12
- end
13
-
14
- Client.expects(:work)
15
-
16
- Client.start '127.0.0.1', 12345
17
-
18
- EM.add_timer(0.2) do
19
- mocha_verify
20
- done!
21
- end
22
-
23
- wait!
24
- end
25
-
26
- it 'calls .break when receives :stop', :timeout => 0.3 do
27
- EM.start_server '127.0.0.1', 12345, ExampleServer do |conn|
28
- conn.send_data ":stop\n"
29
- end
30
-
31
- Client.expects(:break)
32
-
33
- Client.start '127.0.0.1', 12345
34
-
35
- EM.add_timer(0.2) do
36
- mocha_verify
37
- done!
38
- end
39
-
40
- wait!
41
- end
42
-
43
- describe '.work' do
44
- describe 'if sound is activated' do
45
- it 'plays a sound', :timeout => 0.2 do
46
- Config.stubs(:sound).returns true
47
- Client.expects(:system)
48
- Client.work
49
-
50
- EM.add_timer(0.1) do
51
- mocha_verify
52
- done!
53
- end
54
- wait!
11
+ [
12
+ [:start, :work],
13
+ [:stop, :break],
14
+ [:lunch, :lunch],
15
+ [:go_home, :home],
16
+ ].each do |message, action|
17
+ it "calls .#{action} when receives :#{message}", :timeout => 0.3 do
18
+ EM.start_server '127.0.0.1', 12345, ExampleServer do |conn|
19
+ conn.send_object({:current_action => ["08:30", message] })
55
20
  end
56
- end
57
-
58
- describe 'otherwise' do
59
- it 'does not play a sound', :timeout => 0.2 do
60
- Config.stubs(:sound).returns false
61
- Client.expects(:system).never
62
- Client.work
63
21
 
64
- EM.add_timer(0.1) do
65
- mocha_verify
66
- done!
67
- end
68
- wait!
69
- end
70
- end
22
+ Client.expects(action)
71
23
 
72
- describe 'if visual is activated' do
73
- it 'displays a visual notification', :timeout => 0.2 do
74
- Config.stubs(:visual).returns true
75
- Notify.expects(:notify)
76
- Client.work
24
+ Client.start '127.0.0.1', 12345
77
25
 
78
- EM.add_timer(0.1) do
79
- mocha_verify
80
- done!
81
- end
82
- wait!
26
+ EM.add_timer(0.2) do
27
+ mocha_verify
28
+ done!
83
29
  end
84
- end
85
-
86
- describe 'otherwise' do
87
- it 'does not display any visual notification', :timeout => 0.2 do
88
- Config.stubs(:visual).returns false
89
- Notify.expects(:notify).never
90
- Client.work
91
30
 
92
- EM.add_timer(0.1) do
93
- mocha_verify
94
- done!
95
- end
96
- wait!
97
- end
31
+ wait!
98
32
  end
99
33
  end
100
34
 
101
- describe '.break' do
102
- describe 'if sound is activated' do
103
- it 'plays a sound', :timeout => 0.2 do
104
- Config.stubs(:sound).returns true
105
- Client.expects(:system)
106
- Client.break
107
-
108
- EM.add_timer(0.1) do
109
- mocha_verify
110
- done!
35
+ %w(work break lunch home).each do |action|
36
+ describe ".#{action}" do
37
+ describe 'if sound is activated' do
38
+ it 'plays a sound', :timeout => 0.3 do
39
+ Config.stubs(:sound).returns true
40
+ Client.expects(:system)
41
+ Client.send action
42
+
43
+ EM.add_timer(0.2) do
44
+ mocha_verify
45
+ done!
46
+ end
47
+ wait!
111
48
  end
112
- wait!
113
49
  end
114
50
 
115
- end
116
-
117
- describe 'otherwise' do
118
- it 'does not play a sound', :timeout => 0.2 do
119
- Config.stubs(:sound).returns false
120
- Client.expects(:system).never
121
- Client.break
122
-
123
- EM.add_timer(0.1) do
124
- mocha_verify
125
- done!
51
+ describe 'otherwise' do
52
+ it 'does not play a sound', :timeout => 0.2 do
53
+ Config.stubs(:sound).returns false
54
+ Client.expects(:system).never
55
+ Client.send action
56
+
57
+ EM.add_timer(0.1) do
58
+ mocha_verify
59
+ done!
60
+ end
61
+ wait!
126
62
  end
127
- wait!
128
63
  end
129
- end
130
64
 
131
- describe 'if visual is activated' do
132
- it 'displays a visual notification', :timeout => 0.2 do
133
- Config.stubs(:visual).returns true
134
- Notify.expects(:notify)
135
- Client.break
136
-
137
- EM.add_timer(0.1) do
138
- mocha_verify
139
- done!
65
+ describe 'if visual is activated' do
66
+ it 'displays a visual notification', :timeout => 0.2 do
67
+ Config.stubs(:visual).returns true
68
+ Notify.expects(:notify)
69
+ Client.send action
70
+
71
+ EM.add_timer(0.1) do
72
+ mocha_verify
73
+ done!
74
+ end
75
+ wait!
140
76
  end
141
- wait!
142
77
  end
143
- end
144
78
 
145
- describe 'otherwise' do
146
- it 'does not display any visual notification', :timeout => 0.2 do
147
- Config.stubs(:visual).returns false
148
- Notify.expects(:notify).never
149
- Client.break
150
-
151
- EM.add_timer(0.1) do
152
- mocha_verify
153
- done!
79
+ describe 'otherwise' do
80
+ it 'does not display any visual notification', :timeout => 0.2 do
81
+ Config.stubs(:visual).returns false
82
+ Notify.expects(:notify).never
83
+ Client.send action
84
+
85
+ EM.add_timer(0.1) do
86
+ mocha_verify
87
+ done!
88
+ end
89
+ wait!
154
90
  end
155
- wait!
156
91
  end
157
92
  end
158
93
  end
94
+
159
95
  end
160
96
  end