riot_notifier 0.0.6 → 0.0.7

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.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@ doc
2
2
  pkg
3
3
  coverage
4
4
  tags
5
+ *.gemspec
data/README.rdoc CHANGED
@@ -1,6 +1,7 @@
1
1
  = Notifier for testing framework riot.
2
2
 
3
- Notifies you about passes, errors, failures via $HOME/bin/notify_redgreen
3
+ Notifies you about passes, errors, failures via custom notify libraries
4
+ like libnotify.
4
5
 
5
6
  == Usage
6
7
 
@@ -9,42 +10,50 @@ Notifies you about passes, errors, failures via $HOME/bin/notify_redgreen
9
10
  require 'riot'
10
11
  require 'riot_notifier'
11
12
 
12
- # Using notify-send (see below for wrapper script)
13
- Riot.reporter = RiotNotifier::RedgreenNotifier
13
+ # Auto-detect in load order
14
+ Riot.reporter = RiotNotifier
14
15
 
15
- # Using libnotify gem (ruby bindings using ffi)
16
- # gem install libnotify
17
- Riot.reporter = RiotNotifier::Libnotify
16
+ === Advanced usage
17
+
18
+ require 'riot'
19
+ require 'riot_notifier'
20
+
21
+ # Auto-detect in specified order notifier defined in RiotNotifier
22
+ Riot.reporter = RiotNotifier.try(:Libnotify, :RedgreenBinary)
23
+ Riot.reporter = RiotNotifier[:Libnotify, :RedgreenBinary] # sugar
18
24
 
19
- == notify_redgreen
25
+ # Use specific notifier class (libnotify)
26
+ Riot.reporter = RiotNotifier::Libnotify
20
27
 
21
- Your $HOME/bin/notify_redgreen
28
+ # Use my own notifier
29
+ class MyOwn < ::RiotNotifier::Base
30
+ # override .notify and #usable?
31
+ end
22
32
 
23
- #!/bin/sh
33
+ Riot.reporter = RiotNotifier[MyOwn] # try only this
34
+ Riot.reporter = RiotNotifier # try MyOwn first (auto-detection)
24
35
 
25
- case "$1" in
26
- red)
27
- OPTIONS="-t 2500 -u critical -i /usr/share/icons/gnome/scalable/emotes/face-angry.svg :-("
28
- ;;
29
- green)
30
- OPTIONS="-t 2000 -u normal -i /usr/share/icons/gnome/scalable/emblems/emblem-default.svg :-)"
31
- ;;
32
- esac
33
- shift
36
+ # Use my own inline
37
+ Riot.reporter = Class.new(RiotNotifier::Base) do
38
+ def notify(color, msg)
39
+ MyFancyNotifierGem.notify(:color => color, :message => msg)
40
+ end
34
41
 
35
- notify-send $OPTIONS "$*"
42
+ def self.usable?
43
+ require 'my_fancy_notifier_gem'
44
+ true
45
+ rescue LoadError
46
+ false
47
+ end
48
+ end
36
49
 
37
- == Install via gemcutter
50
+ == Installation
38
51
 
39
- gem install gemcutter
40
- gem tumble
41
52
  gem install riot_notifier
42
53
 
43
54
  == Authors
44
55
  * Peter Suschlik
45
56
 
46
57
  == TODO
47
- * talk to DBUS directly (ruby-dbus?) instead of `notify-send` binary
48
58
  * riot's assertions support blocks! (like asserts_topic.equals { topic }). Use it!
49
- * Test Libnotify somehow
50
- * Autodetect notify class
59
+ * Test auto-detection and Libnotify
data/Rakefile CHANGED
@@ -1,31 +1,34 @@
1
1
  require 'rake'
2
- require 'rake/testtask'
3
- require 'rake/rdoctask'
4
-
5
- desc 'Default: run unit tests.'
6
- task :default => :test
7
-
8
- require 'jeweler'
9
- Jeweler::Tasks.new do |gem|
10
- gem.name = "riot_notifier"
11
- gem.summary = 'Simple notifier for riot'
12
- gem.email = "peter-riot_notifier@suschlik.de"
13
- gem.homepage = "http://github.com/splattael/riot_notifier"
14
- gem.authors = ["Peter Suschlik"]
15
-
16
- gem.has_rdoc = true
17
- gem.extra_rdoc_files = [ "README.rdoc" ]
18
2
 
