goodguide-gibbon 0.3.0 → 0.3.1
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/goodguide/gibbon.rb
CHANGED
@@ -24,8 +24,39 @@ module GoodGuide
|
|
24
24
|
def initialize(errors)
|
25
25
|
@errors = errors
|
26
26
|
end
|
27
|
+
|
28
|
+
def messages
|
29
|
+
@errors.map(&method(:semantic_error_message))
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def semantic_error_message(e)
|
34
|
+
case e['_tag']
|
35
|
+
when 'match'
|
36
|
+
lhs = e['lhs'].inspect
|
37
|
+
rhs = e['rhs'].inspect
|
38
|
+
"could not match #{lhs} with #{rhs}"
|
39
|
+
when 'destructure'
|
40
|
+
type = e['type'].inspect
|
41
|
+
"could not destructure #{type}"
|
42
|
+
when 'lookup'
|
43
|
+
query_name = e['query']['name']
|
44
|
+
query_type = e['query']['type']
|
45
|
+
query = "@#{query_type}(#{query_name})"
|
46
|
+
id = e['id']
|
47
|
+
error = e['error']
|
48
|
+
"error analyzing #{query} on #{id}: #{error}"
|
49
|
+
when 'circular'
|
50
|
+
chain = e['crumbs'].join(' -> ')
|
51
|
+
"circular dependency: #{chain}"
|
52
|
+
else
|
53
|
+
raise "unknown error type #{e['_tag']}"
|
54
|
+
end
|
55
|
+
end
|
27
56
|
end
|
28
57
|
|
58
|
+
class QueryError < StandardError; end
|
59
|
+
|
29
60
|
class RuntimeError < StandardError; end
|
30
61
|
|
31
62
|
class Program
|
@@ -99,8 +130,8 @@ module GoodGuide
|
|
99
130
|
cb = args.pop
|
100
131
|
err, val = begin
|
101
132
|
[nil, send(method, *args)]
|
102
|
-
|
103
|
-
|
133
|
+
rescue QueryError => e
|
134
|
+
[e.to_s, nil]
|
104
135
|
end
|
105
136
|
|
106
137
|
cb.call(err, val)
|
@@ -109,6 +140,10 @@ module GoodGuide
|
|
109
140
|
end
|
110
141
|
|
111
142
|
class StaticClient < AbstractClient
|
143
|
+
def query_error!(*a)
|
144
|
+
raise QueryError.new(*a)
|
145
|
+
end
|
146
|
+
|
112
147
|
def analyze_query(input_id, query, t)
|
113
148
|
query_impl = get_query(query.type)
|
114
149
|
analysis = instance_exec(input_id, query.name, t, &query_impl)
|
@@ -1500,7 +1500,8 @@ Gibbon.TypeLookup = TypeLookup = (function(_super) {
|
|
1500
1500
|
|
1501
1501
|
TypeLookup.types({
|
1502
1502
|
response: ['analysis'],
|
1503
|
-
local: ['name']
|
1503
|
+
local: ['name'],
|
1504
|
+
error: ['error']
|
1504
1505
|
});
|
1505
1506
|
|
1506
1507
|
return TypeLookup;
|
@@ -1781,9 +1782,10 @@ analyze = Gibbon.analyze = (function() {
|
|
1781
1782
|
NativeContext.prototype.query = function(id, query, cb) {
|
1782
1783
|
return this.externalLookup.call(null, id, query, TypeAST, function(err, analysis) {
|
1783
1784
|
if (err) {
|
1784
|
-
|
1785
|
+
return cb(TypeLookup.error(err));
|
1786
|
+
} else {
|
1787
|
+
return cb(TypeLookup.response(analysis));
|
1785
1788
|
}
|
1786
|
-
return cb(TypeLookup.response(analysis));
|
1787
1789
|
});
|
1788
1790
|
};
|
1789
1791
|
|
@@ -1978,9 +1980,8 @@ analyze = Gibbon.analyze = (function() {
|
|
1978
1980
|
|
1979
1981
|
TypeError.types({
|
1980
1982
|
match: ['lhs', 'rhs'],
|
1981
|
-
infinite: ['type'],
|
1982
1983
|
destructure: ['type'],
|
1983
|
-
|
1984
|
+
lookup: ['query', 'id', 'error'],
|
1984
1985
|
circular: ['crumbs']
|
1985
1986
|
});
|
1986
1987
|
|
@@ -2085,6 +2086,9 @@ analyze = Gibbon.analyze = (function() {
|
|
2085
2086
|
return scope.lookup(id, query, function(lookup) {
|
2086
2087
|
dependencies.push(lookup);
|
2087
2088
|
return lookup.cases({
|
2089
|
+
error: function(e) {
|
2090
|
+
return cb(error('lookup', query, id, e));
|
2091
|
+
},
|
2088
2092
|
response: function(analysis) {
|
2089
2093
|
semanticAccessors.set(query, Semantic.query(analysis.annotations));
|
2090
2094
|
return cb(TypeExpr.fromAST(analysis.type));
|
@@ -2854,7 +2858,7 @@ eval_ = Gibbon["eval"] = (function() {
|
|
2854
2858
|
// Generated by CoffeeScript 1.6.3
|
2855
2859
|
Gibbon.jsonConsumer = (function() {
|
2856
2860
|
return function(tables) {
|
2857
|
-
var getType, getValue;
|
2861
|
+
var analyzeList, getType, getValue, lists;
|
2858
2862
|
getType = function(id, accessorName, t, callback) {
|
2859
2863
|
var fields;
|
2860
2864
|
if (!tables.hasOwnProperty(id)) {
|
@@ -2887,11 +2891,30 @@ Gibbon.jsonConsumer = (function() {
|
|
2887
2891
|
}
|
2888
2892
|
return callback(null, entity[annotations.name]);
|
2889
2893
|
};
|
2894
|
+
lists = tables._lists || {};
|
2895
|
+
analyzeList = function(id, listName, t, callback) {
|
2896
|
+
var list;
|
2897
|
+
if (!lists.hasOwnProperty(listName)) {
|
2898
|
+
callback(new Error("unkown list `" + listName + "'"));
|
2899
|
+
}
|
2900
|
+
list = lists[listName];
|
2901
|
+
if (id !== list.type) {
|
2902
|
+
callback(new Error("wrong type " + id + " for list `" + listName + "'"));
|
2903
|
+
}
|
2904
|
+
return callback(null, {
|
2905
|
+
type: t.concrete('bool'),
|
2906
|
+
annotations: {
|
2907
|
+
list: listName
|
2908
|
+
}
|
2909
|
+
});
|
2910
|
+
};
|
2890
2911
|
return {
|
2891
2912
|
analyzeQuery: function(id, query, t, callback) {
|
2892
2913
|
switch (query.type) {
|
2893
2914
|
case 'access':
|
2894
2915
|
return getType(id, query.name, t, callback);
|
2916
|
+
case 'on':
|
2917
|
+
return analyzeList(id, query.name, t, callback);
|
2895
2918
|
default:
|
2896
2919
|
return callback(new Error("unknown query `" + query.type + "'"));
|
2897
2920
|
}
|
@@ -1494,7 +1494,8 @@ Gibbon.TypeLookup = TypeLookup = (function(_super) {
|
|
1494
1494
|
|
1495
1495
|
TypeLookup.types({
|
1496
1496
|
response: ['analysis'],
|
1497
|
-
local: ['name']
|
1497
|
+
local: ['name'],
|
1498
|
+
error: ['error']
|
1498
1499
|
});
|
1499
1500
|
|
1500
1501
|
return TypeLookup;
|
@@ -1775,9 +1776,10 @@ analyze = Gibbon.analyze = (function() {
|
|
1775
1776
|
NativeContext.prototype.query = function(id, query, cb) {
|
1776
1777
|
return this.externalLookup.call(null, id, query, TypeAST, function(err, analysis) {
|
1777
1778
|
if (err) {
|
1778
|
-
|
1779
|
+
return cb(TypeLookup.error(err));
|
1780
|
+
} else {
|
1781
|
+
return cb(TypeLookup.response(analysis));
|
1779
1782
|
}
|
1780
|
-
return cb(TypeLookup.response(analysis));
|
1781
1783
|
});
|
1782
1784
|
};
|
1783
1785
|
|
@@ -1972,9 +1974,8 @@ analyze = Gibbon.analyze = (function() {
|
|
1972
1974
|
|
1973
1975
|
TypeError.types({
|
1974
1976
|
match: ['lhs', 'rhs'],
|
1975
|
-
infinite: ['type'],
|
1976
1977
|
destructure: ['type'],
|
1977
|
-
|
1978
|
+
lookup: ['query', 'id', 'error'],
|
1978
1979
|
circular: ['crumbs']
|
1979
1980
|
});
|
1980
1981
|
|
@@ -2065,6 +2066,9 @@ analyze = Gibbon.analyze = (function() {
|
|
2065
2066
|
return scope.lookup(id, query, function(lookup) {
|
2066
2067
|
dependencies.push(lookup);
|
2067
2068
|
return lookup.cases({
|
2069
|
+
error: function(e) {
|
2070
|
+
return cb(error('lookup', query, id, e));
|
2071
|
+
},
|
2068
2072
|
response: function(analysis) {
|
2069
2073
|
semanticAccessors.set(query, Semantic.query(analysis.annotations));
|
2070
2074
|
return cb(TypeExpr.fromAST(analysis.type));
|
@@ -2826,7 +2830,7 @@ eval_ = Gibbon["eval"] = (function() {
|
|
2826
2830
|
// Generated by CoffeeScript 1.6.3
|
2827
2831
|
Gibbon.jsonConsumer = (function() {
|
2828
2832
|
return function(tables) {
|
2829
|
-
var getType, getValue;
|
2833
|
+
var analyzeList, getType, getValue, lists;
|
2830
2834
|
getType = function(id, accessorName, t, callback) {
|
2831
2835
|
var fields;
|
2832
2836
|
if (!tables.hasOwnProperty(id)) {
|
@@ -2859,11 +2863,30 @@ Gibbon.jsonConsumer = (function() {
|
|
2859
2863
|
}
|
2860
2864
|
return callback(null, entity[annotations.name]);
|
2861
2865
|
};
|
2866
|
+
lists = tables._lists || {};
|
2867
|
+
analyzeList = function(id, listName, t, callback) {
|
2868
|
+
var list;
|
2869
|
+
if (!lists.hasOwnProperty(listName)) {
|
2870
|
+
callback(new Error("unkown list `" + listName + "'"));
|
2871
|
+
}
|
2872
|
+
list = lists[listName];
|
2873
|
+
if (id !== list.type) {
|
2874
|
+
callback(new Error("wrong type " + id + " for list `" + listName + "'"));
|
2875
|
+
}
|
2876
|
+
return callback(null, {
|
2877
|
+
type: t.concrete('bool'),
|
2878
|
+
annotations: {
|
2879
|
+
list: listName
|
2880
|
+
}
|
2881
|
+
});
|
2882
|
+
};
|
2862
2883
|
return {
|
2863
2884
|
analyzeQuery: function(id, query, t, callback) {
|
2864
2885
|
switch (query.type) {
|
2865
2886
|
case 'access':
|
2866
2887
|
return getType(id, query.name, t, callback);
|
2888
|
+
case 'on':
|
2889
|
+
return analyzeList(id, query.name, t, callback);
|
2867
2890
|
default:
|
2868
2891
|
return callback(new Error("unknown query `" + query.type + "'"));
|
2869
2892
|
}
|
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.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,21 +12,21 @@ cert_chain: []
|
|
12
12
|
date: 2013-07-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
type: :runtime
|
16
15
|
name: therubyracer
|
17
|
-
|
18
|
-
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
19
18
|
requirements:
|
20
19
|
- - ! '>='
|
21
20
|
- !ruby/object:Gem::Version
|
22
21
|
version: '0'
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
23
23
|
none: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
24
|
requirements:
|
26
25
|
- - ! '>='
|
27
26
|
- !ruby/object:Gem::Version
|
28
27
|
version: '0'
|
29
|
-
|
28
|
+
type: :runtime
|
29
|
+
prerelease: false
|
30
30
|
description: Run and analyze gibbon code from ruby or a browser (via a ruby app).
|
31
31
|
email:
|
32
32
|
- jjmadkisson@gmail.com
|
@@ -48,17 +48,23 @@ rdoc_options: []
|
|
48
48
|
require_paths:
|
49
49
|
- lib
|
50
50
|
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
51
52
|
requirements:
|
52
53
|
- - ! '>='
|
53
54
|
- !ruby/object:Gem::Version
|
54
55
|
version: '0'
|
55
|
-
|
56
|
+
hash: -2075265121022310565
|
57
|
+
segments:
|
58
|
+
- 0
|
56
59
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
57
61
|
requirements:
|
58
62
|
- - ! '>='
|
59
63
|
- !ruby/object:Gem::Version
|
60
64
|
version: '0'
|
61
|
-
|
65
|
+
hash: -2075265121022310565
|
66
|
+
segments:
|
67
|
+
- 0
|
62
68
|
requirements: []
|
63
69
|
rubyforge_project: goodguide-gibbon
|
64
70
|
rubygems_version: 1.8.23
|
@@ -66,4 +72,3 @@ signing_key:
|
|
66
72
|
specification_version: 3
|
67
73
|
summary: Ruby bindings for the gibbon data language
|
68
74
|
test_files: []
|
69
|
-
has_rdoc:
|