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.
- data/Readme.md +21 -6
- data/assets/{stop.wav → break.wav} +0 -0
- data/assets/home.wav +0 -0
- data/assets/lunch.wav +0 -0
- data/assets/{start.wav → work.wav} +0 -0
- data/lib/domodoro.rb +2 -0
- data/lib/domodoro/channel.rb +8 -38
- data/lib/domodoro/client.rb +73 -34
- data/lib/domodoro/config.rb +32 -1
- data/lib/domodoro/schedule.rb +82 -0
- data/lib/domodoro/server.rb +20 -4
- data/lib/domodoro/timepoint.rb +80 -0
- data/lib/domodoro/version.rb +1 -1
- data/test/domodoro/channel_test.rb +23 -108
- data/test/domodoro/client_test.rb +65 -129
- data/test/domodoro/config_test.rb +2 -2
- data/test/domodoro/schedule_test.rb +108 -0
- data/test/domodoro/server_test.rb +39 -9
- data/test/domodoro/timepoint_test.rb +105 -0
- metadata +102 -68
@@ -9,7 +9,7 @@ module Domodoro
|
|
9
9
|
visual: true
|
10
10
|
sound: false
|
11
11
|
"""
|
12
|
-
Domodoro::Config.
|
12
|
+
Domodoro::Config.load_client_configuration
|
13
13
|
|
14
14
|
assert_equal true, Domodoro::Config.visual
|
15
15
|
assert_equal false, Domodoro::Config.sound
|
@@ -20,7 +20,7 @@ module Domodoro
|
|
20
20
|
it 'sets both options to true' do
|
21
21
|
File.stubs(:exist?).returns false
|
22
22
|
|
23
|
-
Domodoro::Config.
|
23
|
+
Domodoro::Config.load_client_configuration
|
24
24
|
|
25
25
|
assert_equal true, Domodoro::Config.visual
|
26
26
|
assert_equal true, Domodoro::Config.sound
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
module Domodoro
|
6
|
+
describe Schedule do
|
7
|
+
before do
|
8
|
+
File.stubs(:exist?).returns false
|
9
|
+
@schedule = Schedule.new
|
10
|
+
@schedule.generate!
|
11
|
+
@times = @schedule.to_hash
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "before lunch" do
|
15
|
+
it 'generates start times correctly' do
|
16
|
+
%w(08:30 09:00 09:30 10:00 10:35 11:05 11:35 12:05 12:35).each do |time|
|
17
|
+
assert_equal :start, @times[time]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'generates stop times correctly' do
|
22
|
+
%w(08:55 09:25 09:55 10:25 11:00 11:30 12:00 12:30).each do |time|
|
23
|
+
assert_equal :stop, @times[time]
|
24
|
+
end
|
25
|
+
assert_equal :lunch, @times["13:00"]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'after lunch' do
|
30
|
+
it 'generates start times correctly' do
|
31
|
+
%w(13:30 14:00 14:30 15:00 15:35 16:05).each do |time|
|
32
|
+
assert_equal :start, @times[time]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'generates stop times correctly' do
|
37
|
+
%w(13:55 14:25 14:55 15:25 16:00).each do |time|
|
38
|
+
assert_equal :stop, @times[time]
|
39
|
+
end
|
40
|
+
assert_equal :go_home, @times["16:30"]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'uneven, weird schedules' do
|
45
|
+
before do
|
46
|
+
config = OpenStruct.new
|
47
|
+
config.pomodoro_duration = 25
|
48
|
+
config.pomodoro_break = 5
|
49
|
+
config.long_break_after = 4
|
50
|
+
config.day_start = Timepoint.new('9:13')
|
51
|
+
config.lunch_time = Timepoint.new('12:49')
|
52
|
+
config.lunch_duration = 120
|
53
|
+
config.day_end = Timepoint.new('15:00')
|
54
|
+
|
55
|
+
Config.expects(:get_server_configuration).returns config
|
56
|
+
|
57
|
+
@schedule = Schedule.new
|
58
|
+
@schedule.generate!
|
59
|
+
@times = @schedule.to_hash
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'respect lunch' do
|
63
|
+
assert_equal :lunch, @times["12:49"]
|
64
|
+
assert_equal :start, @times["14:49"]
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'respect home' do
|
68
|
+
assert_equal :go_home, @times["15:00"]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#action_after' do
|
73
|
+
it 'returns the next action after a given timestamp' do
|
74
|
+
times = {
|
75
|
+
"08:30" => :start,
|
76
|
+
"09:15" => :stop,
|
77
|
+
"10:15" => :start,
|
78
|
+
}
|
79
|
+
|
80
|
+
@schedule = Schedule.new
|
81
|
+
@schedule.instance_variable_set(:@times, times)
|
82
|
+
|
83
|
+
@schedule.action_after("08:30").must_equal ['09:15', :stop]
|
84
|
+
@schedule.action_after("08:45").must_equal ['09:15', :stop]
|
85
|
+
@schedule.action_after("09:31").must_equal ['10:15', :start]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#current_action' do
|
90
|
+
it 'returns the current or past action on a given timestamp' do
|
91
|
+
times = {
|
92
|
+
"08:30" => :start,
|
93
|
+
"09:15" => :stop,
|
94
|
+
"10:15" => :start,
|
95
|
+
}
|
96
|
+
|
97
|
+
@schedule = Schedule.new
|
98
|
+
@schedule.instance_variable_set(:@times, times)
|
99
|
+
|
100
|
+
@schedule.current_action("08:30").must_equal ['08:30', :start]
|
101
|
+
@schedule.current_action("08:31").must_equal ['08:30', :start]
|
102
|
+
@schedule.current_action("09:18").must_equal ['09:15', :stop]
|
103
|
+
@schedule.current_action("12:18").must_equal ['10:15', :start]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
@@ -5,19 +5,16 @@ module Domodoro
|
|
5
5
|
include EM::MiniTest::Spec
|
6
6
|
|
7
7
|
before do
|
8
|
+
File.stubs(:exist?).returns(false)
|
8
9
|
@channel = Channel.new
|
9
|
-
|
10
|
-
|
11
|
-
it 'initializes with a channel' do
|
12
|
-
server = Domodoro::Server.new(nil, @channel)
|
13
|
-
assert_equal @channel, server.channel
|
10
|
+
@schedule = Schedule.new
|
11
|
+
@schedule.generate!
|
14
12
|
end
|
15
13
|
|
16
14
|
it 'repeats every message broadcasted to the channel' do
|
17
|
-
|
18
|
-
EM.start_server('127.0.0.1', 8888, Server, :app => server)
|
15
|
+
EM.start_server('127.0.0.1', 8888, Server, @channel, @schedule)
|
19
16
|
|
20
|
-
|
17
|
+
Server.any_instance.expects(:send_data).with(":start\n")
|
21
18
|
|
22
19
|
@channel << :start
|
23
20
|
end
|
@@ -25,7 +22,8 @@ module Domodoro
|
|
25
22
|
describe '.start' do
|
26
23
|
it 'opens a server with a new channel' do
|
27
24
|
Channel.expects(:new).returns @channel
|
28
|
-
|
25
|
+
Schedule.expects(:new).returns @schedule
|
26
|
+
EM.expects(:start_server).with('0.0.0.0', '8888', Server, @channel, @schedule)
|
29
27
|
|
30
28
|
Server.start('0.0.0.0', '8888')
|
31
29
|
end
|
@@ -61,5 +59,37 @@ module Domodoro
|
|
61
59
|
end
|
62
60
|
end
|
63
61
|
|
62
|
+
describe 'on connection' do
|
63
|
+
it 'sends the current and next actions to the client', :timeout => 0.3 do
|
64
|
+
Server.stubs(:timestamp).returns "13:15"
|
65
|
+
|
66
|
+
EM.start_server('127.0.0.1', 8888, Server, @channel, @schedule)
|
67
|
+
|
68
|
+
FakeSocketClient = Class.new(EM::Connection) do
|
69
|
+
include EM::P::ObjectProtocol
|
70
|
+
@object = nil
|
71
|
+
def self.object=(obj)
|
72
|
+
@object = obj
|
73
|
+
end
|
74
|
+
def receive_object(object)
|
75
|
+
self.class.object = object
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
EM.connect('127.0.0.1', 8888, FakeSocketClient)
|
80
|
+
|
81
|
+
EM.add_timer(0.25) do
|
82
|
+
object = FakeSocketClient.class_eval "@object"
|
83
|
+
|
84
|
+
assert_equal ["13:00", :lunch], object[:current_action]
|
85
|
+
assert_equal ["13:30", :start], object[:next_action]
|
86
|
+
|
87
|
+
done!
|
88
|
+
end
|
89
|
+
|
90
|
+
wait!
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
64
94
|
end
|
65
95
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Domodoro
|
4
|
+
describe Timepoint do
|
5
|
+
before do
|
6
|
+
@timepoint = Timepoint.new("08:30")
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'initializes with an hour/minute timestamp' do
|
10
|
+
assert_equal 8, @timepoint.hour
|
11
|
+
assert_equal 30, @timepoint.min
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'initializes with hours and minutes as fixnums' do
|
15
|
+
timepoint = Timepoint.new(8, 30)
|
16
|
+
assert_equal 8, timepoint.hour
|
17
|
+
assert_equal 30, timepoint.min
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#to_s' do
|
21
|
+
it 'returns the original timestamp' do
|
22
|
+
assert_equal "08:30", @timepoint.to_s
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '+' do
|
27
|
+
describe 'when the added minutes belong to the next hour' do
|
28
|
+
it 'adds time appropriately returning a new timepoint' do
|
29
|
+
new_timepoint = @timepoint + 45
|
30
|
+
|
31
|
+
assert_equal 9, new_timepoint.hour
|
32
|
+
assert_equal 15, new_timepoint.min
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'within the same hour' do
|
37
|
+
it 'works the same way' do
|
38
|
+
new_timepoint = @timepoint + 15
|
39
|
+
|
40
|
+
assert_equal 8, new_timepoint.hour
|
41
|
+
assert_equal 45, new_timepoint.min
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#after?' do
|
47
|
+
before do
|
48
|
+
@timepoint = Timepoint.new(8, 30)
|
49
|
+
end
|
50
|
+
it 'tells if the timepoint is after another timepoint' do
|
51
|
+
Timepoint.new(8, 45).after?(@timepoint).must_equal true
|
52
|
+
Timepoint.new(9, 15).after?(@timepoint).must_equal true
|
53
|
+
Timepoint.new(8, 25).after?(@timepoint).must_equal false
|
54
|
+
Timepoint.new(7, 10).after?(@timepoint).must_equal false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#before?' do
|
59
|
+
before do
|
60
|
+
@timepoint = Timepoint.new(17, 30)
|
61
|
+
end
|
62
|
+
it 'tells if the timepoint is before another timepoint' do
|
63
|
+
Timepoint.new(17, 15).before?(@timepoint).must_equal true
|
64
|
+
Timepoint.new(13, 00).before?(@timepoint).must_equal true
|
65
|
+
Timepoint.new(17, 40).before?(@timepoint).must_equal false
|
66
|
+
Timepoint.new(19, 10).before?(@timepoint).must_equal false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#==' do
|
71
|
+
before do
|
72
|
+
@timepoint = Timepoint.new(8, 30)
|
73
|
+
end
|
74
|
+
it 'tells if the timepoint equals another timepoint' do
|
75
|
+
Timepoint.new(8, 30).must_equal @timepoint
|
76
|
+
Timepoint.new(8, 45).wont_equal @timepoint
|
77
|
+
Timepoint.new(8, 15).wont_equal @timepoint
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'tells if the timepoint equals another string' do
|
81
|
+
"08:30".must_equal @timepoint
|
82
|
+
"08:45".wont_equal @timepoint
|
83
|
+
"08:15".wont_equal @timepoint
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#left_until' do
|
88
|
+
it 'returns the time left until another timestamp' do
|
89
|
+
Time.stubs(:now).returns stub(:sec => 55)
|
90
|
+
@a = Timepoint.new(8, 30)
|
91
|
+
@b = Timepoint.new(9, 45)
|
92
|
+
@c = Timepoint.new(11, 10)
|
93
|
+
@d = Timepoint.new(8, 32)
|
94
|
+
@e = Timepoint.new(15, 01)
|
95
|
+
@f = Timepoint.new(8, 31)
|
96
|
+
|
97
|
+
assert_equal "01:14:04", @a.left_until(@b)
|
98
|
+
assert_equal "01:24:04", @b.left_until(@c)
|
99
|
+
assert_equal "00:01:04", @a.left_until(@d)
|
100
|
+
assert_equal "06:30:04", @a.left_until(@e)
|
101
|
+
assert_equal "00:00:04", @a.left_until(@f)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
metadata
CHANGED
@@ -1,139 +1,173 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: domodoro
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 1322991910812937300
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Josep M. Bach
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
17
|
+
|
18
|
+
date: 2011-08-30 00:00:00 +02:00
|
13
19
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
16
22
|
name: eventmachine
|
17
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
25
|
none: false
|
19
|
-
requirements:
|
20
|
-
- -
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 2002549777813010636
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
23
33
|
type: :runtime
|
24
|
-
|
25
|
-
|
26
|
-
- !ruby/object:Gem::Dependency
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
27
36
|
name: notify
|
28
|
-
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
29
39
|
none: false
|
30
|
-
requirements:
|
31
|
-
- -
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 2002549777813010636
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
34
47
|
type: :runtime
|
35
|
-
|
36
|
-
|
37
|
-
- !ruby/object:Gem::Dependency
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
38
50
|
name: minitest
|
39
|
-
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
53
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 2002549777813010636
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
45
61
|
type: :development
|
46
|
-
|
47
|
-
|
48
|
-
- !ruby/object:Gem::Dependency
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
49
64
|
name: mocha
|
50
|
-
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
51
67
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 2002549777813010636
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
56
75
|
type: :development
|
57
|
-
|
58
|
-
|
59
|
-
- !ruby/object:Gem::Dependency
|
76
|
+
version_requirements: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
60
78
|
name: purdytest
|
61
|
-
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
62
81
|
none: false
|
63
|
-
requirements:
|
64
|
-
- -
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 2002549777813010636
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
67
89
|
type: :development
|
68
|
-
|
69
|
-
version_requirements: *2155927240
|
90
|
+
version_requirements: *id005
|
70
91
|
description: Distributed Pomodoro for the masses
|
71
|
-
email:
|
92
|
+
email:
|
72
93
|
- josep.m.bach@gmail.com
|
73
|
-
executables:
|
94
|
+
executables:
|
74
95
|
- domodoro
|
75
96
|
extensions: []
|
97
|
+
|
76
98
|
extra_rdoc_files: []
|
77
|
-
|
99
|
+
|
100
|
+
files:
|
78
101
|
- .gitignore
|
79
102
|
- .travis.yml
|
80
103
|
- Gemfile
|
81
104
|
- Guardfile
|
82
105
|
- Rakefile
|
83
106
|
- Readme.md
|
84
|
-
- assets/
|
85
|
-
- assets/
|
107
|
+
- assets/break.wav
|
108
|
+
- assets/home.wav
|
109
|
+
- assets/lunch.wav
|
110
|
+
- assets/work.wav
|
86
111
|
- bin/domodoro
|
87
112
|
- domodoro.gemspec
|
88
113
|
- lib/domodoro.rb
|
89
114
|
- lib/domodoro/channel.rb
|
90
115
|
- lib/domodoro/client.rb
|
91
116
|
- lib/domodoro/config.rb
|
117
|
+
- lib/domodoro/schedule.rb
|
92
118
|
- lib/domodoro/server.rb
|
119
|
+
- lib/domodoro/timepoint.rb
|
93
120
|
- lib/domodoro/version.rb
|
94
121
|
- test/domodoro/channel_test.rb
|
95
122
|
- test/domodoro/client_test.rb
|
96
123
|
- test/domodoro/config_test.rb
|
124
|
+
- test/domodoro/schedule_test.rb
|
97
125
|
- test/domodoro/server_test.rb
|
126
|
+
- test/domodoro/timepoint_test.rb
|
98
127
|
- test/domodoro_test.rb
|
99
128
|
- test/support/em-minitest.rb
|
100
129
|
- test/test_helper.rb
|
101
130
|
has_rdoc: true
|
102
131
|
homepage: http://github.com/txus/domodoro
|
103
132
|
licenses: []
|
133
|
+
|
104
134
|
post_install_message:
|
105
135
|
rdoc_options: []
|
106
|
-
|
136
|
+
|
137
|
+
require_paths:
|
107
138
|
- lib
|
108
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
140
|
none: false
|
110
|
-
requirements:
|
111
|
-
- -
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
|
114
|
-
segments:
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
hash: 2002549777813010636
|
145
|
+
segments:
|
115
146
|
- 0
|
116
|
-
|
117
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
+
version: "0"
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
149
|
none: false
|
119
|
-
requirements:
|
120
|
-
- -
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
|
123
|
-
segments:
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
hash: 2002549777813010636
|
154
|
+
segments:
|
124
155
|
- 0
|
125
|
-
|
156
|
+
version: "0"
|
126
157
|
requirements: []
|
158
|
+
|
127
159
|
rubyforge_project: domodoro
|
128
|
-
rubygems_version: 1.
|
160
|
+
rubygems_version: 1.5.2
|
129
161
|
signing_key:
|
130
162
|
specification_version: 3
|
131
163
|
summary: Distributed Pomodoro for the masses
|
132
|
-
test_files:
|
164
|
+
test_files:
|
133
165
|
- test/domodoro/channel_test.rb
|
134
166
|
- test/domodoro/client_test.rb
|
135
167
|
- test/domodoro/config_test.rb
|
168
|
+
- test/domodoro/schedule_test.rb
|
136
169
|
- test/domodoro/server_test.rb
|
170
|
+
- test/domodoro/timepoint_test.rb
|
137
171
|
- test/domodoro_test.rb
|
138
172
|
- test/support/em-minitest.rb
|
139
173
|
- test/test_helper.rb
|