paradeiser 0.2.0 → 0.4.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Guardfile +1 -0
  4. data/README.md +98 -6
  5. data/TODO.md +22 -6
  6. data/VISION.md +171 -26
  7. data/bin/par +20 -4
  8. data/lib/paradeiser/controllers/breaks_controller.rb +0 -1
  9. data/lib/paradeiser/controllers/controller.rb +15 -1
  10. data/lib/paradeiser/controllers/paradeiser_controller.rb +23 -1
  11. data/lib/paradeiser/controllers/pomodori_controller.rb +23 -1
  12. data/lib/paradeiser/errors.rb +6 -0
  13. data/lib/paradeiser/executor.rb +1 -1
  14. data/lib/paradeiser/initializers/inflections.rb +3 -0
  15. data/lib/paradeiser/models/break.rb +1 -0
  16. data/lib/paradeiser/models/pomodoro.rb +13 -1
  17. data/lib/paradeiser/models/repository.rb +11 -1
  18. data/lib/paradeiser/models/scheduled.rb +7 -1
  19. data/lib/paradeiser/refinements/pluralize.rb +10 -0
  20. data/lib/paradeiser/router.rb +0 -2
  21. data/lib/paradeiser/version.rb +1 -1
  22. data/lib/paradeiser/view.rb +1 -1
  23. data/lib/paradeiser/views/breaks/finish.erb +1 -0
  24. data/lib/paradeiser/views/breaks/start.erb +1 -0
  25. data/lib/paradeiser/views/paradeiser/init.erb +1 -1
  26. data/lib/paradeiser/views/paradeiser/report.erb +10 -4
  27. data/lib/paradeiser/views/paradeiser/status.erb +2 -1
  28. data/lib/paradeiser/views/pomodori/annotate.erb +1 -0
  29. data/lib/paradeiser/views/pomodori/cancel.erb +1 -0
  30. data/lib/paradeiser/views/pomodori/interrupt.erb +1 -0
  31. data/lib/paradeiser/views/pomodori/log.erb +1 -0
  32. data/lib/paradeiser/views/pomodori/start.erb +1 -1
  33. data/paradeiser.gemspec +2 -0
  34. data/test/bin/notify-send +1 -0
  35. data/test/helper.rb +7 -24
  36. data/test/integration/test_annotate.rb +19 -0
  37. data/test/integration/test_finish.rb +9 -0
  38. data/test/integration/test_interrupt.rb +9 -0
  39. data/test/integration/test_log.rb +12 -0
  40. data/test/integration/test_no_args.rb +7 -0
  41. data/test/integration/test_start.rb +7 -0
  42. data/test/integration/test_status.rb +10 -0
  43. data/test/integration/test_unknown.rb +7 -0
  44. data/test/lib/at_mock.rb +1 -1
  45. data/test/lib/controller_test.rb +25 -0
  46. data/test/lib/integration_test.rb +45 -0
  47. data/test/lib/paradeiser_controller_test.rb +7 -0
  48. data/test/lib/view_test.rb +12 -0
  49. data/test/unit/test_break.rb +7 -44
  50. data/test/unit/test_break_view.rb +22 -0
  51. data/test/unit/test_breaks_controller.rb +66 -0
  52. data/test/unit/test_paradeiser_controller_export.rb +107 -0
  53. data/test/unit/test_paradeiser_controller_report.rb +73 -26
  54. data/test/unit/test_paradeiser_controller_status.rb +42 -24
  55. data/test/unit/test_paradeiser_view_init.rb +7 -0
  56. data/test/unit/test_paradeiser_view_report.rb +132 -0
  57. data/test/unit/test_paradeiser_view_status.rb +17 -0
  58. data/test/unit/test_pomodori_controller.rb +241 -33
  59. data/test/unit/test_pomodori_view.rb +26 -13
  60. data/test/unit/test_pomodoro.rb +23 -81
  61. data/test/unit/test_pomodoro_hooks.rb +12 -25
  62. data/test/unit/test_repository.rb +5 -21
  63. data/test/unit/test_scheduler.rb +1 -1
  64. metadata +61 -8
  65. data/test/integration/test_par.rb +0 -17
  66. data/test/unit/test_break_controller.rb +0 -56
  67. data/test/unit/test_paradeiser_view.rb +0 -66