19
- gem.add_dependency "riot", ">= 0.10.4"
20
- gem.add_dependency "libnotify"
21
-
22
- gem.test_files = Dir.glob('test/test_*.rb')
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ gem.name = "riot_notifier"
7
+ gem.summary = 'Simple notifier for riot'
8
+ gem.email = "peter-riot_notifier@suschlik.de"
9
+ gem.homepage = "http://github.com/splattael/riot_notifier"
10
+ gem.authors = ["Peter Suschlik"]
11
+
12
+ gem.has_rdoc = true
13
+ gem.extra_rdoc_files = [ "README.rdoc" ]
14
+
15
+ gem.add_dependency "riot", ">= 0.10.9"
16
+ gem.add_development_dependency "riot_notifier"
17
+ gem.add_development_dependency "libnotify"
18
+
19
+ gem.test_files = Dir.glob('test/test_*.rb')
20
+ end
21
+ Jeweler::GemcutterTasks.new
22
+ rescue LoadError
23
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
24
  end
24
25
 
25
- Jeweler::GemcutterTasks.new
26
-
27
26
  # Test
28
27
  require 'rake/testtask'
28
+ desc 'Default: run unit tests.'
29
+ task :default => :test
30
+ task :test => :check_dependencies
31
+
29
32
  Rake::TestTask.new(:test) do |test|
30
33
  test.test_files = FileList.new('test/test_*.rb')
31
34
  test.libs << 'test'
@@ -33,6 +36,7 @@ Rake::TestTask.new(:test) do |test|
33
36
  end
34
37
 
35
38
  # RDoc
39
+ require 'rake/rdoctask'
36
40
  Rake::RDocTask.new do |rd|
37
41
  rd.title = "Riot Notifier"
38
42
  rd.main = "README.rdoc"
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.7
@@ -0,0 +1,59 @@
1
+ # Base class for all specific notifiers.
2
+ #
3
+ # Each notifier should implement +notify+ and +usable?+.
4
+ #
5
+ # Note: Base is NOT usable.
6
+ module RiotNotifier
7
+
8
+ class Base < ::Riot::DotMatrixReporter
9
+
10
+ def initialize(*args, &block)
11
+ raise "#{self.class} is NOT usable" unless self.class.usable?
12
+ super
13
+ end
14
+
15
+ # Notifies you about failures and errors.
16
+ # This methods should be overridden in order to define specific notifications libraries.
17
+ def notify(color, msg)
18
+ # override me
19
+ end
20
+
21
+ # Tests if this notifier is usable.
22
+ # Should contain some initialization code e.g. require 'libnotify'.
23
+ def self.usable?
24
+ # override
25
+ false
26
+ end
27
+
28
+ def self.inherited(notifier)
29
+ ::RiotNotifier.order.unshift notifier
30
+ end
31
+
32
+ # Override
33
+
34
+ def fail(desc, message)
35
+ super
36
+ notify(:red, "FAILURE: #{message}")
37
+ end
38
+
39
+ def error(desc, error)
40
+ super
41
+ notify(:red, "ERROR: #{error}")
42
+ end
43
+
44
+ def results(time_taken)
45
+ super
46
+ unless bad_results?
47
+ notify(:green, "%d passes, %d failures, %d errors in %s seconds" % [passes, failures, errors, ("%0.6f" % time_taken)])
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def bad_results?
54
+ failures + errors > 0
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,34 @@
1
+ # Notifies via libnotify.
2
+ module RiotNotifier
3
+
4
+ class Libnotify < Base
5
+ OPTIONS = {
6
+ :green => {
7
+ :icon_path => "/usr/share/icons/gnome/scalable/emblems/emblem-default.svg",
8
+ :timeout => 2.5,
9
+ :urgency => :normal,
10
+ :summary => ":-)"
11
+ },
12
+ :red => {
13
+ :icon_path => "/usr/share/icons/gnome/scalable/emotes/face-angry.svg",
14
+ :timeout => 2.5,
15
+ :urgency => :critical,
16
+ :summary => ":-("
17
+ }
18
+ }
19
+
20
+ def notify(color, msg)
21
+ options = OPTIONS[color] or raise "unknown color #{color}"
22
+
23
+ ::Libnotify.show(options.merge(:body => msg))
24
+ end
25
+
26
+ def self.usable?
27
+ require 'libnotify'
28
+ true
29
+ rescue LoadError
30
+ false
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,45 @@
1
+ # Notifies you about failures and errors in your riot tests!
2
+ #
3
+ # Usage:
4
+ # require 'riot'
5
+ # require 'riot_notifier'
6
+ #
7
+ # # auto-detection
8
+ # Riot.reporter = RiotNotifier
9
+ # # try these first
10
+ # Riot.reporter = RiotNotifier[:RedgreenBinary, :Libnotify]
11
+ #
12
+ module RiotNotifier
13
+
14
+ def self.new(*args, &block)
15
+ notifier_class = notifier_classes.detect(&:usable?) || None
16
+ notifier_class.new(*args, &block)
17
+ end
18
+
19
+ def self.order
20
+ @order ||= []
21
+ end
22
+
23
+ def self.try(*order)
24
+ @order = order
25
+ self
26
+ end
27
+
28
+ class << self
29
+ alias [] try
30
+ end
31
+
32
+ def self.notifier_classes
33
+ order.map { |o| resolve_notifier_class(o) }.compact - [None]
34
+ end
35
+
36
+ def self.resolve_notifier_class(o)
37
+ case o
38
+ when Class; o
39
+ when Symbol, String; const_get(o)
40
+ else
41
+ nil
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,14 @@
1
+ # Doesn't notify at all. Is used as auto-detection fallback.
2
+ module RiotNotifier
3
+
4
+ class None < Base
5
+ def notify(color, msg)
6
+ # noop
7
+ end
8
+
9
+ def self.usable?
10
+ true
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,28 @@
1
+ # Notifies via $HOME/bin/notify_redgreen (with notify-send)
2
+ module RiotNotifier
3
+
4
+ class RedgreenBinary < Base
5
+ attr_reader :path
6
+ PATH = ENV['HOME'] + "/bin/notify_redgreen"
7
+
8
+ def initialize(path = PATH)
9
+ super()
10
+ @path = path
11
+ end
12
+
13
+ def notify(color, msg)
14
+ msg.gsub!(/</, '&lt;')
15
+ msg.gsub!(/"/, "\\\"")
16
+ exec "#{@path} #{color} \"#{msg}\""
17
+ end
18
+
19
+ def exec(*args)
20
+ Kernel.system(*args)
21
+ end
22
+
23
+ def self.usable?
24
+ File.exist?(PATH)
25
+ end
26
+ end
27
+
28
+ end
data/lib/riot_notifier.rb CHANGED
@@ -1,82 +1,14 @@
1
1
  require 'riot'
