paradeiser 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/README.md +96 -35
  4. data/TODO.md +14 -15
  5. data/VISION.md +92 -84
  6. data/bin/{pom → par} +32 -2
  7. data/doc/Paradeiser::Break_status.svg +50 -0
  8. data/doc/Paradeiser::Pomodoro_status.svg +40 -22
  9. data/lib/paradeiser.rb +3 -3
  10. data/lib/paradeiser/controllers/breaks_controller.rb +19 -0
  11. data/lib/paradeiser/controllers/controller.rb +3 -3
  12. data/lib/paradeiser/controllers/paradeiser_controller.rb +13 -2
  13. data/lib/paradeiser/controllers/pomodori_controller.rb +36 -17
  14. data/lib/paradeiser/errors.rb +12 -6
  15. data/lib/paradeiser/executor.rb +2 -0
  16. data/lib/paradeiser/initializers/inflections.rb +4 -0
  17. data/lib/paradeiser/models/break.rb +40 -0
  18. data/lib/paradeiser/models/hook.rb +4 -4
  19. data/lib/paradeiser/models/interrupt.rb +18 -0
  20. data/lib/paradeiser/models/job.rb +1 -1
  21. data/lib/paradeiser/models/pomodoro.rb +30 -22
  22. data/lib/paradeiser/models/repository.rb +26 -13
  23. data/lib/paradeiser/models/scheduled.rb +25 -0
  24. data/lib/paradeiser/models/scheduler.rb +1 -1
  25. data/lib/paradeiser/models/status.rb +21 -0
  26. data/lib/paradeiser/{refinements.rb → refinements/numeric.rb} +4 -0
  27. data/lib/paradeiser/router.rb +12 -7
  28. data/lib/paradeiser/version.rb +1 -1
  29. data/lib/paradeiser/views/paradeiser/init.erb +1 -1
  30. data/lib/paradeiser/views/paradeiser/report.erb +5 -0
  31. data/lib/paradeiser/views/paradeiser/status.erb +13 -0
  32. data/paradeiser.gemspec +2 -0
  33. data/templates/linux/hooks/after-finish-break +10 -0
  34. data/templates/linux/hooks/after-finish-pomodoro +10 -0
  35. data/templates/linux/hooks/after-start-break +7 -0
  36. data/templates/linux/hooks/after-start-pomodoro +7 -0
  37. data/templates/mac/hooks/after-finish-break +10 -0
  38. data/templates/mac/hooks/after-finish-pomodoro +10 -0
  39. data/templates/mac/hooks/after-start-break +7 -0
  40. data/templates/mac/hooks/after-start-pomodoro +7 -0
  41. data/test/helper.rb +37 -4
  42. data/test/integration/{test_pom.rb → test_par.rb} +4 -4
  43. data/test/lib/{pomodoro_mock.rb → schedulable_mock.rb} +9 -1
  44. data/test/unit/test_break.rb +99 -0
  45. data/test/unit/test_break_controller.rb +56 -0
  46. data/test/unit/test_interrupt.rb +36 -0
  47. data/test/unit/test_paradeiser_controller_init.rb +92 -0
  48. data/test/unit/test_paradeiser_controller_report.rb +44 -0
  49. data/test/unit/test_paradeiser_controller_status.rb +70 -0
  50. data/test/unit/test_paradeiser_view.rb +66 -0
  51. data/test/unit/test_pomodori_controller.rb +87 -31
  52. data/test/unit/test_pomodori_view.rb +0 -50
  53. data/test/unit/test_pomodoro.rb +131 -9
  54. data/test/unit/test_pomodoro_hooks.rb +165 -17
  55. data/test/unit/test_repository.rb +38 -15
  56. data/test/unit/test_router.rb +4 -4
  57. data/test/unit/test_status.rb +26 -0
  58. metadata +70 -17
  59. data/lib/paradeiser/views/pomodori/report.erb +0 -5
  60. data/lib/paradeiser/views/pomodori/status.erb +0 -9
  61. data/templates/linux/hooks/after-finish +0 -10
  62. data/templates/linux/hooks/after-start +0 -7
  63. data/templates/mac/hooks/after-finish +0 -10
  64. data/templates/mac/hooks/after-start +0 -7
  65. data/test/unit/test_paradeiser_controller.rb +0 -88