@@ -1,28 +1,41 @@
1
1
  require 'helper'
2
2
 
3
- class TestPomodoriView < MiniTest::Test
3
+ class TestPomodoriView < ViewTest
4
4
  def setup
5
- @pom = Pomodoro.new
5
+ @pom = produce(Pomodoro)
6
6
  @pom.id = 1
7
7
  end
8
8
 
9
9
  def test_start
10
- out, err = render(:start)
11
- assert_match(/^Starting pomodoro #1\.$/m, out)
12
- assert_empty(err)
10
+ assert_match(/^Started pomodoro #1\.$/m, render(:start))
13
11
  end
14
12
 
15
13
  def test_finish
16
- start!
17
- out, err = render(:finish)
18
- assert_match(/^Finished pomodoro #1 after .* minutes\.$/m, out)
14
+ assert_match(/^Finished pomodoro #1 after .* minutes\.$/m, render(:finish))
19
15
  end
20
16
 
21
- private
17
+ def test_cancel
18
+ cancel!
19
+ assert_match(/^Canceled pomodoro #1 after .* minutes\.$/m, render(:cancel))
20
+ end
21
+
22
+ def test_interrupt_internal
23
+ @interrupt_type = 'internally'
24
+ assert_match(/^Marked pomodoro #1 as internally interrupted\.$/m, render(:interrupt))
25
+ end
26
+
27
+ def test_interrupt_external
28
+ @interrupt_type = 'externally'
29
+ assert_match(/^Marked pomodoro #1 as externally interrupted\.$/m, render(:interrupt))
30
+ end
31
+
32
+ def test_annotate
33
+ assert_match(/^Successfully annotated pomodoro #1\.$/m, render(:annotate))
34
+ end
35
+
36
+ protected
22
37
 
23
- def render(method)
24
- capture_io do
25
- View.new('Pomodori', method).render(binding)
26
- end
38
+ def model
39
+ 'Pomodoro'
27
40
  end
28
41
  end
@@ -2,27 +2,10 @@ require 'helper'
2
2
 
3
3
  class TestPomodoro < MiniTest::Test
4
4
  def setup
5
- @pom = Pomodoro.new
6
- end
7
-
8
- def test_virgin
9
- assert_equal(:idle, @pom.status_name)
10
- refute(@pom.started_at)
11
- refute(@pom.canceled_at)
12
- refute(@pom.finished_at)
13
- end
14
-
15
- def test_finish_idle
16
- assert_raises StateMachine::InvalidTransition do
17
- finish!
18
- end
19
- refute(@pom.started_at)
20
- refute(@pom.canceled_at)
21
- refute(@pom.finished_at)
5
+ @pom = produce(Pomodoro)
22
6
  end
23
7
 
24
8
  def test_finish_active
25
- start!
26
9
  assert_equal(:active, @pom.status_name)
27
10
 
28
11
  now = srand
@@ -37,7 +20,6 @@ class TestPomodoro < MiniTest::Test
37
20
  end
38
21
 
39
22
  def test_finish_finished
40
- start!
41
23
  finish!
42
24
  assert_raises StateMachine::InvalidTransition do
43
25
  finish!
@@ -46,7 +28,6 @@ class TestPomodoro < MiniTest::Test
46
28
  end
47
29
 
48
30
  def test_finish_canceled
49
- start!
50
31
  cancel!
51
32
  assert_raises StateMachine::InvalidTransition do
52
33
  finish!
@@ -58,77 +39,46 @@ class TestPomodoro < MiniTest::Test
58
39
  assert_equal(25 * 60, @pom.length)
59
40
  end
60
41
 
61
- def test_duration_idle
62
- assert_equal(0, @pom.duration)
63
- end
64
-
65
42
  def test_duration_started
66
- now = srand
67
-
68
- Time.stub :now, Time.at(now) do
69
- start!
70
- end
71
-
72
- later = now + rand(42)
43
+ later = @started + rand(42)
73
44
 
74
45
  Time.stub :now, Time.at(later) do
75
- assert_equal(later - now, @pom.duration)
46
+ assert_equal(later - @started, @pom.duration)
76
47
  end
77
48
  end
78
49
 
79
50
  def test_duration_finished
80
- now = srand
81
-
82
- Time.stub :now, Time.at(now) do
83
- start!
84
- end
85
-
86
- later = now + rand(42)
51
+ later = @started + rand(42)
87
52
 
88
53
  Time.stub :now, Time.at(later) do
89
54
  finish!
90
55
  end
91
56
 
92
- assert_equal(later - now, @pom.duration)
57
+ assert_equal(later - @started, @pom.duration)
93
58
  end
94
59
 
95
60
  def test_duration_canceled
96
- now = srand
97
-
98
- Time.stub :now, Time.at(now) do
99
- start!
100
- end
101
-
102
- later = now + rand(42)
61
+ later = @started + rand(42)
103
62
 
104
63
  Time.stub :now, Time.at(later) do
105
64
  cancel!
106
65
  end
107
66
 
108
- assert_equal(later - now, @pom.duration)
67
+ assert_equal(later - @started, @pom.duration)
109
68
  end
110
69
 
111
70
  def test_start
112
- now = srand
113
-
114
- Time.stub :now, Time.at(now) do
115
- start!
116
- end
117
-
118
71
  assert_equal(:active, @pom.status_name)
119
- assert_equal(now, @pom.started_at.to_i)
72
+ assert_equal(@started, @pom.started_at.to_i)
120
73
  end
121
74
 
122
75
  def test_remaining_active
123
- now = srand
124
-
125
- Time.stub :now, Time.at(now) do
126
- start!
76
+ Time.stub :now, Time.at(@started) do
127
77
  assert_equal(Pomodoro::MINUTES_25 * 60, @pom.remaining)
128
78
  end
129
79
 
130
80
  delta = 600
131
- later = now + delta
81
+ later = @started + delta
132
82
 
133
83
  Time.stub :now, Time.at(later) do
134
84
  assert_equal(Pomodoro::MINUTES_25 * 60 - delta, @pom.remaining)
@@ -136,7 +86,6 @@ class TestPomodoro < MiniTest::Test
136
86
  end
137
87
 
138
88
  def test_interrupt
139
- start!
140
89
  assert_equal(0, @pom.interrupts.size)
141
90
 
142
91
  now = srand
@@ -153,7 +102,6 @@ class TestPomodoro < MiniTest::Test
153
102
  end
154
103
 
155
104
  def test_interrupt_internal
156
- start!
157
105
  interrupt!(:internal)
158
106
  assert_equal(1, @pom.interrupts.size)
159
107
  int = @pom.interrupts.first
@@ -161,7 +109,6 @@ class TestPomodoro < MiniTest::Test
161
109
  end
162
110
 
163
111
  def test_interrupt_external
164
- start!
165
112
  interrupt!(:external)
166
113
  assert_equal(1, @pom.interrupts.size)
167
114
  int = @pom.interrupts.first
@@ -169,20 +116,12 @@ class TestPomodoro < MiniTest::Test
169
116
  end
170
117
 
171
118
  def test_interrupt_unknown
172
- start!
173
119
  assert_raises InvalidTypeError do
174
120
  interrupt!(:unknown)
175
121
  end
176
122
  end
177
123
 
178
- def test_interrupt_idle
179
- assert_raises StateMachine::InvalidTransition do
180
- interrupt!
181
- end
182
- end
183
-
184
124
  def test_interrupt_finished
185
- start!
186
125
  finish!
187
126
  assert_raises StateMachine::InvalidTransition do
188
127
  interrupt!
@@ -190,23 +129,13 @@ class TestPomodoro < MiniTest::Test
190
129
  end
191
130
 
192
131
  def test_interrupt_canceled
193
- start!
194
132
  cancel!
195
133
  assert_raises StateMachine::InvalidTransition do
196
134
  interrupt!
197
135
  end
198
136
  end
199
137
 
200
- def test_cancel_idle
201
- assert_raises StateMachine::InvalidTransition do
202
- cancel!
203
- end
204
- refute(@pom.finished_at)
205
- refute(@pom.canceled_at)
206
- end
207
-
208
138
  def test_cancel_active
209
- start!
210
139
  assert_equal(:active, @pom.status_name)
211
140
 
212
141
  now = srand
@@ -219,4 +148,17 @@ class TestPomodoro < MiniTest::Test
219
148
  assert_equal(now, @pom.canceled_at.to_i)
220
149
  refute(@pom.finished_at)
221
150
  end
151
+
152
+ def test_annotate_active
153
+ annotations = @pom.annotations
154
+ assert(annotations)
155
+ assert_empty(annotations)
156
+
157
+ text = 'foobar something'
158
+ @pom.annotate(text)
159
+
160
+ assert_equal(:active, @pom.status_name)
161
+ refute_empty(@pom.annotations)
162
+ assert_equal(text, @pom.annotations.first)
163
+ end
222
164
  end
@@ -16,20 +16,18 @@ class TestPomodoroHooks < MiniTest::Test
16
16
 
17
17
  def test_before_start_pomodoro_success
18
18
  hook_name = 'before-start-pomodoro'
19
- pom = Pomodoro.new
20
19
  token_file = create_hook('Pomodoro', hook_name)
21
20
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
22
- pom.start
21
+ pom = produce(Pomodoro)
23
22
  assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
24
23
  assert_equal(:active, pom.status_name)
25
- assert_equal("Pomodoro #{Repository.next_id} #{pom.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
24
+ assert_match(/Pomodoro \d \d{1,2}:\d{1,2}/ , File.read(token_file).chomp)
26
25
  end
27
26
 
28
27
  def test_before_finish_pomodoro_success
29
28
  hook_name = 'before-finish-pomodoro'
30
- pom = Pomodoro.new
29
+ pom = produce(Pomodoro)
31
30
  pom.id = SecureRandom.random_number(1000)
32
- pom.start
33
31
  token_file = create_hook('Pomodoro', hook_name)
34
32
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
35
33
  pom.finish
@@ -40,9 +38,8 @@ class TestPomodoroHooks < MiniTest::Test
40
38
 
41
39
  def test_before_finish_pomodoro_error
42
40
  hook_name = 'before-finish-pomodoro'
43
- pom = Pomodoro.new
41
+ pom = produce(Pomodoro)
44
42
  pom.id = SecureRandom.random_number(1000)
45
- pom.start
46
43
  token_file = create_hook('Pomodoro', hook_name, false)
47
44
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
48
45
 
@@ -58,7 +55,6 @@ class TestPomodoroHooks < MiniTest::Test
58
55
  hook_name = 'before-finish-break'
59
56
  br3ak = Break.new
60
57
  br3ak.id = SecureRandom.random_number(1000)
61
- br3ak.start
62
58
  token_file = create_hook('Break', hook_name)
63
59
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
64
60
  br3ak.finish
@@ -71,7 +67,6 @@ class TestPomodoroHooks < MiniTest::Test
71
67
  hook_name = 'before-finish-break'
72
68
  br3ak = Break.new
73
69
  br3ak.id = SecureRandom.random_number(1000)
74
- br3ak.start
75
70
  token_file = create_hook('Break', hook_name, false)
76
71
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
77
72
 
@@ -85,8 +80,7 @@ class TestPomodoroHooks < MiniTest::Test
85
80
 
86
81
  def test_before_interrupt_success
87
82
  hook_name = 'before-interrupt-pomodoro'
88
- pom = Pomodoro.new
89
- pom.start
83
+ pom = produce(Pomodoro)
90
84
  token_file = create_hook('Pomodoro', hook_name)
91
85
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
92
86
  pom.interrupt
@@ -97,8 +91,7 @@ class TestPomodoroHooks < MiniTest::Test
97
91
 
98
92
  def test_before_interrupt_error
99
93
  hook_name = 'before-interrupt-pomodoro'
100
- pom = Pomodoro.new
101
- pom.start
94
+ pom = produce(Pomodoro)
102
95
  token_file = create_hook('Pomodoro', hook_name, false)
103
96
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
104
97
 
@@ -112,8 +105,7 @@ class TestPomodoroHooks < MiniTest::Test
112
105
 
113
106
  def test_after_interrupt_success
114
107
  hook_name = 'after-interrupt-pomodoro'
115
- pom = Pomodoro.new
116
- pom.start
108
+ pom = produce(Pomodoro)
117
109
  token_file = create_hook('Pomodoro', hook_name, false)
118
110
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
119
111
 
@@ -127,8 +119,7 @@ class TestPomodoroHooks < MiniTest::Test
127
119
 
128
120
  def test_after_interrupt_error
129
121
  hook_name = 'after-interrupt-pomodoro'
130
- pom = Pomodoro.new
131
- pom.start
122
+ pom = produce(Pomodoro)
132
123
  token_file = create_hook('Pomodoro', hook_name)
133
124
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
134
125
  pom.interrupt
@@ -139,8 +130,7 @@ class TestPomodoroHooks < MiniTest::Test
139
130
 
140
131
  def test_before_cancel_success
141
132
  hook_name = 'before-cancel-pomodoro'
142
- pom = Pomodoro.new
143
- pom.start
133
+ pom = produce(Pomodoro)
144
134
  token_file = create_hook('Pomodoro', hook_name)
145
135
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
146
136
  pom.cancel
@@ -151,8 +141,7 @@ class TestPomodoroHooks < MiniTest::Test
151
141
 
152
142
  def test_before_cancel_error
153
143
  hook_name = 'before-cancel-pomodoro'
154
- pom = Pomodoro.new
155
- pom.start
144
+ pom = produce(Pomodoro)
156
145
  token_file = create_hook('Pomodoro', hook_name, false)
157
146
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
158
147
 
@@ -166,8 +155,7 @@ class TestPomodoroHooks < MiniTest::Test
166
155
 
167
156
  def test_after_cancel_success
168
157
  hook_name = 'after-cancel-pomodoro'
169
- pom = Pomodoro.new
170
- pom.start
158
+ pom = produce(Pomodoro)
171
159
  token_file = create_hook('Pomodoro', hook_name, false)
172
160
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
173
161
 
@@ -181,8 +169,7 @@ class TestPomodoroHooks < MiniTest::Test
181
169
 
182
170
  def test_after_cancel_error
183
171
  hook_name = 'after-cancel-pomodoro'
184
- pom = Pomodoro.new
185
- pom.start
172
+ pom = produce(Pomodoro)
186
173
  token_file = create_hook('Pomodoro', hook_name)
187
174
  refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
188
175
  pom.cancel
@@ -5,19 +5,8 @@ class TestRepository < MiniTest::Test
5
5
  @backend = PStoreMock.new
6
6
  end
7
7
 
8
- def test_save_idle
9
- pom = Pomodoro.new
10
-
11
- assert_raises IllegalStatusError do
12
- invoke(:save, pom)
13
- end
14
-
15
- assert_equal(0, @backend.size)
16
- end
17
-
18
8
  def test_save_active
19
- pom = Pomodoro.new
20
- start!(pom)
9
+ pom = produce(Pomodoro)
21
10
 
22
11
  invoke(:save, pom)
23
12
 
@@ -25,11 +14,8 @@ class TestRepository < MiniTest::Test
25
14
  end
26
15
 
27
16
  def test_save_second_active
28
- pom1 = Pomodoro.new
29
- start!(pom1)
30
-
31
- pom2 = Pomodoro.new
32
- start!(pom2)
17
+ pom1 = produce(Pomodoro)
18
+ pom2 = produce(Pomodoro)
33
19
 
34
20
  invoke(:save, pom1)
35
21
 
@@ -41,8 +27,7 @@ class TestRepository < MiniTest::Test
41
27
  end
42
28
 
43
29
  def test_save_finished
44
- pom = Pomodoro.new
45
- start!(pom)
30
+ pom = produce(Pomodoro)
46
31
  finish!(pom)
47
32
 
48
33
  invoke(:save, pom)
@@ -51,8 +36,7 @@ class TestRepository < MiniTest::Test
51
36
  end
52
37
 
53
38
  def test_save_active_finish_save
54
- pom = Pomodoro.new
55
- start!(pom)
39
+ pom = produce(Pomodoro)
56
40
 
57
41
  invoke(:save, pom)
58
42
  finish!(pom)
@@ -4,7 +4,7 @@ class TestScheduler < MiniTest::Test
4
4
  def setup
5
5
  if Scheduler.list.any?
6
6
  @do_not_clear = true
7
- raise "The at queue 't' is not empty. Clean it up before running this test again."
7
+ raise "The at queue '#{queue}' is not empty. Clean it up before running this test again."
8
8
  end
9
9
  end
10
10