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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Guardfile +16 -11
  4. data/README.md +1 -1
  5. data/Rakefile +1 -1
  6. data/TODO.md +12 -1
  7. data/bin/par +5 -2
  8. data/lib/paradeiser.rb +22 -2
  9. data/lib/paradeiser/controllers/controller.rb +1 -0
  10. data/lib/paradeiser/controllers/paradeiser_controller.rb +0 -1
  11. data/lib/paradeiser/models/hook.rb +4 -0
  12. data/lib/paradeiser/models/repository.rb +1 -1
  13. data/lib/paradeiser/models/scheduled.rb +4 -0
  14. data/lib/paradeiser/version.rb +1 -1
  15. data/paradeiser.gemspec +1 -6
  16. data/templates/linux/hooks/after-finish-break +2 -0
  17. data/templates/linux/hooks/after-finish-pomodoro +2 -0
  18. data/templates/linux/hooks/after-start-break +2 -0
  19. data/templates/linux/hooks/after-start-pomodoro +2 -0
  20. data/templates/mac/hooks/after-finish-break +2 -0
  21. data/templates/mac/hooks/after-finish-pomodoro +2 -0
  22. data/templates/mac/hooks/after-start-break +2 -0
  23. data/templates/mac/hooks/after-start-pomodoro +2 -0
  24. data/test/helper.rb +14 -36
  25. data/test/integration/test_annotate.rb +15 -13
  26. data/test/integration/test_finish.rb +7 -5
  27. data/test/integration/test_interrupt.rb +7 -5
  28. data/test/integration/test_log.rb +9 -7
  29. data/test/integration/test_no_args.rb +5 -3
  30. data/test/integration/test_start.rb +5 -3
  31. data/test/integration/test_status.rb +8 -6
  32. data/test/integration/test_unknown.rb +5 -3
  33. data/test/lib/controller_test.rb +4 -2
  34. data/test/lib/integration_test.rb +8 -2
  35. data/test/lib/paradeiser_controller_test.rb +7 -1
  36. data/test/lib/token_file_registry.rb +19 -0
  37. data/test/lib/unit_test.rb +47 -0
  38. data/test/lib/view_test.rb +13 -8
  39. data/test/scripts/create-failing-hooks +17 -0
  40. data/test/scripts/fail +5 -0
  41. data/test/unit/test_break.rb +43 -40
  42. data/test/unit/test_break_view.rb +17 -14
  43. data/test/unit/test_breaks_controller.rb +55 -52
  44. data/test/unit/test_interrupt.rb +27 -24
  45. data/test/unit/test_paradeiser_controller_export.rb +103 -100
  46. data/test/unit/test_paradeiser_controller_init.rb +2 -2
  47. data/test/unit/test_paradeiser_controller_report.rb +72 -69
  48. data/test/unit/test_paradeiser_controller_status.rb +78 -75
  49. data/test/unit/test_paradeiser_view_init.rb +5 -3
  50. data/test/unit/test_paradeiser_view_report.rb +116 -114
  51. data/test/unit/test_paradeiser_view_status.rb +14 -11
  52. data/test/unit/test_pomodori_controller.rb +319 -316
  53. data/test/unit/test_pomodori_view.rb +40 -37
  54. data/test/unit/test_pomodoro.rb +116 -113
  55. data/test/unit/test_pomodoro_hooks.rb +172 -170
  56. data/test/unit/test_repository.rb +98 -95
  57. data/test/unit/test_scheduler.rb +39 -30
  58. data/test/unit/test_token_file_registry.rb +40 -0
  59. metadata +59 -49
@@ -1,7 +1,9 @@
1
1
  require 'helper'
2
2
 
3
- class TestStartCommand < Paradeiser::IntegrationTest
4
- def test_start
5
- assert_command('start')
3
+ module ParadeiserTest
4
+ class TestStartCommand < IntegrationTest
5
+ def test_start
6
+ assert_command('start')
7
+ end
6
8
  end
7
9
  end
@@ -1,10 +1,12 @@
1
1
  require 'helper'
2
2
 
3
- class TestStatusCommand < Paradeiser::IntegrationTest
4
- def test_status
5
- assert_command('status', 255) # not initialized
6
- assert_command('start')
7
- out = assert_command('status')
8
- refute_empty(out, "Expected 'status' to produce an non-empty output")
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
@@ -1,7 +1,9 @@
1
1
  require 'helper'
2
2
 
3
- class TestUnknownCommand < Paradeiser::IntegrationTest
4
- def test_unknown
5
- refute_command('unknown')
3
+ module ParadeiserTest
4
+ class TestUnknownCommand < IntegrationTest
5
+ def test_unknown
6
+ refute_command('unknown')
7
+ end
6
8
  end
7
9
  end
@@ -1,5 +1,7 @@
1
- module Paradeiser
2
- class ControllerTest < MiniTest::Test
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 Paradeiser
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
@@ -1,4 +1,10 @@
1
- module Paradeiser
1
+ require 'helper'
2
+
3
+ module ParadeiserTest
4
+ # Not sure why Gurd seems to require this here ...
5
+ class ControllerTest < UnitTest
6
+ end
7
+
2
8
  class ParadeiserControllerTest < ControllerTest
3
9
  def model
4
10
  'paradeiser'
