shell-proxy 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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("butts_function") do
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
- function butts_function() {
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
@@ -1,5 +1,5 @@
1
1
  ```
2
2
 
3
- outputs:
3
+ When invoked with `PosixProxy`, outputs:
4
4
 
5
5
  ```bash
data/README/3 CHANGED
@@ -1 +1,5 @@
1
1
  ```
2
+
3
+ Or if invoked with VimProxy, outputs:
4
+
5
+ ```VimL
@@ -0,0 +1 @@
1
+ ```
@@ -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
@@ -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
@@ -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("butts_function") do
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "shell-proxy"
5
- s.version = "0.0.1"
5
+ s.version = "0.0.2"
6
6
  s.authors = ["Richo Healey"]
7
7
  s.email = ["richo@psych0tik.net"]
8
8
  s.homepage = "http://github.com/richo/shell-proxy"
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
- version: 0.0.1
5
- prerelease:
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
- date: 2013-04-18 00:00:00.000000000 Z
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
- files:
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/case.rb
29
- - lib/shell-proxy/escaping.rb
30
- - lib/shell-proxy/for.rb
31
- - lib/shell-proxy/if.rb
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
- require_paths:
57
+
58
+ require_paths:
40
59
  - lib
41
- required_ruby_version: !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ! '>='
45
- - !ruby/object:Gem::Version
46
- version: '0'
47
- required_rubygems_version: !ruby/object:Gem::Requirement
48
- none: false
49
- requirements:
50
- - - ! '>='
51
- - !ruby/object:Gem::Version
52
- version: '0'
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.8.24
77
+ rubygems_version: 1.3.6
56
78
  signing_key:
57
79
  specification_version: 3
58
80
  summary: description
59
81
  test_files: []
82
+
@@ -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