shr 0.0.1 → 0.1.1
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/README.md +2 -2
- data/lib/shr/option.rb +17 -19
- data/lib/shr/shell.rb +10 -2
- data/lib/shr/version.rb +1 -1
- data/lib/shr/which.rb +40 -1
- data/spec/lib/shr/option_spec.rb +39 -47
- data/spec/lib/shr/shell_spec.rb +2 -2
- data/spec/lib/shr/which_spec.rb +33 -7
- metadata +10 -5
data/README.md
CHANGED
@@ -10,7 +10,7 @@ This is a port of Python's [sh](https://github.com/amoffat/sh).
|
|
10
10
|
|
11
11
|
Installation
|
12
12
|
------------
|
13
|
-
|
13
|
+
gem install shr
|
14
14
|
|
15
15
|
Usage
|
16
16
|
-----
|
@@ -18,5 +18,5 @@ TODO: Write usage instructions here
|
|
18
18
|
|
19
19
|
License
|
20
20
|
-------
|
21
|
-
Released under the MIT License. See the [
|
21
|
+
Released under the MIT License. See the [LICENSE][license] file for further details.
|
22
22
|
[license]: https://github.com/kukenko/shr/LICENSE.md
|
data/lib/shr/option.rb
CHANGED
@@ -2,45 +2,43 @@
|
|
2
2
|
|
3
3
|
module Shr
|
4
4
|
class Option
|
5
|
-
# xxx
|
6
5
|
def initialize
|
7
|
-
@
|
6
|
+
@options = []
|
7
|
+
@indicator = '-'
|
8
8
|
end
|
9
|
+
attr_accessor :indicator
|
9
10
|
|
10
|
-
# xxx
|
11
|
-
# This method has not support Windows yet.
|
12
11
|
def parse(options)
|
13
12
|
options.each do |opt|
|
14
13
|
case opt
|
15
14
|
when String
|
16
|
-
|
17
|
-
if @stack.last && @stack.last.start_with?('--')
|
18
|
-
@stack.push "#{@stack.pop}=#{opt}"
|
19
|
-
else
|
20
|
-
@stack.push opt
|
21
|
-
end
|
22
|
-
else
|
23
|
-
@stack.push opt
|
24
|
-
end
|
15
|
+
@options << opt
|
25
16
|
when Symbol
|
26
|
-
@
|
17
|
+
@options << translate_from(opt)
|
27
18
|
when Hash
|
28
19
|
opt.each do |k, v|
|
29
20
|
if v.eql?(true)
|
30
|
-
@
|
21
|
+
@options << translate_from(k)
|
31
22
|
else
|
32
23
|
if k.length > 1
|
33
|
-
@
|
24
|
+
@options << "#{translate_from(k)}=#{v}"
|
34
25
|
else
|
35
|
-
@
|
26
|
+
@options << translate_from(k) << v
|
36
27
|
end
|
37
28
|
end
|
38
29
|
end
|
39
30
|
when Fixnum
|
40
|
-
@
|
31
|
+
@options << "#{@indicator}#{opt}"
|
41
32
|
end
|
42
33
|
end
|
43
|
-
@
|
34
|
+
@options
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def translate_from(opt)
|
40
|
+
s = opt.to_s
|
41
|
+
"#{@indicator}#{(s.length > 1 ? '-' : '') if @indicator == '-'}#{s}"
|
44
42
|
end
|
45
43
|
end
|
46
44
|
end
|
data/lib/shr/shell.rb
CHANGED
@@ -78,9 +78,17 @@ module Shr
|
|
78
78
|
@command_out && !@command_out.closed?
|
79
79
|
end
|
80
80
|
|
81
|
+
# xxx
|
81
82
|
def command_line(name, args)
|
82
|
-
|
83
|
-
|
83
|
+
option = Option.new
|
84
|
+
option.indicator = '/' if OS.windows?
|
85
|
+
options = option.parse(args).join(' ')
|
86
|
+
|
87
|
+
if OS.windows?
|
88
|
+
"cmd /c #{name} #{options}".strip
|
89
|
+
else
|
90
|
+
"#{name} #{options}".strip
|
91
|
+
end
|
84
92
|
end
|
85
93
|
|
86
94
|
def delay(name, args)
|
data/lib/shr/version.rb
CHANGED
data/lib/shr/which.rb
CHANGED
@@ -12,13 +12,52 @@ module Shr
|
|
12
12
|
@@path += cwd
|
13
13
|
end
|
14
14
|
|
15
|
+
if OS.windows?
|
16
|
+
@@builtins = %w{
|
17
|
+
assoc
|
18
|
+
call
|
19
|
+
cd chdir
|
20
|
+
cls
|
21
|
+
color
|
22
|
+
date
|
23
|
+
del erace
|
24
|
+
dir
|
25
|
+
echo
|
26
|
+
exit
|
27
|
+
ftype
|
28
|
+
md mkdir
|
29
|
+
mklink
|
30
|
+
move
|
31
|
+
path
|
32
|
+
pause
|
33
|
+
popd
|
34
|
+
prompt
|
35
|
+
pushd
|
36
|
+
rd rmdir
|
37
|
+
ren rename
|
38
|
+
set
|
39
|
+
start
|
40
|
+
time
|
41
|
+
title
|
42
|
+
var
|
43
|
+
verify
|
44
|
+
vol
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
15
48
|
def self.exist?(program)
|
16
49
|
programs = add_extensions(program)
|
17
50
|
|
18
51
|
entries = paths.product(programs).map { |list| list.join '/' }
|
19
|
-
entries.find do |exe|
|
52
|
+
result = entries.find do |exe|
|
20
53
|
File.executable?(exe) && !File.directory?(exe)
|
21
54
|
end
|
55
|
+
|
56
|
+
if OS.windows?
|
57
|
+
result = program.to_s if @@builtins.include? program.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
result
|
22
61
|
end
|
23
62
|
class << self
|
24
63
|
alias :exists? :exist?
|
data/spec/lib/shr/option_spec.rb
CHANGED
@@ -5,76 +5,68 @@ module Shr
|
|
5
5
|
describe Option do
|
6
6
|
let(:opt) { Option.new }
|
7
7
|
|
8
|
+
SHORT_FORM = ['-o', 'page.html']
|
9
|
+
LONG_FORM = ['--shell=/bin/sh', '--silent']
|
10
|
+
MIXED_FORM = SHORT_FORM + LONG_FORM
|
11
|
+
|
8
12
|
it 'has the following methods' do
|
9
13
|
o = opt.methods
|
10
14
|
o.should include(:parse)
|
11
15
|
end
|
12
16
|
|
13
17
|
describe '#parse' do
|
14
|
-
shared_examples 'with short-form options' do
|
15
|
-
it 'parses correctly' do
|
16
|
-
opt.parse(options).should eq(['-o', 'page.html'])
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
shared_examples 'with long-form options' do
|
21
|
-
it 'parses correctly' do
|
22
|
-
opt.parse(options).should eq(['--shell=/bin/sh', '--silent'])
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
shared_examples 'with mixed options' do
|
27
|
-
it 'parses correctly' do
|
28
|
-
opt.parse(options).should eq(['-o', 'page.html', '--shell=/bin/sh', '--silent'])
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
18
|
describe String do
|
33
|
-
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
it_behaves_like 'with long-form options' do
|
38
|
-
let(:options) { ['--shell', '/bin/sh', '--silent'] }
|
39
|
-
end
|
40
|
-
|
41
|
-
it_behaves_like 'with mixed options' do
|
42
|
-
let(:options) { ['-o', 'page.html', '--shell', '/bin/sh', '--silent'] }
|
19
|
+
it 'remains argument unchanged' do
|
20
|
+
opt.parse(MIXED_FORM).should eq(MIXED_FORM)
|
43
21
|
end
|
44
22
|
end
|
45
23
|
|
46
24
|
describe Symbol do
|
47
|
-
|
48
|
-
|
49
|
-
|
25
|
+
context 'with a character' do
|
26
|
+
it 'tranlate argument to short-form' do
|
27
|
+
opt.parse([:o]).should eq(['-o'])
|
28
|
+
end
|
50
29
|
|
51
|
-
|
52
|
-
|
30
|
+
it 'may be indicated by @indicator' do
|
31
|
+
opt.indicator = '/'
|
32
|
+
opt.parse([:o]).should eq(['/o'])
|
33
|
+
end
|
53
34
|
end
|
54
35
|
|
55
|
-
|
56
|
-
|
36
|
+
context 'with some characters' do
|
37
|
+
it 'translates argument to long-form' do
|
38
|
+
opt.parse([:silent]).should eq(['--silent'])
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'may be indicated by @indicator' do
|
42
|
+
opt.indicator = '/'
|
43
|
+
opt.parse([:silent]).should eq(['/silent'])
|
44
|
+
end
|
57
45
|
end
|
58
46
|
end
|
59
47
|
|
60
48
|
describe Hash do
|
61
|
-
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
it_behaves_like 'with long-form options' do
|
66
|
-
let(:options) { [{ :shell => '/bin/sh', :silent => true }] }
|
67
|
-
end
|
49
|
+
it { opt.parse([{ :o => 'page.html' }]).should eq(SHORT_FORM) }
|
50
|
+
it { opt.parse([{ :shell => '/bin/sh', :silent => true }]).should eq(LONG_FORM) }
|
68
51
|
|
69
|
-
|
70
|
-
|
52
|
+
context 'with indicator' do
|
53
|
+
it 'may be indicated by @indicator' do
|
54
|
+
opt.indicator = '/'
|
55
|
+
opt.parse([{ :o => 'page.html' }]).should eq(['/o', 'page.html'])
|
56
|
+
end
|
71
57
|
end
|
72
58
|
end
|
73
59
|
|
74
60
|
describe Fixnum do
|
75
|
-
it '
|
76
|
-
|
77
|
-
|
61
|
+
it 'translates argument to short-form' do
|
62
|
+
opt.parse([1, 2, 3]).should eq(['-1', '-2', '-3'])
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with indicator' do
|
66
|
+
it 'may be indicated by @indicator' do
|
67
|
+
opt.indicator = '/'
|
68
|
+
opt.parse([1, 2, 3]).should eq(['/1', '/2', '/3'])
|
69
|
+
end
|
78
70
|
end
|
79
71
|
end
|
80
72
|
end
|
data/spec/lib/shr/shell_spec.rb
CHANGED
@@ -74,8 +74,8 @@ module Shr
|
|
74
74
|
|
75
75
|
describe '#exitstatus' do
|
76
76
|
it "shows an exit status of process" do
|
77
|
-
sh.ruby(
|
78
|
-
sh.ruby(
|
77
|
+
sh.ruby('-e', "'exit 0'").exitstatus.should eq(0)
|
78
|
+
sh.ruby('-e', "'exit 1'").exitstatus.should eq(1)
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
data/spec/lib/shr/which_spec.rb
CHANGED
@@ -10,18 +10,44 @@ module Shr
|
|
10
10
|
end
|
11
11
|
|
12
12
|
describe '#exist?' do
|
13
|
-
|
14
|
-
Which.exist?(
|
13
|
+
shared_examples 'if any of executables are found' do
|
14
|
+
it { Which.exist?(command).should be_true }
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
Which.exist?(
|
17
|
+
shared_examples 'if any of executables are not found' do
|
18
|
+
it { Which.exist?(command).should be_false }
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
unless ENV['OS'] == 'Windows_NT'
|
22
|
+
it_behaves_like 'if any of executables are found' do
|
23
|
+
let(:command) { :pwd }
|
24
24
|
end
|
25
|
+
|
26
|
+
context 'with String' do
|
27
|
+
it_behaves_like 'if any of executables are found' do
|
28
|
+
let(:command) { 'pwd' }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
it_behaves_like 'if any of executables are found' do
|
33
|
+
let(:command) { :notepad }
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with builtin command' do
|
37
|
+
it_behaves_like 'if any of executables are found' do
|
38
|
+
let(:command) { :chdir }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'with String' do
|
43
|
+
it_behaves_like 'if any of executables are found' do
|
44
|
+
let(:command) { 'chdir' }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it_behaves_like 'if any of executables are not found' do
|
50
|
+
let(:command) { :not_found }
|
25
51
|
end
|
26
52
|
end
|
27
53
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
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: 2013-01-
|
12
|
+
date: 2013-01-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: os
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,12 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
description: Make controlling subprocess easier in Ruby.
|
26
31
|
email:
|
27
32
|
- m.kukenko@gmail.com
|
@@ -66,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
71
|
version: '0'
|
67
72
|
requirements: []
|
68
73
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.8.
|
74
|
+
rubygems_version: 1.8.24
|
70
75
|
signing_key:
|
71
76
|
specification_version: 3
|
72
77
|
summary: Make controlling subprocess easier in Ruby.
|