which_works 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,38 @@
1
- # which_works
1
+ # which\_works
2
2
 
3
- **Ruby UNIX-like which.**
3
+ **Ruby UNIX-like which. Locates a program file in the user's path.**
4
+
5
+ The `which` method takes a list of command names and searches the path
6
+ for each executable file that would be run had these commands actually
7
+ been invoked.
8
+
9
+ ```ruby
10
+ Which.which('ls') #=> "/bin/ls"
11
+ Which.which('ls', 'screen') #=> [ "/bin/ls", "/usr/bin/screen" ]
12
+ Which.which('unknown') #=> nil
13
+
14
+ # you can also check an absolute path
15
+ Which.which('/usr/bin/svn') #=> "/usr/bin/svn"
16
+ Which.which('/usr/bin/foo') #=> nil
17
+
18
+ # the :all option finds all executable files,
19
+ # not just the first one found
20
+ Which.which('svn', :all => true) #=> [ "/opt/local/bin/svn", "/usr/bin/svn" ]
21
+
22
+ # the :array option always returns an array
23
+ Which.which('unknown', :array => true) #=> []
24
+ Which.which('ls', :array => true) #=> [ "/bin/ls" ]
25
+ Which.which('ls', 'screen', :array => true) #=> [ "/bin/ls", "/usr/bin/screen" ]
26
+
27
+ # combined options
28
+ Which.which('ls', 'svn', :all => true, :array => true)
29
+ #=> [ "/bin/ls", "/opt/local/bin/svn", "/usr/bin/svn" ]
30
+ ```
31
+
32
+ Tested with <a href="https://www.relishapp.com/rspec">RSpec</a>, <a href="https://github.com/thoughtbot/shoulda">shoulda</a> and <a href="http://travis-ci.org/#!/AlphaHydrae/which_works">Travis CI</a>.
33
+
34
+ * master [![Build Status](https://secure.travis-ci.org/AlphaHydrae/which_works.png?branch=master)](http://travis-ci.org/AlphaHydrae/which\_works)
35
+ * develop [![Build Status](https://secure.travis-ci.org/AlphaHydrae/which_works.png?branch=develop)](http://travis-ci.org/AlphaHydrae/which\_works)
4
36
 
5
37
  ## License (MIT)
6
38
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
data/lib/which_works.rb CHANGED
@@ -1,20 +1,65 @@
1
1
 
2
- class Which
2
+ # The {Which} module can locate program files in the user's path.
3
+ # See {Which.which}.
4
+ module Which
3
5
 
4
- def self.which cmd
6
+ # Locates a program file in the user's path.
7
+ #
8
+ # The which method takes a list of command names and searches the path
9
+ # for each executable file that would be run had these commands actually
10
+ # been invoked.
11
+ #
12
+ # By default, which will return nil if no executable was found, one
13
+ # string if one executable file was found, or an array if several were
14
+ # found. You can customize this behavior by passing the <tt>:array</tt>
15
+ # option.
16
+ #
17
+ # == Options
18
+ # * <tt>:all => boolean</tt> - List all instances of executables found
19
+ # (instead of just the first one of each). False by default.
20
+ # * <tt>:array => boolean</tt> - Always return an array. False by default.
21
+ #
22
+ # == Examples
23
+ # Which.which('ls') #=> "/bin/ls"
24
+ # Which.which('unknown') #=> nil
25
+ # Which.which('ls', 'screen') #=> [ "/bin/ls", "/usr/bin/screen" ]
26
+ # Which.which('svn', :all => true) #=> [ "/opt/local/bin/svn", "/usr/bin/svn" ]
27
+ # Which.which('ls', :array => true) #=> [ "/bin/ls" ]
28
+ # Which.which('/usr/bin/screen') #=> "/usr/bin/screen"
29
+ def self.which *programs
30
+
31
+ found = []
32
+ options = programs.last.kind_of?(Hash) ? programs.pop : {}
5
33
 
6
- # valid file extensions (cross-platform)
7
- extensions = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [ '' ]
34
+ programs.each do |program|
8
35
 
9
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
36
+ program_found = false
10
37
 
11
- extensions.each do |ext|
38
+ # valid file extensions (cross-platform)
39
+ extensions = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [ '' ]
12
40
 
13
- absolute_path = File.expand_path "#{cmd}#{ext}", path
14
- return absolute_path if File.executable? absolute_path
41
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
42
+
43
+ extensions.each do |ext|
44
+
45
+ # using expand_path makes it work with absolute program paths
46
+ absolute_path = File.expand_path "#{program}#{ext}", path
47
+
48
+ if File.executable? absolute_path
49
+ program_found = true
50
+ found << absolute_path
51
+ break unless options[:all]
52
+ end
53
+ end
54
+
55
+ break if program_found && !options[:all]
15
56
  end
16
57
  end
17
58
 
18
- return nil
59
+ if found.length <= 1
60
+ options[:array] ? found : found.first
61
+ else
62
+ found
63
+ end
19
64
  end
20
65
  end
data/spec/all_spec.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'helper'
2
+
3
+ describe ':all option' do
4
+
5
+ before :each do
6
+ WhichSpecHelper.stub_unix!
7
+ end
8
+
9
+ it "should find all executable files" do
10
+ Which.which('svn', :all => true).should == [ '/opt/local/bin/svn', '/usr/bin/svn' ]
11
+ end
12
+
13
+ it "should find all executable files and other files" do
14
+ Which.which('ls', 'svn', 'screen', :all => true).should == [ '/bin/ls', '/opt/local/bin/svn', '/usr/bin/svn', '/usr/bin/screen' ]
15
+ end
16
+
17
+ it "should not find anything when given no command to find" do
18
+ Which.which({ :all => true }).should be_nil
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ require 'helper'
2
+
3
+ describe ':array option' do
4
+
5
+ before :each do
6
+ WhichSpecHelper.stub_unix!
7
+ end
8
+
9
+ it "should return an array when given nothing to find" do
10
+ Which.which({ :array => true }).should == []
11
+ end
12
+
13
+ it "should return an array if the given command does not exist" do
14
+ Which.which('unknown', :array => true).should == []
15
+ end
16
+
17
+ it "should return an array when finding a single command" do
18
+ Which.which('ls', :array => true).should == [ '/bin/ls' ]
19
+ end
20
+
21
+ it "should return an array when finding several commands" do
22
+ Which.which('ls', 'svn', :array => true).should == [ '/bin/ls', '/opt/local/bin/svn' ]
23
+ end
24
+ end
@@ -0,0 +1,42 @@
1
+ require 'helper'
2
+
3
+ describe Which do
4
+
5
+ before :each do
6
+ WhichSpecHelper.stub_unix!
7
+ end
8
+
9
+ it "should find a single command" do
10
+ Which.which('ls').should == '/bin/ls'
11
+ end
12
+
13
+ it "should find a single command with an absolute path" do
14
+ Which.which('/bin/ls').should == '/bin/ls'
15
+ end
16
+
17
+ it "should not find commands that do not exist" do
18
+ [ 'foo', 'bar', 'wrong', 'cp', '/usr/bin/du' ].each do |unknown|
19
+ Which.which(unknown).should be_nil
20
+ end
21
+ end
22
+
23
+ it "should find nothing when given nothing" do
24
+ Which.which.should be_nil
25
+ end
26
+
27
+ it "should find several commands" do
28
+ Which.which('ls', 'screen').should == [ '/bin/ls', '/usr/bin/screen' ]
29
+ end
30
+
31
+ it "should find only existing commands" do
32
+ Which.which('ls', 'cp', 'screen', '/bin/foo').should == [ '/bin/ls', '/usr/bin/screen' ]
33
+ end
34
+
35
+ it "should not find a command that is not in the path" do
36
+ Which.which('custom').should be_nil
37
+ end
38
+
39
+ it "should find the first executable file in the path" do
40
+ Which.which('svn').should == '/opt/local/bin/svn'
41
+ end
42
+ end
data/spec/helper.rb CHANGED
@@ -20,3 +20,33 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
20
20
  $LOAD_PATH.unshift(File.dirname(__FILE__))
21
21
  require 'which_works'
22
22
 
23
+ module WhichSpecHelper
24
+ UNIX_COMMANDS = %w( /bin/ls /usr/bin/screen /home/johndoe/bin/custom /opt/local/bin/svn /usr/bin/svn )
25
+ UNIX_PATH = "/bin:/opt/local/bin:/usr/bin"
26
+
27
+ def self.stub_unix!
28
+
29
+ v = $VERBOSE
30
+ $VERBOSE = nil
31
+ File.const_set :SEPARATOR, '/'
32
+ File.const_set :PATH_SEPARATOR, ':'
33
+ $VERBOSE = v
34
+
35
+ UNIX_COMMANDS.each{ |com| com.gsub!(/\//, File::SEPARATOR) }
36
+ UNIX_PATH.gsub!(/\:/, File::PATH_SEPARATOR).gsub!(/\//, File::SEPARATOR)
37
+
38
+ ENV.stub!(:[]) do |name|
39
+ case name
40
+ when 'PATH'
41
+ UNIX_PATH
42
+ when 'PATHEXT'
43
+ nil
44
+ end
45
+ end
46
+
47
+ File.stub!(:executable?) do |name|
48
+ UNIX_COMMANDS.include? name.to_s
49
+ end
50
+ end
51
+ end
52
+
data/which_works.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "which_works"
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["AlphaHydrae"]
12
- s.date = "2012-03-09"
12
+ s.date = "2012-03-10"
13
13
  s.description = "Ruby UNIX-like which."
14
14
  s.email = "hydrae.alpha@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -28,8 +28,10 @@ Gem::Specification.new do |s|
28
28
  "Rakefile",
29
29
  "VERSION",
30
30
  "lib/which_works.rb",
31
+ "spec/all_spec.rb",
32
+ "spec/array_spec.rb",
33
+ "spec/basic_spec.rb",
31
34
  "spec/helper.rb",
32
- "spec/which_spec.rb",
33
35
  "which_works.gemspec"
34
36
  ]
35
37
  s.homepage = "http://github.com/AlphaHydrae/which_works"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: which_works
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-09 00:00:00.000000000Z
12
+ date: 2012-03-10 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70294153990340 !ruby/object:Gem::Requirement
16
+ requirement: &70349900379000 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.9.2
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70294153990340
24
+ version_requirements: *70349900379000
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70294153989580 !ruby/object:Gem::Requirement
27
+ requirement: &70349900378040 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.8.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70294153989580
35
+ version_requirements: *70349900378040
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shoulda
38
- requirement: &70294153988860 !ruby/object:Gem::Requirement
38
+ requirement: &70349900375720 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.11.3
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70294153988860
46
+ version_requirements: *70349900375720
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &70294153988380 !ruby/object:Gem::Requirement
49
+ requirement: &70349900374340 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70294153988380
57
+ version_requirements: *70349900374340
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &70294153987820 !ruby/object:Gem::Requirement
60
+ requirement: &70349900372640 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.8.3
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70294153987820
68
+ version_requirements: *70349900372640
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
- requirement: &70294153987300 !ruby/object:Gem::Requirement
71
+ requirement: &70349900370600 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.5.4
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70294153987300
79
+ version_requirements: *70349900370600
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: yard
82
- requirement: &70294153851360 !ruby/object:Gem::Requirement
82
+ requirement: &70349900367500 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.7.5
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70294153851360
90
+ version_requirements: *70349900367500
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rdiscount
93
- requirement: &70294153850820 !ruby/object:Gem::Requirement
93
+ requirement: &70349900364380 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 1.6.8
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70294153850820
101
+ version_requirements: *70349900364380
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: travis-lint
104
- requirement: &70294153850340 !ruby/object:Gem::Requirement
104
+ requirement: &70349900362880 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 1.3.0
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70294153850340
112
+ version_requirements: *70349900362880
113
113
  description: Ruby UNIX-like which.
114
114
  email: hydrae.alpha@gmail.com
115
115
  executables: []
@@ -129,8 +129,10 @@ files:
129
129
  - Rakefile
130
130
  - VERSION
131
131
  - lib/which_works.rb
132
+ - spec/all_spec.rb
133
+ - spec/array_spec.rb
134
+ - spec/basic_spec.rb
132
135
  - spec/helper.rb
133
- - spec/which_spec.rb
134
136
  - which_works.gemspec
135
137
  homepage: http://github.com/AlphaHydrae/which_works
136
138
  licenses:
@@ -147,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
149
  version: '0'
148
150
  segments:
149
151
  - 0
150
- hash: 4513161161405820055
152
+ hash: 4071309635441737713
151
153
  required_rubygems_version: !ruby/object:Gem::Requirement
152
154
  none: false
153
155
  requirements:
data/spec/which_spec.rb DELETED
@@ -1,35 +0,0 @@
1
- require 'helper'
2
-
3
- describe Which do
4
- COMMANDS = %w( /bin/ls /usr/bin/screen /home/johndoe/bin/custom )
5
-
6
- before :each do
7
-
8
- ENV.stub!(:[]) do |name|
9
- case name
10
- when 'PATH'
11
- "/bin#{File::PATH_SEPARATOR}/usr/bin"
12
- when 'PATHEXT'
13
- nil
14
- end
15
- end
16
-
17
- File.stub!(:executable?) do |name|
18
- COMMANDS.include? name.to_s
19
- end
20
- end
21
-
22
- it "should find commands" do
23
- Which.which('ls').should == '/bin/ls'
24
- end
25
-
26
- it "should find commands with absolute paths" do
27
- Which.which('/bin/ls').should == '/bin/ls'
28
- end
29
-
30
- it "should not find commands that do not exist" do
31
- [ 'wrong', 'cp', '/usr/bin/du' ].each do |unknown|
32
- Which.which(unknown).should be_nil
33
- end
34
- end
35
- end