goodguide-gibbon 0.6.1 → 0.6.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/Gemfile +5 -1
- data/goodguide-gibbon.gemspec +5 -1
- data/lib/goodguide/gibbon.rb +37 -12
- data/lib/goodguide/gibbon/version.rb +1 -1
- data/vendor/gibbon/lib/gibbon.browser.dev.js +49 -7
- data/vendor/gibbon/lib/gibbon.browser.js +49 -7
- metadata +2 -2
data/Gemfile
CHANGED
data/goodguide-gibbon.gemspec
CHANGED
data/lib/goodguide/gibbon.rb
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
-
|
1
|
+
if defined?(JRUBY_VERSION)
|
2
|
+
require 'rhino' # therubyrhino
|
3
|
+
JSError = org.mozilla.javascript.RhinoException
|
4
|
+
JSContext = Rhino::Context
|
5
|
+
JSArray = Rhino::JS::NativeArray
|
6
|
+
JSObject = Rhino::JS::NativeObject
|
7
|
+
JSString = Java::OrgMozillaJavascript::ConsString
|
8
|
+
else
|
9
|
+
require 'v8' # therubyracer
|
10
|
+
JSError = V8::Error
|
11
|
+
JSContext = V8::Context
|
12
|
+
JSArray = V8::Array
|
13
|
+
JSObject = V8::Object
|
14
|
+
JSString = String
|
15
|
+
end
|
2
16
|
|
3
17
|
require 'pathname'
|
4
18
|
|
@@ -11,7 +25,8 @@ module GoodGuide
|
|
11
25
|
|
12
26
|
ruby_hash = { '__isHash__' => true }
|
13
27
|
|
14
|
-
js_hash[:each].methodcall(js_hash, lambda { |
|
28
|
+
js_hash[:each].methodcall(js_hash, lambda { |a, b, c|
|
29
|
+
k, v = defined?(JRUBY_VERSION) ? [a, b] : [b, c]
|
15
30
|
ruby_hash[k] = obj_to_ruby(v)
|
16
31
|
})
|
17
32
|
|
@@ -36,7 +51,7 @@ module GoodGuide
|
|
36
51
|
constructor = gibbon[type]
|
37
52
|
raise "unknown union #{type}" unless constructor && constructor.tags
|
38
53
|
names = constructor.tags[tag]
|
39
|
-
raise "unknown tag #{tag}" unless names.is_a?
|
54
|
+
raise "unknown tag #{tag}" unless names.is_a?(JSArray) or names.is_a?(Array)
|
40
55
|
|
41
56
|
vals = names.map do |name|
|
42
57
|
obj_to_js(o[name])
|
@@ -53,9 +68,11 @@ module GoodGuide
|
|
53
68
|
|
54
69
|
def obj_to_ruby(o)
|
55
70
|
case o
|
56
|
-
when
|
71
|
+
when JSArray, Array
|
57
72
|
o.map { |x| obj_to_ruby(x) }
|
58
|
-
when
|
73
|
+
when JSString
|
74
|
+
o.to_s
|
75
|
+
when JSObject
|
59
76
|
if o[:__isHash__]
|
60
77
|
hash_to_ruby(o)
|
61
78
|
elsif o[:__isVariant__]
|
@@ -247,6 +264,8 @@ module GoodGuide
|
|
247
264
|
|
248
265
|
def proc_for(method)
|
249
266
|
lambda do |this, *args|
|
267
|
+
args = ([this] + args).compact if defined?(JRUBY_VERSION)
|
268
|
+
|
250
269
|
cb = args.pop
|
251
270
|
err, val = begin
|
252
271
|
[nil, send(method, *args)]
|
@@ -332,7 +351,7 @@ module GoodGuide
|
|
332
351
|
|
333
352
|
def parse(str)
|
334
353
|
obj_to_ruby self.gibbon.parse(str)
|
335
|
-
rescue
|
354
|
+
rescue JSError => e
|
336
355
|
raise SemanticError.new([{'_tag' => 'parse', 'message' => e.value}])
|
337
356
|
end
|
338
357
|
|
@@ -360,22 +379,28 @@ module GoodGuide
|
|
360
379
|
def capture(&b)
|
361
380
|
output = nil
|
362
381
|
error = nil
|
363
|
-
b.call do |
|
364
|
-
|
382
|
+
b.call do |*args|
|
383
|
+
# Rhino doesn't get "this", but V8 does.
|
384
|
+
args.shift unless defined?(JRUBY_VERSION)
|
385
|
+
error, output = args[0..1]
|
365
386
|
end
|
366
387
|
|
367
388
|
[output, error]
|
368
389
|
end
|
369
390
|
end
|
370
391
|
|
371
|
-
class JS <
|
392
|
+
class JS < JSContext
|
372
393
|
def self.default
|
373
394
|
@default ||= new
|
374
395
|
end
|
375
396
|
|
376
397
|
class Console
|
377
398
|
def log
|
378
|
-
@log ||=
|
399
|
+
@log ||= if defined?(JRUBY_VERSION)
|
400
|
+
proc { |*a| puts a.map(&:to_s).join(' ') }
|
401
|
+
else
|
402
|
+
proc { |_, *a| puts a.map(&:to_s).join(' ') }
|
403
|
+
end
|
379
404
|
end
|
380
405
|
end
|
381
406
|
|
@@ -387,9 +412,9 @@ module GoodGuide
|
|
387
412
|
self[:console] = Console.new
|
388
413
|
|
389
414
|
if @debug
|
390
|
-
load GoodGuide::Gibbon.dev_js_lib
|
415
|
+
load GoodGuide::Gibbon.dev_js_lib.to_s
|
391
416
|
else
|
392
|
-
load GoodGuide::Gibbon.js_lib
|
417
|
+
load GoodGuide::Gibbon.js_lib.to_s
|
393
418
|
end
|
394
419
|
end
|
395
420
|
|
@@ -1233,7 +1233,7 @@ parse = Gibbon.parse = (function() {
|
|
1233
1233
|
lsplat = multiline(string('[*'));
|
1234
1234
|
rsplat = lexeme(string('*]'));
|
1235
1235
|
query = lexeme(string('.').then(identifier));
|
1236
|
-
queryArg = lexeme(regex(
|
1236
|
+
queryArg = lexeme(regex(/^\w[\w-]*/));
|
1237
1237
|
accessor = lexeme(string('@').then(identifier));
|
1238
1238
|
name = lexeme(identifier);
|
1239
1239
|
str = lexeme(string("'").then(regex(/^[^']*/)).skip(string("'")));
|
@@ -3046,8 +3046,8 @@ Gibbon.Dependency = Dependency = (function(_super) {
|
|
3046
3046
|
query: function(entity, query) {
|
3047
3047
|
return "" + (JSON.stringify(query)) + "<" + entity + ">";
|
3048
3048
|
},
|
3049
|
-
lexical: function(
|
3050
|
-
return "@" +
|
3049
|
+
lexical: function(key) {
|
3050
|
+
return "@" + key;
|
3051
3051
|
},
|
3052
3052
|
failure: function(failure) {
|
3053
3053
|
return "!";
|
@@ -3594,6 +3594,10 @@ Gibbon.Core = Core = (function(_super) {
|
|
3594
3594
|
});
|
3595
3595
|
};
|
3596
3596
|
|
3597
|
+
Core.prototype.failIf = function(message, f) {
|
3598
|
+
return f(this).branch(Core.fail(message), this);
|
3599
|
+
};
|
3600
|
+
|
3597
3601
|
Core.prototype.alwaysFails = function() {
|
3598
3602
|
return this.cases({
|
3599
3603
|
query: function() {
|
@@ -6404,9 +6408,12 @@ Gibbon.codegen = (function() {
|
|
6404
6408
|
})();
|
6405
6409
|
|
6406
6410
|
stdlib = Gibbon.stdlib = (function() {
|
6407
|
-
var FALSE, TRUE, equals;
|
6411
|
+
var FALSE, TRUE, equals, isEmpty;
|
6408
6412
|
TRUE = Core.constant(true);
|
6409
6413
|
FALSE = Core.constant(false);
|
6414
|
+
isEmpty = function(list) {
|
6415
|
+
return list.len().op2('===', Core.constant(0));
|
6416
|
+
};
|
6410
6417
|
equals = function(x, y, type) {
|
6411
6418
|
var direct;
|
6412
6419
|
direct = function() {
|
@@ -6526,9 +6533,7 @@ stdlib = Gibbon.stdlib = (function() {
|
|
6526
6533
|
},
|
6527
6534
|
"empty?": {
|
6528
6535
|
type: parse.type('empty? = [%] -> bool'),
|
6529
|
-
compile:
|
6530
|
-
return list.len().op2('===', Core.constant(0));
|
6531
|
-
}
|
6536
|
+
compile: isEmpty
|
6532
6537
|
},
|
6533
6538
|
weight: {
|
6534
6539
|
type: parse.type('weight [numeric : numeric] = % -> numeric'),
|
@@ -6600,6 +6605,24 @@ stdlib = Gibbon.stdlib = (function() {
|
|
6600
6605
|
});
|
6601
6606
|
}
|
6602
6607
|
},
|
6608
|
+
max: {
|
6609
|
+
type: parse.type('max = [numeric] -> numeric'),
|
6610
|
+
compile: function(list) {
|
6611
|
+
list = list.failIf('max: empty list', isEmpty);
|
6612
|
+
return list.foldList(Core.constant(-Infinity), function(el, next) {
|
6613
|
+
return el.op2('>', next).branch(el, next);
|
6614
|
+
});
|
6615
|
+
}
|
6616
|
+
},
|
6617
|
+
min: {
|
6618
|
+
type: parse.type('min = [numeric] -> numeric'),
|
6619
|
+
compile: function(list) {
|
6620
|
+
list = list.failIf('min: empty list', isEmpty);
|
6621
|
+
return list.foldList(Core.constant(Infinity), function(el, next) {
|
6622
|
+
return el.op2('<', next).branch(el, next);
|
6623
|
+
});
|
6624
|
+
}
|
6625
|
+
},
|
6603
6626
|
"case-sum": {
|
6604
6627
|
type: parse.type('case-sum [bool : numeric] = % -> numeric'),
|
6605
6628
|
compile: function(_, _arg) {
|
@@ -6635,6 +6658,25 @@ stdlib = Gibbon.stdlib = (function() {
|
|
6635
6658
|
return input.op2('+', num.op1('-'));
|
6636
6659
|
}
|
6637
6660
|
},
|
6661
|
+
mul: {
|
6662
|
+
type: parse.type('mul numeric = numeric -> numeric'),
|
6663
|
+
compile: function(input, _arg) {
|
6664
|
+
var num;
|
6665
|
+
num = _arg[0];
|
6666
|
+
return input.op2('*', num);
|
6667
|
+
}
|
6668
|
+
},
|
6669
|
+
div: {
|
6670
|
+
type: parse.type('div numeric = numeric -> numeric'),
|
6671
|
+
compile: function(input, _arg) {
|
6672
|
+
var num;
|
6673
|
+
num = _arg[0];
|
6674
|
+
num = num.failIf('division by zero', function(n) {
|
6675
|
+
return n.op2('===', Core.constant(0));
|
6676
|
+
});
|
6677
|
+
return input.op2('/', num);
|
6678
|
+
}
|
6679
|
+
},
|
6638
6680
|
id: {
|
6639
6681
|
type: parse.type('id = %a -> %a'),
|
6640
6682
|
compile: function(input) {
|
@@ -1223,7 +1223,7 @@ parse = Gibbon.parse = (function() {
|
|
1223
1223
|
lsplat = multiline(string('[*'));
|
1224
1224
|
rsplat = lexeme(string('*]'));
|
1225
1225
|
query = lexeme(string('.').then(identifier));
|
1226
|
-
queryArg = lexeme(regex(
|
1226
|
+
queryArg = lexeme(regex(/^\w[\w-]*/));
|
1227
1227
|
accessor = lexeme(string('@').then(identifier));
|
1228
1228
|
name = lexeme(identifier);
|
1229
1229
|
str = lexeme(string("'").then(regex(/^[^']*/)).skip(string("'")));
|
@@ -3018,8 +3018,8 @@ Gibbon.Dependency = Dependency = (function(_super) {
|
|
3018
3018
|
query: function(entity, query) {
|
3019
3019
|
return "" + (JSON.stringify(query)) + "<" + entity + ">";
|
3020
3020
|
},
|
3021
|
-
lexical: function(
|
3022
|
-
return "@" +
|
3021
|
+
lexical: function(key) {
|
3022
|
+
return "@" + key;
|
3023
3023
|
},
|
3024
3024
|
failure: function(failure) {
|
3025
3025
|
return "!";
|
@@ -3566,6 +3566,10 @@ Gibbon.Core = Core = (function(_super) {
|
|
3566
3566
|
});
|
3567
3567
|
};
|
3568
3568
|
|
3569
|
+
Core.prototype.failIf = function(message, f) {
|
3570
|
+
return f(this).branch(Core.fail(message), this);
|
3571
|
+
};
|
3572
|
+
|
3569
3573
|
Core.prototype.alwaysFails = function() {
|
3570
3574
|
return this.cases({
|
3571
3575
|
query: function() {
|
@@ -6376,9 +6380,12 @@ Gibbon.codegen = (function() {
|
|
6376
6380
|
})();
|
6377
6381
|
|
6378
6382
|
stdlib = Gibbon.stdlib = (function() {
|
6379
|
-
var FALSE, TRUE, equals;
|
6383
|
+
var FALSE, TRUE, equals, isEmpty;
|
6380
6384
|
TRUE = Core.constant(true);
|
6381
6385
|
FALSE = Core.constant(false);
|
6386
|
+
isEmpty = function(list) {
|
6387
|
+
return list.len().op2('===', Core.constant(0));
|
6388
|
+
};
|
6382
6389
|
equals = function(x, y, type) {
|
6383
6390
|
var direct;
|
6384
6391
|
direct = function() {
|
@@ -6498,9 +6505,7 @@ stdlib = Gibbon.stdlib = (function() {
|
|
6498
6505
|
},
|
6499
6506
|
"empty?": {
|
6500
6507
|
type: parse.type('empty? = [%] -> bool'),
|
6501
|
-
compile:
|
6502
|
-
return list.len().op2('===', Core.constant(0));
|
6503
|
-
}
|
6508
|
+
compile: isEmpty
|
6504
6509
|
},
|
6505
6510
|
weight: {
|
6506
6511
|
type: parse.type('weight [numeric : numeric] = % -> numeric'),
|
@@ -6572,6 +6577,24 @@ stdlib = Gibbon.stdlib = (function() {
|
|
6572
6577
|
});
|
6573
6578
|
}
|
6574
6579
|
},
|
6580
|
+
max: {
|
6581
|
+
type: parse.type('max = [numeric] -> numeric'),
|
6582
|
+
compile: function(list) {
|
6583
|
+
list = list.failIf('max: empty list', isEmpty);
|
6584
|
+
return list.foldList(Core.constant(-Infinity), function(el, next) {
|
6585
|
+
return el.op2('>', next).branch(el, next);
|
6586
|
+
});
|
6587
|
+
}
|
6588
|
+
},
|
6589
|
+
min: {
|
6590
|
+
type: parse.type('min = [numeric] -> numeric'),
|
6591
|
+
compile: function(list) {
|
6592
|
+
list = list.failIf('min: empty list', isEmpty);
|
6593
|
+
return list.foldList(Core.constant(Infinity), function(el, next) {
|
6594
|
+
return el.op2('<', next).branch(el, next);
|
6595
|
+
});
|
6596
|
+
}
|
6597
|
+
},
|
6575
6598
|
"case-sum": {
|
6576
6599
|
type: parse.type('case-sum [bool : numeric] = % -> numeric'),
|
6577
6600
|
compile: function(_, _arg) {
|
@@ -6607,6 +6630,25 @@ stdlib = Gibbon.stdlib = (function() {
|
|
6607
6630
|
return input.op2('+', num.op1('-'));
|
6608
6631
|
}
|
6609
6632
|
},
|
6633
|
+
mul: {
|
6634
|
+
type: parse.type('mul numeric = numeric -> numeric'),
|
6635
|
+
compile: function(input, _arg) {
|
6636
|
+
var num;
|
6637
|
+
num = _arg[0];
|
6638
|
+
return input.op2('*', num);
|
6639
|
+
}
|
6640
|
+
},
|
6641
|
+
div: {
|
6642
|
+
type: parse.type('div numeric = numeric -> numeric'),
|
6643
|
+
compile: function(input, _arg) {
|
6644
|
+
var num;
|
6645
|
+
num = _arg[0];
|
6646
|
+
num = num.failIf('division by zero', function(n) {
|
6647
|
+
return n.op2('===', Core.constant(0));
|
6648
|
+
});
|
6649
|
+
return input.op2('/', num);
|
6650
|
+
}
|
6651
|
+
},
|
6610
6652
|
id: {
|
6611
6653
|
type: parse.type('id = %a -> %a'),
|
6612
6654
|
compile: function(input) {
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goodguide-gibbon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: therubyracer
|