Module: TerminalNotifier::Guard

Defined in:
lib/terminal-notifier-guard.rb

Constant Summary collapse

VERSION =
"1.7.0"
ICONS_PATH =
File.expand_path("../../icons", __FILE__)
GUARD_ICON =
File.join(ICONS_PATH, 'Guard.icns')
LIST_FIELDS =
[:group, :title, :subtitle, :message, :delivered_at].freeze

Class Method Summary collapse

Class Method Details

.available?Boolean

Returns wether or not the current platform is Mac OS X 10.8, or higher.

Returns:

  • (Boolean)


30
31
32
33
34
35
36
37
# File 'lib/terminal-notifier-guard.rb', line 30

def self.available?
  deprecation_check
  if @available.nil?
    @available = `uname`.strip == 'Darwin' &&
      osx_version >= Gem::Version.new('10.9')
  end
  @available
end

.bin_pathObject



44
45
46
47
48
# File 'lib/terminal-notifier-guard.rb', line 44

def self.bin_path
  ENV["TERMINAL_NOTIFIER_BIN"] || begin
    @@binary ||= `which terminal-notifier`.chomp
  end
end

.deprecation_checkObject



19
20
21
22
23
24
25
26
27
# File 'lib/terminal-notifier-guard.rb', line 19

def self.deprecation_check
  if osx_version <= Gem::Version.new('10.8')
    raise "OSX 10.8 is no longer supported by this gem. Please revert to version <= 1.5.3."
  end

  if terminal_notifier_version < Gem::Version.new('1.6.0')
    puts "Notice: Your terminal-notifier is older than what terminal-notifier-guard supports, consider upgrading."
  end
end

.execute(verbose, options) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/terminal-notifier-guard.rb', line 50

def self.execute(verbose, options)
  if available? && installed?
    options.merge!({ :contentImage=> GUARD_ICON, :appIcon => icon(options.delete(:type)) })

    command = [bin_path, *options.map { |k,v| ["-#{k}", v.to_s] }.flatten]
    if RUBY_VERSION < '1.9'
      require 'shellwords'
      command = Shellwords.shelljoin(command)
    end
    result = ''
    IO.popen(command) do |stdout|
      output = stdout.read
      STDOUT.print output if verbose
      result << output
    end
    result
  else
    raise "terminal-notifier is only supported on Mac OS X 10.8, or higher." if !available?
    raise "TerminalNotifier not installed. Please do so by running `brew install terminal-notifier`" if !installed?
  end
end

.failed(message, options = {}, verbose = false) ⇒ Object



95
96
97
98
# File 'lib/terminal-notifier-guard.rb', line 95

def failed(message, options = {}, verbose = false)
  TerminalNotifier::Guard.execute(verbose, options.merge(:message => message, :type => :failed))
  $?.success?
end

.icon(type = :notify) ⇒ Object



113
114
115
116
117
# File 'lib/terminal-notifier-guard.rb', line 113

def icon(type = :notify)
  type ||= :notify
  file_name = "#{type}.icns".capitalize
  File.join(ICONS_PATH, file_name)
end

.installed?Boolean

Whether or not the terminal notifier is installed

Returns:

  • (Boolean)


40
41
42
# File 'lib/terminal-notifier-guard.rb', line 40

def self.installed?
  File.exist? bin_path
end

.list(group = 'ALL', verbose = false) ⇒ Object

If a ‘group’ ID is given, and a notification for that group exists, returns a hash with details about the notification.

If no ‘group’ ID is given, an array of hashes describing all notifications.

If no information is available this will return ‘nil`.



139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/terminal-notifier-guard.rb', line 139

def list(group = 'ALL', verbose = false)
  output = TerminalNotifier::Guard.execute(verbose, :list => group)
  return if output.strip.empty?

  require 'time'
  notifications = output.split("\n")[1..-1].map do |line|
    LIST_FIELDS.zip(line.split("\t")).inject({}) do |hash, (key, value)|
      hash[key] = key == :delivered_at ? Time.parse(value) : (value unless value == '(null)')
      hash
    end
  end

  group == 'ALL' ? notifications : notifications.first
end

.notify(message, options = {}, verbose = false) ⇒ Object

Sends a User Notification and returns wether or not it was a success.

The available options are ‘:title`, `:group`, `:activate`, `:open`, and `:execute`. For a description of each option see:

https://github.com/alloy/terminal-notifier/blob/master/README.markdown

Examples are:

TerminalNotifier::Guard.notify('Hello World')
TerminalNotifier::Guard.notify('Hello World', :title => 'Ruby')
TerminalNotifier::Guard.notify('Hello World', :group => Process.pid)
TerminalNotifier::Guard.notify('Hello World', :activate => 'com.apple.Safari')
TerminalNotifier::Guard.notify('Hello World', :open => 'http://twitter.com/alloy')
TerminalNotifier::Guard.notify('Hello World', :execute => 'say "OMG"')

Raises if not supported on the current platform.



89
90
91
92
# File 'lib/terminal-notifier-guard.rb', line 89

def notify(message, options = {}, verbose = false)
  TerminalNotifier::Guard.execute(verbose, options.merge(:message => message))
  $?.success?
end

.osx_versionObject



7
8
9
# File 'lib/terminal-notifier-guard.rb', line 7

def self.osx_version
  Gem::Version.new(`sw_vers -productVersion`.strip)
end

.pending(message, options = {}, verbose = false) ⇒ Object



101
102
103
104
# File 'lib/terminal-notifier-guard.rb', line 101

def pending(message, options = {}, verbose = false)
  TerminalNotifier::Guard.execute(verbose, options.merge(:message => message, :type => :pending))
  $?.success?
end

.remove(group = 'ALL', verbose = false) ⇒ Object

Removes a notification that was previously sent with the specified ‘group’ ID, if one exists.

If no ‘group’ ID is given, all notifications are removed.



124
125
126
127
# File 'lib/terminal-notifier-guard.rb', line 124

def remove(group = 'ALL', verbose = false)
  TerminalNotifier::Guard.execute(verbose, :remove => group)
  $?.success?
end

.success(message, options = {}, verbose = false) ⇒ Object



107
108
109
110
# File 'lib/terminal-notifier-guard.rb', line 107

def success(message, options = {}, verbose = false)
  TerminalNotifier::Guard.execute(verbose, options.merge(:message => message, :type => :success))
  $?.success?
end

.terminal_notifier_versionObject



11
12
13
14
15
16
17
# File 'lib/terminal-notifier-guard.rb', line 11

def self.terminal_notifier_version
  return Gem::Version("0.0.0") unless installed?
  # invoke the help option since the binary otherwise may get stuck
  Gem::Version.new(`#{bin_path} -help`.lines.first.match(/\d\.\d\.\d/)[0])
rescue
  Gem::Version.new("0.0.0")
end