2
2
 
3
- module RiotNotifier
4
- class Base < ::Riot::DotMatrixReporter
5
- def notify(color, msg)
6
- # overwrite me
7
- end
3
+ require 'riot_notifier/module'
4
+ require 'riot_notifier/base'
8
5
 
9
- def fail(desc, message)
10
- super
11
- say yellow("#{desc}: #{message}")
12
- notify(:red, "FAILURE: #{message}")
13
- end
6
+ # Reverse load order!
14
7
 
15
- def error(desc, error)
16
- super
17
- say red("#{desc}: #{error}")
18
- notify(:red, "ERROR: #{error}")
19
- end
8
+ # Fallback
9
+ require 'riot_notifier/none'
20
10
 
21
- def results(time_taken)
22
- super
23
- unless bad_results?
24
- notify(:green, "%d passes, %d failures, %d errors in %s seconds" % [passes, failures, errors, ("%0.6f" % time_taken)])
25
- end
26
- end
27
-
28
- private
29
-
30
- def bad_results?
31
- failures + errors > 0
32
- end
33
- end
34
-
35
- class Libnotify < Base
36
- OPTIONS = {
37
- :green => {
38
- :icon_path => "/usr/share/icons/gnome/scalable/emblems/emblem-default.svg",
39
- :timeout => 2.5,
40
- :urgency => :normal,
41
- :summary => ":-)"
42
- },
43
- :red => {
44
- :icon_path => "/usr/share/icons/gnome/scalable/emotes/face-angry.svg",
45
- :timeout => 2.5,
46
- :urgency => :critical,
47
- :summary => ":-("
48
- }
49
- }
50
-
51
- def initialize
52
- require 'libnotify'
53
- super()
54
- end
55
-
56
- def notify(color, msg)
57
- options = OPTIONS[color] or raise "unknown color #{color}"
58
-
59
- ::Libnotify.show(options.merge(:body => msg))
60
- end
61
- end
62
-
63
- class RedgreenNotifier < Base
64
- attr_reader :path
65
- PATH = ENV['HOME'] + "/bin/notify_redgreen"
66
-
67
- def initialize(path = PATH)
68
- super()
69
- @path = path
70
- end
71
-
72
- def notify(color, msg)
73
- msg.gsub!(/</, '&lt;')
74
- msg.gsub!(/"/, "\\\"")
75
- exec "#{@path} #{color} \"#{msg}\""
76
- end
77
-
78
- def exec(*args)
79
- Kernel.system(*args)
80
- end
81
- end
82
- end
11
+ # Custom notifiers - loading is important for auto-detection
12
+ # LIFO!
13
+ require 'riot_notifier/redgreen_binary'
14
+ require 'riot_notifier/libnotify'
data/test/helper.rb CHANGED
@@ -1,5 +1,18 @@
1
+ require 'rubygems'
1
2
  require 'riot'
