paradeiser 0.1.0 → 0.2.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 (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