@@ -71,12 +71,35 @@ class TestRepository < MiniTest::Test
71
71
  end
72
72
 
73
73
  def test_any
74
+ refute(invoke(:any?){|p| p.length > 2})
75
+ @backend[:foo] = SchedulableMock.new(:length => 1)
76
+ @backend[:bar] = SchedulableMock.new(:length => 2)
77
+ @backend[:baz] = SchedulableMock.new(:length => 3)
78
+ assert(invoke(:any?){|p| p.length > 2})
79
+ end
80
+
81
+ def test_last_finished
82
+ @backend[:foo] = SchedulableMock.new(:finished => false)
83
+ @backend[:bar] = SchedulableMock.new(:finished => true)
84
+ @backend[:baz] = SchedulableMock.new(:finished => false)
85
+
86
+ last_finished = invoke(:last_finished)
87
+ assert(last_finished)
88
+ end
89
+
90
+ def test_last_canceled
91
+ @backend[:foo] = SchedulableMock.new(:canceled => false)
92
+ @backend[:bar] = SchedulableMock.new(:canceled => true)
93
+ @backend[:baz] = SchedulableMock.new(:canceled => false)
94
+
95
+ last_canceled = invoke(:last_canceled)
96
+ assert(last_canceled)
74
97
  end
75
98
 
76
99
  def test_find
77
- @backend[:foo] = PomodoroMock.new(:length => 3)
78
- @backend[:bar] = PomodoroMock.new(:length => 3)
79
- @backend[:baz] = PomodoroMock.new(:length => 2)
100
+ @backend[:foo] = SchedulableMock.new(:length => 3)
101
+ @backend[:bar] = SchedulableMock.new(:length => 3)
102
+ @backend[:baz] = SchedulableMock.new(:length => 2)
80
103
  assert_equal(3, @backend.size)
81
104
 
82
105
  all = invoke(:find){|pom| pom.length == 3}
@@ -85,35 +108,35 @@ class TestRepository < MiniTest::Test
85
108
  end
86
109
 
87
110
  def test_active
88
- @backend[:foo] = PomodoroMock.new(:active => false)
89
- @backend[:bar] = PomodoroMock.new(:active => true)
90
- @backend[:baz] = PomodoroMock.new(:active => false)
111
+ @backend[:foo] = SchedulableMock.new(:active => false)
112
+ @backend[:bar] = SchedulableMock.new(:active => true)
113
+ @backend[:baz] = SchedulableMock.new(:active => false)
91
114
 
92
115
  active = invoke(:active)
93
116
  assert_equal(@backend[:bar], active)
94
117
  end
95
118
 
96
119
  def test_active_true
97
- @backend[:foo] = PomodoroMock.new(:active => false)
98
- @backend[:bar] = PomodoroMock.new(:active => true)
99
- @backend[:baz] = PomodoroMock.new(:active => false)
120
+ @backend[:foo] = SchedulableMock.new(:active => false)
121
+ @backend[:bar] = SchedulableMock.new(:active => true)
122
+ @backend[:baz] = SchedulableMock.new(:active => false)
100
123
 
101
124
  assert(invoke(:active?))
102
125
  end
103
126
 
104
127
  def test_active_false
105
- @backend[:foo] = PomodoroMock.new(:active => false)
106
- @backend[:bar] = PomodoroMock.new(:active => false)
107
- @backend[:baz] = PomodoroMock.new(:active => false)
128
+ @backend[:foo] = SchedulableMock.new(:active => false)
129
+ @backend[:bar] = SchedulableMock.new(:active => false)
130
+ @backend[:baz] = SchedulableMock.new(:active => false)
108
131
 
