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 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