launchy 0.3.2 → 0.3.3
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.
- data/{CHANGES → HISTORY} +18 -11
- data/README +19 -37
- data/Rakefile +62 -0
- data/bin/launchy +0 -0
- data/gemspec.rb +41 -0
- data/lib/launchy.rb +46 -51
- data/lib/launchy/application.rb +160 -149
- data/lib/launchy/browser.rb +89 -76
- data/lib/launchy/command_line.rb +38 -38
- data/lib/launchy/paths.rb +53 -0
- data/lib/launchy/version.rb +12 -13
- data/spec/application_spec.rb +51 -52
- data/spec/browser_spec.rb +46 -46
- data/spec/launchy_spec.rb +13 -13
- data/spec/paths_spec.rb +15 -0
- data/spec/version_spec.rb +6 -6
- data/tasks/announce.rake +39 -0
- data/tasks/config.rb +107 -0
- data/tasks/distribution.rake +46 -0
- data/tasks/documentation.rake +32 -0
- data/tasks/rspec.rake +29 -0
- data/tasks/rubyforge.rake +52 -0
- data/tasks/utils.rb +80 -0
- metadata +58 -30
- data/lib/launchy/gemspec.rb +0 -53
- data/lib/launchy/specification.rb +0 -133
data/lib/launchy/browser.rb
CHANGED
@@ -2,84 +2,97 @@ require 'launchy/application'
|
|
2
2
|
require 'uri'
|
3
3
|
|
4
4
|
module Launchy
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
class Browser < Application
|
6
|
+
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def desktop_environment_browser_launchers
|
10
|
+
@desktop_environment_browser_launchers ||= {
|
11
|
+
:kde => "kfmclient",
|
12
|
+
:gnome => "gnome-open",
|
13
|
+
:xfce => "exo-open",
|
14
|
+
:generic => "htmlview"
|
12
15
|
}
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def initialize
|
36
|
-
raise "Unable to find browser to launch for os family '#{my_os_family}'." unless browser
|
37
|
-
end
|
38
|
-
|
39
|
-
# Find a list of potential browser applications to run on *nix machines.
|
40
|
-
# The order is:
|
41
|
-
# 1) What is in ENV['LAUNCHY_BROWSER'] or ENV['BROWSER']
|
42
|
-
# 2) xdg-open
|
43
|
-
# 3) desktop environment launcher program
|
44
|
-
# 4) a list of fallback browsers
|
45
|
-
def nix_app_list
|
46
|
-
if not @nix_app_list then
|
47
|
-
browser_cmds = ['xdg-open']
|
48
|
-
browser_cmds << DESKTOP_ENVIRONMENT_BROWSER_LAUNCHERS[nix_desktop_environment]
|
49
|
-
browser_cmds << FALLBACK_BROWSERS
|
50
|
-
browser_cmds.flatten!
|
51
|
-
browser_cmds.delete_if { |b| b.nil? || (b.strip.size == 0) }
|
52
|
-
Launchy.log "#{self.class.name} : Initial *Nix Browser List: #{browser_cmds.join(', ')}"
|
53
|
-
@nix_app_list = browser_cmds.collect { |bin| find_executable(bin) }.find_all { |x| not x.nil? }
|
54
|
-
Launchy.log "#{self.class.name} : Filtered *Nix Browser List: #{@nix_app_list.join(', ')}"
|
55
|
-
end
|
56
|
-
@nix_app_list
|
57
|
-
end
|
58
|
-
|
59
|
-
# return the full command line path to the browser or nil
|
60
|
-
def browser
|
61
|
-
if not @browser then
|
62
|
-
if ENV['LAUNCHY_BROWSER'] and File.exists?(ENV['LAUNCHY_BROWSER']) then
|
63
|
-
Launchy.log "#{self.class.name} : Using LAUNCHY_BROWSER environment variable : #{ENV['LAUNCHY_BROWSER']}"
|
64
|
-
@browser = ENV['LAUNCHY_BROWSER']
|
65
|
-
elsif ENV['BROWSER'] and File.exists?(ENV['BROWSER']) then
|
66
|
-
Launchy.log "#{self.class.name} : Using BROWSER environment variable : #{ENV['BROWSER']}"
|
67
|
-
@browser = ENV['BROWSER']
|
68
|
-
elsif app_list.size > 0 then
|
69
|
-
@browser = app_list.first
|
70
|
-
Launchy.log "#{self.class.name} : Using application list : #{@browser}"
|
71
|
-
else
|
72
|
-
msg = "Unable to launch. No Browser application found."
|
73
|
-
Launchy.log "#{self.class.name} : #{msg}"
|
74
|
-
$stderr.puts msg
|
75
|
-
end
|
76
|
-
end
|
77
|
-
return @browser
|
16
|
+
end
|
17
|
+
def fallback_browsers
|
18
|
+
@fallback_browsers ||= %w[ firefox seamonkey opera mozilla netscape galeon ]
|
19
|
+
end
|
20
|
+
def run(*args)
|
21
|
+
Browser.new.visit(args[0])
|
22
|
+
end
|
23
|
+
|
24
|
+
# return true if this class can handle the given parameter(s)
|
25
|
+
def handle?(*args)
|
26
|
+
begin
|
27
|
+
Launchy.log "#{self.name} : testing if [#{args[0]}] (#{args[0].class}) is a url."
|
28
|
+
uri = URI.parse(args[0])
|
29
|
+
result = [URI::HTTP, URI::HTTPS, URI::FTP].include?(uri.class)
|
30
|
+
rescue Exception => e
|
31
|
+
# hmm... why does rcov not see that this is executed ?
|
32
|
+
Launchy.log "#{self.name} : not a url, #{e}"
|
33
|
+
return false
|
78
34
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
@browser = nil
|
40
|
+
@nix_app_list = nil
|
41
|
+
raise "Unable to find browser to launch for os family '#{my_os_family}'." unless browser
|
42
|
+
end
|
43
|
+
|
44
|
+
def desktop_environment_browser_launchers
|
45
|
+
self.class.desktop_environment_browser_launchers
|
46
|
+
end
|
47
|
+
|
48
|
+
def fallback_browsers
|
49
|
+
self.class.fallback_browsers
|
50
|
+
end
|
51
|
+
|
52
|
+
# Find a list of potential browser applications to run on *nix machines.
|
53
|
+
# The order is:
|
54
|
+
# 1) What is in ENV['LAUNCHY_BROWSER'] or ENV['BROWSER']
|
55
|
+
# 2) xdg-open
|
56
|
+
# 3) desktop environment launcher program
|
57
|
+
# 4) a list of fallback browsers
|
58
|
+
def nix_app_list
|
59
|
+
if not @nix_app_list then
|
60
|
+
browser_cmds = ['xdg-open']
|
61
|
+
browser_cmds << desktop_environment_browser_launchers[nix_desktop_environment]
|
62
|
+
browser_cmds << fallback_browsers
|
63
|
+
browser_cmds.flatten!
|
64
|
+
browser_cmds.delete_if { |b| b.nil? || (b.strip.size == 0) }
|
65
|
+
Launchy.log "#{self.class.name} : Initial *Nix Browser List: #{browser_cmds.join(', ')}"
|
66
|
+
@nix_app_list = browser_cmds.collect { |bin| find_executable(bin) }.find_all { |x| not x.nil? }
|
67
|
+
Launchy.log "#{self.class.name} : Filtered *Nix Browser List: #{@nix_app_list.join(', ')}"
|
68
|
+
end
|
69
|
+
@nix_app_list
|
70
|
+
end
|
71
|
+
|
72
|
+
# return the full command line path to the browser or nil
|
73
|
+
def browser
|
74
|
+
if not @browser then
|
75
|
+
if ENV['LAUNCHY_BROWSER'] and File.exists?(ENV['LAUNCHY_BROWSER']) then
|
76
|
+
Launchy.log "#{self.class.name} : Using LAUNCHY_BROWSER environment variable : #{ENV['LAUNCHY_BROWSER']}"
|
77
|
+
@browser = ENV['LAUNCHY_BROWSER']
|
78
|
+
elsif ENV['BROWSER'] and File.exists?(ENV['BROWSER']) then
|
79
|
+
Launchy.log "#{self.class.name} : Using BROWSER environment variable : #{ENV['BROWSER']}"
|
80
|
+
@browser = ENV['BROWSER']
|
81
|
+
elsif app_list.size > 0 then
|
82
|
+
@browser = app_list.first
|
83
|
+
Launchy.log "#{self.class.name} : Using application list : #{@browser}"
|
84
|
+
else
|
85
|
+
msg = "Unable to launch. No Browser application found."
|
86
|
+
Launchy.log "#{self.class.name} : #{msg}"
|
87
|
+
$stderr.puts msg
|
83
88
|
end
|
89
|
+
end
|
90
|
+
return @browser
|
91
|
+
end
|
92
|
+
|
93
|
+
# launch the browser at the appointed url
|
94
|
+
def visit(url)
|
95
|
+
run(browser,url)
|
84
96
|
end
|
97
|
+
end
|
85
98
|
end
|
data/lib/launchy/command_line.rb
CHANGED
@@ -1,48 +1,48 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
|
3
3
|
module Launchy
|
4
|
-
|
4
|
+
class CommandLine
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
6
|
+
def parser
|
7
|
+
@parser ||= OptionParser.new do |op|
|
8
|
+
op.banner = "Usage: launchy [options] url"
|
9
|
+
op.separator ""
|
10
|
+
op.on("-d", "--debug", "Force debug, output lots of information.",
|
11
|
+
"This sets the LAUNCHY_DEBUG environment variable to 'true'.") do |d|
|
12
|
+
ENV["LAUNCHY_DEBUG"] = 'true'
|
13
|
+
end
|
14
|
+
|
15
|
+
op.on("-h", "--help", "Print this message") do |h|
|
16
|
+
puts op.to_s
|
17
|
+
exit 0
|
18
|
+
end
|
19
|
+
|
20
|
+
op.on("-v", "--version", "Output the version of Launchy") do |v|
|
21
|
+
puts "Launchy version #{Launchy::VERSION}"
|
22
|
+
exit 0
|
23
|
+
end
|
19
24
|
|
20
|
-
|
21
|
-
puts "Launchy version #{Launchy::VERSION}"
|
22
|
-
exit 0
|
23
|
-
end
|
24
|
-
|
25
|
-
op.on("-o", "--host-os HOST_OS","Force the behavior of a particular host os.",
|
25
|
+
op.on("-o", "--host-os HOST_OS","Force the behavior of a particular host os.",
|
26
26
|
"This sets the LAUNCHY_HOST_OS environment variable.") do |os|
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
op.on("-b", "--browser BROWSER", "Force launchy to use a particular browser.",
|
31
|
-
"This sets the LAUNCHY_BROWSER environment variable.") do |browser|
|
32
|
-
ENV["LAUNCHY_BROWSER"] = browser
|
33
|
-
end
|
34
|
-
end
|
27
|
+
ENV["LAUNCHY_HOST_OS"] = os
|
35
28
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
Launchy.open(*argv)
|
41
|
-
rescue ::OptionParser::ParseError => pe
|
42
|
-
$stderr.puts "#{parser.programn_name}: #{pe}"
|
43
|
-
$stderr.puts "Try `#{parser.program_name} --help' for more information."
|
44
|
-
exit 1
|
45
|
-
end
|
29
|
+
|
30
|
+
op.on("-b", "--browser BROWSER", "Force launchy to use a particular browser.",
|
31
|
+
"This sets the LAUNCHY_BROWSER environment variable.") do |browser|
|
32
|
+
ENV["LAUNCHY_BROWSER"] = browser
|
46
33
|
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def run(argv = ARGV)
|
38
|
+
begin
|
39
|
+
parser.parse!(argv)
|
40
|
+
Launchy.open(*argv)
|
41
|
+
rescue ::OptionParser::ParseError => pe
|
42
|
+
$stderr.puts "#{parser.programn_name}: #{pe}"
|
43
|
+
$stderr.puts "Try `#{parser.program_name} --help' for more information."
|
44
|
+
exit 1
|
45
|
+
end
|
47
46
|
end
|
47
|
+
end
|
48
48
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2007 Jeremy Hinegardner
|
3
|
+
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
|
+
#++
|
5
|
+
#
|
6
|
+
module Launchy
|
7
|
+
#
|
8
|
+
# Access to various paths inside the project programatically
|
9
|
+
#
|
10
|
+
module Paths
|
11
|
+
#
|
12
|
+
# :call-seq:
|
13
|
+
# Launchy::Paths.root_dir -> String
|
14
|
+
#
|
15
|
+
# Returns The full expanded path of the parent directory of +lib+
|
16
|
+
# going up the path from the current file. A trailing File::SEPARATOR⋅
|
17
|
+
# is guaranteed
|
18
|
+
#
|
19
|
+
def self.root_dir
|
20
|
+
@root_dir ||=(
|
21
|
+
path_parts = ::File.expand_path( __FILE__ ).split( ::File::SEPARATOR )
|
22
|
+
lib_index = path_parts.rindex( "lib" )
|
23
|
+
@root_dir = path_parts[0...lib_index].join( ::File::SEPARATOR ) + ::File::SEPARATOR
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# :call-seq:
|
29
|
+
# Launchy::Paths.lib_path( *args ) -> String
|
30
|
+
#
|
31
|
+
# Returns The full expanded path of the +lib+ directory below
|
32
|
+
# _root_dir_. All parameters passed in are joined onto the⋅
|
33
|
+
# result. A trailing File::SEPARATOR is guaranteed if⋅
|
34
|
+
# _args_ are *not* present.
|
35
|
+
#
|
36
|
+
def self.lib_path( *args )
|
37
|
+
self.sub_path( "lib", *args )
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# :call-seq:
|
42
|
+
# Launchy::Paths.sub_path( sub, *args ) -> String
|
43
|
+
#
|
44
|
+
# Returns the full expanded path of the +sub+ directory below _root_dir. All
|
45
|
+
# _arg_ parameters passed in are joined onto the result. A trailing
|
46
|
+
# File::SEPARATOR is guaranteed if _args_ are *not* present.
|
47
|
+
#
|
48
|
+
def self.sub_path( sub, *args )
|
49
|
+
sp = ::File.join( root_dir, sub ) + File::SEPARATOR
|
50
|
+
sp = ::File.join( sp, *args ) if args
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/launchy/version.rb
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
module Launchy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
module Version
|
3
|
+
MAJOR = 0
|
4
|
+
MINOR = 3
|
5
|
+
BUILD = 3
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
7
|
+
def self.to_a
|
8
|
+
[MAJOR, MINOR, BUILD]
|
9
|
+
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
11
|
+
def self.to_s
|
12
|
+
to_a.join(".")
|
16
13
|
end
|
17
|
-
|
14
|
+
STRING = Version.to_s.freeze
|
15
|
+
end
|
16
|
+
VERSION = Version.to_s.freeze
|
18
17
|
end
|
data/spec/application_spec.rb
CHANGED
@@ -2,58 +2,57 @@ require File.join(File.dirname(__FILE__),"spec_helper.rb")
|
|
2
2
|
require 'yaml'
|
3
3
|
|
4
4
|
describe Launchy::Application do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
before(:each) do
|
6
|
+
yml = YAML::load(IO.read(File.join(File.dirname(__FILE__),"tattle-host-os.yml")))
|
7
|
+
@host_os = yml['host_os']
|
8
|
+
@app = Launchy::Application.new
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should not find os of 'dos'" do
|
18
|
-
@app.my_os_family('dos').should == :unknown
|
19
|
-
end
|
20
|
-
|
21
|
-
it "my os should have a value" do
|
22
|
-
@app.my_os.should_not == ''
|
23
|
-
@app.my_os.should_not == nil
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should find open" do
|
27
|
-
@app.find_executable('open').should == "/usr/bin/open"
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should not find app xyzzy" do
|
31
|
-
@app.find_executable('xyzzy').should == nil
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should find the correct class to launch an ftp url" do
|
35
|
-
Launchy::Application.find_application_class_for("ftp://ftp.ruby-lang.org/pub/ruby/").should == Launchy::Browser
|
36
|
-
end
|
37
|
-
|
38
|
-
it "knows when it cannot find an application class" do
|
39
|
-
Launchy::Application.find_application_class_for("xyzzy:stuff,things").should == nil
|
40
|
-
end
|
41
|
-
|
42
|
-
it "allows for environmental override of host_os" do
|
43
|
-
ENV["LAUNCHY_HOST_OS"] = "hal-9000"
|
44
|
-
Launchy::Application.my_os.should == "hal-9000"
|
45
|
-
ENV["LAUNCHY_HOST_OS"] = nil
|
46
|
-
end
|
47
|
-
|
48
|
-
it "can detect the desktop environment of a *nix machien" do
|
49
|
-
@app.nix_desktop_environment.should == :generic
|
50
|
-
|
51
|
-
{ "KDE_FULL_SESSION" => :kde,
|
52
|
-
"KDE_SESSION_UID" => :kde,
|
53
|
-
"GNOME_DESKTOP_SESSION_ID" => :gnome }.each_pair do |k,v|
|
54
|
-
ENV[k] = "launchy-test"
|
55
|
-
Launchy::Application.new.nix_desktop_environment.should == v
|
56
|
-
ENV[k] = nil
|
57
|
-
end
|
11
|
+
YAML::load(IO.read(File.join(File.dirname(__FILE__), "tattle-host-os.yml")))['host_os'].keys.sort.each do |os|
|
12
|
+
it "#{os} should be a found os" do
|
13
|
+
Launchy::Application::known_os_families.should include(@app.my_os_family(os))
|
58
14
|
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should not find os of 'dos'" do
|
18
|
+
@app.my_os_family('dos').should eql(:unknown)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "my os should have a value" do
|
22
|
+
@app.my_os.should_not eql('')
|
23
|
+
@app.my_os.should_not eql(nil)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should find open" do
|
27
|
+
@app.find_executable('open').should eql("/usr/bin/open")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not find app xyzzy" do
|
31
|
+
@app.find_executable('xyzzy').should eql(nil)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should find the correct class to launch an ftp url" do
|
35
|
+
Launchy::Application.find_application_class_for("ftp://ftp.ruby-lang.org/pub/ruby/").should == Launchy::Browser
|
36
|
+
end
|
37
|
+
|
38
|
+
it "knows when it cannot find an application class" do
|
39
|
+
Launchy::Application.find_application_class_for("xyzzy:stuff,things").should == nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "allows for environmental override of host_os" do
|
43
|
+
ENV["LAUNCHY_HOST_OS"] = "hal-9000"
|
44
|
+
Launchy::Application.my_os.should eql("hal-9000")
|
45
|
+
ENV["LAUNCHY_HOST_OS"] = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
{ "KDE_FULL_SESSION" => :kde,
|
49
|
+
"KDE_SESSION_UID" => :kde,
|
50
|
+
"GNOME_DESKTOP_SESSION_ID" => :gnome }.each_pair do |k,v|
|
51
|
+
it "can detect the desktop environment of a *nix machine using #{k}" do
|
52
|
+
@app.nix_desktop_environment.should eql(:generic)
|
53
|
+
ENV[k] = "launchy-test"
|
54
|
+
Launchy::Application.new.nix_desktop_environment.should eql(v)
|
55
|
+
ENV[k] = nil
|
56
|
+
end
|
57
|
+
end
|
59
58
|
end
|