notifier 0.4.1 → 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4e8f22ae020099416927c4342232f8e37631292454b51036ee75a80227da2152
4
+ data.tar.gz: bed78ad310c8577665578bc763e1e3f20f100e368d66c9f13fd460b38486bb2a
5
+ SHA512:
6
+ metadata.gz: 2bca083c02fb0ee73772a8f3604ca2749b6e9cee6e6f75bff623afc948b0032aee87af722b3e071391731043749a0f1d9470b472c23f405e719b78df62183b9c
7
+ data.tar.gz: a082e4f102062da75d76e21253848bf1cf56a08780a3fac4c7f2e032310e5c9c45cf7005700e84ce7d336632aa7b7ace9dd8c5493196074350c4bc6fa9dfb79e
data/.gitignore CHANGED
@@ -1,4 +1,6 @@
1
1
  pkg/*
2
2
  *.gem
3
3
  .bundle
4
- .DS_Store
4
+ .DS_Store
5
+ *.lock
6
+ /coverage
data/.rubocop.yml ADDED
@@ -0,0 +1,10 @@
1
+ ---
2
+ inherit_gem:
3
+ rubocop-fnando: .rubocop.yml
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.7
7
+ NewCops: enable
8
+ Exclude:
9
+ - vendor/**/*
10
+ - gemfiles/**/*
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
- source :rubygems
1
+ # frozen_string_literal: true
2
+
3
+ source "http://rubygems.org"
2
4
  gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,20 @@