109
132
  refute(invoke(:active?))
110
133
  end
111
134
 
112
135
  def test_corrupted_repo
113
- @backend[:foo] = PomodoroMock.new(:active => true)
114
- @backend[:bar] = PomodoroMock.new(:active => true)
136
+ @backend[:foo] = SchedulableMock.new(:active => true)
137
+ @backend[:bar] = SchedulableMock.new(:active => true)
115
138
 
116
- assert_raises SingletonError do
139
+ assert_raises RuntimeError do
117
140
  invoke(:active?)
118
141
  end
119
142
  end
@@ -14,12 +14,12 @@ class TestRouter < MiniTest::Test
14
14
  end
15
15
 
16
16
  def test_init
17
- refute(Dir.exists?(Paradeiser.pom_dir), "Expect #{Paradeiser.pom_dir} to not exist yet")
17
+ refute(Dir.exists?(Paradeiser.par_dir), "Expect #{Paradeiser.par_dir} to not exist yet")
18
18
 
19
- block = Router.new.dispatch(CommandMock.new(:init))
19
+ block = Router.new.dispatch(CommandMock.new('init'))
20
20
  refute_nil(block)
21
21
 
22
- refute(Dir.exists?(Paradeiser.pom_dir), "Expect #{Paradeiser.pom_dir} to not exist yet")
22
+ refute(Dir.exists?(Paradeiser.par_dir), "Expect #{Paradeiser.par_dir} to not exist yet")
23
23
 
24
24
  # fake the view
25
25
  dirname = File.join(File.dirname(__FILE__), '..', '..', 'lib', 'paradeiser', 'views', 'paradeiser')
@@ -30,7 +30,7 @@ class TestRouter < MiniTest::Test
30
30
  begin
31
31
  block.call(nil, OptionsMock.new(:trace => true, :verbose => false))
32
32
  ensure
33
- FileUtils.rm_r(Paradeiser.pom_dir, :force => true)
33
+ FileUtils.rm_r(Paradeiser.par_dir, :force => true)
34
34
  end
35
35
  end
36
36
  end
@@ -0,0 +1,26 @@
1
+ require 'helper'
2
+ require 'ostruct'
3
+
4
+ class TestStatus < MiniTest::Test
5
+ def test_pomodoro_active
6
+ assert_equal(0, Status.of(thing('pomodoro', 'active')).to_i)
7
+ end
8
+
9
+ def test_pomodoro_finished
10
+ assert_equal(1, Status.of(thing('pomodoro', 'finished')).to_i)
11
+ end
12
+
13
+ def test_break_active
14
+ assert_equal(2, Status.of(thing('break', 'active')).to_i)
15
+ end
16
+
17
+ def test_break_finished
18
+ assert_equal(3, Status.of(thing('break', 'finished')).to_i)
19
+ end
20
+
21
+ private
22
+
23
+ def thing(name, status)
24
+ OpenStruct.new(:name => name, :status => status)
25
+ end
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paradeiser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas E. Rabenau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-09 00:00:00.000000000 Z
11
+ date: 2013-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: actionpack
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: guard-minitest
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -212,7 +240,7 @@ description: Paradeiser is a command-line tool for the Pomodoro Technique. It ke
212
240
  email:
213
241
  - nerab@gmx.net
214
242
  executables:
215
- - pom
243
+ - par
216
244
  extensions: []
217
245
  extra_rdoc_files: []
218
246
  files:
@@ -226,43 +254,60 @@ files:
226
254
  - Rakefile
227
255
  - TODO.md
228
256
  - VISION.md
229
- - bin/pom
257
+ - bin/par
258
+ - doc/Paradeiser::Break_status.svg
230
259
  - doc/Paradeiser::Pomodoro_status.svg
