shell-proxy 0.0.1 → 0.0.2
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/Makefile +3 -1
- data/README.md +36 -3
- data/README/2 +1 -1
- data/README/3 +4 -0
- data/README/4 +1 -0
- data/lib/shell-proxy.rb +10 -185
- data/lib/shell-proxy/cmd_buffer.rb +29 -0
- data/lib/shell-proxy/common.rb +21 -0
- data/lib/shell-proxy/posix.rb +137 -0
- data/lib/shell-proxy/posix/case.rb +40 -0
- data/lib/shell-proxy/{escaping.rb → posix/escaping.rb} +0 -0
- data/lib/shell-proxy/{for.rb → posix/for.rb} +0 -0
- data/lib/shell-proxy/{if.rb → posix/if.rb} +0 -0
- data/lib/shell-proxy/shell_writer.rb +25 -0
- data/lib/shell-proxy/vim.rb +45 -0
- data/proof_of_concept.rb +17 -1
- data/shell-proxy.gemspec +1 -1
- metadata +49 -26
- data/lib/shell-proxy/case.rb +0 -38
data/Makefile
CHANGED
@@ -2,5 +2,7 @@ readme:
|
|
2
2
|
cat README/1 > README.md
|
3
3
|
cat proof_of_concept.rb >> README.md
|
4
4
|
cat README/2 >> README.md
|
5
|
-
ruby proof_of_concept.rb >> README.md
|
5
|
+
ruby proof_of_concept.rb PosixProxy >> README.md
|
6
6
|
cat README/3 >> README.md
|
7
|
+
ruby proof_of_concept.rb VimProxy >> README.md
|
8
|
+
cat README/4 >> README.md
|
data/README.md
CHANGED
@@ -8,13 +8,26 @@ Inputs:
|
|
8
8
|
```ruby
|
9
9
|
require './lib/shell-proxy'
|
10
10
|
|
11
|
+
class ShellProxy
|
12
|
+
case ARGV[0]
|
13
|
+
when "PosixProxy"
|
14
|
+
include PosixProxy
|
15
|
+
when "VimProxy"
|
16
|
+
include VimProxy
|
17
|
+
else
|
18
|
+
raise "usage #{$0}: <PosixProxy|VimProxy>"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
11
22
|
ShellProxy.new.__main__ do
|
12
23
|
cd "Somedir"
|
13
24
|
|
14
|
-
__function("
|
25
|
+
__function("Butts_function") do
|
15
26
|
touch "butts"
|
16
27
|
end
|
17
28
|
|
29
|
+
__call("Butts_function", raw("rawr"))
|
30
|
+
|
18
31
|
__subshell do
|
19
32
|
__subshell do
|
20
33
|
mkdir "borp"
|
@@ -36,6 +49,8 @@ ShellProxy.new.__main__ do
|
|
36
49
|
|
37
50
|
__set("foo", bare("$RANDOM"))
|
38
51
|
|
52
|
+
if ARGV[0] != "VimProxy"
|
53
|
+
|
39
54
|
some | thing | some | other | thing
|
40
55
|
|
41
56
|
__case(raw("$foo")) do |c|
|
@@ -65,16 +80,18 @@ ShellProxy.new.__main__ do
|
|
65
80
|
echo "This wont be reached"
|
66
81
|
end
|
67
82
|
end
|
83
|
+
end
|
68
84
|
end
|
69
85
|
```
|
70
86
|
|
71
|
-
outputs:
|
87
|
+
When invoked with `PosixProxy`, outputs:
|
72
88
|
|
73
89
|
```bash
|
74
90
|
cd 'Somedir'
|
75
|
-
|
91
|
+
Butts_function() {
|
76
92
|
touch 'butts'
|
77
93
|
}
|
94
|
+
Butts_function "rawr"
|
78
95
|
(
|
79
96
|
(
|
80
97
|
mkdir 'borp'
|
@@ -119,3 +136,19 @@ else
|
|
119
136
|
echo 'This wont be reached'
|
120
137
|
fi
|
121
138
|
```
|
139
|
+
|
140
|
+
Or if invoked with VimProxy, outputs:
|
141
|
+
|
142
|
+
```VimL
|
143
|
+
cd Somedir
|
144
|
+
function! Butts_function()
|
145
|
+
!touch butts
|
146
|
+
endfunction
|
147
|
+
call Butts_function(rawr)
|
148
|
+
" subshell currently not implemented
|
149
|
+
let __here="cd " . getcwd()
|
150
|
+
cd /tmp
|
151
|
+
!touch rawr
|
152
|
+
exec __here
|
153
|
+
let foo=$RANDOM
|
154
|
+
```
|
data/README/2
CHANGED
data/README/3
CHANGED
data/README/4
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
```
|
data/lib/shell-proxy.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
require_relative 'shell-proxy/escaping'
|
2
|
-
require_relative 'shell-proxy/case'
|
3
|
-
require_relative 'shell-proxy/for'
|
4
|
-
require_relative 'shell-proxy/if'
|
5
|
-
|
6
1
|
INDENT_PADDING=" "
|
7
2
|
|
8
3
|
class RawString < String
|
@@ -14,6 +9,16 @@ end
|
|
14
9
|
class BareString < String
|
15
10
|
end
|
16
11
|
|
12
|
+
%w[
|
13
|
+
common.rb
|
14
|
+
cmd_buffer.rb
|
15
|
+
shell_writer.rb
|
16
|
+
posix.rb
|
17
|
+
vim.rb
|
18
|
+
].each do |f|
|
19
|
+
require File.expand_path("../shell-proxy/#{f}", __FILE__)
|
20
|
+
end
|
21
|
+
|
17
22
|
def raw(s)
|
18
23
|
RawString.new(s)
|
19
24
|
end
|
@@ -21,183 +26,3 @@ end
|
|
21
26
|
def bare(s)
|
22
27
|
BareString.new(s)
|
23
28
|
end
|
24
|
-
|
25
|
-
class ShellProxy
|
26
|
-
include Escaping
|
27
|
-
|
28
|
-
def __main__(writer = nil, &block)
|
29
|
-
@cmd_buffer = CmdBuffer.new
|
30
|
-
instance_exec(&block)
|
31
|
-
@cmd_buffer.write(writer || __writer)
|
32
|
-
end
|
33
|
-
|
34
|
-
def __subshell(&block)
|
35
|
-
@cmd_buffer << "("
|
36
|
-
@cmd_buffer.indent
|
37
|
-
yield
|
38
|
-
@cmd_buffer.undent
|
39
|
-
@cmd_buffer << ")"
|
40
|
-
end
|
41
|
-
|
42
|
-
def __chdir(dir, &block)
|
43
|
-
__subshell do
|
44
|
-
cd(dir)
|
45
|
-
yield
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def __case(value, &block)
|
50
|
-
CaseStub.new(__escapinate(value), &block).__handle(@cmd_buffer)
|
51
|
-
end
|
52
|
-
|
53
|
-
def __for(over, iter, &block)
|
54
|
-
ForStub.new(over, iter, &block).__handle(@cmd_buffer)
|
55
|
-
end
|
56
|
-
|
57
|
-
def __if(condition, &block)
|
58
|
-
IfStub.new(condition, &block).__handle(@cmd_buffer)
|
59
|
-
end
|
60
|
-
|
61
|
-
def __set(variable, value)
|
62
|
-
__eval("#{variable}=#{__escapinate(value)}")
|
63
|
-
end
|
64
|
-
|
65
|
-
def __return(val)
|
66
|
-
__eval("return #{__escapinate(val)}")
|
67
|
-
end
|
68
|
-
|
69
|
-
def __function(name, &block)
|
70
|
-
@cmd_buffer << "function #{name}() {"
|
71
|
-
@cmd_buffer.indent
|
72
|
-
yield
|
73
|
-
@cmd_buffer.undent
|
74
|
-
@cmd_buffer << "}"
|
75
|
-
end
|
76
|
-
|
77
|
-
def method_missing(sym, *args)
|
78
|
-
opts = case args[-1]
|
79
|
-
when Hash
|
80
|
-
args.pop
|
81
|
-
else
|
82
|
-
{}
|
83
|
-
end
|
84
|
-
|
85
|
-
stub = CmdStub.new(@cmd_buffer)
|
86
|
-
|
87
|
-
cmd = sym.to_s
|
88
|
-
cmd << " #{__process_opts(opts)}" unless opts.empty?
|
89
|
-
cmd << " #{__process_args(args)}" unless args.empty?
|
90
|
-
@cmd_buffer << cmd
|
91
|
-
stub
|
92
|
-
end
|
93
|
-
|
94
|
-
def __eval(str)
|
95
|
-
@cmd_buffer << str
|
96
|
-
end
|
97
|
-
|
98
|
-
def __emit(str)
|
99
|
-
__writer.flush
|
100
|
-
end
|
101
|
-
|
102
|
-
def __writer
|
103
|
-
@writer ||= ShellWriter.new($stdout)
|
104
|
-
end
|
105
|
-
|
106
|
-
def __process_args(args)
|
107
|
-
args.map do |v|
|
108
|
-
__escapinate(v)
|
109
|
-
end.join(" ")
|
110
|
-
end
|
111
|
-
|
112
|
-
def __process_opts(opts)
|
113
|
-
outputs = []
|
114
|
-
__process_and_escape(opts) do |value|
|
115
|
-
outputs << value
|
116
|
-
end
|
117
|
-
outputs.join(" ")
|
118
|
-
end
|
119
|
-
|
120
|
-
def __process_and_escape(opts)
|
121
|
-
opts.each do |k, v|
|
122
|
-
k = k.to_s
|
123
|
-
k = (k.length == 1 ? "-" : "--") + k
|
124
|
-
yield __escapinate(k)
|
125
|
-
yield __escapinate(v) unless v.nil?
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
|
-
class CmdStub
|
132
|
-
def initialize(buffer)
|
133
|
-
@buffer = buffer
|
134
|
-
end
|
135
|
-
|
136
|
-
def emit(data)
|
137
|
-
@emitter.call(data)
|
138
|
-
end
|
139
|
-
|
140
|
-
def |(other)
|
141
|
-
# Append a pipe to the second last command in the stack
|
142
|
-
last = @buffer.pop
|
143
|
-
@buffer << "#{@buffer.pop} | #{last.strip}"
|
144
|
-
self
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
class CmdBuffer
|
150
|
-
def initialize
|
151
|
-
@indent = 0
|
152
|
-
@buffer = []
|
153
|
-
end
|
154
|
-
|
155
|
-
def indent
|
156
|
-
@indent += 1
|
157
|
-
end
|
158
|
-
|
159
|
-
def undent
|
160
|
-
@indent -= 1
|
161
|
-
end
|
162
|
-
|
163
|
-
def << (other)
|
164
|
-
@buffer << "#{INDENT_PADDING * @indent}#{other}"
|
165
|
-
end
|
166
|
-
|
167
|
-
def pop
|
168
|
-
@buffer.pop
|
169
|
-
end
|
170
|
-
|
171
|
-
def write(buf)
|
172
|
-
@buffer.each do |l|
|
173
|
-
buf.puts l
|
174
|
-
end
|
175
|
-
buf.flush
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
class ShellWriter
|
180
|
-
def initialize(to)
|
181
|
-
case to
|
182
|
-
when String
|
183
|
-
@to = File.open(to)
|
184
|
-
when IO
|
185
|
-
@to = to
|
186
|
-
else
|
187
|
-
raise "I don't know what to do"
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
def write(str)
|
192
|
-
@to.write(str)
|
193
|
-
end
|
194
|
-
|
195
|
-
def puts(str)
|
196
|
-
@to.puts(str)
|
197
|
-
end
|
198
|
-
|
199
|
-
def flush
|
200
|
-
@to.flush
|
201
|
-
end
|
202
|
-
|
203
|
-
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class CmdBuffer
|
2
|
+
def initialize
|
3
|
+
@indent = 0
|
4
|
+
@buffer = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def indent
|
8
|
+
@indent += 1
|
9
|
+
end
|
10
|
+
|
11
|
+
def undent
|
12
|
+
@indent -= 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def << (other)
|
16
|
+
@buffer << "#{INDENT_PADDING * @indent}#{other}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def pop
|
20
|
+
@buffer.pop
|
21
|
+
end
|
22
|
+
|
23
|
+
def write(buf)
|
24
|
+
@buffer.each do |l|
|
25
|
+
buf.puts l
|
26
|
+
end
|
27
|
+
buf.flush
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CommonProxy
|
2
|
+
def __main__(writer = nil, buffer = nil, &block)
|
3
|
+
@cmd_buffer = buffer || CmdBuffer.new
|
4
|
+
instance_exec(&block)
|
5
|
+
@cmd_buffer.write(writer || __writer)
|
6
|
+
end
|
7
|
+
|
8
|
+
def __eval(str)
|
9
|
+
@cmd_buffer << str
|
10
|
+
end
|
11
|
+
|
12
|
+
# XXX Holy shit wat
|
13
|
+
def __emit(str)
|
14
|
+
__writer.flush
|
15
|
+
end
|
16
|
+
|
17
|
+
def __writer
|
18
|
+
@writer ||= ShellWriter.new($stdout)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
module PosixProxy include CommonProxy
|
2
|
+
end
|
3
|
+
|
4
|
+
%w[
|
5
|
+
escaping.rb
|
6
|
+
case.rb
|
7
|
+
for.rb
|
8
|
+
if.rb
|
9
|
+
].each do |f|
|
10
|
+
require File.expand_path("../posix/#{f}", __FILE__)
|
11
|
+
end
|
12
|
+
|
13
|
+
module PosixProxy
|
14
|
+
include Escaping
|
15
|
+
|
16
|
+
def __subshell(&block)
|
17
|
+
@cmd_buffer << "("
|
18
|
+
@cmd_buffer.indent
|
19
|
+
yield
|
20
|
+
@cmd_buffer.undent
|
21
|
+
@cmd_buffer << ")"
|
22
|
+
end
|
23
|
+
|
24
|
+
def __chdir(dir, &block)
|
25
|
+
__subshell do
|
26
|
+
cd(dir)
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def __case(value, &block)
|
32
|
+
CaseStub.new(__escapinate(value), &block).__handle(@cmd_buffer)
|
33
|
+
end
|
34
|
+
|
35
|
+
def __for(over, iter, &block)
|
36
|
+
ForStub.new(over, iter, &block).__handle(@cmd_buffer)
|
37
|
+
end
|
38
|
+
|
39
|
+
def __if(condition, &block)
|
40
|
+
IfStub.new(condition, &block).__handle(@cmd_buffer)
|
41
|
+
end
|
42
|
+
|
43
|
+
def __set(variable, value)
|
44
|
+
__eval("#{variable}=#{__escapinate(value)}")
|
45
|
+
end
|
46
|
+
|
47
|
+
def __unset(*variables)
|
48
|
+
__eval("unset #{variables.join(" ")}")
|
49
|
+
end
|
50
|
+
|
51
|
+
def __export(variable, value=nil)
|
52
|
+
export = "export #{variable}"
|
53
|
+
export << "=#{__escapinate(value)}" if value
|
54
|
+
__eval(export)
|
55
|
+
end
|
56
|
+
|
57
|
+
def __call(fn, *args)
|
58
|
+
call = fn
|
59
|
+
unless args.empty?
|
60
|
+
call << " "
|
61
|
+
call << args.map do |arg|
|
62
|
+
__escapinate(arg)
|
63
|
+
end.join(" ")
|
64
|
+
end
|
65
|
+
__eval(call)
|
66
|
+
end
|
67
|
+
|
68
|
+
def __return(val)
|
69
|
+
__eval("return #{__escapinate(val)}")
|
70
|
+
end
|
71
|
+
|
72
|
+
def __function(name, &block)
|
73
|
+
@cmd_buffer << "#{name}() {"
|
74
|
+
@cmd_buffer.indent
|
75
|
+
yield
|
76
|
+
@cmd_buffer.undent
|
77
|
+
@cmd_buffer << "}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def method_missing(sym, *args)
|
81
|
+
opts = case args[-1]
|
82
|
+
when Hash
|
83
|
+
args.pop
|
84
|
+
else
|
85
|
+
{}
|
86
|
+
end
|
87
|
+
|
88
|
+
stub = CmdStub.new(@cmd_buffer)
|
89
|
+
|
90
|
+
cmd = sym.to_s
|
91
|
+
cmd << " #{__process_opts(opts)}" unless opts.empty?
|
92
|
+
cmd << " #{__process_args(args)}" unless args.empty?
|
93
|
+
@cmd_buffer << cmd
|
94
|
+
stub
|
95
|
+
end
|
96
|
+
|
97
|
+
def __process_args(args)
|
98
|
+
args.map do |v|
|
99
|
+
__escapinate(v)
|
100
|
+
end.join(" ")
|
101
|
+
end
|
102
|
+
|
103
|
+
def __process_opts(opts)
|
104
|
+
outputs = []
|
105
|
+
__process_and_escape(opts) do |value|
|
106
|
+
outputs << value
|
107
|
+
end
|
108
|
+
outputs.join(" ")
|
109
|
+
end
|
110
|
+
|
111
|
+
def __process_and_escape(opts)
|
112
|
+
opts.each do |k, v|
|
113
|
+
k = k.to_s
|
114
|
+
k = (k.length == 1 ? "-" : "--") + k
|
115
|
+
yield __escapinate(k)
|
116
|
+
yield __escapinate(v) unless v.nil?
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class CmdStub
|
121
|
+
def initialize(buffer)
|
122
|
+
@buffer = buffer
|
123
|
+
end
|
124
|
+
|
125
|
+
def emit(data)
|
126
|
+
@emitter.call(data)
|
127
|
+
end
|
128
|
+
|
129
|
+
def |(other)
|
130
|
+
# Append a pipe to the second last command in the stack
|
131
|
+
last = @buffer.pop
|
132
|
+
@buffer << "#{@buffer.pop} | #{last.strip}"
|
133
|
+
self
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module PosixProxy
|
2
|
+
class CaseStub
|
3
|
+
def initialize(value, &block)
|
4
|
+
@value = value
|
5
|
+
@block = block
|
6
|
+
end
|
7
|
+
|
8
|
+
def __handle(buffer)
|
9
|
+
handler = CaseHandler.new(buffer)
|
10
|
+
buffer << "case #{@value} in"
|
11
|
+
buffer.indent
|
12
|
+
@block.call(handler)
|
13
|
+
buffer.undent
|
14
|
+
buffer << "esac"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
class CaseHandler
|
20
|
+
def initialize(buffer)
|
21
|
+
@buffer = buffer
|
22
|
+
end
|
23
|
+
|
24
|
+
def __escapinate(v)
|
25
|
+
if v.empty?
|
26
|
+
'""'
|
27
|
+
else
|
28
|
+
v
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def when(opt, &block)
|
33
|
+
@buffer << "#{__escapinate(opt.to_s)})"
|
34
|
+
@buffer.indent
|
35
|
+
yield
|
36
|
+
@buffer.undent
|
37
|
+
@buffer << ";;"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class ShellWriter
|
2
|
+
def initialize(to)
|
3
|
+
case to
|
4
|
+
when String
|
5
|
+
@to = File.open(to)
|
6
|
+
when IO
|
7
|
+
@to = to
|
8
|
+
else
|
9
|
+
raise "I don't know what to do"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def write(str)
|
14
|
+
@to.write(str)
|
15
|
+
end
|
16
|
+
|
17
|
+
def puts(str)
|
18
|
+
@to.puts(str)
|
19
|
+
end
|
20
|
+
|
21
|
+
def flush
|
22
|
+
@to.flush
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module VimProxy include CommonProxy
|
2
|
+
class InvalidMethodName < Exception; end
|
3
|
+
def cd(dir)
|
4
|
+
__eval("cd #{dir}")
|
5
|
+
end
|
6
|
+
|
7
|
+
def __function(name, &block)
|
8
|
+
raise InvalidMethodName, "Methods must start with caps" unless (name =~ /[A-Z]/) == 0
|
9
|
+
@cmd_buffer << "function! #{name}()"
|
10
|
+
@cmd_buffer.indent
|
11
|
+
yield
|
12
|
+
@cmd_buffer.undent
|
13
|
+
@cmd_buffer << "endfunction"
|
14
|
+
end
|
15
|
+
|
16
|
+
def touch(file)
|
17
|
+
__eval("!touch #{file}")
|
18
|
+
end
|
19
|
+
|
20
|
+
def __subshell(&block)
|
21
|
+
@cmd_buffer << '" subshell currently not implemented'
|
22
|
+
end
|
23
|
+
|
24
|
+
def __chdir(dir, &block)
|
25
|
+
__eval "let __here=\"cd \" . getcwd()"
|
26
|
+
__eval "cd #{dir}"
|
27
|
+
@cmd_buffer.indent
|
28
|
+
block.call
|
29
|
+
@cmd_buffer.undent
|
30
|
+
__eval "exec __here"
|
31
|
+
end
|
32
|
+
|
33
|
+
def __set(variable, value)
|
34
|
+
__eval "let #{variable}=#{value}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def __call(fn, *args)
|
38
|
+
opts = (args.last.is_a? Hash) ? args.pop : {}
|
39
|
+
prefix = opts.include?(:prefix) ? "#{opts[:prefix]}:" : ""
|
40
|
+
call = "call #{prefix}#{fn}("
|
41
|
+
call << args.join(", ")
|
42
|
+
call << ")"
|
43
|
+
__eval(call)
|
44
|
+
end
|
45
|
+
end
|
data/proof_of_concept.rb
CHANGED
@@ -1,12 +1,25 @@
|
|
1
1
|
require './lib/shell-proxy'
|
2
2
|
|
3
|
+
class ShellProxy
|
4
|
+
case ARGV[0]
|
5
|
+
when "PosixProxy"
|
6
|
+
include PosixProxy
|
7
|
+
when "VimProxy"
|
8
|
+
include VimProxy
|
9
|
+
else
|
10
|
+
raise "usage #{$0}: <PosixProxy|VimProxy>"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
3
14
|
ShellProxy.new.__main__ do
|
4
15
|
cd "Somedir"
|
5
16
|
|
6
|
-
__function("
|
17
|
+
__function("Butts_function") do
|
7
18
|
touch "butts"
|
8
19
|
end
|
9
20
|
|
21
|
+
__call("Butts_function", raw("rawr"))
|
22
|
+
|
10
23
|
__subshell do
|
11
24
|
__subshell do
|
12
25
|
mkdir "borp"
|
@@ -28,6 +41,8 @@ ShellProxy.new.__main__ do
|
|
28
41
|
|
29
42
|
__set("foo", bare("$RANDOM"))
|
30
43
|
|
44
|
+
if ARGV[0] != "VimProxy"
|
45
|
+
|
31
46
|
some | thing | some | other | thing
|
32
47
|
|
33
48
|
__case(raw("$foo")) do |c|
|
@@ -57,4 +72,5 @@ ShellProxy.new.__main__ do
|
|
57
72
|
echo "This wont be reached"
|
58
73
|
end
|
59
74
|
end
|
75
|
+
end
|
60
76
|
end
|
data/shell-proxy.gemspec
CHANGED
metadata
CHANGED
@@ -1,59 +1,82 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: shell-proxy
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- Richo Healey
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
16
|
+
|
17
|
+
date: 2013-05-02 00:00:00 +10:00
|
18
|
+
default_executable:
|
13
19
|
dependencies: []
|
20
|
+
|
14
21
|
description: description
|
15
|
-
email:
|
22
|
+
email:
|
16
23
|
- richo@psych0tik.net
|
17
24
|
executables: []
|
25
|
+
|
18
26
|
extensions: []
|
27
|
+
|
19
28
|
extra_rdoc_files: []
|
20
|
-
|
29
|
+
|
30
|
+
files:
|
21
31
|
- .gitignore
|
22
32
|
- Makefile
|
23
33
|
- README.md
|
24
34
|
- README/1
|
25
35
|
- README/2
|
26
36
|
- README/3
|
37
|
+
- README/4
|
27
38
|
- lib/shell-proxy.rb
|
28
|
-
- lib/shell-proxy/
|
29
|
-
- lib/shell-proxy/
|
30
|
-
- lib/shell-proxy/
|
31
|
-
- lib/shell-proxy/
|
39
|
+
- lib/shell-proxy/cmd_buffer.rb
|
40
|
+
- lib/shell-proxy/common.rb
|
41
|
+
- lib/shell-proxy/posix.rb
|
42
|
+
- lib/shell-proxy/posix/case.rb
|
43
|
+
- lib/shell-proxy/posix/escaping.rb
|
44
|
+
- lib/shell-proxy/posix/for.rb
|
45
|
+
- lib/shell-proxy/posix/if.rb
|
46
|
+
- lib/shell-proxy/shell_writer.rb
|
47
|
+
- lib/shell-proxy/vim.rb
|
32
48
|
- proof_of_concept.rb
|
33
49
|
- shell-proxy.gemspec
|
34
50
|
- test_shell_proxy.rb
|
51
|
+
has_rdoc: true
|
35
52
|
homepage: http://github.com/richo/shell-proxy
|
36
53
|
licenses: []
|
54
|
+
|
37
55
|
post_install_message:
|
38
56
|
rdoc_options: []
|
39
|
-
|
57
|
+
|
58
|
+
require_paths:
|
40
59
|
- lib
|
41
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
requirements:
|
50
|
-
- -
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
53
74
|
requirements: []
|
75
|
+
|
54
76
|
rubyforge_project:
|
55
|
-
rubygems_version: 1.
|
77
|
+
rubygems_version: 1.3.6
|
56
78
|
signing_key:
|
57
79
|
specification_version: 3
|
58
80
|
summary: description
|
59
81
|
test_files: []
|
82
|
+
|
data/lib/shell-proxy/case.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
class CaseStub
|
2
|
-
def initialize(value, &block)
|
3
|
-
@value = value
|
4
|
-
@block = block
|
5
|
-
end
|
6
|
-
|
7
|
-
def __handle(buffer)
|
8
|
-
handler = CaseHandler.new(buffer)
|
9
|
-
buffer << "case #{@value} in"
|
10
|
-
buffer.indent
|
11
|
-
@block.call(handler)
|
12
|
-
buffer.undent
|
13
|
-
buffer << "esac"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
class CaseHandler
|
19
|
-
def initialize(buffer)
|
20
|
-
@buffer = buffer
|
21
|
-
end
|
22
|
-
|
23
|
-
def __escapinate(v)
|
24
|
-
if v.empty?
|
25
|
-
'""'
|
26
|
-
else
|
27
|
-
v
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def when(opt, &block)
|
32
|
-
@buffer << "#{__escapinate(opt.to_s)})"
|
33
|
-
@buffer.indent
|
34
|
-
yield
|
35
|
-
@buffer.undent
|
36
|
-
@buffer << ";;"
|
37
|
-
end
|
38
|
-
end
|