1
+ (The MIT License)
2
+
3
+ Nando Vieira
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the 'Software'), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,128 @@
1
+ # Notifier
2
+
3
+ [![Gem](https://img.shields.io/gem/v/notifier.svg)](https://rubygems.org/gems/notifier)
4
+ [![Gem](https://img.shields.io/gem/dt/notifier.svg)](https://rubygems.org/gems/notifier)
5
+
6
+ Send system notifications on several platforms with a simple and unified API.
7
+ Currently supports:
8
+
9
+ - terminal-notifier (Notification Center wrapper for Mac OS X)
10
+ - GNTP Protocol (Growl, with Vagrant support)
11
+ - Kdialog (Linux/KDE)
12
+ - Knotify (Linux/KDE)
13
+ - OSD Cat (Linux)
14
+ - Libnotify (Linux)
15
+ - Snarl (Windows)
16
+
17
+ ## Installation
18
+
19
+ gem install notifier
20
+
21
+ ### Mac OS X
22
+
23
+ #### terminal-notifier
24
+
25
+ - Install terminal-notifier - https://github.com/alloy/terminal-notifier
26
+
27
+ terminal-notifier also supports two additional flags:
28
+
29
+ - `subtitle`
30
+ - `sound`
31
+
32
+ See terminal-notifier's help for additional information.
33
+
34
+ ### Linux
35
+
36
+ If you're a linux guy, you can choose one of these methods:
37
+
38
+ - Install libnotify-bin and its dependencies:
39
+ `sudo aptitude install libnotify-bin`
40
+ - Install xosd-bin: `sudo aptitude install xosd-bin`
41
+ - KDE users don't need to install anything: Test Notifier will use +knotify+ or
42
+ +kdialog+.
43
+
44
+ ### Windows
45
+
46
+ - Install Snarl: download from http://www.fullphat.net
47
+ - Install ruby-snarl: `gem install ruby-snarl`
48
+
49
+ ## Usage
50
+
51
+ Notifier will try to detect which notifiers are available in your system. So you
52
+ can just send a message:
53
+
54
+ ```ruby
55
+ Notifier.notify(
56
+ image: "image.png",
57
+ title: "Testing Notifier",
58
+ message: "Sending an important message!"
59
+ )
60
+ ```
61
+
62
+ Not all notifiers support the image option, therefore it will be ignored.
63
+
64
+ If your system support more than one notifier, you can specify which one you
65
+ prefer:
66
+
67
+ ```ruby
68
+ Notifier.default_notifier = :notify_send
69
+ ```
70
+
71
+ The available names are `terminal_notifier`, `kdialog`, `knotify`,
72
+ `notify_send`, `osd_cat`, and `snarl`.
73
+
74
+ There are several helper methods that you can use in order to retrieve
75
+ notifiers.
76
+
77
+ - `Notifier.notifier`: return the first supported notifier
78
+ - `Notifier.notifiers`: return all notifiers
79
+ - `Notifier.supported_notifiers`: return only supported notifiers
80
+ - `Notifier.from_name(name)`: find notifier by its name
81
+ - `Notifier.supported_notifier_from_name(name)`: find a supported notifier by
82
+ its name
83
+
84
+ ## Creating custom notifiers
85
+
86
+ To create a new notifier, just create a module on `Notifier` namespace that
87
+ implements the following interface:
88
+
89
+ ```ruby
90
+ module Notifier
91
+ module MyCustomNotifier
92
+ def self.supported?
93
+ end
94
+
95
+ def self.notify(options)
96
+ end
97
+ end
98
+ end
99
+ ```
100
+
101
+ ## Maintainer
102
+
103
+ - Nando Vieira - https://nandovieira.com
104
+
105
+ ## Contributors
106
+
107
+ https://github.com/fnando/notifier/graphs/contributors
108
+
109
+ ## License
110
+
111
+ (The MIT License)
112
+
113
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
114
+ this software and associated documentation files (the 'Software'), to deal in
115
+ the Software without restriction, including without limitation the rights to
116
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
117
+ the Software, and to permit persons to whom the Software is furnished to do so,
118
+ subject to the following conditions:
119
+
120
+ The above copyright notice and this permission notice shall be included in all
121
+ copies or substantial portions of the Software.
122
+
123
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
124
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
125
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
126
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
127
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
128
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,10 +1,15 @@
1
- require "bundler"
2
- Bundler::GemHelper.install_tasks
1
+ # frozen_string_literal: true
3
2
 
3
+ require "bundler/gem_tasks"
4
4
  require "rake/testtask"
5
- Rake::TestTask.new do |t|
6
- t.libs += %w[test lib]
7
- t.ruby_opts = %w[-rubygems]
5
+ require "rubocop/rake_task"
6
+
7
+ Rake::TestTask.new(:test) do |t|
8
+ t.libs << "test"
8
9
  t.test_files = FileList["test/**/*_test.rb"]
9
- t.verbose = true
10
+ t.warning = false
10
11
  end
12
+
13
+ RuboCop::RakeTask.new
14
+
15
+ task default: %i[test rubocop]
@@ -1,19 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Notifier
2
4
  module Kdialog
3
5
  extend self
4
6
 
5
7
  def supported?
6
- Notifier.os?(/(linux|freebsd)/) && `which kdialog > /dev/null` && $? == 0
8
+ Notifier.os?(/(linux|freebsd)/) &&
9
+ `which kdialog > /dev/null` &&
10
+ $CHILD_STATUS == 0
7
11
  end
8
12
 
9
13
  def notify(options)
10
14
  command = [
11
15
  "kdialog",
12
- "--title", options[:title],
13
- "--passivepopup", options[:message], "5"
16
+ "--title", options[:title].to_s,
17
+ "--passivepopup", options[:message].to_s,
18
+ "5"
14
19
  ]
15
20
 
16
- Thread.new { system(*command) }
21
+ Thread.new { system(*command) }.join
17
22
  end
18
23
  end
19
24
  end
@@ -1,19 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Notifier
2
4
  module Knotify
3
5
  extend self
4
6
 
5
7
  def supported?
6
- Notifier.os?(/(linux|freebsd)/) && `ps -Al | grep dcop` && $? == 0
8
+ Notifier.os?(/(linux|freebsd)/) &&
9
+ `ps -Al | grep dcop` &&
10
+ $CHILD_STATUS == 0
7
11
  end
8
12
 
9
13
  def notify(options)
10
14
  command = [
11
15
  "dcop", "knotify", "default", "notify", "eventname",
12
- options[:title], options[:message],
16
+ options[:title].to_s, options[:message].to_s,
13
17
  "", "", "16", "2"
14
18
  ]
15
19
 
16
- Thread.new { system(*command) }
20
+ Thread.new { system(*command) }.join
17
21
  end
18
22
  end
19
23
  end
@@ -1,20 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Notifier
2
4
  module NotifySend
3
5
  extend self
4
6
 
5
7
  def supported?
6
- Notifier.os?(/(linux|freebsd)/) && `which notify-send > /dev/null` && $? == 0
8
+ Notifier.os?(/(linux|freebsd)/) &&
9
+ `which notify-send > /dev/null` &&
10
+ $CHILD_STATUS == 0
7
11
  end
8
12
 
9
13
  def notify(options)
10
14
  command = [
11
15
  "notify-send", "-i",
12
- options[:image],
13
- options[:title],
14
- options[:message]
16
+ options[:image].to_s,
17
+ options[:title].to_s,
18
+ options[:message].to_s
15
19
  ]
16
20
 
17
- Thread.new { system(*command) }
21
+ Thread.new { system(*command) }.join
18
22
  end
19
23
  end
20
24
  end
@@ -1,13 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Notifier
2
4
  module OsdCat
3
5
  extend self
4
6
 
5
7
  def supported?
6
- Notifier.os?(/(linux|freebsd)/) && `which osd_cat > /dev/null` && $? == 0
8
+ Notifier.os?(/(linux|freebsd)/) &&
9
+ `which osd_cat > /dev/null` &&
10
+ $CHILD_STATUS == 0
7
11
  end
8
12
 
9
13
  def notify(options)
10
- color = options.fetch(:color, "white")
14
+ color = options.fetch(:color, "white").to_s
11
15
 
12
16
  command = [
13
17
  "osd_cat",
@@ -18,15 +22,15 @@ module Notifier
18
22
  "--align", "center",
19
23
  "--font", "-bitstream-bitstream charter-bold-r-*-*-*-350-*-*-*-*-*-*",
20
24
  "--delay", "5",
21
- "--outline", "4",
25
+ "--outline", "4"
22
26
  ]
23
27
 
24
28
  Thread.new do
25
- Open3.popen3(*command) do |stdin, stdout, stderr|
29
+ Open3.popen3(*command) do |stdin, _stdout, _stderr|
26
30
  stdin.puts options[:message]
27
31
  stdin.close
28
32
  end
29
- end
33
+ end.join
30
34
  end
31
35
  end
32
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Notifier
2
4
  module Placebo
3
5
  extend self
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Notifier
2
4
  module Snarl
3
5
  extend self
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Notifier
4
+ module TerminalNotifier
5
+ extend self
6
+
7
+ def supported?
8
+ Notifier.os?(/darwin/) && `which terminal-notifier` && $CHILD_STATUS == 0
9
+ end
10
+
11
+ def notify(options)
12
+ command = [
13
+ "terminal-notifier",
14
+ "-group", "notifier-rubygems",
15
+ "-title", options[:title].to_s,
16
+ "-appIcon", options.fetch(:image, "").to_s,
17
+ "-message", options[:message].to_s,
18
+ "-subtitle", options.fetch(:subtitle, "").to_s
19
+ ]
20
+
21
+ # -sound with an empty string (e.g., "") will trigger the
22
+ # default sound so we need to check for it.
23
+ if options[:sound]
24
+ command.concat([
25
+ "-sound",
26
+ options.fetch(:sound, "default").to_s
27
+ ])
28
+ end
29
+
30
+ Thread.new do
31
+ Open3.popen3(*command) do |_stdin, _stdout, _stderr|
32
+ # noop
33
+ end
34
+ end.join
35
+ end
36
+ end
37
+ end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Notifier
2
4
  module Version
3
- MAJOR = 0
4
- MINOR = 4
5
- PATCH = 1
5
+ MAJOR = 1
6
+ MINOR = 0
7
+ PATCH = 0
6
8
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
9
  end
8
10
  end
data/lib/notifier.rb CHANGED
@@ -1,20 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "open3"
2
4
  require "socket"
3
5
  require "digest/md5"
4
6
  require "timeout"
5
7
  require "rbconfig"
8
+ require "English"
6
9
 
7
10
  module Notifier
8
- autoload :Growl, "notifier/growl"
9
- autoload :GNTP, "notifier/gntp"
10
- autoload :Snarl, "notifier/snarl"
11
- autoload :OsdCat, "notifier/osd_cat"
12
- autoload :Knotify, "notifier/knotify"
13
- autoload :Kdialog, "notifier/kdialog"
14
- autoload :NotifySend, "notifier/notify_send"
15
- autoload :Placebo, "notifier/placebo"
16
- autoload :Version, "notifier/version"
17
- autoload :Adapters, "notifier/adapters"
11
+ require "notifier/snarl"
12
+ require "notifier/osd_cat"
13
+ require "notifier/knotify"
14
+ require "notifier/kdialog"
15
+ require "notifier/notify_send"
16
+ require "notifier/placebo"
17
+ require "notifier/terminal_notifier"
18
+ require "notifier/version"
18
19
 
19
20
  extend self
20
21
 
@@ -22,6 +23,10 @@ module Notifier
22
23
  attr_accessor :default_notifier
23
24
  end
24
25
 
26
+ def skip_constants
27
+ @skip_constants ||= %w[Placebo Adapters Version]
28
+ end
29
+
25
30
  def notifier
26
31
  supported_notifier_from_name(default_notifier) || supported_notifiers.first
27
32
  end
@@ -31,32 +36,32 @@ module Notifier
31
36
  end
32
37
 
33
38
  def notifiers
34
- constants.collect do |name|
35
- const_get(name) unless %w[Placebo Adapters Version].include?(name.to_s)
36
- end.compact + [Placebo]
39
+ constants.filter_map do |name|
40
+ const_get(name) unless skip_constants.include?(name.to_s)
41
+ end + [Placebo]
37
42
  end
38
43
 
39
44
  def supported_notifiers
40
- notifiers.select {|notifier| notifier.supported?}
45
+ notifiers.select(&:supported?)
41
46
  end
42
47
 
43
48
  def from_name(name)
44
49
  const_get(classify(name.to_s))
45
- rescue Exception
50
+ rescue StandardError
46
51
  nil
47
52
  end
48
53
 
49
54
  def supported_notifier_from_name(name)
50
55
  notifier = from_name(name)
51
- notifier && notifier.supported? ? notifier : nil
56
+ notifier&.supported? ? notifier : nil
52
57
  end
53
58
 
54
59
  def os?(regex)
55
60
  RUBY_PLATFORM =~ regex || RbConfig::CONFIG["host_os"] =~ regex
56
61
  end
57
62
 
58
- private
59
- def classify(string)
60
- string.gsub(/_(.)/sm) { "#{$1.upcase}" }.gsub(/^(.)/) { "#{$1.upcase}" }
63
+ private def classify(string)
64
+ string.gsub(/_(.)/sm) { Regexp.last_match(1).upcase.to_s }
65
+ .gsub(/^(.)/) { Regexp.last_match(1).upcase.to_s }
61
66
  end
62
67
  end
data/notifier.gemspec CHANGED
@@ -1,24 +1,35 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "notifier/version"
1
+ # frozen_string_literal: true
2
+
3
+ require "./lib/notifier/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "notifier"
7
7
  s.version = Notifier::Version::STRING
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Nando Vieira"]
10
- s.email = ["fnando.vieira@gmail.com"]
10
+ s.email = ["me@fnando.com"]
11
11
  s.homepage = "http://rubygems.org/gems/notifier"
12
- s.summary = "Send system notifications on several platforms with a simple and unified API. Currently supports Growl, Libnotify, OSD, KDE (Knotify and Kdialog) and Snarl"
12
+ s.summary = "Send system notifications on several platforms with a " \
13
+ "simple and unified API. Currently supports Libnotify, " \
14
+ "OSD, KDE (Knotify and Kdialog) and Snarl"
13
15
  s.description = s.summary
16
+ s.required_ruby_version = ">= 2.7"
17
+ s.metadata["rubygems_mfa_required"] = "true"
14
18
 
15
19
  s.files = `git ls-files`.split("\n")
16
20
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map do |f|
22
+ File.basename(f)
23
+ end
18
24
  s.require_paths = ["lib"]
19
25
 
20
- s.requirements << "Growl, Libnotify, OSD, KDE (Knotify and Kdialog) or Snarl"
26
+ s.requirements << "terminal-notifier, Libnotify, OSD, KDE (Knotify and " \
27
+ "Kdialog) or Snarl"
21
28
 
22
- s.add_development_dependency "rspec"
29
+ s.add_development_dependency "minitest-utils"
30
+ s.add_development_dependency "mocha"
23
31
  s.add_development_dependency "rake"
32
+ s.add_development_dependency "rubocop"
33
+ s.add_development_dependency "rubocop-fnando"
34
+ s.add_development_dependency "simplecov"
24
35
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class NotifierTest < Minitest::Test
6
+ setup do
7
+ Notifier.notifiers.each do |notifier|
8
+ unless notifier == Notifier::Placebo
9
+ notifier.stubs(:supported?).returns(false)
10
+ end
11
+ end
12
+
13
+ Notifier.default_notifier = nil
14
+ end
15
+
16
+ test "retrieves list of supported notifiers" do
17
+ Notifier::Snarl.stubs(:supported?).returns(true)
18
+ Notifier::Knotify.stubs(:supported?).returns(true)
19
+
20
+ assert_equal 3, Notifier.supported_notifiers.size
21
+ end
22
+
23
+ test "returns first available notifier" do
24
+ Notifier::Snarl.stubs(:supported?).returns(true)
25
+ Notifier::Knotify.stubs(:supported?).returns(true)
26
+
27
+ assert_equal Notifier::Snarl, Notifier.notifier
28
+ end
29
+
30
+ test "prefers default notifier" do
31
+ Notifier::Snarl.stubs(:supported?).returns(true)
32
+ Notifier::Knotify.stubs(:supported?).returns(true)
33
+
34
+ Notifier.default_notifier = :knotify
35
+
36
+ assert_equal Notifier::Knotify, Notifier.notifier
37
+ end
38
+
39
+ test "sends notification" do
40
+ params = {
41
+ title: "Some title",
42
+ message: "Some message",
43
+ image: "image.png"
44
+ }
45
+
46
+ Notifier::Snarl.stubs(:supported?).returns(true)
47
+ Notifier::Snarl.expects(:notify).with(params)
48
+
49
+ Notifier.notify(params)
50
+ end
51
+
52
+ test "retrieves list of all notifiers" do
53
+ assert_equal 7, Notifier.notifiers.size
54
+ end
55
+
56
+ test "considers Placebo as fallback notifier" do
57
+ assert_equal Notifier::Placebo, Notifier.supported_notifiers.last
58
+ end
59
+
60
+ test "returns notifier by its name" do
61
+ assert_equal Notifier::OsdCat, Notifier.from_name(:osd_cat)
62
+ assert_equal Notifier::NotifySend, Notifier.from_name(:notify_send)
63
+ end
64
+
65
+ test "returns notifier by its name when supported" do
66
+ Notifier::Snarl.expects(:supported?).returns(true)
67
+ assert_equal Notifier::Snarl, Notifier.supported_notifier_from_name(:snarl)
68
+ end
69
+
70
+ test "returns nil when have no supported notifiers" do
71
+ assert_nil Notifier.supported_notifier_from_name(:snarl)
72
+ end
73
+
74
+ test "returns nil when an invalid notifier name is provided" do
75
+ assert_nil Notifier.from_name(:invalid)
76
+ assert_nil Notifier.supported_notifier_from_name(:invalid)
77
+ end
78
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class SnarlTest < Minitest::Test
6
+ test "sends notification" do
7
+ Snarl.expects(:show_message).with("TITLE", "MESSAGE", "IMAGE")
8
+
9
+ Notifier::Snarl.notify(title: "TITLE", message: "MESSAGE", image: "IMAGE")
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "simplecov"
4
+ SimpleCov.start
5
+
6
+ require "bundler/setup"
7
+ require "notifier"
8
+ require "minitest/utils"
9
+ require "minitest/autorun"
10
+
11
+ module Snarl
12
+ def self.show_message(*)
13
+ end
14
+ end
metadata CHANGED
@@ -1,102 +1,152 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Nando Vieira
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-27 00:00:00.000000000 Z
11
+ date: 2022-02-20 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: rspec
14
+ name: minitest-utils
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
28
39
  - !ruby/object:Gem::Version
29
40
  version: '0'
30
41
  - !ruby/object:Gem::Dependency
31
42
  name: rake
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
- - - ! '>='
45
+ - - ">="
36
46
  - !ruby/object:Gem::Version
37
47
  version: '0'
38
48
  type: :development
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ! '>='
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
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: rubocop-fnando
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
44
95
  - !ruby/object:Gem::Version
45
96
  version: '0'
46
97
  description: Send system notifications on several platforms with a simple and unified
47
- API. Currently supports Growl, Libnotify, OSD, KDE (Knotify and Kdialog) and Snarl
98
+ API. Currently supports Libnotify, OSD, KDE (Knotify and Kdialog) and Snarl
48
99
  email:
49
- - fnando.vieira@gmail.com
100
+ - me@fnando.com
50
101
  executables: []
51
102
  extensions: []
52
103
  extra_rdoc_files: []
53
104
  files:
54
- - .gitignore
55
- - .rspec
105
+ - ".gitignore"
106
+ - ".rubocop.yml"
56
107
  - Gemfile
57
- - Gemfile.lock
58
- - README.rdoc
108
+ - LICENSE.md
109
+ - README.md
59
110
  - Rakefile
60
111
  - lib/notifier.rb
61
- - lib/notifier/adapters.rb
62
- - lib/notifier/adapters/gntp.rb
63
- - lib/notifier/gntp.rb
64
- - lib/notifier/growl.rb
65
112
  - lib/notifier/kdialog.rb
66
113
  - lib/notifier/knotify.rb
67
114
  - lib/notifier/notify_send.rb
68
115
  - lib/notifier/osd_cat.rb
69
116
  - lib/notifier/placebo.rb
70
117
  - lib/notifier/snarl.rb
118
+ - lib/notifier/terminal_notifier.rb
71
119
  - lib/notifier/version.rb
72
120
  - notifier.gemspec
73
- - resources/register-growl.scpt
74
- - spec/notifier_spec.rb
75
- - spec/spec_helper.rb
121
+ - test/notifier/notifier_test.rb
122
+ - test/notifier/snarl_test.rb
123
+ - test/test_helper.rb
76
124
  homepage: http://rubygems.org/gems/notifier
77
125
  licenses: []
78
- post_install_message:
126
+ metadata:
127
+ rubygems_mfa_required: 'true'
128
+ post_install_message:
79
129
  rdoc_options: []
80
130
  require_paths:
81
131
  - lib
82
132
  required_ruby_version: !ruby/object:Gem::Requirement
83
- none: false
84
133
  requirements:
85
- - - ! '>='
134
+ - - ">="
86
135
  - !ruby/object:Gem::Version
87
- version: '0'
136
+ version: '2.7'
88
137
  required_rubygems_version: !ruby/object:Gem::Requirement
89
- none: false
90
138
  requirements:
91
- - - ! '>='
139
+ - - ">="
92
140
  - !ruby/object:Gem::Version
93
141
  version: '0'
94
142
  requirements:
95
- - Growl, Libnotify, OSD, KDE (Knotify and Kdialog) or Snarl
96
- rubyforge_project:
97
- rubygems_version: 1.8.23
98
- signing_key:
99
- specification_version: 3
143
+ - terminal-notifier, Libnotify, OSD, KDE (Knotify and Kdialog) or Snarl
144
+ rubygems_version: 3.3.7
145
+ signing_key:
146
+ specification_version: 4
100
147
  summary: Send system notifications on several platforms with a simple and unified
101
- API. Currently supports Growl, Libnotify, OSD, KDE (Knotify and Kdialog) and Snarl
102
- test_files: []
148
+ API. Currently supports Libnotify, OSD, KDE (Knotify and Kdialog) and Snarl
149
+ test_files:
150
+ - test/notifier/notifier_test.rb
151
+ - test/notifier/snarl_test.rb
152
+ - test/test_helper.rb
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --color --format documentation
data/Gemfile.lock DELETED
@@ -1,26 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- notifier (0.4.1)
5
-
6
- GEM
7
- remote: http://rubygems.org/
8
- specs:
9
- diff-lcs (1.1.3)
10
- rake (0.9.2.2)
11
- rspec (2.11.0)
12
- rspec-core (~> 2.11.0)
13
- rspec-expectations (~> 2.11.0)
14
- rspec-mocks (~> 2.11.0)
15
- rspec-core (2.11.1)
16
- rspec-expectations (2.11.3)
17
- diff-lcs (~> 1.1.3)
18
- rspec-mocks (2.11.2)
19
-
20
- PLATFORMS
21
- ruby
22
-
23
- DEPENDENCIES
24
- notifier!
25
- rake
26
- rspec
data/README.rdoc DELETED
@@ -1,106 +0,0 @@
1
- = Notifier
2
-
3
- Send system notifications on several platforms with a simple and unified API. Currently supports:
4
-
5
- * Growl (Mac OS X)
6
- * GNTP Protocol (Growl, with Vagrant support)
7
- * Kdialog (Linux/KDE)
8
- * Knotify (Linux/KDE)
9
- * OSD Cat (Linux)
10
- * Libnotify (Linux)
11
- * Snarl (Windows)
12
-
13
- == Installation
14
-
15
- gem install notifier
16
-
17
- === Mac OS X
18
-
19
- * Install Growl - http://growl.info/
20
- * Install the growlnotify script located on the "Extras" directory
21
- * Open the Growl Preference Panel (System > Growl) and activate "Listen for incoming notifications" and "Allow remote application registration" options on the Network tab.
22
-
23
- === Linux
24
-
25
- If you're a linux guy, you can choose one of these methods:
26
-
27
- * Install libnotify-bin and its dependencies: <tt>sudo aptitude install libnotify-bin</tt>
28
- * Install xosd-bin: <tt>sudo aptitude install xosd-bin</tt>
29
- * KDE users don't need to install anything: Test Notifier will use +knotify+ or +kdialog+.
30
-
31
- === Windows
32
-
33
- * Install Snarl: download from http://www.fullphat.net
34
- * Install ruby-snarl: <tt>gem install ruby-snarl</tt>
35
-
36
- == Usage
37
-
38
- Notifier will try to detect which notifiers are available in your system. So you can just send a message:
39
-
40
- Notifier.notify(
41
- :image => "image.png",
42
- :title => "Testing Notifier",
43
- :message => "Sending an important message!"
44
- )
45
-
46
- Not all notifiers support the image option, therefore it will be ignored.
47
-
48
- If your system support more than one notifier, you can specify which one you prefer:
49
-
50
- Notifier.default_notifier = :notify_send
51
-
52
- The available names are <tt>growl</tt>, <tt>kdialog</tt>, <tt>knotify</tt>, <tt>notify_send</tt>, <tt>osd_cat</tt>, and <tt>snarl</tt>.
53
-
54
- There are several helper methods that you can use in order to retrieve notifiers.
55
-
56
- * <tt>Notifier.notifier</tt>: return the first supported notifier
57
- * <tt>Notifier.notifiers</tt>: return all notifiers
58
- * <tt>Notifier.supported_notifiers</tt>: return only supported notifiers
59
- * <tt>Notifier.from_name(name)</tt>: find notifier by its name
60
- * <tt>Notifier.supported_notifier_from_name(name)</tt>: find a supported notifier by its name
61
-
62
- == Creating custom notifiers
63
-
64
- To create a new notifier, just create a module on <tt>Notifier</tt> namespace that implements the following interface:
65
-
66
- module Notifier
67
- module MyCustomNotifier
68
- def self.supported?
69
- end
70
-
71
- def self.notify(options)
72
- end
73
- end
74
- end
75
-
76
- == Maintainer
77
-
78
- * Nando Vieira - http://nandovieira.com.br
79
-
80
- == Contributors
81
-
82
- * Olek Janiszewski
83
- * David Miani
84
-
85
- == License
86
-
87
- (The MIT License)
88
-
89
- Permission is hereby granted, free of charge, to any person obtaining
90
- a copy of this software and associated documentation files (the
91
- 'Software'), to deal in the Software without restriction, including
92
- without limitation the rights to use, copy, modify, merge, publish,
93
- distribute, sublicense, and/or sell copies of the Software, and to
94
- permit persons to whom the Software is furnished to do so, subject to
95
- the following conditions:
96
-
97
- The above copyright notice and this permission notice shall be
98
- included in all copies or substantial portions of the Software.
99
-
100
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
101
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
102
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
103
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
104
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
105
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
106
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,89 +0,0 @@
1
- module Notifier
2
- module Adapters
3
- class GNTP
4
- attr_accessor :application_name
5
- attr_accessor :host
6
- attr_accessor :port
7
- attr_accessor :password
8
-
9
- def initialize(options = {})
10
- if options.kind_of?(String)
11
- options = {:name => options}
12
- end
13
-
14
- @application_name = options.fetch(:name, "GNTP/Ruby")
15
- @host = options.fetch(:host, "127.0.0.1")
16
- @port = options.fetch(:port, 23053)
17
- @password = options.fetch(:password, nil)
18
- end
19
-
20
- def line_break(number = 1)
21
- "\r\n" * number
22
- end
23
-
24
- def write(*contents)
25
- contents.map! do |content|
26
- content.force_encoding("utf-8") rescue content
27
- end
28
-
29
- socket = TCPSocket.open(host, port)
30
- message = [*contents, line_break(2)].join(line_break)
31
- socket.write(message)
32
-
33
- "".tap do |response|
34
- while chunk = socket.gets
35
- break if chunk == line_break
36
- response << chunk
37
- end
38
-
39
- socket.close
40
- end
41
- end
42
-
43
- def notify(options)
44
- name = options.fetch(:name, "notification")
45
- register(name)
46
-
47
- icon = fetch_icon(options[:icon])
48
-
49
- result = write "GNTP/1.0 NOTIFY NONE",
50
- "Application-Name: #{application_name}",
51
- "Notification-Name: #{name}",
52
- "Notification-Title: #{options[:title]}",
53
- "Notification-Text: #{options[:message]}",
54
- "Notification-Icon: x-growl-resource://#{icon[:identifier]}",
55
- "Notification-Sticky: #{bool options[:sticky]}",
56
- nil,
57
- "Identifier: #{icon[:identifier]}",
58
- "Length: #{icon[:size]}",
59
- nil,
60
- icon[:contents]
61
- end
62
-
63
- def fetch_icon(path)
64
- contents = File.open(path, "rb") {|f| f.read }
65
-
66
- {
67
- :identifier => Digest::MD5.hexdigest(contents),
68
- :contents => contents,
69
- :size => contents.bytesize
70
- }
71
- end
72
-
73
- def bool(boolean)
74
- {true => "Yes", false => "No"}[boolean]
75
- end
76
-
77
- def register(name)
78
- result = write(
79
- "GNTP/1.0 REGISTER NONE",
80
- "Application-Name: #{application_name}",
81
- "Notifications-count: 1",
82
- nil,
83
- "Notification-Name: #{name}",
84
- "Notification-Enabled: True"
85
- )
86
- end
87
- end
88
- end
89
- end
@@ -1,5 +0,0 @@
1
- module Notifier
2
- module Adapters
3
- autoload :GNTP, "notifier/adapters/gntp"
4
- end
5
- end
data/lib/notifier/gntp.rb DELETED
@@ -1,37 +0,0 @@
1
- module Notifier
2
- module GNTP extend self
3
- def supported?
4
- Timeout.timeout(1) { TCPSocket.new(host, port).close }
5
- true
6
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Timeout::Error
7
- false
8
- end
9
-
10
- def port
11
- ENV.fetch("GNTP_PORT", 23053)
12
- end
13
-
14
- def host
15
- ENV["GNTP_HOST"] || ssh_connection || "127.0.0.1"
16
- end
17
-
18
- def ssh_connection
19
- ENV["SSH_CONNECTION"][/^([^ ]+)/, 1] if ENV["SSH_CONNECTION"]
20
- end
21
-
22
- def notify(options)
23
- gntp = Adapters::GNTP.new({
24
- :name => "test_notifier",
25
- :host => host,
26
- :port => port
27
- })
28
-
29
- gntp.notify({
30
- :name => "status",
31
- :title => options[:title],
32
- :message => options[:message],
33
- :icon => options[:image]
34
- })
35
- end
36
- end
37
- end
@@ -1,31 +0,0 @@
1
- module Notifier
2
- module Growl
3
- extend self
4
-
5
- SCRIPT = File.dirname(__FILE__) + "/../../resources/register-growl.scpt"
6
- FILE = File.expand_path("~/.test_notifier-growl")
7
-
8
- def supported?
9
- Notifier.os?(/darwin/) && `which growlnotify` && $? == 0
10
- end
11
-
12
- def notify(options)
13
- register
14
- command = [
15
- "growlnotify",
16
- "--name", "test_notifier",
17
- "--image", options.fetch(:image, ''),
18
- "--priority", "2",
19
- "--message", options[:message],
20
- options[:title]
21
- ]
22
-
23
- Thread.new { system(*command) }
24
- end
25
-
26
- def register
27
- return if File.file?(FILE)
28
- system "osascript #{SCRIPT} > #{FILE}"
29
- end
30
- end
31
- end
Binary file
@@ -1,72 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Notifier do
4
- before do
5
- unsupport_all_notifiers
6
- Notifier.default_notifier = nil
7
- end
8
-
9
- it "retrieves list of supported notifiers" do
10
- Notifier::Snarl.stub :supported? => true
11
- Notifier::Knotify.stub :supported? => true
12
-
13
- expect(Notifier.supported_notifiers.size).to eql(3)
14
- end
15
-
16
- it "returns first available notifier" do
17
- Notifier::Snarl.stub :supported? => true
18
- Notifier::Knotify.stub :supported? => true
19
-
20
- expect(Notifier.notifier).to eql(Notifier::Snarl)
21
- end
22
-
23
- it "prefers default notifier" do
24
- Notifier::Snarl.stub :supported? => true
25
- Notifier::Knotify.stub :supported? => true
26
-
27
- Notifier.default_notifier = :knotify
28
-
29
- expect(Notifier.notifier).to eql(Notifier::Knotify)
30
- end
31
-
32
- it "sends notification" do
33
- params = {
34
- :title => "Some title",
35
- :message => "Some message",
36
- :image => "image.png"
37
- }
38
-
39
- Notifier::Snarl.stub :supported? => true
40
- Notifier::Snarl.should_receive(:notify).with(params)
41
-
42
- Notifier.notify(params)
43
- end
44
-
45
- it "retrieves list of all notifiers" do
46
- expect(Notifier.notifiers.size).to eql(8)
47
- end
48
-
49
- it "considers Placebo as fallback notifier" do
50
- expect(Notifier.supported_notifiers.last).to eql(Notifier::Placebo)
51
- end
52
-
53
- it "returns notifier by its name" do
54
- expect(Notifier.from_name(:osd_cat)).to eql(Notifier::OsdCat)
55
- expect(Notifier.from_name(:notify_send)).to eql(Notifier::NotifySend)
56
- expect(Notifier.from_name(:growl)).to eql(Notifier::Growl)
57
- end
58
-
59
- it "returns notifier by its name when supported" do
60
- Notifier::Snarl.stub :supported? => true
61
- expect(Notifier.supported_notifier_from_name(:snarl)).to eql(Notifier::Snarl)
62
- end
63
-
64
- it "returns nil when have no supported notifiers" do
65
- expect(Notifier.supported_notifier_from_name(:snarl)).to be_nil
66
- end
67
-
68
- it "returns nil when an invalid notifier name is provided" do
69
- expect(Notifier.from_name(:invalid)).to be_nil
70
- expect(Notifier.supported_notifier_from_name(:invalid)).to be_nil
71
- end
72
- end
data/spec/spec_helper.rb DELETED
@@ -1,13 +0,0 @@
1
- require "notifier"
2
-
3
- module SpecHelpers
4
- def unsupport_all_notifiers
5
- Notifier.notifiers.each do |notifier|
6
- notifier.stub :supported? => false unless notifier == Notifier::Placebo
7
- end
8
- end
9
- end
10
-
11
- RSpec.configure do |config|
12
- config.include SpecHelpers
13
- end