231
260
  - lib/paradeiser.rb
261
+ - lib/paradeiser/controllers/breaks_controller.rb
232
262
  - lib/paradeiser/controllers/controller.rb
233
263
  - lib/paradeiser/controllers/paradeiser_controller.rb
234
264
  - lib/paradeiser/controllers/pomodori_controller.rb
235
265
  - lib/paradeiser/errors.rb
236
266
  - lib/paradeiser/executor.rb
267
+ - lib/paradeiser/initializers/inflections.rb
268
+ - lib/paradeiser/models/break.rb
237
269
  - lib/paradeiser/models/hook.rb
270
+ - lib/paradeiser/models/interrupt.rb
238
271
  - lib/paradeiser/models/job.rb
239
272
  - lib/paradeiser/models/pomodoro.rb
240
273
  - lib/paradeiser/models/repository.rb
274
+ - lib/paradeiser/models/scheduled.rb
241
275
  - lib/paradeiser/models/scheduler.rb
242
- - lib/paradeiser/refinements.rb
276
+ - lib/paradeiser/models/status.rb
277
+ - lib/paradeiser/refinements/numeric.rb
243
278
  - lib/paradeiser/router.rb
244
279
  - lib/paradeiser/version.rb
245
280
  - lib/paradeiser/view.rb
246
281
  - lib/paradeiser/views/paradeiser/init.erb
282
+ - lib/paradeiser/views/paradeiser/report.erb
283
+ - lib/paradeiser/views/paradeiser/status.erb
247
284
  - lib/paradeiser/views/pomodori/finish.erb
248
- - lib/paradeiser/views/pomodori/report.erb
249
285
  - lib/paradeiser/views/pomodori/start.erb
250
- - lib/paradeiser/views/pomodori/status.erb
251
286
  - paradeiser.gemspec
252
- - templates/linux/hooks/after-finish
253
- - templates/linux/hooks/after-start
254
- - templates/mac/hooks/after-finish
255
- - templates/mac/hooks/after-start
287
+ - templates/linux/hooks/after-finish-break
288
+ - templates/linux/hooks/after-finish-pomodoro
289
+ - templates/linux/hooks/after-start-break
290
+ - templates/linux/hooks/after-start-pomodoro
291
+ - templates/mac/hooks/after-finish-break
292
+ - templates/mac/hooks/after-finish-pomodoro
293
+ - templates/mac/hooks/after-start-break
294
+ - templates/mac/hooks/after-start-pomodoro
256
295
  - test/helper.rb
257
- - test/integration/test_pom.rb
296
+ - test/integration/test_par.rb
258
297
  - test/lib/assertions.rb
259
298
  - test/lib/at_mock.rb
260
299
  - test/lib/options_mock.rb
261
- - test/lib/pomodoro_mock.rb
262
300
  - test/lib/process_status_mock.rb
263
301
  - test/lib/pstore_mock.rb
302
+ - test/lib/schedulable_mock.rb
264
303
  - test/templates/hooks/pre-finish
265
- - test/unit/test_paradeiser_controller.rb
304
+ - test/unit/test_break.rb
305
+ - test/unit/test_break_controller.rb
306
+ - test/unit/test_interrupt.rb
307
+ - test/unit/test_paradeiser_controller_init.rb
308
+ - test/unit/test_paradeiser_controller_report.rb
309
+ - test/unit/test_paradeiser_controller_status.rb
310
+ - test/unit/test_paradeiser_view.rb
266
311
  - test/unit/test_pomodori_controller.rb
267
312
  - test/unit/test_pomodori_view.rb
268
313
  - test/unit/test_pomodoro.rb
@@ -270,6 +315,7 @@ files:
270
315
  - test/unit/test_repository.rb
271
316
  - test/unit/test_router.rb
272
317
  - test/unit/test_scheduler.rb
318
+ - test/unit/test_status.rb
273
319
  homepage: https://github.com/nerab/paradeiser
