paradeiser 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Guardfile +16 -11
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/TODO.md +12 -1
- data/bin/par +5 -2
- data/lib/paradeiser.rb +22 -2
- data/lib/paradeiser/controllers/controller.rb +1 -0
- data/lib/paradeiser/controllers/paradeiser_controller.rb +0 -1
- data/lib/paradeiser/models/hook.rb +4 -0
- data/lib/paradeiser/models/repository.rb +1 -1
- data/lib/paradeiser/models/scheduled.rb +4 -0
- data/lib/paradeiser/version.rb +1 -1
- data/paradeiser.gemspec +1 -6
- data/templates/linux/hooks/after-finish-break +2 -0
- data/templates/linux/hooks/after-finish-pomodoro +2 -0
- data/templates/linux/hooks/after-start-break +2 -0
- data/templates/linux/hooks/after-start-pomodoro +2 -0
- data/templates/mac/hooks/after-finish-break +2 -0
- data/templates/mac/hooks/after-finish-pomodoro +2 -0
- data/templates/mac/hooks/after-start-break +2 -0
- data/templates/mac/hooks/after-start-pomodoro +2 -0
- data/test/helper.rb +14 -36
- data/test/integration/test_annotate.rb +15 -13
- data/test/integration/test_finish.rb +7 -5
- data/test/integration/test_interrupt.rb +7 -5
- data/test/integration/test_log.rb +9 -7
- data/test/integration/test_no_args.rb +5 -3
- data/test/integration/test_start.rb +5 -3
- data/test/integration/test_status.rb +8 -6
- data/test/integration/test_unknown.rb +5 -3
- data/test/lib/controller_test.rb +4 -2
- data/test/lib/integration_test.rb +8 -2
- data/test/lib/paradeiser_controller_test.rb +7 -1
- data/test/lib/token_file_registry.rb +19 -0
- data/test/lib/unit_test.rb +47 -0
- data/test/lib/view_test.rb +13 -8
- data/test/scripts/create-failing-hooks +17 -0
- data/test/scripts/fail +5 -0
- data/test/unit/test_break.rb +43 -40
- data/test/unit/test_break_view.rb +17 -14
- data/test/unit/test_breaks_controller.rb +55 -52
- data/test/unit/test_interrupt.rb +27 -24
- data/test/unit/test_paradeiser_controller_export.rb +103 -100
- data/test/unit/test_paradeiser_controller_init.rb +2 -2
- data/test/unit/test_paradeiser_controller_report.rb +72 -69
- data/test/unit/test_paradeiser_controller_status.rb +78 -75
- data/test/unit/test_paradeiser_view_init.rb +5 -3
- data/test/unit/test_paradeiser_view_report.rb +116 -114
- data/test/unit/test_paradeiser_view_status.rb +14 -11
- data/test/unit/test_pomodori_controller.rb +319 -316
- data/test/unit/test_pomodori_view.rb +40 -37
- data/test/unit/test_pomodoro.rb +116 -113
- data/test/unit/test_pomodoro_hooks.rb +172 -170
- data/test/unit/test_repository.rb +98 -95
- data/test/unit/test_scheduler.rb +39 -30
- data/test/unit/test_token_file_registry.rb +40 -0
- metadata +59 -49
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module ParadeiserTest
|
4
|
+
class TestStatusCommand < IntegrationTest
|
5
|
+
def test_status
|
6
|
+
assert_command('status', 255) # not initialized
|
7
|
+
assert_command('start')
|
8
|
+
out = assert_command('status')
|
9
|
+
refute_empty(out, "Expected 'status' to produce an non-empty output")
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
data/test/lib/controller_test.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
module ParadeiserTest
|
4
|
+
class ControllerTest < UnitTest
|
3
5
|
def invoke(method, args = nil, options = nil, *attributes)
|
4
6
|
controller = Paradeiser.const_get("#{model.pluralize.capitalize}Controller".to_sym).new(method)
|
5
7
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'helper'
|
2
|
+
require 'shellwords'
|
2
3
|
|
3
|
-
module
|
4
|
+
module ParadeiserTest
|
4
5
|
#
|
5
6
|
# We put all integration tests into separate files so we only run one at a
|
6
7
|
# time after a change. These tests are expensive to run.
|
@@ -9,6 +10,11 @@ module Paradeiser
|
|
9
10
|
PAR = 'bin/par'
|
10
11
|
include Executor
|
11
12
|
|
13
|
+
def initialize(*args)
|
14
|
+
super(*args)
|
15
|
+
@do_not_clear = nil
|
16
|
+
end
|
17
|
+
|
12
18
|
def setup
|
13
19
|
if Scheduler.list.any?
|
14
20
|
@do_not_clear = true
|
@@ -16,7 +22,7 @@ module Paradeiser
|
|
16
22
|
end
|
17
23
|
|
18
24
|
@orig_PAR_DIR = ENV['PAR_DIR']
|
19
|
-
ENV['PAR_DIR'] = Dir.mktmpdir
|
25
|
+
ENV['PAR_DIR'] = Dir.mktmpdir(name)
|
20
26
|
ENV['PAR_AT_QUEUE'] = 'i'
|
21
27
|
assert_command('init')
|
22
28
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
|
3
|
+
module ParadeiserTest
|
4
|
+
class TokenFileRegistry
|
5
|
+
def initialize
|
6
|
+
@token_files = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
token_file = File.join(Dir.tmpdir, SecureRandom.uuid)
|
11
|
+
@token_files << token_file
|
12
|
+
token_file
|
13
|
+
end
|
14
|
+
|
15
|
+
def cleanup
|
16
|
+
@token_files.each{|tf| FileUtils.rm(tf) if File.exist?(tf)}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
|
3
|
+
module ParadeiserTest
|
4
|
+
class UnitTest < MiniTest::Test
|
5
|
+
def setup
|
6
|
+
# Cannot use fakefs because hooks will not execute under it, but as part of
|
7
|
+
# the real FS. Instead, we set the $PAR_DIR to point to a temp directory
|
8
|
+
@orig_PAR_DIR = ENV['PAR_DIR']
|
9
|
+
ENV['PAR_DIR'] = Dir.mktmpdir(name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
FileUtils.rm_rf(ENV['PAR_DIR'])
|
14
|
+
ENV['PAR_DIR'] = @orig_PAR_DIR
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def produce(clazz)
|
20
|
+
@started = srand
|
21
|
+
|
22
|
+
Time.stub :now, Time.at(@started) do
|
23
|
+
Scheduler.stub(:add, nil) do
|
24
|
+
clazz.new
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def interrupt!(type = :internal, pom = @pom)
|
30
|
+
Scheduler.stub(:clear, nil) do
|
31
|
+
pom.interrupt!(type)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def finish!(thing = @pom || @break)
|
36
|
+
Scheduler.stub(:clear, nil) do
|
37
|
+
thing.finish!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def cancel!(pom = @pom)
|
42
|
+
Scheduler.stub(:clear, nil) do
|
43
|
+
pom.cancel!
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/test/lib/view_test.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
module ParadeiserTest
|
4
|
+
class ViewTest < UnitTest
|
5
|
+
def render(method)
|
6
|
+
View.new(model.pluralize, method).render(binding)
|
7
|
+
end
|
4
8
|
end
|
5
|
-
end
|
6
9
|
|
7
|
-
class ParadeiserViewTest < ViewTest
|
8
|
-
protected
|
9
|
-
|
10
|
-
|
10
|
+
class ParadeiserViewTest < ViewTest
|
11
|
+
protected
|
12
|
+
|
13
|
+
def model
|
14
|
+
'Paradeiser'
|
15
|
+
end
|
11
16
|
end
|
12
17
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
hooks=(
|
4
|
+
"after-finish-break"
|
5
|
+
"after-finish-pomodoro"
|
6
|
+
"after-start-break"
|
7
|
+
"after-start-pomodoro"
|
8
|
+
"before-finish-break"
|
9
|
+
"before-finish-pomodoro"
|
10
|
+
"before-start-break"
|
11
|
+
"before-start-pomodoro")
|
12
|
+
|
13
|
+
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
14
|
+
|
15
|
+
for hook in ${hooks[*]}; do
|
16
|
+
ln -s "$DIR/fail" "$HOME/.paradeiser/hooks/$hook"
|
17
|
+
done
|
data/test/scripts/fail
ADDED
data/test/unit/test_break.rb
CHANGED
@@ -1,62 +1,65 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module ParadeiserTest
|
4
|
+
class TestBreak < UnitTest
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@break = produce(Break)
|
8
|
+
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
10
|
+
def test_new
|
11
|
+
assert_equal(:active, @break.status_name)
|
12
|
+
end
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
+
def test_finish_break
|
15
|
+
assert_equal(:active, @break.status_name)
|
14
16
|
|
15
|
-
|
17
|
+
now = srand
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
Time.stub :now, Time.at(now) do
|
20
|
+
finish!
|
21
|
+
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
assert_equal(:finished, @break.status_name)
|
24
|
+
assert_equal(now, @break.finished_at.to_i)
|
25
|
+
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
def test_length
|
28
|
+
assert_equal(5 * 60, @break.length)
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
+
def test_duration
|
32
|
+
later = @started + rand(42)
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
+
Time.stub :now, Time.at(later) do
|
35
|
+
assert_equal(later - @started, @break.duration)
|
36
|
+
end
|
34
37
|
end
|
35
|
-
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
+
def test_duration_finished
|
40
|
+
later = @started + rand(42)
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
Time.stub :now, Time.at(later) do
|
43
|
+
finish!
|
44
|
+
end
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
+
assert_equal(later - @started, @break.duration)
|
47
|
+
end
|
46
48
|
|
47
|
-
|
48
|
-
finish!
|
49
|
-
assert_raises StateMachine::InvalidTransition do
|
49
|
+
def test_finish_break
|
50
50
|
finish!
|
51
|
+
assert_raises StateMachine::InvalidTransition do
|
52
|
+
finish!
|
53
|
+
end
|
51
54
|
end
|
52
|
-
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
56
|
+
def test_remaining
|
57
|
+
delta = 120
|
58
|
+
later = @started + delta
|
57
59
|
|
58
|
-
|
59
|
-
|
60
|
+
Time.stub :now, Time.at(later) do
|
61
|
+
assert_equal(@break.length - delta, @break.remaining)
|
62
|
+
end
|
60
63
|
end
|
61
64
|
end
|
62
65
|
end
|
@@ -1,22 +1,25 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module ParadeiserTest
|
4
|
+
class TestBreakView < ViewTest
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@break = produce(Break)
|
8
|
+
@break.id = 1
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
def test_start
|
12
|
+
assert_match(/^Started a new break \(5 minutes\)\.$/m, render(:start))
|
13
|
+
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
def test_finish
|
16
|
+
assert_match(/^Finished break #1 after .* minutes\.$/m, render(:finish))
|
17
|
+
end
|
16
18
|
|
17
|
-
protected
|
19
|
+
protected
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
+
def model
|
22
|
+
'Break'
|
23
|
+
end
|
21
24
|
end
|
22
25
|
end
|
@@ -1,66 +1,69 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
'break'
|
10
|
-
end
|
3
|
+
module ParadeiserTest
|
4
|
+
class TestBreaksController < ControllerTest
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@backend = PStoreMock.new
|
8
|
+
end
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
assert_equal(false, attrs[:has_output])
|
16
|
-
assert_empty(attrs[:stdout])
|
17
|
-
assert_empty(attrs[:stderr])
|
18
|
-
assert_equal(1, @backend.size)
|
19
|
-
end
|
10
|
+
def model
|
11
|
+
'break'
|
12
|
+
end
|
20
13
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
14
|
+
def test_break
|
15
|
+
attrs = invoke(:start, nil, nil, '@break', 'exitstatus', 'has_output')
|
16
|
+
assert_equal(:active, attrs[:break].status_name)
|
17
|
+
assert_equal(false, attrs[:has_output])
|
18
|
+
assert_empty(attrs[:stdout])
|
19
|
+
assert_empty(attrs[:stderr])
|
20
|
+
assert_equal(1, @backend.size)
|
21
|
+
end
|
29
22
|
|
30
|
-
|
31
|
-
|
32
|
-
|
23
|
+
def test_break_verbose
|
24
|
+
attrs = invoke(:start, nil, OpenStruct.new(:verbose => true), '@break', 'exitstatus', 'has_output')
|
25
|
+
assert_equal(:active, attrs[:break].status_name)
|
26
|
+
assert_equal(false, attrs[:has_output])
|
27
|
+
refute_empty(attrs[:stdout])
|
28
|
+
assert_empty(attrs[:stderr])
|
29
|
+
assert_equal(1, @backend.size)
|
30
|
+
end
|
33
31
|
|
34
|
-
|
32
|
+
def test_break_active
|
35
33
|
invoke(:start)
|
34
|
+
assert_equal(1, @backend.size)
|
35
|
+
|
36
|
+
assert_raises SingletonError do
|
37
|
+
invoke(:start)
|
38
|
+
end
|
39
|
+
assert_equal(1, @backend.size)
|
36
40
|
end
|
37
|
-
assert_equal(1, @backend.size)
|
38
|
-
end
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
def test_finish
|
43
|
+
invoke(:start)
|
44
|
+
attrs = invoke(:finish, nil, nil, '@break', 'exitstatus', 'has_output')
|
45
|
+
assert_equal(:finished, attrs[:break].status_name)
|
46
|
+
assert_equal(false, attrs[:has_output])
|
47
|
+
assert_empty(attrs[:stdout])
|
48
|
+
assert_empty(attrs[:stderr])
|
49
|
+
assert_equal(1, @backend.size)
|
50
|
+
end
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
52
|
+
def test_finish_verbose
|
53
|
+
invoke(:start)
|
54
|
+
attrs = invoke(:finish, nil, OpenStruct.new(:verbose => true), '@break', 'exitstatus', 'has_output')
|
55
|
+
assert_equal(:finished, attrs[:break].status_name)
|
56
|
+
assert_equal(false, attrs[:has_output])
|
57
|
+
refute_empty(attrs[:stdout])
|
58
|
+
assert_empty(attrs[:stderr])
|
59
|
+
assert_equal(1, @backend.size)
|
60
|
+
end
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
|
62
|
+
def test_finish_idle
|
63
|
+
assert_raises NotActiveError do
|
64
|
+
invoke(:finish)
|
65
|
+
end
|
66
|
+
assert_equal(0, @backend.size)
|
63
67
|
end
|
64
|
-
assert_equal(0, @backend.size)
|
65
68
|
end
|
66
69
|
end
|