2
3
 
3
4
  require 'riot_notifier'
4
5
 
5
- Riot.reporter = RiotNotifier::Libnotify
6
+ Riot.reporter = RiotNotifier
7
+
8
+ module Riot
9
+ class Situation
10
+ # Create backtrace for this exception.
11
+ def bt!(error)
12
+ return error if error.backtrace
13
+ raise error
14
+ rescue error.class => e
15
+ e
16
+ end
17
+ end
18
+ end
@@ -1,9 +1,8 @@
1
- require 'rubygems'
2
1
 
3
2
  require 'helper'
4
3
  require 'stringio'
5
4
 
6
- class MockNotifier < ::RiotNotifier::Base
5
+ class MockNotifier < ::RiotNotifier::None
7
6
  def initialize
8
7
  super(StringIO.new)
9
8
  end
@@ -11,17 +10,23 @@ class MockNotifier < ::RiotNotifier::Base
11
10
  def notify(color, msg)
12
11
  [ color, msg ]
13
12
  end
13
+
14
+ ::RiotNotifier.order.delete(self)
14
15
  end
15
16
 
16
17
  context "RiotNotifier" do
17
18
  context "with MockNotifier" do
18
- setup { MockNotifier.new }
19
+ setup do
20
+ reporter = MockNotifier.new
21
+ reporter.describe_context(Riot::Context.new("test") {})
22
+ reporter
23
+ end
19
24
 
20
- asserts("displays failure in red") { topic.fail("desc", "failed") }.equals([:red, "FAILURE: failed"])
21
- asserts("displays error in red") { topic.error("desc", "errored") }.equals([:red, "ERROR: errored"])
25
+ asserts("notifies failure in red") { topic.fail("desc", "failed") }.equals([:red, "FAILURE: failed"])
26
+ asserts("notifies error in red") { topic.error("desc", bt!(ArgumentError.new("errored"))) }.equals([:red, "ERROR: errored"])
22
27
  asserts("doesn't display results with bad results") do
23
28
  topic.report("desc", [:fail, "failure"])
24
- topic.report("desc", [:error, "error"])
29
+ topic.report("desc", [:error, bt!(ArgumentError.new("error"))])
25
30
  topic.results(23.0)
26
31
  end.nil
27
32
 
@@ -35,9 +40,9 @@ context "RiotNotifier" do
35
40
  end
36
41
  end # with MockNotifier
37
42
 
38
- context "with RedgreenNotifier" do
43
+ context "with RedgreenBinary" do
39
44
  setup do
40
- Class.new(RiotNotifier::RedgreenNotifier) do
45
+ Class.new(RiotNotifier::RedgreenBinary) do
41
46
  def exec(string)
42
47
  string
43
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riot_notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Suschlik
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-07 00:00:00 +01:00
12
+ date: 2009-12-17 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,11 +20,21 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.10.4
23
+ version: 0.10.9
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: riot_notifier
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
24
34
  version:
25
35
  - !ruby/object:Gem::Dependency
26
36
  name: libnotify
27
- type: :runtime
37
+ type: :development
28
38
  version_requirement:
29
39
  version_requirements: !ruby/object:Gem::Requirement
30
40
  requirements:
@@ -45,8 +55,13 @@ files:
45
55
  - .watchr
46
56
  - README.rdoc
47
57
  - Rakefile
48
- - VERSION.yml
58
+ - VERSION
49
59
  - lib/riot_notifier.rb
60
+ - lib/riot_notifier/base.rb
61
+ - lib/riot_notifier/libnotify.rb
62
+ - lib/riot_notifier/module.rb
63
+ - lib/riot_notifier/none.rb
64
+ - lib/riot_notifier/redgreen_binary.rb
50
65
  - test/helper.rb
51
66
  - test/test_riot_notifier.rb
52
67
  has_rdoc: true
data/VERSION.yml DELETED
@@ -1,5 +0,0 @@
1
- ---
2
- :major: 0
3
- :minor: 0
4
- :patch: 6
5
- :build: