goodguide-gibbon 0.3.6 → 0.3.7

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 CHANGED
@@ -4,5 +4,6 @@ gemspec
4
4
  gem 'minitest', '~> 4.0'
5
5
  gem 'wrong'
6
6
  gem 'pry'
7
+ gem 'pry-debugger'
7
8
 
8
9
  gem 'rake'
@@ -1,7 +1,7 @@
1
1
  module GoodGuide
2
2
  module Gibbon
3
3
  def self.version
4
- '0.3.6'
4
+ '0.3.7'
5
5
  end
6
6
  end
7
7
  end
@@ -4,6 +4,47 @@ require 'pathname'
4
4
 
5
5
  module GoodGuide
6
6
  module Gibbon
7
+ module Util
8
+ extend self
9
+ def hash_to_ruby(js_hash)
10
+ return nil unless js_hash
11
+
12
+ ruby_hash = {}
13
+ iterator = lambda { |this, k, v|
14
+ ruby_hash[k] = obj_to_ruby(v)
15
+ }
16
+
17
+ js_hash[:each].methodcall js_hash, iterator
18
+
19
+ ruby_hash
20
+ end
21
+
22
+ def hash_to_js(ruby_hash)
23
+ js_hash = gibbon[:Hash].new
24
+ ruby_hash.each do |k, v|
25
+ js_hash.set(k, v)
26
+ end
27
+ js_hash
28
+ end
29
+
30
+ def obj_to_ruby(o)
31
+ case o
32
+ when V8::Array
33
+ o.map { |x| obj_to_ruby(x) }
34
+ when V8::Object
35
+ o = o.asJSON if o.respond_to? :asJSON
36
+
37
+ out = {}
38
+ o.each do |k, v|
39
+ out[k] = obj_to_ruby(v)
40
+ end
41
+ out
42
+ else
43
+ o
44
+ end
45
+ end
46
+ end
47
+
7
48
  def self.root
8
49
  Pathname.new(__FILE__).dirname.parent.parent
9
50
  end
@@ -58,6 +99,12 @@ module GoodGuide
58
99
  class QueryError < StandardError; end
59
100
 
60
101
  class RuntimeError < StandardError; end
102
+ class MissingData < RuntimeError
103
+ attr_reader :query_type, :id, :annotations
104
+ def initialize(type, id, annotations)
105
+ @query_type, @id, @annotations = type, id, annotations
106
+ end
107
+ end
61
108
 
62
109
  class Program
63
110
  def self.compile(source, info={})
@@ -100,7 +147,7 @@ module GoodGuide
100
147
  self.semantics, entity_id, runtime_client.to_js
101
148
  )
102
149
 
103
- raise RuntimeError.new(error) if error
150
+ raise error if error
104
151
  values
105
152
  end
106
153
  end
@@ -120,7 +167,7 @@ module GoodGuide
120
167
 
121
168
  private
122
169
  def get_query(type)
123
- query = self.class.queries[type]
170
+ query = self.class.queries[type.to_s]
124
171
  raise "no such query #{type}" if query.nil?
125
172
  query
126
173
  end
@@ -130,8 +177,8 @@ module GoodGuide
130
177
  cb = args.pop
131
178
  err, val = begin
132
179
  [nil, send(method, *args)]
133
- rescue QueryError => e
134
- [e.to_s, nil]
180
+ rescue QueryError, RuntimeError => e
181
+ [e, nil]
135
182
  end
136
183
 
137
184
  cb.call(err, val)
@@ -140,6 +187,8 @@ module GoodGuide
140
187
  end
141
188
 
142
189
  class StaticClient < AbstractClient
190
+ include Util
191
+
143
192
  def query_error!(*a)
144
193
  raise QueryError.new(*a)
145
194
  end
@@ -147,7 +196,7 @@ module GoodGuide
147
196
  def analyze_query(input_id, query, t)
148
197
  query_impl = get_query(query.type)
149
198
  analysis = instance_exec(input_id, query.name, t, &query_impl)
150
- analysis[:annotations][:_query_type] = query.type
199
+ analysis[:annotations]['_query_type'] = query.type
151
200
  analysis
152
201
  end
153
202
 
@@ -157,17 +206,33 @@ module GoodGuide
157
206
  end
158
207
 
159
208
  class RuntimeClient < AbstractClient
209
+ include Util
160
210
  def perform_query(id, annotations, v)
161
- query = get_query(annotations[:_query_type])
211
+ annotations = obj_to_ruby(annotations)
212
+
213
+ query_type = annotations.delete('_query_type')
214
+
215
+ # stash this data in case missing_data! is called
216
+ @last_query_type = query_type
217
+ @last_annotations = annotations
218
+ @last_id = id
219
+
220
+ query = get_query(query_type)
162
221
  instance_exec(id, annotations, v, &query)
163
222
  end
164
223
 
224
+ def missing_data!
225
+ raise MissingData.new(@last_query_type, @last_id, @last_annotations)
226
+ end
227
+
165
228
  def to_js
166
229
  { :performQuery => proc_for(:perform_query) }
167
230
  end
168
231
  end
169
232
 
170
233
  class Context
234
+ include Util
235
+
171
236
  attr_reader :gibbon
172
237
  def initialize(js={})
173
238
  if js.is_a? Hash
@@ -209,43 +274,6 @@ module GoodGuide
209
274
  [output, error]
210
275
  end
211
276
 
212
- def hash_to_ruby(js_hash)
213
- return nil unless js_hash
214
-
215
- ruby_hash = {}
216
- iterator = lambda { |this, k, v|
217
- ruby_hash[k] = obj_to_ruby(v)
218
- }
219
-
220
- js_hash[:each].methodcall js_hash, iterator
221
-
222
- ruby_hash
223
- end
224
-
225
- def hash_to_js(ruby_hash)
226
- js_hash = gibbon[:Hash].new
227
- ruby_hash.each do |k, v|
228
- js_hash.set(k, v)
229
- end
230
- js_hash
231
- end
232
-
233
- def obj_to_ruby(o)
234
- case o
235
- when V8::Array
236
- o.map { |x| obj_to_ruby(x) }
237
- when V8::Object
238
- o = o.asJSON if o.respond_to? :asJSON
239
-
240
- out = {}
241
- o.each do |k, v|
242
- out[k] = obj_to_ruby(v)
243
- end
244
- out
245
- else
246
- o
247
- end
248
- end
249
277
  end
250
278
 
251
279
  class JS < V8::Context
@@ -1034,7 +1034,7 @@ parse = Gibbon.parse = (function() {
1034
1034
  lexeme = function(p) {
1035
1035
  return p.skip(ignore);
1036
1036
  };
1037
- identifier = regex(/^[a-z][\w-]*/i);
1037
+ identifier = regex(/^[a-z][\w-]*[?]?/i);
1038
1038
  arrow = lexeme(string('->'));
1039
1039
  define = lexeme(string(':='));
1040
1040
  pair = lexeme(string(':'));
@@ -1219,241 +1219,6 @@ parse = Gibbon.parse = (function() {
1219
1219
  return parse;
1220
1220
  })();
1221
1221
  // Generated by CoffeeScript 1.6.3
1222
- var stdlib;
1223
-
1224
- stdlib = Gibbon.stdlib = (function() {
1225
- return {
1226
- "case": {
1227
- type: parse.type('case [bool : %b] = % -> %b'),
1228
- impl: function(_, evalList) {
1229
- return evalList.then(function(list) {
1230
- var out, step;
1231
- step = function(pair, next) {
1232
- return pair.first.then(function(cond) {
1233
- if (cond.value) {
1234
- return pair.second;
1235
- } else {
1236
- return next();
1237
- }
1238
- });
1239
- };
1240
- out = function() {
1241
- throw new Error('Runtime Error: non-exhaustive cases');
1242
- };
1243
- return Promise.iter(list.elements, step, out);
1244
- });
1245
- }
1246
- },
1247
- weight: {
1248
- type: parse.type('weight [numeric : numeric] = % -> numeric'),
1249
- impl: function(_, eWeights) {
1250
- return eWeights.then(function(weights) {
1251
- return Promise.combine(weights.elements).then(function(pairs) {
1252
- var denominator, numerator, p, process;
1253
- numerator = 0;
1254
- denominator = 0;
1255
- process = function(pair) {
1256
- return Promise.combine([pair.first, pair.second]).after(function(_arg) {
1257
- var first, second;
1258
- first = _arg[0], second = _arg[1];
1259
- numerator += first.value * second.value;
1260
- return denominator += second.value;
1261
- });
1262
- };
1263
- return Promise.combine((function() {
1264
- var _i, _len, _results;
1265
- _results = [];
1266
- for (_i = 0, _len = pairs.length; _i < _len; _i++) {
1267
- p = pairs[_i];
1268
- _results.push(process(p));
1269
- }
1270
- return _results;
1271
- })()).then(function() {
1272
- if (denominator === 0) {
1273
- return Promise.fail('cannot divide by zero');
1274
- }
1275
- debugger;
1276
- return Promise.unit(Value.number(numerator / denominator));
1277
- });
1278
- });
1279
- });
1280
- }
1281
- },
1282
- filter: {
1283
- type: parse.type('filter { %a -> bool } = [%a] -> [%a]'),
1284
- impl: function(evalInput, evalBlock) {
1285
- return evalBlock.then(function(block) {
1286
- var fn;
1287
- fn = block.fn;
1288
- return evalInput.then(function(list) {
1289
- var check, e, out;
1290
- out = [];
1291
- check = function(thunk) {
1292
- return fn(thunk).after(function(bool) {
1293
- if (bool.value) {
1294
- return out.push(thunk);
1295
- }
1296
- });
1297
- };
1298
- return Promise.combine((function() {
1299
- var _i, _len, _ref, _results;
1300
- _ref = list.elements;
1301
- _results = [];
1302
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1303
- e = _ref[_i];
1304
- _results.push(check(e));
1305
- }
1306
- return _results;
1307
- })()).map(function() {
1308
- return Value.list(out);
1309
- });
1310
- });
1311
- });
1312
- }
1313
- },
1314
- scale: {
1315
- type: parse.type('scale (numeric:numeric) (numeric:numeric) = numeric -> numeric'),
1316
- impl: function(eInput, eDomain, eRange) {
1317
- return Promise.combine([eInput, eDomain, eRange]).then(function(_arg) {
1318
- var bounds, dom, input, range;
1319
- input = _arg[0], dom = _arg[1], range = _arg[2];
1320
- bounds = Promise.combine([dom.first, dom.second, range.first, range.second]);
1321
- return bounds.map(function(_arg1) {
1322
- var domHigh, domLow, domSize, rangeHigh, rangeLow, rangeSize, retranslated, scaled, translated;
1323
- domLow = _arg1[0], domHigh = _arg1[1], rangeLow = _arg1[2], rangeHigh = _arg1[3];
1324
- if (input.value < domLow.value) {
1325
- input = domLow;
1326
- } else if (input.value > domHigh.value) {
1327
- input = domHigh;
1328
- }
1329
- domSize = domHigh.value - domLow.value;
1330
- rangeSize = rangeHigh.value - rangeLow.value;
1331
- translated = input.value - domLow.value;
1332
- scaled = translated * rangeSize / domSize;
1333
- retranslated = scaled + rangeLow.value;
1334
- return Value.number(retranslated);
1335
- });
1336
- });
1337
- }
1338
- },
1339
- map: {
1340
- type: parse.type('map { %a -> %b } = [%a] -> [%b]'),
1341
- impl: function(evalList, evalBlock) {
1342
- return evalList.then(function(list) {
1343
- return evalBlock.map(function(block) {
1344
- var e, fn;
1345
- fn = block.fn;
1346
- return Value.list((function() {
1347
- var _i, _len, _ref, _results;
1348
- _ref = list.elements;
1349
- _results = [];
1350
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1351
- e = _ref[_i];
1352
- _results.push(fn(e));
1353
- }
1354
- return _results;
1355
- })());
1356
- });
1357
- });
1358
- }
1359
- },
1360
- count: {
1361
- type: parse.type('count = [%a] -> numeric'),
1362
- impl: function(evalList) {
1363
- return evalList.map(function(list) {
1364
- return Value.number(list.elements.length);
1365
- });
1366
- }
1367
- },
1368
- sum: {
1369
- type: parse.type('sum = [numeric] -> numeric'),
1370
- impl: function(list) {
1371
- return list.then(function(val) {
1372
- return Promise.combine(val.elements).then(function(vals) {
1373
- var e, out, _i, _len;
1374
- out = 0;
1375
- for (_i = 0, _len = vals.length; _i < _len; _i++) {
1376
- e = vals[_i];
1377
- out += e.value;
1378
- }
1379
- return Promise.unit(Value.number(out));
1380
- });
1381
- });
1382
- }
1383
- },
1384
- first: {
1385
- type: parse.type('first = [%a] -> %a'),
1386
- impl: function(list) {
1387
- return list.then(function(val) {
1388
- return val.elements[0];
1389
- });
1390
- }
1391
- },
1392
- add: {
1393
- type: parse.type('add numeric = numeric -> numeric'),
1394
- impl: function(input, num) {
1395
- return Promise.combine([input, num]).map(function(_arg) {
1396
- var lhs, rhs;
1397
- lhs = _arg[0], rhs = _arg[1];
1398
- return Value.number(lhs.value + rhs.value);
1399
- });
1400
- }
1401
- },
1402
- sub: {
1403
- type: parse.type('sub numeric = numeric -> numeric'),
1404
- impl: function(input, num) {
1405
- return Promise.combine([input, num]).map(function(_arg) {
1406
- var lhs, rhs;
1407
- lhs = _arg[0], rhs = _arg[1];
1408
- return Value.number(lhs.value - rhs.value);
1409
- });
1410
- }
1411
- },
1412
- id: {
1413
- type: parse.type('id = %a -> %a'),
1414
- impl: function(x) {
1415
- return x;
1416
- }
1417
- },
1418
- "else": {
1419
- type: parse.type('else = % -> bool'),
1420
- impl: function(_) {
1421
- return Promise.unit(Value.boolean(true));
1422
- }
1423
- },
1424
- gt: {
1425
- type: parse.type('gt numeric = numeric -> bool'),
1426
- impl: function(input, num) {
1427
- return Promise.combine([input, num]).map(function(_arg) {
1428
- var lhs, rhs;
1429
- lhs = _arg[0], rhs = _arg[1];
1430
- return Value.boolean(lhs.value > rhs.value);
1431
- });
1432
- }
1433
- },
1434
- lt: {
1435
- type: parse.type('lt numeric = numeric -> bool'),
1436
- impl: function(input, num) {
1437
- return Promise.combine([input, num]).map(function(_arg) {
1438
- var lhs, rhs;
1439
- lhs = _arg[0], rhs = _arg[1];
1440
- return Value.boolean(lhs.value < rhs.value);
1441
- });
1442
- }
1443
- },
1444
- eq: {
1445
- type: parse.type('eq %a = %a -> bool'),
1446
- impl: function(input, obj) {
1447
- return Promise.combine([input, obj]).then(function(_arg) {
1448
- var lhs, rhs;
1449
- lhs = _arg[0], rhs = _arg[1];
1450
- return lhs.equals(rhs);
1451
- });
1452
- }
1453
- }
1454
- };
1455
- })();
1456
- // Generated by CoffeeScript 1.6.3
1457
1222
  var Semantic, Type, TypeLookup, analyze, _ref, _ref1, _ref2,
