goodguide-gibbon 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/goodguide/gibbon/version.rb +1 -1
- data/lib/goodguide/gibbon.rb +60 -33
- data/vendor/gibbon/lib/gibbon.browser.dev.js +3145 -553
- data/vendor/gibbon/lib/gibbon.browser.js +3135 -541
- metadata +8 -8
data/lib/goodguide/gibbon.rb
CHANGED
@@ -23,18 +23,18 @@ module GoodGuide
|
|
23
23
|
when Array
|
24
24
|
o.map { |x| obj_to_js(x) }
|
25
25
|
when Hash
|
26
|
-
if o['__isHash__']
|
26
|
+
if o['__isHash__']
|
27
27
|
js_hash = gibbon[:Hash].new
|
28
28
|
o.each do |k, v|
|
29
29
|
next if k.to_s == '__isHash__'
|
30
30
|
js_hash.set(k, obj_to_js(v))
|
31
31
|
end
|
32
32
|
js_hash
|
33
|
-
elsif o['
|
34
|
-
|
35
|
-
tag = o['_tag']
|
36
|
-
constructor = gibbon[
|
37
|
-
raise "unknown union #{
|
33
|
+
elsif o['__isVariant__']
|
34
|
+
type = o['_type']
|
35
|
+
tag = o['_tag']
|
36
|
+
constructor = gibbon[type]
|
37
|
+
raise "unknown union #{type}" unless constructor && constructor.tags
|
38
38
|
names = constructor.tags[tag]
|
39
39
|
raise "unknown tag #{tag}" unless names.is_a? V8::Array
|
40
40
|
|
@@ -58,9 +58,20 @@ module GoodGuide
|
|
58
58
|
when V8::Object
|
59
59
|
if o[:__isHash__]
|
60
60
|
hash_to_ruby(o)
|
61
|
-
|
62
|
-
|
61
|
+
elsif o[:__isVariant__]
|
62
|
+
out = {
|
63
|
+
'__isVariant__' => true,
|
64
|
+
'_names' => obj_to_ruby(o[:_names]),
|
65
|
+
'_type' => o[:_type],
|
66
|
+
'_tag' => o[:_tag]
|
67
|
+
}
|
68
|
+
|
69
|
+
o._names.each do |name|
|
70
|
+
out[name] = obj_to_ruby o[name]
|
71
|
+
end
|
63
72
|
|
73
|
+
out
|
74
|
+
else
|
64
75
|
out = {}
|
65
76
|
o.each do |k, v|
|
66
77
|
out[k] = obj_to_ruby(v)
|
@@ -90,6 +101,8 @@ module GoodGuide
|
|
90
101
|
end
|
91
102
|
|
92
103
|
class SemanticError < StandardError
|
104
|
+
include Util
|
105
|
+
|
93
106
|
def initialize(errors)
|
94
107
|
@errors = errors
|
95
108
|
end
|
@@ -99,14 +112,15 @@ module GoodGuide
|
|
99
112
|
end
|
100
113
|
|
101
114
|
private
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
inspect.methodcall(obj)
|
115
|
+
# needed for obj_to_js
|
116
|
+
def gibbon
|
117
|
+
JS.default.gibbon
|
106
118
|
end
|
107
119
|
|
108
120
|
def inspect_expr(expr)
|
109
|
-
|
121
|
+
obj = obj_to_js(expr)
|
122
|
+
inspect = obj[:inspect]
|
123
|
+
inspect.methodcall(obj)
|
110
124
|
end
|
111
125
|
|
112
126
|
def semantic_error_message(e)
|
@@ -121,7 +135,7 @@ module GoodGuide
|
|
121
135
|
type = inspect_expr e['type']
|
122
136
|
"could not destructure #{type}"
|
123
137
|
when 'lookup'
|
124
|
-
query =
|
138
|
+
query = inspect_expr e['query']
|
125
139
|
id = e['id']
|
126
140
|
error = e['error']
|
127
141
|
"error analyzing #{query} on #{id}: #{error}"
|
@@ -168,31 +182,43 @@ module GoodGuide
|
|
168
182
|
|
169
183
|
raise SemanticError.new(errors) if errors
|
170
184
|
|
185
|
+
compiled = context.compile(semantics)
|
186
|
+
|
171
187
|
Program.new(
|
172
188
|
:syntax => syntax,
|
173
|
-
:
|
189
|
+
:compiled => compiled,
|
174
190
|
:context => context,
|
175
191
|
)
|
176
192
|
end
|
177
193
|
|
178
|
-
attr_reader :syntax, :
|
194
|
+
attr_reader :syntax, :compiled
|
195
|
+
def semantics
|
196
|
+
as_json['compiled']['semantics']
|
197
|
+
end
|
198
|
+
|
179
199
|
def initialize(info={})
|
180
|
-
@syntax = info[:syntax]
|
181
|
-
@
|
200
|
+
@syntax = info[:syntax] or raise 'please pass syntax'
|
201
|
+
@compiled = info[:compiled] or raise 'please pass a compiled program'
|
182
202
|
@context = info[:context] || Context.new
|
183
203
|
end
|
184
204
|
|
185
205
|
def as_json
|
186
|
-
{
|
187
|
-
syntax: @syntax,
|
188
|
-
|
206
|
+
@as_json ||= {
|
207
|
+
'syntax' => @context.send(:obj_to_ruby, @syntax),
|
208
|
+
'compiled' => @context.send(:obj_to_ruby, @compiled),
|
189
209
|
}
|
190
210
|
end
|
191
211
|
|
212
|
+
def self.from_json(hash, context)
|
213
|
+
syntax = context.send(:obj_to_js, hash['syntax'])
|
214
|
+
semantics = context.send(:obj_to_js, hash['compiled']['semantics'])
|
215
|
+
blocks = context.send(:obj_to_js, hash['compiled']['blocks'])
|
216
|
+
compiled = context.gibbon[:CompiledCode].new(semantics, blocks)
|
217
|
+
new(syntax: syntax, compiled: compiled, context: context)
|
218
|
+
end
|
219
|
+
|
192
220
|
def call(runtime_client, entity_id)
|
193
|
-
values, error = @context.
|
194
|
-
self.semantics, entity_id, runtime_client.to_js
|
195
|
-
)
|
221
|
+
values, error = @context.run_compiled(@compiled, entity_id, runtime_client.to_js)
|
196
222
|
|
197
223
|
raise error if error
|
198
224
|
values
|
@@ -268,7 +294,7 @@ module GoodGuide
|
|
268
294
|
|
269
295
|
class RuntimeClient < AbstractClient
|
270
296
|
include Util
|
271
|
-
def perform_query(id, annotations
|
297
|
+
def perform_query(id, annotations)
|
272
298
|
annotations = obj_to_ruby(annotations)
|
273
299
|
|
274
300
|
query_type = annotations.delete('_query_type')
|
@@ -279,7 +305,7 @@ module GoodGuide
|
|
279
305
|
@last_id = id
|
280
306
|
|
281
307
|
query = get_query(query_type)
|
282
|
-
instance_exec(id, annotations,
|
308
|
+
instance_exec(id, annotations, &query)
|
283
309
|
end
|
284
310
|
|
285
311
|
def missing_data!
|
@@ -305,25 +331,26 @@ module GoodGuide
|
|
305
331
|
end
|
306
332
|
|
307
333
|
def parse(str)
|
308
|
-
obj_to_ruby self.gibbon.parse(str)
|
334
|
+
obj_to_ruby self.gibbon.parse(str)
|
309
335
|
rescue V8::Error => e
|
310
336
|
raise SemanticError.new([{'_tag' => 'parse', 'message' => e.value}])
|
311
337
|
end
|
312
338
|
|
339
|
+
def compile(semantics)
|
340
|
+
gibbon.compile(obj_to_js(semantics))
|
341
|
+
end
|
342
|
+
|
313
343
|
def analyze(syntax, global_table, static_client)
|
314
344
|
syntax = obj_to_js(syntax)
|
315
345
|
|
316
|
-
|
346
|
+
capture do |&callback|
|
317
347
|
gibbon.analyze(syntax, global_table, static_client, callback)
|
318
348
|
end
|
319
|
-
|
320
|
-
[hash_to_ruby(semantics), obj_to_ruby(error)]
|
321
349
|
end
|
322
350
|
|
323
|
-
def
|
324
|
-
semantics = obj_to_js(semantics)
|
351
|
+
def run_compiled(compiled, entity_id, runtime_client)
|
325
352
|
values, error = capture do |&callback|
|
326
|
-
|
353
|
+
compiled.run('/', entity_id, runtime_client, callback)
|
327
354
|
end
|
328
355
|
|
329
356
|
[hash_to_ruby(values), obj_to_ruby(error)]
|