Class: Launchy::Detect::Runner

Inherits:
Object
  • Object
show all
Extended by:
Launchy::DescendantTracker
Defined in:
lib/launchy/detect/runner.rb

Direct Known Subclasses

Forkable, Jruby, Windows

Defined Under Namespace

Classes: Forkable, Jruby, NotFoundError, Windows

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Launchy::DescendantTracker

children, find_child, inherited

Class Method Details

.detectObject

Detect the current command runner

This will return an instance of the Runner to be used to do the application launching.

If a runner cannot be detected then raise Runner::NotFoundError

The runner rules are, in order:

1) If you are on windows, you use the Windows Runner no matter what 2) If you are using the jruby engine, use the Jruby Runner. Unless rule

(1) took effect

3) Use Forkable (barring rules (1) and (2))



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/launchy/detect/runner.rb', line 22

def self.detect
  host_os_family = Launchy::Detect::HostOsFamily.detect
  ruby_engine    = Launchy::Detect::RubyEngine.detect

  return Windows.new if host_os_family.windows?
  if ruby_engine.jruby? then
    require 'spoon'
    return Jruby.new
  end
  return Forkable.new 
end

Instance Method Details

#commandline_normalize(cmdline) ⇒ Object



46
47
48
49
50
51
# File 'lib/launchy/detect/runner.rb', line 46

def commandline_normalize( cmdline )
  c = cmdline.flatten!
  c = c.find_all { |a| (not a.nil?) and ( a.size > 0 ) }
  Launchy.log "commandline_normalized => #{c.join(' ')}"
  return c
end

#dry_run(cmd, *args) ⇒ Object



53
54
55
# File 'lib/launchy/detect/runner.rb', line 53

def dry_run( cmd, *args )
  shell_commands(cmd, args).join(" ")
end

#run(cmd, *args) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/launchy/detect/runner.rb', line 57

def run( cmd, *args )
  if Launchy.dry_run? then
    $stdout.puts dry_run( cmd, *args )
  else
    wet_run( cmd, *args )
  end
end

#shell_commands(cmd, args) ⇒ Object

cut it down to just the shell commands that will be passed to exec or posix_spawn. The cmd argument is split according to shell rules and the args are not escaped because they whole set is passed to system as *args and in that case system shell escaping rules are not done.



40
41
42
43
44
# File 'lib/launchy/detect/runner.rb', line 40

def shell_commands( cmd, args )
  cmdline = [ cmd.shellsplit ]
  cmdline << args.flatten.collect{ |a| a.to_s }
  return commandline_normalize( cmdline )
end