274
320
  licenses:
275
321
  - MIT
@@ -296,15 +342,21 @@ specification_version: 4
296
342
  summary: Command-line tool for the Pomodoro Technique
297
343
  test_files:
298
344
  - test/helper.rb
299
- - test/integration/test_pom.rb
345
+ - test/integration/test_par.rb
300
346
  - test/lib/assertions.rb
301
347
  - test/lib/at_mock.rb
302
348
  - test/lib/options_mock.rb
303
- - test/lib/pomodoro_mock.rb
304
349
  - test/lib/process_status_mock.rb
305
350
  - test/lib/pstore_mock.rb
351
+ - test/lib/schedulable_mock.rb
306
352
  - test/templates/hooks/pre-finish
307
- - test/unit/test_paradeiser_controller.rb
353
+ - test/unit/test_break.rb
354
+ - test/unit/test_break_controller.rb
355
+ - test/unit/test_interrupt.rb
356
+ - test/unit/test_paradeiser_controller_init.rb
357
+ - test/unit/test_paradeiser_controller_report.rb
358
+ - test/unit/test_paradeiser_controller_status.rb
359
+ - test/unit/test_paradeiser_view.rb
308
360
  - test/unit/test_pomodori_controller.rb
309
361
  - test/unit/test_pomodori_view.rb
310
362
  - test/unit/test_pomodoro.rb
@@ -312,3 +364,4 @@ test_files:
312
364
  - test/unit/test_repository.rb
313
365
  - test/unit/test_router.rb
314
366
  - test/unit/test_scheduler.rb
