gql 0.0.15 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/gql.rb +9 -7
- data/lib/gql/call.rb +8 -2
- data/lib/gql/config.rb +54 -4
- data/lib/gql/errors.rb +10 -2
- data/lib/gql/executor.rb +2 -2
- data/lib/gql/has_calls.rb +23 -2
- data/lib/gql/has_fields.rb +39 -6
- data/lib/gql/node.rb +3 -3
- data/lib/gql/parser.rb +3 -12
- data/lib/gql/schema/call.rb +6 -1
- data/lib/gql/schema/{placeholder.rb → caller_class.rb} +1 -1
- data/lib/gql/schema/field.rb +5 -0
- data/lib/gql/tokenizer.rb +1 -1
- data/lib/gql/version.rb +1 -1
- metadata +3 -4
- data/lib/gql/schema/root.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd8a84ed2a267ac54920709090a7f462e68d3669
|
4
|
+
data.tar.gz: 4a3e5bec9744df6f0af716d1ac21bdb9dfe309cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f35fc1eae1c53765b4c1f931bb12b2fd5f8325f470d9315e2ed26485cdb79fd6604413e127e096f6a475332b720fcc53238d068c1f11433e61ae3e5c4fb83b87
|
7
|
+
data.tar.gz: f76fd8dff372e093470a0dda9b5aac075ddfdfd17f9e8f83759a90748677a54542988491e84e1c024a71f49e3b83d88ebcf64bfa48d81b62a0cc0c1197ea57b4
|
data/lib/gql.rb
CHANGED
@@ -18,6 +18,7 @@ module GQL
|
|
18
18
|
autoload :Raw
|
19
19
|
autoload :String
|
20
20
|
autoload :TestCase
|
21
|
+
autoload :Tokenizer
|
21
22
|
|
22
23
|
module Errors
|
23
24
|
extend ActiveSupport::Autoload
|
@@ -31,6 +32,7 @@ module GQL
|
|
31
32
|
autoload :ScanError
|
32
33
|
autoload :SyntaxError
|
33
34
|
autoload :UndefinedNodeClass
|
35
|
+
autoload :VariableNotFound
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
@@ -41,8 +43,7 @@ module GQL
|
|
41
43
|
autoload :Field
|
42
44
|
autoload :List
|
43
45
|
autoload :Parameter
|
44
|
-
autoload :
|
45
|
-
autoload :Root
|
46
|
+
autoload :CallerClass
|
46
47
|
end
|
47
48
|
|
48
49
|
extend(Module.new {
|
@@ -56,7 +57,7 @@ module GQL
|
|
56
57
|
|
57
58
|
%w(root_node_class root_target_proc field_types
|
58
59
|
default_list_class default_field_proc
|
59
|
-
default_call_proc).each do |method|
|
60
|
+
default_call_proc debug).each do |method|
|
60
61
|
module_eval <<-DELEGATORS, __FILE__, __LINE__ + 1
|
61
62
|
def #{method}
|
62
63
|
config.#{method}
|
@@ -68,11 +69,11 @@ module GQL
|
|
68
69
|
DELEGATORS
|
69
70
|
end
|
70
71
|
|
71
|
-
def execute(input, context = {})
|
72
|
+
def execute(input, context = {}, variables = {})
|
72
73
|
query = parse(input)
|
73
74
|
|
74
75
|
executor = Executor.new(query)
|
75
|
-
executor.execute context
|
76
|
+
executor.execute context, variables
|
76
77
|
end
|
77
78
|
|
78
79
|
def parse(input)
|
@@ -80,10 +81,11 @@ module GQL
|
|
80
81
|
end
|
81
82
|
|
82
83
|
def tokenize(input)
|
83
|
-
|
84
|
+
tokenizer = Tokenizer.new
|
85
|
+
tokenizer.scan_setup input
|
84
86
|
|
85
87
|
[].tap do |result|
|
86
|
-
while token =
|
88
|
+
while token = tokenizer.next_token
|
87
89
|
result << token
|
88
90
|
yield token if block_given?
|
89
91
|
end
|
data/lib/gql/call.rb
CHANGED
@@ -21,8 +21,14 @@ module GQL
|
|
21
21
|
|
22
22
|
private
|
23
23
|
def substitute_variables(args, variables)
|
24
|
-
|
25
|
-
|
24
|
+
args.map { |arg| substitute_variable arg, variables }
|
25
|
+
end
|
26
|
+
|
27
|
+
def substitute_variable(arg, variables)
|
28
|
+
return arg unless arg.is_a?(::Symbol)
|
29
|
+
return variables[arg] if variables.has_key?(arg)
|
30
|
+
|
31
|
+
raise Errors::VariableNotFound, arg
|
26
32
|
end
|
27
33
|
|
28
34
|
def result_class_from_block(block)
|
data/lib/gql/config.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/class/subclasses'
|
2
|
+
|
1
3
|
module GQL
|
2
4
|
class Config
|
3
5
|
def root_node_class
|
@@ -9,10 +11,6 @@ module GQL
|
|
9
11
|
raise Errors::InvalidNodeClass.new(value, Node)
|
10
12
|
end
|
11
13
|
|
12
|
-
if value && ENV['DEBUG']
|
13
|
-
value.call :schema, -> { context[:__schema_root] }, returns: Schema::Root
|
14
|
-
end
|
15
|
-
|
16
14
|
@@root_node_class = value
|
17
15
|
end
|
18
16
|
|
@@ -66,5 +64,57 @@ module GQL
|
|
66
64
|
def default_call_proc=(value)
|
67
65
|
@@default_call_proc = value
|
68
66
|
end
|
67
|
+
|
68
|
+
def debug
|
69
|
+
@@debug ||= ENV.has_key?('DEBUG')
|
70
|
+
end
|
71
|
+
|
72
|
+
def debug=(value)
|
73
|
+
value = !!value
|
74
|
+
|
75
|
+
return if value == debug
|
76
|
+
|
77
|
+
value ? switch_debug_on : switch_debug_off
|
78
|
+
|
79
|
+
@@debug = value
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
def switch_debug_on
|
84
|
+
switch_on_type_field
|
85
|
+
switch_on_execution_context
|
86
|
+
end
|
87
|
+
|
88
|
+
def switch_debug_off
|
89
|
+
switch_off_type_field
|
90
|
+
switch_off_execution_context
|
91
|
+
end
|
92
|
+
|
93
|
+
def switch_on_type_field
|
94
|
+
return if Node.fields.has_key? :__type__
|
95
|
+
|
96
|
+
[Node, *Node.descendants].each do |node_class|
|
97
|
+
node_class.object :__type__, -> { field_class }, node_class: Schema::Field
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def switch_off_type_field
|
102
|
+
return unless Node.fields.has_key? :__type__
|
103
|
+
|
104
|
+
[Node, *Node.descendants].each do |node_class|
|
105
|
+
node_class.remove_field :__type__
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def switch_on_execution_context
|
110
|
+
Node.send :remove_const, :ExecutionContext if Node.const_defined?(:ExecutionContext)
|
111
|
+
Node.const_set :ExecutionContext, Node::ExecutionContextDebug
|
112
|
+
end
|
113
|
+
|
114
|
+
def switch_off_execution_context
|
115
|
+
Node.send :remove_const, :ExecutionContext if Node.const_defined?(:ExecutionContext)
|
116
|
+
Node.const_set :ExecutionContext, Node::ExecutionContextNoDebug
|
117
|
+
end
|
118
|
+
|
69
119
|
end
|
70
120
|
end
|
data/lib/gql/errors.rb
CHANGED
@@ -19,7 +19,7 @@ module GQL
|
|
19
19
|
}
|
20
20
|
|
21
21
|
result[:error][:handle] = handle.to_s if handle
|
22
|
-
result[:error][:message] = message if
|
22
|
+
result[:error][:message] = message if GQL.debug
|
23
23
|
|
24
24
|
result
|
25
25
|
end
|
@@ -53,6 +53,14 @@ module GQL
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
class VariableNotFound < NotFoundError
|
57
|
+
def initialize(id)
|
58
|
+
msg = "The variable named `<#{id}>' has no value."
|
59
|
+
|
60
|
+
super(msg, 113, id)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
56
64
|
class InvalidNodeClass < Error
|
57
65
|
def initialize(node_class, super_class)
|
58
66
|
msg = "#{node_class} must be a (subclass of) #{super_class}."
|
@@ -72,7 +80,7 @@ module GQL
|
|
72
80
|
msg << "If so, you have to register your field type first "
|
73
81
|
msg << "like this: `GQL.field_types[:#{id}] = My#{id.to_s.camelize}'. "
|
74
82
|
msg << "The following field types are currently registered: "
|
75
|
-
msg << GQL.field_types.keys.sort.map { |
|
83
|
+
msg << GQL.field_types.keys.sort.map { |key| "`#{key}'" }.to_sentence
|
76
84
|
|
77
85
|
super(msg, 122)
|
78
86
|
end
|
data/lib/gql/executor.rb
CHANGED
@@ -7,12 +7,12 @@ module GQL
|
|
7
7
|
@variables = ast_query.variables
|
8
8
|
end
|
9
9
|
|
10
|
-
def execute(context = {})
|
10
|
+
def execute(context = {}, vars = {})
|
11
11
|
node_class = GQL.root_node_class
|
12
12
|
|
13
13
|
raise Errors::RootClassNotSet if node_class.nil?
|
14
14
|
|
15
|
-
|
15
|
+
variables.update vars
|
16
16
|
|
17
17
|
target = GQL.root_target_proc.call(context)
|
18
18
|
|
data/lib/gql/has_calls.rb
CHANGED
@@ -14,7 +14,7 @@ module GQL
|
|
14
14
|
end
|
15
15
|
|
16
16
|
module ClassMethods
|
17
|
-
def
|
17
|
+
def add_call(id, *args, &block)
|
18
18
|
options = args.extract_options!
|
19
19
|
|
20
20
|
call_spec = args.shift || block || proc_for_call(id)
|
@@ -27,11 +27,32 @@ module GQL
|
|
27
27
|
call_class.id = id.to_s
|
28
28
|
call_class.result_class = result_class
|
29
29
|
|
30
|
-
|
30
|
+
if result_class && result_class.name.nil?
|
31
|
+
call_class.const_set :Result, result_class
|
32
|
+
end
|
33
|
+
|
34
|
+
self.const_set const_name_for_call(id), call_class
|
31
35
|
self.calls = calls.merge(id.to_sym => call_class)
|
32
36
|
end
|
33
37
|
|
38
|
+
alias :call :add_call
|
39
|
+
|
40
|
+
def remove_call(id)
|
41
|
+
const_name = const_name_for_call(id)
|
42
|
+
|
43
|
+
send :remove_const, const_name if const_defined?(const_name)
|
44
|
+
calls.delete id
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_call?(id)
|
48
|
+
calls.has_key? id
|
49
|
+
end
|
50
|
+
|
34
51
|
private
|
52
|
+
def const_name_for_call(id)
|
53
|
+
:"#{id.to_s.camelize}Call"
|
54
|
+
end
|
55
|
+
|
35
56
|
def proc_for_call(id)
|
36
57
|
instance_exec id, &(call_proc || GQL.default_call_proc)
|
37
58
|
end
|
data/lib/gql/has_fields.rb
CHANGED
@@ -10,10 +10,14 @@ module GQL
|
|
10
10
|
included do
|
11
11
|
class_attribute :fields, :field_proc, instance_accessor: false, instance_predicate: false
|
12
12
|
self.fields = {}
|
13
|
+
|
14
|
+
object :__type__, -> { field_class }, node_class: Schema::Field if GQL.debug
|
15
|
+
|
16
|
+
const_set :ExecutionContext, GQL.debug ? ExecutionContextDebug : ExecutionContextNoDebug
|
13
17
|
end
|
14
18
|
|
15
19
|
module ClassMethods
|
16
|
-
def
|
20
|
+
def add_field(id, *args, &block)
|
17
21
|
options = args.extract_options!
|
18
22
|
type = options.delete(:type) || Node
|
19
23
|
proc = args.shift || block || proc_for_field(id)
|
@@ -21,16 +25,31 @@ module GQL
|
|
21
25
|
Node.validate_is_subclass! type, 'type'
|
22
26
|
|
23
27
|
type.build_class(id, proc, options).tap do |field_class|
|
24
|
-
|
28
|
+
const_name = const_name_for_field(id)
|
29
|
+
|
30
|
+
const_set const_name, field_class unless const_defined?(const_name)
|
25
31
|
self.fields = fields.merge(id.to_sym => field_class)
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
35
|
+
alias :field :add_field
|
36
|
+
|
37
|
+
def remove_field(id)
|
38
|
+
const_name = const_name_for_field(id)
|
39
|
+
|
40
|
+
send :remove_const, const_name if const_defined?(const_name)
|
41
|
+
fields.delete id
|
42
|
+
end
|
43
|
+
|
44
|
+
def has_field?(id)
|
45
|
+
fields.has_key? id
|
46
|
+
end
|
47
|
+
|
29
48
|
def cursor(id_or_proc)
|
30
49
|
id = id_or_proc.is_a?(Proc) ? nil : id_or_proc
|
31
50
|
proc = id ? -> { target.public_send(id) } : id_or_proc
|
32
51
|
|
33
|
-
|
52
|
+
add_field :cursor, proc, type: Raw
|
34
53
|
end
|
35
54
|
|
36
55
|
def respond_to?(method, *args)
|
@@ -49,6 +68,11 @@ module GQL
|
|
49
68
|
end
|
50
69
|
|
51
70
|
private
|
71
|
+
def const_name_for_field(id)
|
72
|
+
prefix = id == :__type__ ? 'Schema_Type' : id.to_s.camelize
|
73
|
+
:"#{prefix}Field"
|
74
|
+
end
|
75
|
+
|
52
76
|
def proc_for_field(id)
|
53
77
|
instance_exec id, &(field_proc || GQL.default_field_proc)
|
54
78
|
end
|
@@ -58,7 +82,7 @@ module GQL
|
|
58
82
|
options = args.extract_options!.merge(type: type)
|
59
83
|
args = args.push(options)
|
60
84
|
|
61
|
-
|
85
|
+
add_field(*args, &block)
|
62
86
|
end
|
63
87
|
end
|
64
88
|
end
|
@@ -90,11 +114,20 @@ module GQL
|
|
90
114
|
end
|
91
115
|
|
92
116
|
def target_for_field(current_target, proc)
|
93
|
-
|
117
|
+
args = [current_target, context]
|
118
|
+
args.push self.class if GQL.debug
|
119
|
+
|
120
|
+
method = self.class.const_get(:ExecutionContext).new(*args)
|
94
121
|
method.execute proc
|
95
122
|
end
|
96
123
|
|
97
|
-
class
|
124
|
+
class ExecutionContextNoDebug < Struct.new(:target, :context)
|
125
|
+
def execute(method, args = [])
|
126
|
+
instance_exec(*args, &method)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class ExecutionContextDebug < Struct.new(:target, :context, :field_class)
|
98
131
|
def execute(method, args = [])
|
99
132
|
instance_exec(*args, &method)
|
100
133
|
end
|
data/lib/gql/node.rb
CHANGED
@@ -5,9 +5,6 @@ require 'gql/has_fields'
|
|
5
5
|
|
6
6
|
module GQL
|
7
7
|
class Node
|
8
|
-
include HasCalls
|
9
|
-
include HasFields
|
10
|
-
|
11
8
|
class_attribute :id, :proc, instance_accessor: false, instance_predicate: false
|
12
9
|
|
13
10
|
class << self
|
@@ -29,6 +26,9 @@ module GQL
|
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
29
|
+
include HasCalls
|
30
|
+
include HasFields
|
31
|
+
|
32
32
|
attr_reader :ast_node, :target, :variables, :context
|
33
33
|
|
34
34
|
def initialize(ast_node, target, variables, context)
|
data/lib/gql/parser.rb
CHANGED
@@ -14,7 +14,7 @@ require 'active_support/core_ext/object/json'
|
|
14
14
|
require 'gql/tokenizer'
|
15
15
|
|
16
16
|
module GQL
|
17
|
-
class Parser <
|
17
|
+
class Parser < Tokenizer
|
18
18
|
|
19
19
|
module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 136)
|
20
20
|
|
@@ -27,15 +27,6 @@ module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 136)
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
class Root < Struct.new(:call, :fields)
|
31
|
-
def as_json(*)
|
32
|
-
{
|
33
|
-
call: call.as_json,
|
34
|
-
fields: fields.as_json
|
35
|
-
}
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
30
|
class Node < Struct.new(:id, :alias_id, :call, :fields)
|
40
31
|
def as_json(*)
|
41
32
|
{
|
@@ -310,14 +301,14 @@ module_eval(<<'.,.,', 'parser.racc', 4)
|
|
310
301
|
|
311
302
|
module_eval(<<'.,.,', 'parser.racc', 8)
|
312
303
|
def _reduce_2(val, _values, result)
|
313
|
-
result =
|
304
|
+
result = Node.new('[root]', nil, val[0], nil )
|
314
305
|
result
|
315
306
|
end
|
316
307
|
.,.,
|
317
308
|
|
318
309
|
module_eval(<<'.,.,', 'parser.racc', 9)
|
319
310
|
def _reduce_3(val, _values, result)
|
320
|
-
result =
|
311
|
+
result = Node.new('[root]', nil, nil, val[1])
|
321
312
|
result
|
322
313
|
end
|
323
314
|
.,.,
|
data/lib/gql/schema/call.rb
CHANGED
@@ -4,8 +4,13 @@ module GQL
|
|
4
4
|
cursor :id
|
5
5
|
|
6
6
|
string :id
|
7
|
-
|
7
|
+
string :name
|
8
|
+
object :result_class, -> { target.result_class || CallerClass }, node_class: Field
|
8
9
|
array :parameters, -> { (target.proc || target.instance_method(:execute)).parameters }, item_class: Parameter
|
10
|
+
|
11
|
+
def raw_value
|
12
|
+
target.name
|
13
|
+
end
|
9
14
|
end
|
10
15
|
end
|
11
16
|
end
|
data/lib/gql/schema/field.rb
CHANGED
@@ -4,8 +4,13 @@ module GQL
|
|
4
4
|
cursor :id
|
5
5
|
|
6
6
|
string :id
|
7
|
+
string :name
|
7
8
|
connection :calls, -> { target.calls.values }, list_class: List, item_class: Call
|
8
9
|
connection :fields, -> { target.fields.values }, list_class: List, item_class: Field
|
10
|
+
|
11
|
+
def raw_value
|
12
|
+
target.name
|
13
|
+
end
|
9
14
|
end
|
10
15
|
end
|
11
16
|
end
|
data/lib/gql/tokenizer.rb
CHANGED
data/lib/gql/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Andert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -119,11 +119,10 @@ files:
|
|
119
119
|
- lib/gql/parser.rb
|
120
120
|
- lib/gql/raw.rb
|
121
121
|
- lib/gql/schema/call.rb
|
122
|
+
- lib/gql/schema/caller_class.rb
|
122
123
|
- lib/gql/schema/field.rb
|
123
124
|
- lib/gql/schema/list.rb
|
124
125
|
- lib/gql/schema/parameter.rb
|
125
|
-
- lib/gql/schema/placeholder.rb
|
126
|
-
- lib/gql/schema/root.rb
|
127
126
|
- lib/gql/string.rb
|
128
127
|
- lib/gql/test_case.rb
|
129
128
|
- lib/gql/tokenizer.rb
|
data/lib/gql/schema/root.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module GQL
|
2
|
-
module Schema
|
3
|
-
class Root < GQL::Node
|
4
|
-
string :name
|
5
|
-
|
6
|
-
connection :calls, -> { target.calls.values }, list_class: List, item_class: Call
|
7
|
-
connection :fields, -> { target.fields.values }, list_class: List, item_class: Field
|
8
|
-
|
9
|
-
def raw_value
|
10
|
-
target.name
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|