@@ -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
@@ -1,12 +1,17 @@
1
- class ViewTest < MiniTest::Test
2
- def render(method)
3
- View.new(model.pluralize, method).render(binding)
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
- def model
10
- 'Paradeiser'
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
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+ echo Tests must not execute the "$(basename "${BASH_SOURCE[0]}")" hook from "$DIR". >&2
5
+ false
@@ -1,62 +1,65 @@
1
1
  require 'helper'
2
2
 
3
- class TestBreak < MiniTest::Test
4
- def setup
5
- @break = produce(Break)
6
- end
3
+ module ParadeiserTest
4
+ class TestBreak < UnitTest
5
+ def setup
6
+ super
7
+ @break = produce(Break)
8
+ end
7
9
 
8
- def test_new
9
- assert_equal(:active, @break.status_name)
10
- end
10
+ def test_new
11
+ assert_equal(:active, @break.status_name)
12
+ end
11
13
 
12
- def test_finish_break
13
- assert_equal(:active, @break.status_name)
14
+ def test_finish_break
15
+ assert_equal(:active, @break.status_name)
14
16
 
15
- now = srand
17
+ now = srand
16
18
 
17
- Time.stub :now, Time.at(now) do
18
- finish!
19
- end
19
+ Time.stub :now, Time.at(now) do
20
+ finish!
21
+ end
20
22
 
21
- assert_equal(:finished, @break.status_name)
22
- assert_equal(now, @break.finished_at.to_i)
23
- end
23
+ assert_equal(:finished, @break.status_name)
24
+ assert_equal(now, @break.finished_at.to_i)
25
+ end
24
26
 
25
- def test_length
26
- assert_equal(5 * 60, @break.length)
27
- end
27
+ def test_length
28
+ assert_equal(5 * 60, @break.length)
29
+ end
28
30
 
29
- def test_duration
30
- later = @started + rand(42)
31
+ def test_duration
32
+ later = @started + rand(42)
31
33
 
32
- Time.stub :now, Time.at(later) do
33
- assert_equal(later - @started, @break.duration)
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
- def test_duration_finished
38
- later = @started + rand(42)
39
+ def test_duration_finished
40
+ later = @started + rand(42)
39
41
 
40
- Time.stub :now, Time.at(later) do
41
- finish!
42
- end
42
+ Time.stub :now, Time.at(later) do
43
+ finish!
44
+ end
43
45
 
44
- assert_equal(later - @started, @break.duration)
45
- end
46
+ assert_equal(later - @started, @break.duration)
47
+ end
46
48
 
47
- def test_finish_break
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
- def test_remaining
55
- delta = 120
56
- later = @started + delta
56
+ def test_remaining
57
+ delta = 120
58
+ later = @started + delta
57
59
 
58
- Time.stub :now, Time.at(later) do
59
- assert_equal(@break.length - delta, @break.remaining)
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
- class TestBreakView < ViewTest
4
- def setup
5
- @break = produce(Break)
6
- @break.id = 1
7
- end
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
- def test_start
10
- assert_match(/^Started a new break \(5 minutes\)\.$/m, render(:start))
11
- end
11
+ def test_start
12
+ assert_match(/^Started a new break \(5 minutes\)\.$/m, render(:start))
13
+ end
12
14
 
13
- def test_finish
14
- assert_match(/^Finished break #1 after .* minutes\.$/m, render(:finish))
15
- end
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
- def model
20
- 'Break'
21
+ def model
22
+ 'Break'
23
+ end
21
24
  end
22
25
  end
@@ -1,66 +1,69 @@
1
1
  require 'helper'
2
2
 
3
- class TestBreaksController < ControllerTest
4
- def setup
5
- @backend = PStoreMock.new
6
- end
7
-
8
- def model
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
- def test_break
13
- attrs = invoke(:start, nil, nil, '@break', 'exitstatus', 'has_output')
14
- assert_equal(:active, attrs[:break].status_name)
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
- def test_break_verbose
22
- attrs = invoke(:start, nil, OpenStruct.new(:verbose => true), '@break', 'exitstatus', 'has_output')
23
- assert_equal(:active, attrs[:break].status_name)
24
- assert_equal(false, attrs[:has_output])
25
- refute_empty(attrs[:stdout])
26
- assert_empty(attrs[:stderr])
27
- assert_equal(1, @backend.size)
28
- end
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
- def test_break_active
31
- invoke(:start)
32
- assert_equal(1, @backend.size)
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
- assert_raises SingletonError do
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
- def test_finish
41
- invoke(:start)
42
- attrs = invoke(:finish, nil, nil, '@break', 'exitstatus', 'has_output')
43
- assert_equal(:finished, attrs[:break].status_name)
44
- assert_equal(false, attrs[:has_output])
45
- assert_empty(attrs[:stdout])
46
- assert_empty(attrs[:stderr])
47
- assert_equal(1, @backend.size)
48
- end
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
- def test_finish_verbose
51
- invoke(:start)
52
- attrs = invoke(:finish, nil, OpenStruct.new(:verbose => true), '@break', 'exitstatus', 'has_output')
53
- assert_equal(:finished, attrs[:break].status_name)
54
- assert_equal(false, attrs[:has_output])
55
- refute_empty(attrs[:stdout])
56
- assert_empty(attrs[:stderr])
57
- assert_equal(1, @backend.size)
58
- end
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
- def test_finish_idle
61
- assert_raises NotActiveError do
62
- invoke(:finish)
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