Module: TerminalNotifier

Defined in:
lib/terminal-notifier.rb

Defined Under Namespace

Classes: UnsupportedPlatformError

Constant Summary collapse

BIN_PATH =
File.expand_path('../../vendor/terminal-notifier', __FILE__)
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.10, or higher.

Returns:

  • (Boolean)


10
11
12
# File 'lib/terminal-notifier.rb', line 10

def self.available?
  @available ||= (/darwin|mac os/ =~ RbConfig::CONFIG['host_os']) && Gem::Version.new(version) > Gem::Version.new('10.10')
end

.execute(verbose, options) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/terminal-notifier.rb', line 18

def self.execute(verbose, options)
  if available?
    command = [BIN_PATH, *options.map { |k,v| v = v.to_s; ["-#{k}", "#{v[0] == "-" ? " " : ""}#{Shellwords.escape(v[0,1])}#{v[1..-1]}"] }.flatten]
    command = Shellwords.join(command) if RUBY_VERSION < '1.9'
    result = ''
    IO.popen(command) do |stdout|
      output = stdout.read
      STDOUT.print output if verbose
      result << output
    end
    result
  else
    STDERR.print "terminal-notifier is only supported on Mac OS X 10.10, or higher."
  end
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`.



78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/terminal-notifier.rb', line 78

def list(group = 'ALL', verbose = false)
  output = TerminalNotifier.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 whether or not it was a success.

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

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

Examples are:

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

Raises if not supported on the current platform.



53
54
55
56
# File 'lib/terminal-notifier.rb', line 53

def notify(message, options = {}, verbose = false)
  TerminalNotifier.execute(verbose, options.merge(:message => message))
  $? && $?.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.



63
64
65
66
# File 'lib/terminal-notifier.rb', line 63

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

.versionObject



14
15
16
# File 'lib/terminal-notifier.rb', line 14

def self.version
  @version ||= `uname`.strip == 'Darwin' && `sw_vers -productVersion`.strip
end