module MacosUtility

Main MacosUtility module, a static module used for handling Mac Operating System functionality

Constants

VERSION

Public Class Methods

change_desktop_background(file) click to toggle source

Change desktop background

Example:

>> MacosUtility.change_desktop_background("/Library/Desktop Pictures/Desert.jpg")
=> true

Arguments:

file: (String)
# File lib/macos_utility.rb, line 98
def self.change_desktop_background(file)
  raise Constants::NOT_A_FILE_ERROR unless File.ftype(file) == Constants::FY_FILE_TYPE
  pid = spawn(
      "osascript -e 'tell application \"System Events\" to set picture of every desktop to \"#{file}\"'"
  )
  manage_cmd_process(pid, Constants::UPDATE_DESKTOP_WALLPAPER_TIMEOUT)
end
get_processes(process_name: nil, process_id: nil) click to toggle source

Get all running processes

Example:

>> MacosUtility.get_processes
=> [ProcessObj]

Example:

>> MacosUtility.get_processes(process_name: "bash")
=> ProcessObj

Example:

>> MacosUtility.get_processes(process_id: 1234)
=> ProcessObj

Arguments:

process_name: (String)
process_id: (Integer)
# File lib/macos_utility.rb, line 26
def self.get_processes(process_name: nil, process_id: nil)
  command = "ps aux"
  command += " | grep #{process_name}" if process_name
  r, w = IO.pipe

  # dont worry about closing the process with ps command
  begin_process(command, out: w)

  w.close
  stream = r.read.split(/\n/)
  r.close

  stream.shift unless process_name
  stream.select! {|result| result.split(' ').length == 11 && !result.match(/(grep)/)}

  processes = stream.map do |itm|
    # USER               PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
    # joshuawilkosz      313   8.6  5.4 14763108 900940   ??  R     9:49PM   3:27.95 /Applications/RubyMine.app/Contents/MacOS/rubymine -psn_0_69649
    args = itm.split(' ')
    ProcessObj.new(
        args[0],
        args[1].to_i,
        args[2].to_f,
        args[3].to_f,
        args[4].to_i,
        args[5].to_i,
        args[6],
        args[7],
        args[8],
        args[9],
        args[10]
    )
  end
  processes.select! {|process| process.pid == process_id} if process_id && process_name.nil?
  if process_name || process_id
    processes.first
  else
    processes
  end
end
kill_process(pid) click to toggle source

Kill a running process

Example:

>> MacosUtility.kill_process(100)
=> nil

Arguments:

pid: (Integer)
# File lib/macos_utility.rb, line 76
def self.kill_process(pid)
  return if pid.nil?
  command = "kill -9 #{pid}"
  r, w = IO.pipe

  pid = begin_process(command, out: w)

  w.close
  result = r.read
  r.close
  result
end
manage_cmd_process(pid, limit_seconds) click to toggle source

Manage execution of process with process id handle

Example:

>> MacosUtility.manage_cmd_process(10, 10)
=> true

Arguments:

pid: (Numeric)
limit_seconds: (Numeric)
# File lib/macos_utility.rb, line 116
def self.manage_cmd_process(pid, limit_seconds)
  begin
    status = nil
    Timeout::timeout(limit_seconds) do
      status = Process.waitpid(pid) if pid
    end
    status
  rescue => e
    if pid
      Process.kill(Constants::KILL_PROCESS_CODE, pid)
      Process.detach(pid)
    end
    raise e.message
  end
end

Private Class Methods

begin_process(command, out: nil, err: nil) click to toggle source
# File lib/macos_utility.rb, line 134
def self.begin_process(command, out: nil, err: nil)
  error = err ? err : out
  Process.spawn(command, :out=>out, :err=>error)
end