1458
1223
  __hasProp = {}.hasOwnProperty,
1459
1224
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
@@ -2874,6 +2639,317 @@ eval_ = Gibbon["eval"] = (function() {
2874
2639
  };
2875
2640
  })();
2876
2641
  // Generated by CoffeeScript 1.6.3
2642
+ var stdlib;
2643
+
2644
+ stdlib = Gibbon.stdlib = (function() {
2645
+ var combine, iter, unit, vFalse, vTrue;
2646
+ unit = Promise.unit;
2647
+ iter = Promise.iter;
2648
+ combine = Promise.combine;
2649
+ vTrue = Value.boolean(true);
2650
+ vFalse = Value.boolean(false);
2651
+ return {
2652
+ "case": {
2653
+ type: parse.type('case [bool : %b] = % -> %b'),
2654
+ impl: function(_, evalList) {
2655
+ return evalList.then(function(list) {
2656
+ var out, step;
2657
+ step = function(pair, next) {
2658
+ return pair.first.then(function(cond) {
2659
+ if (cond.value) {
2660
+ return pair.second;
2661
+ } else {
2662
+ return next();
2663
+ }
2664
+ });
2665
+ };
2666
+ out = function() {
2667
+ throw new Error('Runtime Error: non-exhaustive cases');
2668
+ };
2669
+ return iter(list.elements, step, out);
2670
+ });
2671
+ }
2672
+ },
2673
+ "any?": {
2674
+ type: parse.type('any? { %a -> bool } = [%a] -> bool'),
2675
+ impl: function(evalList, evalBlock) {
2676
+ return combine([evalList, evalBlock]).then(function(_arg) {
2677
+ var block, booleans, e, fn, list, out, step;
2678
+ list = _arg[0], block = _arg[1];
2679
+ fn = block.fn;
2680
+ booleans = (function() {
2681
+ var _i, _len, _ref, _results;
2682
+ _ref = list.elements;
2683
+ _results = [];
2684
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2685
+ e = _ref[_i];
2686
+ _results.push(fn(e));
2687
+ }
2688
+ return _results;
2689
+ })();
2690
+ step = function(cond, next) {
2691
+ if (cond.value) {
2692
+ return unit(vTrue);
2693
+ } else {
2694
+ return next();
2695
+ }
2696
+ };
2697
+ out = function() {
2698
+ return unit(vFalse);
2699
+ };
2700
+ return iter(booleans, step, out);
2701
+ });
2702
+ }
2703
+ },
2704
+ "all?": {
2705
+ type: parse.type('all? { %a -> bool } = [%a] -> bool'),
2706
+ impl: function(evalList, evalBlock) {
2707
+ return combine([evalList, evalBlock]).then(function(_arg) {
2708
+ var block, booleans, e, fn, list, out, step;
2709
+ list = _arg[0], block = _arg[1];
2710
+ fn = block.fn;
2711
+ booleans = (function() {
2712
+ var _i, _len, _ref, _results;
2713
+ _ref = list.elements;
2714
+ _results = [];
2715
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2716
+ e = _ref[_i];
2717
+ _results.push(fn(e));
2718
+ }
2719
+ return _results;
2720
+ })();
2721
+ step = function(cond, next) {
2722
+ if (cond.value) {
2723
+ return next();
2724
+ } else {
2725
+ return unit(vFalse);
2726
+ }
2727
+ };
2728
+ out = function() {
2729
+ return trueP;
2730
+ };
2731
+ return Promise.iter(booleans, step, out);
2732
+ });
2733
+ }
2734
+ },
2735
+ "empty?": {
2736
+ type: parse.type('empty? = [%] -> bool'),
2737
+ impl: function(evalList) {
2738
+ return evalList.map(function(list) {
2739
+ return Value.boolean(list.length === 0);
2740
+ });
2741
+ }
2742
+ },
2743
+ weight: {
2744
+ type: parse.type('weight [numeric : numeric] = % -> numeric'),
2745
+ impl: function(_, eWeights) {
2746
+ return eWeights.then(function(weights) {
2747
+ return combine(weights.elements).then(function(pairs) {
2748
+ var denominator, numerator, p, process;
2749
+ numerator = 0;
2750
+ denominator = 0;
2751
+ process = function(pair) {
2752
+ return combine([pair.first, pair.second]).after(function(_arg) {
2753
+ var first, second;
2754
+ first = _arg[0], second = _arg[1];
2755
+ numerator += first.value * second.value;
2756
+ return denominator += second.value;
2757
+ });
2758
+ };
2759
+ return combine((function() {
2760
+ var _i, _len, _results;
2761
+ _results = [];
2762
+ for (_i = 0, _len = pairs.length; _i < _len; _i++) {
2763
+ p = pairs[_i];
2764
+ _results.push(process(p));
2765
+ }
2766
+ return _results;
2767
+ })()).then(function() {
2768
+ if (denominator === 0) {
2769
+ return Promise.fail('cannot divide by zero');
2770
+ }
2771
+ debugger;
2772
+ return Promise.unit(Value.number(numerator / denominator));
2773
+ });
2774
+ });
2775
+ });
2776
+ }
2777
+ },
2778
+ filter: {
2779
+ type: parse.type('filter { %a -> bool } = [%a] -> [%a]'),
2780
+ impl: function(evalInput, evalBlock) {
2781
+ return evalBlock.then(function(block) {
2782
+ var fn;
2783
+ fn = block.fn;
2784
+ return evalInput.then(function(list) {
2785
+ var check, e, out;
2786
+ out = [];
2787
+ check = function(thunk) {
2788
+ return fn(thunk).after(function(bool) {
2789
+ if (bool.value) {
2790
+ return out.push(thunk);
2791
+ }
2792
+ });
2793
+ };
2794
+ return combine((function() {
2795
+ var _i, _len, _ref, _results;
2796
+ _ref = list.elements;
2797
+ _results = [];
2798
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2799
+ e = _ref[_i];
2800
+ _results.push(check(e));
2801
+ }
2802
+ return _results;
2803
+ })()).map(function() {
2804
+ return Value.list(out);
2805
+ });
2806
+ });
2807
+ });
2808
+ }
2809
+ },
2810
+ scale: {
2811
+ type: parse.type('scale (numeric:numeric) (numeric:numeric) = numeric -> numeric'),
2812
+ impl: function(eInput, eDomain, eRange) {
2813
+ return combine([eInput, eDomain, eRange]).then(function(_arg) {
2814
+ var bounds, dom, input, range;
2815
+ input = _arg[0], dom = _arg[1], range = _arg[2];
2816
+ bounds = combine([dom.first, dom.second, range.first, range.second]);
2817
+ return bounds.map(function(_arg1) {
2818
+ var domHigh, domLow, domSize, rangeHigh, rangeLow, rangeSize, retranslated, scaled, translated;
2819
+ domLow = _arg1[0], domHigh = _arg1[1], rangeLow = _arg1[2], rangeHigh = _arg1[3];
2820
+ if (input.value < domLow.value) {
2821
+ input = domLow;
2822
+ } else if (input.value > domHigh.value) {
2823
+ input = domHigh;
2824
+ }
2825
+ domSize = domHigh.value - domLow.value;
2826
+ rangeSize = rangeHigh.value - rangeLow.value;
2827
+ translated = input.value - domLow.value;
2828
+ scaled = translated * rangeSize / domSize;
2829
+ retranslated = scaled + rangeLow.value;
2830
+ return Value.number(retranslated);
2831
+ });
2832
+ });
2833
+ }
2834
+ },
2835
+ map: {
2836
+ type: parse.type('map { %a -> %b } = [%a] -> [%b]'),
2837
+ impl: function(evalList, evalBlock) {
2838
+ return evalList.then(function(list) {
2839
+ return evalBlock.map(function(block) {
2840
+ var e, fn;
2841
+ fn = block.fn;
2842
+ return Value.list((function() {
2843
+ var _i, _len, _ref, _results;
2844
+ _ref = list.elements;
2845
+ _results = [];
2846
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2847
+ e = _ref[_i];
2848
+ _results.push(fn(e));
2849
+ }
2850
+ return _results;
2851
+ })());
2852
+ });
2853
+ });
2854
+ }
2855
+ },
2856
+ count: {
2857
+ type: parse.type('count = [%a] -> numeric'),
2858
+ impl: function(evalList) {
2859
+ return evalList.map(function(list) {
2860
+ return Value.number(list.elements.length);
2861
+ });
2862
+ }
2863
+ },
2864
+ sum: {
2865
+ type: parse.type('sum = [numeric] -> numeric'),
2866
+ impl: function(list) {
2867
+ return list.then(function(val) {
2868
+ return combine(val.elements).then(function(vals) {
2869
+ var e, out, _i, _len;
2870
+ out = 0;
2871
+ for (_i = 0, _len = vals.length; _i < _len; _i++) {
2872
+ e = vals[_i];
2873
+ out += e.value;
2874
+ }
2875
+ return Promise.unit(Value.number(out));
2876
+ });
2877
+ });
2878
+ }
2879
+ },
2880
+ first: {
2881
+ type: parse.type('first = [%a] -> %a'),
2882
+ impl: function(list) {
2883
+ return list.then(function(val) {
2884
+ return val.elements[0];
2885
+ });
2886
+ }
2887
+ },
2888
+ add: {
2889
+ type: parse.type('add numeric = numeric -> numeric'),
2890
+ impl: function(input, num) {
2891
+ return combine([input, num]).map(function(_arg) {
2892
+ var lhs, rhs;
2893
+ lhs = _arg[0], rhs = _arg[1];
2894
+ return Value.number(lhs.value + rhs.value);
2895
+ });
2896
+ }
2897
+ },
2898
+ sub: {
2899
+ type: parse.type('sub numeric = numeric -> numeric'),
2900
+ impl: function(input, num) {
2901
+ return combine([input, num]).map(function(_arg) {
2902
+ var lhs, rhs;
2903
+ lhs = _arg[0], rhs = _arg[1];
2904
+ return Value.number(lhs.value - rhs.value);
2905
+ });
2906
+ }
2907
+ },
2908
+ id: {
2909
+ type: parse.type('id = %a -> %a'),
2910
+ impl: function(x) {
2911
+ return x;
2912
+ }
2913
+ },
2914
+ "else": {
2915
+ type: parse.type('else = % -> bool'),
2916
+ impl: function(_) {
2917
+ return unit(vTrue);
2918
+ }
2919
+ },
2920
+ gt: {
2921
+ type: parse.type('gt numeric = numeric -> bool'),
2922
+ impl: function(input, num) {
2923
+ return combine([input, num]).map(function(_arg) {
2924
+ var lhs, rhs;
2925
+ lhs = _arg[0], rhs = _arg[1];
2926
+ return Value.boolean(lhs.value > rhs.value);
2927
+ });
2928
+ }
2929
+ },
2930
+ lt: {
2931
+ type: parse.type('lt numeric = numeric -> bool'),
2932
+ impl: function(input, num) {
2933
+ return combine([input, num]).map(function(_arg) {
2934
+ var lhs, rhs;
2935
+ lhs = _arg[0], rhs = _arg[1];
2936
+ return Value.boolean(lhs.value < rhs.value);
2937
+ });
2938
+ }
2939
+ },
2940
+ eq: {
2941
+ type: parse.type('eq %a = %a -> bool'),
2942
+ impl: function(input, obj) {
2943
+ return combine([input, obj]).then(function(_arg) {
2944
+ var lhs, rhs;
2945
+ lhs = _arg[0], rhs = _arg[1];
2946
+ return lhs.equals(rhs);
2947
+ });
2948
+ }
2949
+ }
2950
+ };
2951
+ })();
2952
+ // Generated by CoffeeScript 1.6.3
2877
2953
  Gibbon.jsonConsumer = (function() {
2878
2954
  return function(tables) {
2879
2955
  var analyzeList, getType, getValue, lists;
@@ -1028,7 +1028,7 @@ parse = Gibbon.parse = (function() {
1028
1028
  lexeme = function(p) {
1029
1029
  return p.skip(ignore);
1030
1030
  };
1031
- identifier = regex(/^[a-z][\w-]*/i);
1031
+ identifier = regex(/^[a-z][\w-]*[?]?/i);
1032
1032
  arrow = lexeme(string('->'));
1033
1033
  define = lexeme(string(':='));
1034
1034
  pair = lexeme(string(':'));
@@ -1213,241 +1213,6 @@ parse = Gibbon.parse = (function() {
1213
1213
  return parse;
1214
1214
  })();
1215
1215
  // Generated by CoffeeScript 1.6.3
1216
- var stdlib;
1217
-
1218
- stdlib = Gibbon.stdlib = (function() {
1219
- return {
1220
- "case": {
1221
- type: parse.type('case [bool : %b] = % -> %b'),
1222
- impl: function(_, evalList) {
1223
- return evalList.then(function(list) {
1224
- var out, step;
1225
- step = function(pair, next) {
1226
- return pair.first.then(function(cond) {
1227
- if (cond.value) {
1228
- return pair.second;
1229
- } else {
1230
- return next();
1231
- }
1232
- });
1233
- };
1234
- out = function() {
1235
- throw new Error('Runtime Error: non-exhaustive cases');
1236
- };
1237
- return Promise.iter(list.elements, step, out);
1238
- });
1239
- }
1240
- },
1241
- weight: {
1242
- type: parse.type('weight [numeric : numeric] = % -> numeric'),
1243
- impl: function(_, eWeights) {
1244
- return eWeights.then(function(weights) {
1245
- return Promise.combine(weights.elements).then(function(pairs) {
1246
- var denominator, numerator, p, process;
1247
- numerator = 0;
1248
- denominator = 0;
1249
- process = function(pair) {
1250
- return Promise.combine([pair.first, pair.second]).after(function(_arg) {
1251
- var first, second;
1252
- first = _arg[0], second = _arg[1];
1253
- numerator += first.value * second.value;
1254
- return denominator += second.value;
1255
- });
1256
- };
1257
- return Promise.combine((function() {
1258
- var _i, _len, _results;
1259
- _results = [];
1260
- for (_i = 0, _len = pairs.length; _i < _len; _i++) {
1261
- p = pairs[_i];
1262
- _results.push(process(p));
1263
- }
1264
- return _results;
1265
- })()).then(function() {
1266
- if (denominator === 0) {
1267
- return Promise.fail('cannot divide by zero');
1268
- }
1269
- debugger;
1270
- return Promise.unit(Value.number(numerator / denominator));
1271
- });
1272
- });
1273
- });
1274
- }
1275
- },
1276
- filter: {
1277
- type: parse.type('filter { %a -> bool } = [%a] -> [%a]'),
1278
- impl: function(evalInput, evalBlock) {
1279
- return evalBlock.then(function(block) {
1280
- var fn;
1281
- fn = block.fn;
1282
- return evalInput.then(function(list) {
1283
- var check, e, out;
1284
- out = [];
1285
- check = function(thunk) {
1286
- return fn(thunk).after(function(bool) {
1287
- if (bool.value) {
1288
- return out.push(thunk);
1289
- }
1290
- });
1291
- };
1292
- return Promise.combine((function() {
1293
- var _i, _len, _ref, _results;
1294
- _ref = list.elements;
1295
- _results = [];
1296
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1297
- e = _ref[_i];
1298
- _results.push(check(e));
1299
- }
1300
- return _results;
1301
- })()).map(function() {
1302
- return Value.list(out);
1303
- });
1304
- });
1305
- });
1306
- }
1307
- },
1308
- scale: {
1309
- type: parse.type('scale (numeric:numeric) (numeric:numeric) = numeric -> numeric'),
1310
- impl: function(eInput, eDomain, eRange) {
1311
- return Promise.combine([eInput, eDomain, eRange]).then(function(_arg) {
1312
- var bounds, dom, input, range;
1313
- input = _arg[0], dom = _arg[1], range = _arg[2];
1314
- bounds = Promise.combine([dom.first, dom.second, range.first, range.second]);
1315
- return bounds.map(function(_arg1) {
1316
- var domHigh, domLow, domSize, rangeHigh, rangeLow, rangeSize, retranslated, scaled, translated;
1317
- domLow = _arg1[0], domHigh = _arg1[1], rangeLow = _arg1[2], rangeHigh = _arg1[3];
1318
- if (input.value < domLow.value) {
1319
- input = domLow;
1320
- } else if (input.value > domHigh.value) {
1321
- input = domHigh;
1322
- }
1323
- domSize = domHigh.value - domLow.value;
1324
- rangeSize = rangeHigh.value - rangeLow.value;
1325
- translated = input.value - domLow.value;
1326
- scaled = translated * rangeSize / domSize;
1327
- retranslated = scaled + rangeLow.value;
1328
- return Value.number(retranslated);
1329
- });
1330
- });
1331
- }
1332
- },
1333
- map: {
1334
- type: parse.type('map { %a -> %b } = [%a] -> [%b]'),
1335
- impl: function(evalList, evalBlock) {
1336
- return evalList.then(function(list) {
1337
- return evalBlock.map(function(block) {
1338
- var e, fn;
1339
- fn = block.fn;
1340
- return Value.list((function() {
1341
- var _i, _len, _ref, _results;
1342
- _ref = list.elements;
1343
- _results = [];
1344
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1345
- e = _ref[_i];
1346
- _results.push(fn(e));
1347
- }
1348
- return _results;
1349
- })());
1350
- });
1351
- });
1352
- }
1353
- },
1354
- count: {
1355
- type: parse.type('count = [%a] -> numeric'),
1356
- impl: function(evalList) {
1357
- return evalList.map(function(list) {
1358
- return Value.number(list.elements.length);
1359
- });
1360
- }
1361
- },
1362
- sum: {
1363
- type: parse.type('sum = [numeric] -> numeric'),
1364
- impl: function(list) {
1365
- return list.then(function(val) {
1366
- return Promise.combine(val.elements).then(function(vals) {
1367
- var e, out, _i, _len;
1368
- out = 0;
1369
- for (_i = 0, _len = vals.length; _i < _len; _i++) {
1370
- e = vals[_i];
1371
- out += e.value;
1372
- }
1373
- return Promise.unit(Value.number(out));
1374
- });
1375
- });
1376
- }
1377
- },
1378
- first: {
1379
- type: parse.type('first = [%a] -> %a'),
1380
- impl: function(list) {
1381
- return list.then(function(val) {
1382
- return val.elements[0];
1383
- });
1384
- }
1385
- },
1386
- add: {
1387
- type: parse.type('add numeric = numeric -> numeric'),
1388
- impl: function(input, num) {
1389
- return Promise.combine([input, num]).map(function(_arg) {
1390
- var lhs, rhs;
1391
- lhs = _arg[0], rhs = _arg[1];
1392
- return Value.number(lhs.value + rhs.value);
1393
- });
1394
- }
1395
- },
1396
- sub: {
1397
- type: parse.type('sub numeric = numeric -> numeric'),
1398
- impl: function(input, num) {
1399
- return Promise.combine([input, num]).map(function(_arg) {
1400
- var lhs, rhs;
1401
- lhs = _arg[0], rhs = _arg[1];
1402
- return Value.number(lhs.value - rhs.value);
1403
- });
1404
- }
1405
- },
1406
- id: {
1407
- type: parse.type('id = %a -> %a'),
1408
- impl: function(x) {
1409
- return x;
1410
- }
1411
- },
1412
- "else": {
1413
- type: parse.type('else = % -> bool'),
1414
- impl: function(_) {
1415
- return Promise.unit(Value.boolean(true));
1416
- }
1417
- },
1418
- gt: {
1419
- type: parse.type('gt numeric = numeric -> bool'),
1420
- impl: function(input, num) {
1421
- return Promise.combine([input, num]).map(function(_arg) {
1422
- var lhs, rhs;
1423
- lhs = _arg[0], rhs = _arg[1];
1424
- return Value.boolean(lhs.value > rhs.value);
1425
- });
1426
- }
1427
- },
1428
- lt: {
1429
- type: parse.type('lt numeric = numeric -> bool'),
1430
- impl: function(input, num) {
1431
- return Promise.combine([input, num]).map(function(_arg) {
1432
- var lhs, rhs;
1433
- lhs = _arg[0], rhs = _arg[1];
1434
- return Value.boolean(lhs.value < rhs.value);
1435
- });
1436
- }
1437
- },
1438
- eq: {
1439
- type: parse.type('eq %a = %a -> bool'),
1440
- impl: function(input, obj) {
1441
- return Promise.combine([input, obj]).then(function(_arg) {
1442
- var lhs, rhs;
1443
- lhs = _arg[0], rhs = _arg[1];
1444
- return lhs.equals(rhs);
1445
- });
1446
- }
1447
- }
1448
- };
1449
- })();
1450
- // Generated by CoffeeScript 1.6.3
1451
1216
  var Semantic, Type, TypeLookup, analyze, _ref, _ref1, _ref2,
1452
1217
  __hasProp = {}.hasOwnProperty,
1453
1218
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
@@ -2846,6 +2611,317 @@ eval_ = Gibbon["eval"] = (function() {
2846
2611
  };
2847
2612
  })();
2848
2613
  // Generated by CoffeeScript 1.6.3
2614
+ var stdlib;
2615
+
2616
+ stdlib = Gibbon.stdlib = (function() {
2617
+ var combine, iter, unit, vFalse, vTrue;
2618
+ unit = Promise.unit;
2619
+ iter = Promise.iter;
2620
+ combine = Promise.combine;
2621
+ vTrue = Value.boolean(true);
2622
+ vFalse = Value.boolean(false);
2623
+ return {
2624
+ "case": {
2625
+ type: parse.type('case [bool : %b] = % -> %b'),
2626
+ impl: function(_, evalList) {
2627
+ return evalList.then(function(list) {
2628
+ var out, step;
2629
+ step = function(pair, next) {
2630
+ return pair.first.then(function(cond) {
2631
+ if (cond.value) {
2632
+ return pair.second;
2633
+ } else {
2634
+ return next();
2635
+ }
2636
+ });
2637
+ };
2638
+ out = function() {
2639
+ throw new Error('Runtime Error: non-exhaustive cases');
2640
+ };
2641
+ return iter(list.elements, step, out);
2642
+ });
2643
+ }
2644
+ },
2645
+ "any?": {
2646
+ type: parse.type('any? { %a -> bool } = [%a] -> bool'),
2647
+ impl: function(evalList, evalBlock) {
2648
+ return combine([evalList, evalBlock]).then(function(_arg) {
2649
+ var block, booleans, e, fn, list, out, step;
2650
+ list = _arg[0], block = _arg[1];
2651
+ fn = block.fn;
2652
+ booleans = (function() {
2653
+ var _i, _len, _ref, _results;
2654
+ _ref = list.elements;
2655
+ _results = [];
2656
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2657
+ e = _ref[_i];
2658
+ _results.push(fn(e));
2659
+ }
2660
+ return _results;
2661
+ })();
2662
+ step = function(cond, next) {
2663
+ if (cond.value) {
2664
+ return unit(vTrue);
2665
+ } else {
2666
+ return next();
2667
+ }
2668
+ };
2669
+ out = function() {
2670
+ return unit(vFalse);
2671
+ };
2672
+ return iter(booleans, step, out);
2673
+ });
2674
+ }
2675
+ },
2676
+ "all?": {
2677
+ type: parse.type('all? { %a -> bool } = [%a] -> bool'),
2678
+ impl: function(evalList, evalBlock) {
2679
+ return combine([evalList, evalBlock]).then(function(_arg) {
2680
+ var block, booleans, e, fn, list, out, step;
2681
+ list = _arg[0], block = _arg[1];
2682
+ fn = block.fn;
2683
+ booleans = (function() {
2684
+ var _i, _len, _ref, _results;
2685
+ _ref = list.elements;
2686
+ _results = [];
2687
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2688
+ e = _ref[_i];
2689
+ _results.push(fn(e));
2690
+ }
2691
+ return _results;
2692
+ })();
2693
+ step = function(cond, next) {
2694
+ if (cond.value) {
2695
+ return next();
2696
+ } else {
2697
+ return unit(vFalse);
2698
+ }
2699
+ };
2700
+ out = function() {
2701
+ return trueP;
2702
+ };
2703
+ return Promise.iter(booleans, step, out);
2704
+ });
2705
+ }
2706
+ },
2707
+ "empty?": {
2708
+ type: parse.type('empty? = [%] -> bool'),
2709
+ impl: function(evalList) {
2710
+ return evalList.map(function(list) {
2711
+ return Value.boolean(list.length === 0);
2712
+ });
2713
+ }
2714
+ },
2715
+ weight: {
2716
+ type: parse.type('weight [numeric : numeric] = % -> numeric'),
2717
+ impl: function(_, eWeights) {
2718
+ return eWeights.then(function(weights) {
2719
+ return combine(weights.elements).then(function(pairs) {
2720
+ var denominator, numerator, p, process;
2721
+ numerator = 0;
2722
+ denominator = 0;
2723
+ process = function(pair) {
2724
+ return combine([pair.first, pair.second]).after(function(_arg) {
2725
+ var first, second;
2726
+ first = _arg[0], second = _arg[1];
2727
+ numerator += first.value * second.value;
2728
+ return denominator += second.value;
2729
+ });
2730
+ };
2731
+ return combine((function() {
2732
+ var _i, _len, _results;
2733
+ _results = [];
2734
+ for (_i = 0, _len = pairs.length; _i < _len; _i++) {
2735
+ p = pairs[_i];
2736
+ _results.push(process(p));
2737
+ }
2738
+ return _results;
2739
+ })()).then(function() {
2740
+ if (denominator === 0) {
2741
+ return Promise.fail('cannot divide by zero');
2742
+ }
2743
+ debugger;
2744
+ return Promise.unit(Value.number(numerator / denominator));
2745
+ });
2746
+ });
2747
+ });
2748
+ }
2749
+ },
2750
+ filter: {
2751
+ type: parse.type('filter { %a -> bool } = [%a] -> [%a]'),
2752
+ impl: function(evalInput, evalBlock) {
2753
+ return evalBlock.then(function(block) {
2754
+ var fn;
2755
+ fn = block.fn;
2756
+ return evalInput.then(function(list) {
2757
+ var check, e, out;
2758
+ out = [];
2759
+ check = function(thunk) {
2760
+ return fn(thunk).after(function(bool) {
2761
+ if (bool.value) {
2762
+ return out.push(thunk);
2763
+ }
2764
+ });
2765
+ };
2766
+ return combine((function() {
2767
+ var _i, _len, _ref, _results;
2768
+ _ref = list.elements;
2769
+ _results = [];
2770
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2771
+ e = _ref[_i];
2772
+ _results.push(check(e));
2773
+ }
2774
+ return _results;
2775
+ })()).map(function() {
2776
+ return Value.list(out);
2777
+ });
2778
+ });
2779
+ });
2780
+ }
2781
+ },
2782
+ scale: {
2783
+ type: parse.type('scale (numeric:numeric) (numeric:numeric) = numeric -> numeric'),
2784
+ impl: function(eInput, eDomain, eRange) {
2785
+ return combine([eInput, eDomain, eRange]).then(function(_arg) {
2786
+ var bounds, dom, input, range;
2787
+ input = _arg[0], dom = _arg[1], range = _arg[2];
2788
+ bounds = combine([dom.first, dom.second, range.first, range.second]);
2789
+ return bounds.map(function(_arg1) {
2790
+ var domHigh, domLow, domSize, rangeHigh, rangeLow, rangeSize, retranslated, scaled, translated;
2791
+ domLow = _arg1[0], domHigh = _arg1[1], rangeLow = _arg1[2], rangeHigh = _arg1[3];
2792
+ if (input.value < domLow.value) {
2793
+ input = domLow;
2794
+ } else if (input.value > domHigh.value) {
2795
+ input = domHigh;
2796
+ }
2797
+ domSize = domHigh.value - domLow.value;
2798
+ rangeSize = rangeHigh.value - rangeLow.value;
2799
+ translated = input.value - domLow.value;
2800
+ scaled = translated * rangeSize / domSize;
2801
+ retranslated = scaled + rangeLow.value;
2802
+ return Value.number(retranslated);
2803
+ });
2804
+ });
2805
+ }
2806
+ },
2807
+ map: {
2808
+ type: parse.type('map { %a -> %b } = [%a] -> [%b]'),
2809
+ impl: function(evalList, evalBlock) {
2810
+ return evalList.then(function(list) {
2811
+ return evalBlock.map(function(block) {
2812
+ var e, fn;
2813
+ fn = block.fn;
2814
+ return Value.list((function() {
2815
+ var _i, _len, _ref, _results;
2816
+ _ref = list.elements;
2817
+ _results = [];
2818
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
2819
+ e = _ref[_i];
2820
+ _results.push(fn(e));
2821
+ }
2822
+ return _results;
2823
+ })());
2824
+ });
2825
+ });
2826
+ }
2827
+ },
2828
+ count: {
2829
+ type: parse.type('count = [%a] -> numeric'),
2830
+ impl: function(evalList) {
2831
+ return evalList.map(function(list) {
2832
+ return Value.number(list.elements.length);
2833
+ });
2834
+ }
2835
+ },
2836
+ sum: {
2837
+ type: parse.type('sum = [numeric] -> numeric'),
2838
+ impl: function(list) {
2839
+ return list.then(function(val) {
2840
+ return combine(val.elements).then(function(vals) {
2841
+ var e, out, _i, _len;
2842
+ out = 0;
2843
+ for (_i = 0, _len = vals.length; _i < _len; _i++) {
2844
+ e = vals[_i];
2845
+ out += e.value;
2846
+ }
2847
+ return Promise.unit(Value.number(out));
2848
+ });
2849
+ });
2850
+ }
2851
+ },
2852
+ first: {
2853
+ type: parse.type('first = [%a] -> %a'),
2854
+ impl: function(list) {
2855
+ return list.then(function(val) {
2856
+ return val.elements[0];
2857
+ });
2858
+ }
2859
+ },
2860
+ add: {
2861
+ type: parse.type('add numeric = numeric -> numeric'),
2862
+ impl: function(input, num) {
2863
+ return combine([input, num]).map(function(_arg) {
2864
+ var lhs, rhs;
2865
+ lhs = _arg[0], rhs = _arg[1];
2866
+ return Value.number(lhs.value + rhs.value);
2867
+ });
2868
+ }
2869
+ },
2870
+ sub: {
2871
+ type: parse.type('sub numeric = numeric -> numeric'),
2872
+ impl: function(input, num) {
2873
+ return combine([input, num]).map(function(_arg) {
2874
+ var lhs, rhs;
2875
+ lhs = _arg[0], rhs = _arg[1];
2876
+ return Value.number(lhs.value - rhs.value);
2877
+ });
2878
+ }
2879
+ },
2880
+ id: {
2881
+ type: parse.type('id = %a -> %a'),
2882
+ impl: function(x) {
2883
+ return x;
2884
+ }
2885
+ },
2886
+ "else": {
2887
+ type: parse.type('else = % -> bool'),
2888
+ impl: function(_) {
2889
+ return unit(vTrue);
2890
+ }
2891
+ },
2892
+ gt: {
2893
+ type: parse.type('gt numeric = numeric -> bool'),
2894
+ impl: function(input, num) {
2895
+ return combine([input, num]).map(function(_arg) {
2896
+ var lhs, rhs;
2897
+ lhs = _arg[0], rhs = _arg[1];
2898
+ return Value.boolean(lhs.value > rhs.value);
2899
+ });
2900
+ }
2901
+ },
2902
+ lt: {
2903
+ type: parse.type('lt numeric = numeric -> bool'),
2904
+ impl: function(input, num) {
2905
+ return combine([input, num]).map(function(_arg) {
2906
+ var lhs, rhs;
2907
+ lhs = _arg[0], rhs = _arg[1];
2908
+ return Value.boolean(lhs.value < rhs.value);
2909
+ });
2910
+ }
2911
+ },
2912
+ eq: {
2913
+ type: parse.type('eq %a = %a -> bool'),
2914
+ impl: function(input, obj) {
2915
+ return combine([input, obj]).then(function(_arg) {
2916
+ var lhs, rhs;
2917
+ lhs = _arg[0], rhs = _arg[1];
2918
+ return lhs.equals(rhs);
2919
+ });
2920
+ }
2921
+ }
2922
+ };
2923
+ })();
2924
+ // Generated by CoffeeScript 1.6.3
2849
2925
  Gibbon.jsonConsumer = (function() {
2850
2926
  return function(tables) {
2851
2927
  var analyzeList, getType, getValue, lists;
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.3.6
4
+ version: 0.3.7
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: 2013-08-13 00:00:00.000000000 Z
12
+ date: 2013-08-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: therubyracer
@@ -55,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
55
55
  version: '0'
56
56
  segments:
57
57
  - 0
58
- hash: -2471759766594341795
58
+ hash: 3075766379386117662
59
59
  required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  none: false
61
61
  requirements:
@@ -64,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
64
  version: '0'
65
65
  segments:
66
66
  - 0
67
- hash: -2471759766594341795
67
+ hash: 3075766379386117662
68
68
  requirements: []
69
69
  rubyforge_project: goodguide-gibbon
70
70
  rubygems_version: 1.8.23