367
+ - test/unit/test_status.rb
@@ -1,5 +0,0 @@
1
- ID | Status | Started | Ended
2
- <% @pom.each do |pom| %>
3
- <%= pom.id %> | <%= pom.status %> | <%= pom.started_at.strftime('%R') %> | <%= pom.finished_at.strftime('%R') if pom.finished? %>
4
-
5
- <% end %>
@@ -1,9 +0,0 @@
1
- <% case @pom.status_name
2
- when :active
3
- %>Pomodoro #<%= @pom.id %> is active for another <%= @pom.remaining.minutes %> minutes (started at <%= @pom.started_at.strftime('%R') %>).<%
4
- when :finished
5
- %>No active pomodoro. Last one was finished at <%= @pom.finished_at.strftime('%R') %>.<%
6
- else
7
- %>Current state is <%= @pom.status %>.<%
8
- end
9
- %>
@@ -1,10 +0,0 @@
1
- #!/bin/sh
2
-
3
- #
4
- # Sample post-finish hook for Paradeiser (called when a pomodoro ended). It
5
- # displays a simple notification.
6
- #
7
- # $POM_ID - the ID of the pomodoro that just ended
8
- # $POM_STARTED_AT - the time when the pomodoro was started
9
- #
10
- notify-send "Pomodoro" "The Pomodoro $POM_ID (started at $POM_STARTED_AT) is over." -u critical > /dev/null
@@ -1,7 +0,0 @@
1
- #!/bin/sh
2
-
3
- #
4
- # Sample post-finish hook for Paradeiser (called after a pomodoro started). It
5
- # displays a simple notification.
6
- #
7
- notify-send "Pomodoro" "A new Pomodoro started." -u critical > /dev/null
@@ -1,10 +0,0 @@
1
- #!/bin/sh
2
-
3
- #
4
- # Sample post-finish hook for Paradeiser (called when a pomodoro ended). It
5
- # displays a simple notification.
6
- #
7
- # $POM_ID - the ID of the pomodoro that just ended
8
- # $POM_STARTED_AT - the time when the pomodoro was started
9
- #
10
- terminal-notifier-success -message "The Pomodoro $POM_ID (started at $POM_STARTED_AT) is over." > /dev/null
@@ -1,7 +0,0 @@
1
- #!/bin/sh
2
-
3
- #
4
- # Sample post-finish hook for Paradeiser (called after a pomodoro started). It
5
- # displays a simple notification.
6
- #
7
- terminal-notifier-success -message "A new Pomodoro started." > /dev/null
@@ -1,88 +0,0 @@
1
- require 'helper'
2
- require 'fakefs/safe'
3
-
4
- class TestParadeiserController < MiniTest::Test
5
- HOOKS = ['after-finish', 'before-finish']
6
-
7
- def setup
8
- @orig_pom_dir = ENV['POM_DIR']
9
- FakeFS.activate!
10
- create_hook_templates
11
- end
12
-
13
- def teardown
14
- FileUtils.rm_r(Paradeiser.pom_dir, :force => true) if Dir.exists?(Paradeiser.pom_dir)
15
- FakeFS.deactivate!
16
- ENV['POM_DIR'] = @orig_pom_dir
17
- end
18
-
19
- def test_init_virgin
20
- ENV.delete('POM_DIR')
21
- refute(Dir.exists?(Paradeiser.pom_dir), "Expect #{Paradeiser.pom_dir} to not exist yet")
22
-
23
- ParadeiserController.new(:init).call(nil, nil)
24
- assert(Dir.exists?(Paradeiser.pom_dir))
25
- assert_hooks_exist
26
- end
27
-
28
- def test_init_existing
29
- FileUtils.mkdir_p(Paradeiser.pom_dir, 0700)
30
- assert(Dir.exists?(Paradeiser.pom_dir))
31
-
32
- ParadeiserController.new(:init).call(nil, nil)
33
- assert(Dir.exists?(Paradeiser.pom_dir))
34
- assert_hooks_exist
35
- end
36
-
37
- def test_init_virgin_with_env_override
38
- dir = tempdir_name
39
- refute_equal(dir, Paradeiser.pom_dir)
40
- ENV['POM_DIR'] = dir
41
- assert_equal(dir, Paradeiser.pom_dir)
42
- refute(Dir.exists?(Paradeiser.pom_dir), "POM_DIR override #{Paradeiser.pom_dir} must not exist")
43
-
44
- ParadeiserController.new(:init).call(nil, nil)
45
-
46
- assert(Dir.exists?(Paradeiser.pom_dir))
47
- assert_hooks_exist
48
- end
49
-
50
- def test_init_existing_with_env_override
51
- ENV.delete('POM_DIR')
52
-
53
- Dir.mktmpdir do |dir|
54
- refute_equal(dir, Paradeiser.pom_dir)
55
- ENV['POM_DIR'] = dir
56
- assert_equal(dir, Paradeiser.pom_dir)
57
- assert(Dir.exists?(Paradeiser.pom_dir), "POM_DIR override #{Paradeiser.pom_dir} must exist")
58
-
59
- ParadeiserController.new(:init).call(nil, nil)
60
- assert(Dir.exists?(Paradeiser.pom_dir), "POM_DIR override #{Paradeiser.pom_dir} must exist")
61
- assert_hooks_exist
62
- end
63
- end
64
-
65
- private
66
-
67
- # Makes a temporary directory name, but does not create the directory
68
- def tempdir_name
69
- dir = File.join(Dir.tmpdir, SecureRandom.uuid)
70
- refute(Dir.exists?(dir))
71
- dir
72
- end
73
-
74
- def create_hook_templates
75
- hook_templates_dir = File.join(Paradeiser.templates_dir, Paradeiser.os.to_s, 'hooks')
76
- FileUtils.mkdir_p(hook_templates_dir)
77
-
78
- HOOKS.each do |hook|
79
- FileUtils.touch(File.join(hook_templates_dir, hook))
80
- end
81
- end
82
-
83
- def assert_hooks_exist
84
- HOOKS.each do |hook|
85
- assert(File.exist?(File.join(Paradeiser.hooks_dir, hook)))
86
- end
87
- end
88
- end