wunderbar 0.14.2 → 0.14.3
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/lib/wunderbar/builder.rb +29 -19
- data/lib/wunderbar/version.rb +1 -1
- data/lib/wunderbar/websocket.rb +42 -6
- data/wunderbar.gemspec +2 -2
- metadata +4 -4
data/lib/wunderbar/builder.rb
CHANGED
@@ -78,7 +78,33 @@ module Wunderbar
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
class
|
81
|
+
class BuilderBase
|
82
|
+
def set_variables_from_params(locals={})
|
83
|
+
@_scope.params.merge(locals).each do |key,value|
|
84
|
+
value = value.first if Array === value
|
85
|
+
value.gsub! "\r\n", "\n" if String === value
|
86
|
+
if key =~ /^[a-z]\w+$/
|
87
|
+
instance_variable_set "@#{key.dup.untaint}", value
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_binding
|
93
|
+
binding
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
class BuilderClass < BuilderBase
|
98
|
+
def websocket(*args, &block)
|
99
|
+
if Hash === args.last
|
100
|
+
args.last[:locals] = Hash[instance_variables.
|
101
|
+
map { |name| [name.sub('@',''), instance_variable_get(name)] } ]
|
102
|
+
end
|
103
|
+
Wunderbar.websocket(*args, &block)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
class XmlMarkup < BuilderClass
|
82
108
|
def initialize(args)
|
83
109
|
@_scope = args.delete(:scope)
|
84
110
|
@_builder = SpacedMarkup.new(args)
|
@@ -222,24 +248,8 @@ module Wunderbar
|
|
222
248
|
end
|
223
249
|
end
|
224
250
|
|
225
|
-
class BuilderBase
|
226
|
-
def set_variables_from_params(locals={})
|
227
|
-
@_scope.params.merge(locals).each do |key,value|
|
228
|
-
value = value.first if Array === value
|
229
|
-
value.gsub! "\r\n", "\n" if String === value
|
230
|
-
if key =~ /^[a-z]\w+$/
|
231
|
-
instance_variable_set "@#{key.dup.untaint}", value
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
def get_binding
|
237
|
-
binding
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
251
|
require 'stringio'
|
242
|
-
class TextBuilder <
|
252
|
+
class TextBuilder < BuilderClass
|
243
253
|
def initialize(scope)
|
244
254
|
@_target = StringIO.new
|
245
255
|
@_scope = scope
|
@@ -290,7 +300,7 @@ module Wunderbar
|
|
290
300
|
end
|
291
301
|
end
|
292
302
|
|
293
|
-
class JsonBuilder <
|
303
|
+
class JsonBuilder < BuilderClass
|
294
304
|
def initialize(scope)
|
295
305
|
@_scope = scope
|
296
306
|
@_target = {}
|
data/lib/wunderbar/version.rb
CHANGED
data/lib/wunderbar/websocket.rb
CHANGED
@@ -9,16 +9,18 @@ rescue LoadError
|
|
9
9
|
end
|
10
10
|
|
11
11
|
module Wunderbar
|
12
|
-
class Channel
|
12
|
+
class Channel < BuilderBase
|
13
13
|
attr_reader :port, :connected, :complete
|
14
14
|
|
15
|
-
def initialize(port, limit)
|
15
|
+
def initialize(port, limit, locals=nil)
|
16
16
|
# verify that the port is available
|
17
17
|
TCPServer.new('0.0.0.0', port).close
|
18
18
|
|
19
19
|
super()
|
20
20
|
@port = port
|
21
21
|
@connected = @complete = false
|
22
|
+
@onopen = @onmessage = @onerror = @onclose = Proc.new {}
|
23
|
+
@_scope = Struct.new(:params).new({})
|
22
24
|
@channel1 = EM::Channel.new
|
23
25
|
@channel2 = EM::Channel.new
|
24
26
|
@memory = []
|
@@ -26,6 +28,13 @@ module Wunderbar
|
|
26
28
|
@memory << msg.chomp unless Symbol === msg
|
27
29
|
@memory.shift while @connected and limit and @memory.length > limit
|
28
30
|
end
|
31
|
+
|
32
|
+
if locals
|
33
|
+
@_scope = locals['_scope'] || @_scope
|
34
|
+
set_variables_from_params(locals)
|
35
|
+
_ :type => 'stdout', :line => locals['_scope'].methods.inspect
|
36
|
+
end
|
37
|
+
|
29
38
|
websocket.run
|
30
39
|
end
|
31
40
|
|
@@ -38,6 +47,7 @@ module Wunderbar
|
|
38
47
|
connection = EventMachine::WebSocket::Connection
|
39
48
|
EM.start_server('0.0.0.0', @port, connection, {}) do |ws|
|
40
49
|
ws.onopen do
|
50
|
+
@onopen.call(ws)
|
41
51
|
@memory.each {|msg| ws.send msg }
|
42
52
|
@connected = true
|
43
53
|
ws.close_websocket if complete
|
@@ -51,9 +61,11 @@ module Wunderbar
|
|
51
61
|
end
|
52
62
|
end
|
53
63
|
|
54
|
-
ws.onmessage {|msg| @channel2.push msg}
|
64
|
+
ws.onmessage {|msg| @onmessage.call(msg); @channel2.push msg}
|
65
|
+
|
66
|
+
ws.onerror {|e| @onerror.call(e)}
|
55
67
|
|
56
|
-
ws.onclose {@channel1.unsubscribe sid}
|
68
|
+
ws.onclose {@onclose.call(ws); @channel1.unsubscribe sid}
|
57
69
|
end
|
58
70
|
EM.add_timer(0.1) {ready = true}
|
59
71
|
end
|
@@ -86,6 +98,30 @@ module Wunderbar
|
|
86
98
|
@channel2.pop(*args)
|
87
99
|
end
|
88
100
|
|
101
|
+
def onopen(&block)
|
102
|
+
@onopen = block
|
103
|
+
end
|
104
|
+
|
105
|
+
def onmessage(&block)
|
106
|
+
@onmessage = block
|
107
|
+
end
|
108
|
+
|
109
|
+
def onerror(&block)
|
110
|
+
@onerror = block
|
111
|
+
end
|
112
|
+
|
113
|
+
def onclose(&block)
|
114
|
+
@onclose = block
|
115
|
+
end
|
116
|
+
|
117
|
+
def method_missing(method, *args, &block)
|
118
|
+
if @_scope and @_scope.respond_to? :method
|
119
|
+
@_scope.__send__ method, *args, &block
|
120
|
+
else
|
121
|
+
super
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
89
125
|
def _(*args, &block)
|
90
126
|
if block or args.length > 1
|
91
127
|
begin
|
@@ -151,7 +187,7 @@ module Wunderbar
|
|
151
187
|
|
152
188
|
proc = Proc.new do
|
153
189
|
begin
|
154
|
-
channel = Wunderbar::Channel.new(port, buffer)
|
190
|
+
channel = Wunderbar::Channel.new(port, buffer, opts[:locals])
|
155
191
|
if sock1
|
156
192
|
sock1.send('x',0)
|
157
193
|
sock1.close
|
@@ -167,7 +203,7 @@ module Wunderbar
|
|
167
203
|
if channel
|
168
204
|
channel.complete = true
|
169
205
|
sleep 5
|
170
|
-
sleep 60 unless channel.connected
|
206
|
+
sleep 60 unless channel.connected or opts[:sync]
|
171
207
|
channel.close
|
172
208
|
end
|
173
209
|
end
|
data/wunderbar.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "wunderbar"
|
5
|
-
s.version = "0.14.
|
5
|
+
s.version = "0.14.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Sam Ruby"]
|
9
|
-
s.date = "2012-
|
9
|
+
s.date = "2012-05-01"
|
10
10
|
s.description = " Wunderbar makes it easy to produce valid HTML5, wellformed XHTML, Unicode\n (utf-8), consistently indented, readable applications. This includes\n output that conforms to the Polyglot specification and the emerging\n results from the XML Error Recovery Community Group.\n"
|
11
11
|
s.email = "rubys@intertwingly.net"
|
12
12
|
s.files = ["wunderbar.gemspec", "README.md", "COPYING", "lib/wunderbar.rb", "lib/wunderbar", "lib/wunderbar/installation.rb", "lib/wunderbar/html-methods.rb", "lib/wunderbar/job-control.rb", "lib/wunderbar/server.rb", "lib/wunderbar/logger.rb", "lib/wunderbar/rack.rb", "lib/wunderbar/builder.rb", "lib/wunderbar/websocket.rb", "lib/wunderbar/sinatra.rb", "lib/wunderbar/environment.rb", "lib/wunderbar/rails.rb", "lib/wunderbar/cgi-methods.rb", "lib/wunderbar/cssproxy.rb", "lib/wunderbar/version.rb"]
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wunderbar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 33
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 14
|
9
|
-
-
|
10
|
-
version: 0.14.
|
9
|
+
- 3
|
10
|
+
version: 0.14.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sam Ruby
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-05-01 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: builder
|