launchy 2.5.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +1 -0
- data/HISTORY.md +31 -20
- data/LICENSE +1 -1
- data/Manifest.txt +1 -5
- data/README.md +10 -47
- data/Rakefile +7 -5
- data/lib/launchy/application.rb +18 -3
- data/lib/launchy/applications/browser.rb +2 -2
- data/lib/launchy/cli.rb +1 -6
- data/lib/launchy/detect/host_os.rb +1 -1
- data/lib/launchy/detect/host_os_family.rb +2 -2
- data/lib/launchy/detect.rb +0 -2
- data/lib/launchy/runner.rb +46 -0
- data/lib/launchy/version.rb +1 -1
- data/lib/launchy.rb +18 -14
- data/spec/applications/browser_spec.rb +9 -14
- data/spec/cli_spec.rb +5 -6
- data/spec/launchy_spec.rb +29 -6
- data/spec/mock_application.rb +4 -0
- data/spec/spec_helper.rb +2 -5
- data/tasks/default.rake +24 -16
- data/tasks/this.rb +3 -3
- metadata +45 -23
- data/lib/launchy/deprecated.rb +0 -52
- data/lib/launchy/detect/ruby_engine.rb +0 -78
- data/lib/launchy/detect/runner.rb +0 -152
- data/spec/detect/ruby_engine_spec.rb +0 -37
- data/spec/detect/runner_spec.rb +0 -103
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d637a77afa69826953a3226c55fc20334c6fa90e268912bcf9a208bc9b448e2
|
4
|
+
data.tar.gz: 2f5ff5e1401319e3a97655848f4f61b9bb33e786cd1b22b76aa20a7729e0b885
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb02ca4bd30a8394ca2a6c8e86518eb4f403d5b56c574f7730d1581a19ca686c94a001c641a09620b799b620f9d8e6be54ad39c27bb980e67268d01f68d8eae1
|
7
|
+
data.tar.gz: ba3bc128ef33d39c87b50e187ca71e0f39a2382cdf3513122ec1a108b71a55d2e2a8e0f81f138a27b8c9b1f74b8df183fe0b626d9718236efb3cb6a653fd1e62
|
data/CONTRIBUTING.md
CHANGED
@@ -51,6 +51,7 @@ easiest way to contribute.
|
|
51
51
|
* [Daniel Farina](https://github.com/fdr)
|
52
52
|
* [Jack Turnbull](https://github.com/jackturnbull)
|
53
53
|
* [Jeremy Moritz](https://github.com/jeremymoritz)
|
54
|
+
* [Jamie Donnelly](https://github.com/JamieKDonnelly)
|
54
55
|
|
55
56
|
[GitHub Account]: https://github.com/signup/free "GitHub Signup"
|
56
57
|
[GitHub Issues]: https://github.com/copiousfreetime/launchy/issues "Launchy Issues"
|
data/HISTORY.md
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
# Launchy Changelog
|
2
|
+
## Version 3.0.0 - 2024-03-03
|
3
|
+
* Remove unused `deprecated.rb` file - <https://github.com/copiousfreetime/launchy/issues/148>
|
4
|
+
* Update supported ruby versin to be 3.x
|
5
|
+
* use the `:application` parameter - <https://github.com/copiousfreetime/launchy/issues/121>
|
6
|
+
* adjust the semaphore configuration to allow better caching
|
7
|
+
* replace the homegrown process runner with [`childprocess`](https://rubygems.org/gems/childprocess)
|
8
|
+
|
9
|
+
## Version 2.5.2 - 2022-12-27
|
10
|
+
* Update Addressable - <https://github.com/copiousfreetime/launchy/pull/145> - JamieKDonnelly
|
11
|
+
* Fix deprecated usage of `Object#=~` - <https://github.com/copiousfreetime/launchy/pull/138> - marcrohloff
|
12
|
+
* Move to sempahore for matrix builds and macos tests
|
2
13
|
|
3
14
|
## Version 2.5.0 - 2020-02-27
|
4
15
|
* Update depedencies
|
@@ -21,12 +32,12 @@
|
|
21
32
|
* Abstract out the argv of the commandline - <https://github.com/copiousfreetime/launchy/issues/71>
|
22
33
|
|
23
34
|
## Version 2.4.0 - 2013-11-12
|
24
|
-
* Support `Launchy.open( url, :debug => true )` - <
|
25
|
-
* Fix inconsistencies in `debug?` and `dry_run?` methods - <
|
26
|
-
* Fix detection of missing *nix desktops - <
|
27
|
-
* Fix running tests in bare Linux environment - <
|
28
|
-
* Fix mistaking windows drive as uri schema - <
|
29
|
-
* Attempt fixing windows `start` command oddities, again - <
|
35
|
+
* Support `Launchy.open( url, :debug => true )` - <https://github.com/copiousfreetime/launchy/issues/63> - schmich
|
36
|
+
* Fix inconsistencies in `debug?` and `dry_run?` methods - <https://github.com/copiousfreetime/launchy/issues/63> - schmich
|
37
|
+
* Fix detection of missing *nix desktops - <https://github.com/copiousfreetime/launchy/issues/70>
|
38
|
+
* Fix running tests in bare Linux environment - <https://github.com/copiousfreetime/launchy/issues/67> - gioele
|
39
|
+
* Fix mistaking windows drive as uri schema - <https://github.com/copiousfreetime/launchy/issues/65>
|
40
|
+
* Attempt fixing windows `start` command oddities, again - <https://github.com/copiousfreetime/launchy/issues/62>
|
30
41
|
|
31
42
|
## Version 2.3.0 - 2013-04-11
|
32
43
|
|
@@ -34,39 +45,39 @@
|
|
34
45
|
|
35
46
|
## Version 2.2.0 - 2013-02-06
|
36
47
|
|
37
|
-
* Change XFCE detection to not depend on grep <
|
38
|
-
* Suppress forked process output <
|
39
|
-
* Display help/usage if no url is given <
|
40
|
-
* Detect the fluxbox environment <
|
41
|
-
* Automatically detect `http` url's if they are missing the `http://` <
|
48
|
+
* Change XFCE detection to not depend on grep <https://github.com/copiousfreetime/launchy/issues/52> - bogdan
|
49
|
+
* Suppress forked process output <https://github.com/copiousfreetime/launchy/issues/51>
|
50
|
+
* Display help/usage if no url is given <https://github.com/copiousfreetime/launchy/issues/54>
|
51
|
+
* Detect the fluxbox environment <https://github.com/copiousfreetime/launchy/issues/53>
|
52
|
+
* Automatically detect `http` url's if they are missing the `http://` <https://github.com/copiousfreetime/launchy/issues/55>
|
42
53
|
* Update to latest project management rake tasks
|
43
54
|
|
44
55
|
## Version 2.1.2 - 2012-08-06
|
45
56
|
|
46
|
-
* Fix where HostOS would fail to convert to string on JRuby in 1.9 mode <
|
57
|
+
* Fix where HostOS would fail to convert to string on JRuby in 1.9 mode <https://github.com/copiousfreetime/launchy/issues/45>
|
47
58
|
|
48
59
|
## Version 2.1.1 - 2012-07-28
|
49
60
|
|
50
|
-
* Update addressable runtime dependency <
|
61
|
+
* Update addressable runtime dependency <https://github.com/copiousfreetime/launchy/issues/47>
|
51
62
|
* Bring minitest and ffi development dependencies up to date
|
52
63
|
|
53
64
|
## Version 2.1.0 - 2012-03-18
|
54
65
|
|
55
|
-
* Fix raising exception when no browser program found <
|
66
|
+
* Fix raising exception when no browser program found <https://github.com/copiousfreetime/launchy/issues/42>
|
56
67
|
* Add `LAUNCHY_DRY_RUN` environment variable (Mariusz Pietrzyk / wijet)
|
57
68
|
* Update dependencies
|
58
69
|
|
59
70
|
## Version 2.0.5 - 2011-07-24
|
60
71
|
|
61
|
-
* Fix the case where `$BROWSER` is set and no *nix desktop was found <
|
72
|
+
* Fix the case where `$BROWSER` is set and no *nix desktop was found <https://github.com/copiousfreetime/launchy/issues/33>
|
62
73
|
|
63
74
|
## Version 2.0.4 - 2011-07-23
|
64
75
|
|
65
|
-
* Fix windows `start` commandline <
|
66
|
-
* Add capability to open local files with no file: scheme present <
|
67
|
-
* Added `rake how_to_contribute` task <
|
68
|
-
* Make better decisions on when to do shell escaping <
|
69
|
-
* Switch to Addressable::URI so UTF-8 urls may be parsed. <
|
76
|
+
* Fix windows `start` commandline <https://github.com/copiousfreetime/launchy/issues/5>
|
77
|
+
* Add capability to open local files with no file: scheme present <https://github.com/copiousfreetime/launchy/issues/29>
|
78
|
+
* Added `rake how_to_contribute` task <https://github.com/copiousfreetime/launchy/issues/30>
|
79
|
+
* Make better decisions on when to do shell escaping <https://github.com/copiousfreetime/launchy/issues/31>
|
80
|
+
* Switch to Addressable::URI so UTF-8 urls may be parsed. <https://github.com/copiousfreetime/launchy/issues/32>
|
70
81
|
|
71
82
|
## Version 2.0.3 - 2011-07-17
|
72
83
|
|
data/LICENSE
CHANGED
data/Manifest.txt
CHANGED
@@ -10,16 +10,14 @@ lib/launchy/application.rb
|
|
10
10
|
lib/launchy/applications/browser.rb
|
11
11
|
lib/launchy/argv.rb
|
12
12
|
lib/launchy/cli.rb
|
13
|
-
lib/launchy/deprecated.rb
|
14
13
|
lib/launchy/descendant_tracker.rb
|
15
14
|
lib/launchy/detect.rb
|
16
15
|
lib/launchy/detect/host_os.rb
|
17
16
|
lib/launchy/detect/host_os_family.rb
|
18
17
|
lib/launchy/detect/nix_desktop_environment.rb
|
19
|
-
lib/launchy/detect/ruby_engine.rb
|
20
|
-
lib/launchy/detect/runner.rb
|
21
18
|
lib/launchy/error.rb
|
22
19
|
lib/launchy/os_family.rb
|
20
|
+
lib/launchy/runner.rb
|
23
21
|
lib/launchy/version.rb
|
24
22
|
spec/application_spec.rb
|
25
23
|
spec/applications/browser_spec.rb
|
@@ -27,8 +25,6 @@ spec/cli_spec.rb
|
|
27
25
|
spec/detect/host_os_family_spec.rb
|
28
26
|
spec/detect/host_os_spec.rb
|
29
27
|
spec/detect/nix_desktop_environment_spec.rb
|
30
|
-
spec/detect/ruby_engine_spec.rb
|
31
|
-
spec/detect/runner_spec.rb
|
32
28
|
spec/launchy_spec.rb
|
33
29
|
spec/mock_application.rb
|
34
30
|
spec/spec_helper.rb
|
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# launchy
|
2
2
|
|
3
|
-
[![Build Status](https://
|
4
|
-
|
3
|
+
[![Build Status](https://copiousfreetime.semaphoreci.com/badges/launchy/branches/main.svg)](https://copiousfreetime.semaphoreci.com/projects/launchy)
|
5
4
|
|
6
5
|
* [Homepage](https://github.com/copiousfreetime/launchy)
|
7
6
|
* [Github Project](https://github.com/copiousfreetime/launchy)
|
@@ -27,14 +26,14 @@ testing environment, or via its API.
|
|
27
26
|
|
28
27
|
### Commandline
|
29
28
|
|
30
|
-
% launchy
|
29
|
+
% launchy https://www.ruby-lang.org/
|
31
30
|
|
32
31
|
There are additional command line options, use `launchy --help` to see them.
|
33
32
|
|
34
33
|
### Using the `BROWSER` environment variable
|
35
34
|
|
36
35
|
Launchy has a predefined set of common browsers on each platform that it
|
37
|
-
attempts to use, and of course it is not exhaustive. As a
|
36
|
+
attempts to use, and of course it is not exhaustive. As a fallback you can make
|
38
37
|
use of the somewhat standard `BROWSER` environment variable.
|
39
38
|
|
40
39
|
`BROWSER` works in a similar same way to `PATH`. It is a colon (`:`) separated
|
@@ -43,10 +42,10 @@ you are attempting to open will be substituted there.
|
|
43
42
|
|
44
43
|
As an example if you set `BROWSER=/usr/local/bin/firefox-bin -new-tab
|
45
44
|
'%s':/usr/local/bin/google-chrome-stable` and you call
|
46
|
-
`Launchy.open("
|
45
|
+
`Launchy.open("https://www.ruby-lang.org/")` then Launchy will try, in order:
|
47
46
|
|
48
|
-
* `/usr/local/bin/firefox-bin -new-tab '
|
49
|
-
* `/usr/local/bin/google-chrome-stable
|
47
|
+
* `/usr/local/bin/firefox-bin -new-tab 'https://www.ruby-lang.org'`
|
48
|
+
* `/usr/local/bin/google-chrome-stable https://www.ruby-lang.org`
|
50
49
|
|
51
50
|
Additional links on the use of `BROWSER` as an environment variable.
|
52
51
|
|
@@ -83,7 +82,7 @@ in integration tests. For example:
|
|
83
82
|
|
84
83
|
### Public API
|
85
84
|
|
86
|
-
In the vein of [Semantic Versioning](
|
85
|
+
In the vein of [Semantic Versioning](https://semver.org), this is the sole
|
87
86
|
supported public API.
|
88
87
|
|
89
88
|
Launchy.open( uri, options = {} ) { |exception| }
|
@@ -93,7 +92,6 @@ At the moment, the only available options are:
|
|
93
92
|
:debug Turn on debugging output
|
94
93
|
:application Explicitly state what application class is going to be used
|
95
94
|
:host_os Explicitly state what host operating system to pretend to be
|
96
|
-
:ruby_engine Explicitly state what ruby engine to pretend to be under
|
97
95
|
:dry_run Do nothing and print the command that would be executed on $stdout
|
98
96
|
|
99
97
|
If `Launchy.open` is invoked with a block, then no exception will be thrown, and
|
@@ -102,53 +100,18 @@ exception that was raised.
|
|
102
100
|
|
103
101
|
### An example of using the public API:
|
104
102
|
|
105
|
-
Launchy.open( "
|
103
|
+
Launchy.open( "https://www.ruby-lang.org" )
|
106
104
|
|
107
105
|
### An example of using the public API and using the error block:
|
108
106
|
|
109
|
-
uri = "
|
107
|
+
uri = "https://www.ruby-lang.org"
|
110
108
|
Launchy.open( uri ) do |exception|
|
111
109
|
puts "Attempted to open #{uri} and failed because #{exception}"
|
112
110
|
end
|
113
111
|
|
114
|
-
## UPGRADING from versions before 2.0.0
|
115
|
-
|
116
|
-
The previously published version of Launchy before the 2.0.0 series was 0.4.0.
|
117
|
-
There have been so many changes, and a mistaken tag at 1.0.0, that I have
|
118
|
-
decided to bump all the way to 2.x.y.
|
119
|
-
|
120
|
-
I have attempted to keep backward compatibility with the previous examples. The
|
121
|
-
previous API examples of:
|
122
|
-
|
123
|
-
Launchy::Browser.run("http://www.ruby-lang.org/")
|
124
|
-
|
125
|
-
and
|
126
|
-
|
127
|
-
Launchy::Browser.new.visit("http://www.ruby-lang.org/")
|
128
|
-
|
129
|
-
will still work, and you will get a deprecation notice, along with the line
|
130
|
-
of code you should probably update. For example, this is what would print out
|
131
|
-
in the github gem if it was updated to use 2.0.x but not use the supported API.
|
132
|
-
|
133
|
-
% gh home
|
134
|
-
WARNING: You made a call to a deprecated Launchy API. This call should be changed to 'Launchy.open( uri )'
|
135
|
-
WARNING: I think I was able to find the location that needs to be fixed. Please go look at:
|
136
|
-
WARNING:
|
137
|
-
WARNING: /Users/jeremy/.rvm/gems/ruby-1.8.7-p334/gems/github-0.6.2/lib/commands/helpers.rb:275:in `open'
|
138
|
-
WARNING: helper :open do |url|
|
139
|
-
WARNING: has_launchy? proc {
|
140
|
-
WARNING: Launchy::Browser.new.visit url
|
141
|
-
WARNING: }
|
142
|
-
WARNING: end
|
143
|
-
WARNING:
|
144
|
-
WARNING: If this is not the case, please file a bug. Please file a bug at https://github.com/copiousfreetime/launchy/issues/new
|
145
|
-
|
146
|
-
These deprecation notices will go away with version 3.0 and the only available
|
147
|
-
API will be the documented one.
|
148
|
-
|
149
112
|
## ISC LICENSE
|
150
113
|
|
151
|
-
|
114
|
+
https://opensource.org/licenses/isc-license.txt
|
152
115
|
|
153
116
|
Copyright (c) 2007-2020 Jeremy Hinegardner
|
154
117
|
|
data/Rakefile
CHANGED
@@ -4,15 +4,17 @@ load 'tasks/this.rb'
|
|
4
4
|
This.name = "launchy"
|
5
5
|
This.author = "Jeremy Hinegardner"
|
6
6
|
This.email = "jeremy@copiousfreetime.org"
|
7
|
-
This.homepage = "
|
7
|
+
This.homepage = "https://github.com/copiousfreetime/#{ This.name }"
|
8
8
|
|
9
9
|
This.ruby_gemspec do |spec|
|
10
|
-
spec.add_dependency( 'addressable', '~> 2.
|
10
|
+
spec.add_dependency( 'addressable', '~> 2.8')
|
11
|
+
spec.add_dependency( 'childprocess', '~> 5.0')
|
11
12
|
|
12
13
|
spec.add_development_dependency( 'rake' , '~> 13.0')
|
13
|
-
spec.add_development_dependency( 'minitest' , '~> 5.
|
14
|
-
spec.add_development_dependency( '
|
15
|
-
spec.add_development_dependency( '
|
14
|
+
spec.add_development_dependency( 'minitest' , '~> 5.21' )
|
15
|
+
spec.add_development_dependency( 'minitest-junit' , '~> 1.0' )
|
16
|
+
spec.add_development_dependency( 'rdoc' , '~> 6.6' )
|
17
|
+
spec.add_development_dependency( 'simplecov', '~> 0.22' )
|
16
18
|
|
17
19
|
spec.licenses = ['ISC']
|
18
20
|
|
data/lib/launchy/application.rb
CHANGED
@@ -24,8 +24,18 @@ module Launchy
|
|
24
24
|
raise ApplicationNotFoundError, "No application found to handle '#{uri}'"
|
25
25
|
end
|
26
26
|
|
27
|
+
# Find the application with the given name
|
27
28
|
#
|
29
|
+
# returns the Class that has the given name
|
30
|
+
def for_name( name )
|
31
|
+
klass = find_child( :has_name?, name )
|
32
|
+
return klass if klass
|
33
|
+
raise ApplicationNotFoundError, "No application found named '#{name}'"
|
34
|
+
end
|
35
|
+
|
28
36
|
# Find the given executable in the available paths
|
37
|
+
#
|
38
|
+
# returns the path to the executable or nil if not found
|
29
39
|
def find_executable( bin, *paths )
|
30
40
|
paths = Launchy.path.split( File::PATH_SEPARATOR ) if paths.empty?
|
31
41
|
paths.each do |path|
|
@@ -38,16 +48,21 @@ module Launchy
|
|
38
48
|
Launchy.log "#{self.name} : Unable to find `#{bin}' in #{paths.join(", ")}"
|
39
49
|
return nil
|
40
50
|
end
|
51
|
+
|
52
|
+
# Does this class have the given name-like string?
|
53
|
+
#
|
54
|
+
# returns true if the class has the given name
|
55
|
+
def has_name?( qname )
|
56
|
+
qname.to_s.downcase == self.name.split("::").last.downcase
|
57
|
+
end
|
41
58
|
end
|
42
59
|
|
43
60
|
attr_reader :host_os_family
|
44
|
-
attr_reader :ruby_engine
|
45
61
|
attr_reader :runner
|
46
62
|
|
47
63
|
def initialize
|
48
64
|
@host_os_family = Launchy::Detect::HostOsFamily.detect
|
49
|
-
@
|
50
|
-
@runner = Launchy::Detect::Runner.detect
|
65
|
+
@runner = Launchy::Runner.new
|
51
66
|
end
|
52
67
|
|
53
68
|
def find_executable( bin, *paths )
|
@@ -64,12 +64,12 @@ class Launchy::Application
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def cmd_and_args( uri, options = {} )
|
67
|
-
cmd = browser_cmdline
|
67
|
+
cmd = browser_cmdline.to_s
|
68
68
|
args = [ uri.to_s ]
|
69
69
|
if cmd =~ /%s/ then
|
70
70
|
cmd.gsub!( /%s/, args.shift )
|
71
71
|
end
|
72
|
-
|
72
|
+
[cmd, args]
|
73
73
|
end
|
74
74
|
|
75
75
|
# final assembly of the command and do %s substitution
|
data/lib/launchy/cli.rb
CHANGED
@@ -15,7 +15,7 @@ module Launchy
|
|
15
15
|
op.separator ""
|
16
16
|
op.separator "Launch Options:"
|
17
17
|
|
18
|
-
op.on( "-a", "--application APPLICATION",
|
18
|
+
op.on( "-a", "--application APPLICATION",
|
19
19
|
"Explicitly specify the application class to use in the launch") do |app|
|
20
20
|
@options[:application] = app
|
21
21
|
end
|
@@ -25,11 +25,6 @@ module Launchy
|
|
25
25
|
@options[:debug] = true
|
26
26
|
end
|
27
27
|
|
28
|
-
op.on( "-e", "--engine RUBY_ENGINE",
|
29
|
-
"Force launchy to behave as if it was on a particular ruby engine.") do |e|
|
30
|
-
@options[:ruby_engine] = e
|
31
|
-
end
|
32
|
-
|
33
28
|
op.on( "-n", "--dry-run", "Don't launchy, print the command to be executed on stdout" ) do |x|
|
34
29
|
@options[:dry_run] = true
|
35
30
|
end
|
@@ -42,7 +42,7 @@ module Launchy::Detect
|
|
42
42
|
#
|
43
43
|
class Windows < HostOsFamily
|
44
44
|
def self.matching_regex
|
45
|
-
/(mingw|mswin|windows)/i
|
45
|
+
/(mingw|mswin|msys|windows)/i
|
46
46
|
end
|
47
47
|
def app_list( app ) app.windows_app_list; end
|
48
48
|
end
|
@@ -56,7 +56,7 @@ module Launchy::Detect
|
|
56
56
|
|
57
57
|
class Nix < HostOsFamily
|
58
58
|
def self.matching_regex
|
59
|
-
/(linux|bsd|aix|solaris)/i
|
59
|
+
/(linux|bsd|aix|solaris|sunos|dragonfly)/i
|
60
60
|
end
|
61
61
|
def app_list( app ) app.nix_app_list; end
|
62
62
|
end
|
data/lib/launchy/detect.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'childprocess'
|
2
|
+
module Launchy
|
3
|
+
class Runner
|
4
|
+
def run( cmd, *args )
|
5
|
+
raise Launchy::CommandNotFoundError, "No command found to run with args '#{args.join(' ')}'. If this is unexpected, #{Launchy.bug_report_message}" unless cmd
|
6
|
+
if Launchy.dry_run? then
|
7
|
+
$stdout.puts dry_run( cmd, *args )
|
8
|
+
else
|
9
|
+
wet_run( cmd, *args )
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def wet_run( cmd, *args )
|
14
|
+
argv = [ cmd, *args ].flatten
|
15
|
+
Launchy.log "ChildProcess: argv => #{argv.inspect}"
|
16
|
+
process = ChildProcess.build( *argv )
|
17
|
+
|
18
|
+
process.io.inherit!
|
19
|
+
process.leader = true
|
20
|
+
process.detach = true
|
21
|
+
process.start
|
22
|
+
end
|
23
|
+
|
24
|
+
def dry_run( cmd, *args )
|
25
|
+
shell_commands(cmd, args).join(" ")
|
26
|
+
end
|
27
|
+
|
28
|
+
# cut it down to just the shell commands that will be passed to exec or
|
29
|
+
# posix_spawn. The cmd argument is split according to shell rules and the
|
30
|
+
# args are not escaped because the whole set is passed to system as *args
|
31
|
+
# and in that case system shell escaping rules are not done.
|
32
|
+
#
|
33
|
+
def shell_commands( cmd, args )
|
34
|
+
cmdline = [ cmd.to_s.shellsplit ]
|
35
|
+
cmdline << args.flatten.collect{ |a| a.to_s }
|
36
|
+
return commandline_normalize( cmdline )
|
37
|
+
end
|
38
|
+
|
39
|
+
def commandline_normalize( cmdline )
|
40
|
+
c = cmdline.flatten!
|
41
|
+
c = c.find_all { |a| (not a.nil?) and ( a.size > 0 ) }
|
42
|
+
Launchy.log "commandline_normalized => #{c.join(' ')}"
|
43
|
+
return c
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/launchy/version.rb
CHANGED
data/lib/launchy.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'addressable/uri'
|
2
|
+
require 'shellwords'
|
3
|
+
require 'stringio'
|
2
4
|
|
3
5
|
#
|
4
6
|
# The entry point into Launchy. This is the sole supported public API.
|
@@ -11,7 +13,6 @@ require 'addressable/uri'
|
|
11
13
|
# :application Explicitly state what application class is going to be used.
|
12
14
|
# This must be a child class of Launchy::Application
|
13
15
|
# :host_os Explicitly state what host operating system to pretend to be
|
14
|
-
# :ruby_engine Explicitly state what ruby engine to pretend to be under
|
15
16
|
# :dry_run Do nothing and print the command that would be executed on $stdout
|
16
17
|
#
|
17
18
|
# Other options may be used, and those will be passed directly to the
|
@@ -26,7 +27,14 @@ module Launchy
|
|
26
27
|
def open(uri_s, options = {}, &error_block )
|
27
28
|
leftover = extract_global_options( options )
|
28
29
|
uri = string_to_uri( uri_s )
|
29
|
-
|
30
|
+
if name = options[:application] then
|
31
|
+
app = app_for_name( name )
|
32
|
+
end
|
33
|
+
|
34
|
+
if app.nil? then
|
35
|
+
app = app_for_uri( uri )
|
36
|
+
end
|
37
|
+
|
30
38
|
app.new.open( uri, leftover )
|
31
39
|
rescue Launchy::Error => le
|
32
40
|
raise le
|
@@ -34,7 +42,7 @@ module Launchy
|
|
34
42
|
msg = "Failure in opening uri #{uri_s.inspect} with options #{options.inspect}: #{e}"
|
35
43
|
raise Launchy::Error, msg
|
36
44
|
ensure
|
37
|
-
if $!
|
45
|
+
if $! && block_given? then
|
38
46
|
yield $!
|
39
47
|
return # explicitly swallow the errors
|
40
48
|
end
|
@@ -44,6 +52,12 @@ module Launchy
|
|
44
52
|
Launchy::Application.handling( uri )
|
45
53
|
end
|
46
54
|
|
55
|
+
def app_for_name( name )
|
56
|
+
Launchy::Application.for_name( name )
|
57
|
+
rescue Launchy::ApplicationNotFoundError
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
47
61
|
def app_for_uri_string( s )
|
48
62
|
app_for_uri( string_to_uri( s ) )
|
49
63
|
end
|
@@ -64,7 +78,6 @@ module Launchy
|
|
64
78
|
Launchy.debug = false
|
65
79
|
Launchy.application = nil
|
66
80
|
Launchy.host_os = nil
|
67
|
-
Launchy.ruby_engine = nil
|
68
81
|
Launchy.dry_run = false
|
69
82
|
Launchy.path = ENV['PATH']
|
70
83
|
end
|
@@ -74,7 +87,6 @@ module Launchy
|
|
74
87
|
Launchy.debug = leftover.delete( :debug ) || ENV['LAUNCHY_DEBUG']
|
75
88
|
Launchy.application = leftover.delete( :application ) || ENV['LAUNCHY_APPLICATION']
|
76
89
|
Launchy.host_os = leftover.delete( :host_os ) || ENV['LAUNCHY_HOST_OS']
|
77
|
-
Launchy.ruby_engine = leftover.delete( :ruby_engine ) || ENV['LAUNCHY_RUBY_ENGINE']
|
78
90
|
Launchy.dry_run = leftover.delete( :dry_run ) || ENV['LAUNCHY_DRY_RUN']
|
79
91
|
end
|
80
92
|
|
@@ -104,14 +116,6 @@ module Launchy
|
|
104
116
|
@host_os || ENV['LAUNCHY_HOST_OS']
|
105
117
|
end
|
106
118
|
|
107
|
-
def ruby_engine=( ruby_engine )
|
108
|
-
@ruby_engine = ruby_engine
|
109
|
-
end
|
110
|
-
|
111
|
-
def ruby_engine
|
112
|
-
@ruby_engine || ENV['LAUNCHY_RUBY_ENGINE']
|
113
|
-
end
|
114
|
-
|
115
119
|
def dry_run=( dry_run )
|
116
120
|
@dry_run = to_bool( dry_run )
|
117
121
|
end
|
@@ -160,4 +164,4 @@ require 'launchy/descendant_tracker'
|
|
160
164
|
require 'launchy/error'
|
161
165
|
require 'launchy/application'
|
162
166
|
require 'launchy/detect'
|
163
|
-
require 'launchy/
|
167
|
+
require 'launchy/runner'
|
@@ -13,22 +13,17 @@ describe Launchy::Application::Browser do
|
|
13
13
|
ENV.delete( 'BROWSER' )
|
14
14
|
end
|
15
15
|
|
16
|
-
{ 'windows' => '
|
17
|
-
'darwin' =>
|
18
|
-
'cygwin' => '
|
19
|
-
'linux' =>
|
20
|
-
}.each do |host_os,
|
21
|
-
it "when host_os is '#{host_os}' the
|
16
|
+
{ 'windows' => 'windows_app_list',
|
17
|
+
'darwin' => 'darwin_app_list',
|
18
|
+
'cygwin' => 'cygwin_app_list',
|
19
|
+
'linux' => 'nix_app_list',
|
20
|
+
}.each do |host_os, called_method|
|
21
|
+
it "when host_os is '#{host_os}' the '#{called_method}' method is called" do
|
22
22
|
Launchy.host_os = host_os
|
23
23
|
browser = Launchy::Application::Browser.new
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
case expected
|
28
|
-
when Array
|
29
|
-
_(expected).must_include item
|
30
|
-
when String
|
31
|
-
_(item).must_equal expected
|
24
|
+
browser.stub(called_method, [:called_me]) do
|
25
|
+
item = browser.app_list.first
|
26
|
+
_(item).must_equal :called_me
|
32
27
|
end
|
33
28
|
end
|
34
29
|
end
|
data/spec/cli_spec.rb
CHANGED
@@ -45,29 +45,28 @@ describe Launchy::Cli do
|
|
45
45
|
|
46
46
|
it "leaves the url on argv after parsing" do
|
47
47
|
l = Launchy::Cli.new
|
48
|
-
argv = %w[ --debug --dry-run
|
48
|
+
argv = %w[ --debug --dry-run https://github.com/copiousfreetime/launchy ]
|
49
49
|
l.parse( argv , {} )
|
50
50
|
_(argv.size).must_equal 1
|
51
|
-
_(argv[0]).must_equal "
|
51
|
+
_(argv[0]).must_equal "https://github.com/copiousfreetime/launchy"
|
52
52
|
end
|
53
53
|
|
54
54
|
it "prints the command on stdout when using --dry-run" do
|
55
|
-
argv = %w[ --debug --dry-run
|
55
|
+
argv = %w[ --debug --dry-run https://github.com/copiousfreetime/launchy ]
|
56
56
|
Launchy::Cli.new.good_run( argv, {} )
|
57
57
|
_($stdout.string).must_match %r[github.com]
|
58
58
|
end
|
59
59
|
|
60
60
|
{
|
61
61
|
'--application' => [ :application, 'Browser'],
|
62
|
-
'--engine' => [ :ruby_engine, 'rbx'],
|
63
62
|
'--host-os' => [ :host_os, 'cygwin'] }.each_pair do |opt, val|
|
64
63
|
it "the commandline option #{opt} sets the program option #{val[0]}" do
|
65
|
-
argv = [ opt, val[1], "
|
64
|
+
argv = [ opt, val[1], "https://github.com/copiousfreetime/launchy" ]
|
66
65
|
l = Launchy::Cli.new
|
67
66
|
rc = l.parse( argv, {} )
|
68
67
|
_(rc).must_equal true
|
69
68
|
_(argv.size).must_equal 1
|
70
|
-
_(argv[0]).must_equal "
|
69
|
+
_(argv[0]).must_equal "https://github.com/copiousfreetime/launchy"
|
71
70
|
_(l.options[val[0]]).must_equal val[1]
|
72
71
|
end
|
73
72
|
end
|