gql 0.0.21 → 0.0.22
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.
- checksums.yaml +4 -4
- data/lib/gql/array.rb +6 -4
- data/lib/gql/call.rb +4 -0
- data/lib/gql/config.rb +13 -23
- data/lib/gql/errors.rb +2 -2
- data/lib/gql/executor.rb +5 -9
- data/lib/gql/field.rb +10 -0
- data/lib/gql/mixins/has_calls.rb +19 -7
- data/lib/gql/mixins/has_fields.rb +1 -24
- data/lib/gql/number.rb +1 -1
- data/lib/gql/object.rb +29 -4
- data/lib/gql/schema/call.rb +3 -1
- data/lib/gql/schema/list.rb +8 -0
- data/lib/gql/string.rb +1 -1
- data/lib/gql/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b8d0bd13d8d50371e8a27403e0939d0c313c816
|
4
|
+
data.tar.gz: 854371b7797057ad99cb47a1e04ab912cf6aa7d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d52b45346facafa3c994dce27ffc6f8d708a4a3c26fb9878ee013fd904c993fa5ece24d6ee38e79fd1007f029064c2cece59fe0b55beac711f0af2d8dd599bf5
|
7
|
+
data.tar.gz: 18fa4cd86fbb2c6a094f77dc00fa68efd82f5efd6f4b1831b0b7973fae416e5d417d2f808f0fbe70885879515d2d2431cfadca6ff74bb76ab98dfa24ed8aeeb4
|
data/lib/gql/array.rb
CHANGED
@@ -7,21 +7,23 @@ module GQL
|
|
7
7
|
class << self
|
8
8
|
def build_class(id, proc, options = {})
|
9
9
|
item_class = options.delete(:item_class) || self.item_class
|
10
|
-
item_class =
|
10
|
+
item_class = Object.build_class(:item, -> { target }, object_class: item_class)
|
11
11
|
|
12
12
|
Class.new(self).tap do |field_class|
|
13
13
|
field_class.id = id
|
14
14
|
field_class.proc = proc
|
15
15
|
field_class.item_class = item_class
|
16
|
+
|
17
|
+
if item_class && item_class.name.nil?
|
18
|
+
field_class.const_set :Item, item_class
|
19
|
+
end
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
20
24
|
def value
|
21
25
|
target.map do |item|
|
22
|
-
|
23
|
-
|
24
|
-
field = field_class.new(ast_node, item, variables, context)
|
26
|
+
field = self.class.item_class.new(ast_node, item, variables, context)
|
25
27
|
field.value
|
26
28
|
end
|
27
29
|
end
|
data/lib/gql/call.rb
CHANGED
data/lib/gql/config.rb
CHANGED
@@ -8,14 +8,6 @@ module GQL
|
|
8
8
|
@@root_class = value
|
9
9
|
end
|
10
10
|
|
11
|
-
def root_target_proc
|
12
|
-
@@root_target_proc ||= -> context { nil }
|
13
|
-
end
|
14
|
-
|
15
|
-
def root_target_proc=(value)
|
16
|
-
@@root_target_proc = value
|
17
|
-
end
|
18
|
-
|
19
11
|
def field_types
|
20
12
|
@@field_types ||= {
|
21
13
|
array: 'GQL::Array',
|
@@ -39,6 +31,14 @@ module GQL
|
|
39
31
|
@@default_list_class = value
|
40
32
|
end
|
41
33
|
|
34
|
+
def root_target_proc
|
35
|
+
@@root_target_proc ||= -> { nil }
|
36
|
+
end
|
37
|
+
|
38
|
+
def root_target_proc=(value)
|
39
|
+
@@root_target_proc = value
|
40
|
+
end
|
41
|
+
|
42
42
|
def default_field_proc
|
43
43
|
@@default_field_proc ||= -> id { -> { target.public_send(id) } }
|
44
44
|
end
|
@@ -71,23 +71,13 @@ module GQL
|
|
71
71
|
|
72
72
|
return if value == @@debug
|
73
73
|
|
74
|
-
value
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
def switch_debug_on
|
81
|
-
Field.object :__type__, -> { field_class }, object_class: Schema::Field
|
82
|
-
Field.send :remove_const, :ExecutionContext if Field.const_defined?(:ExecutionContext)
|
83
|
-
Field.const_set :ExecutionContext, Field::ExecutionContextDebug
|
84
|
-
end
|
85
|
-
|
86
|
-
def switch_debug_off
|
74
|
+
if value
|
75
|
+
Field.object :__type__, -> { field_class }, object_class: 'GQL::Schema::Field'
|
76
|
+
else
|
87
77
|
Field.remove_field :__type__
|
88
|
-
Field.send :remove_const, :ExecutionContext if Field.const_defined?(:ExecutionContext)
|
89
|
-
Field.const_set :ExecutionContext, Field::ExecutionContextNoDebug
|
90
78
|
end
|
91
79
|
|
80
|
+
@@debug = value
|
81
|
+
end
|
92
82
|
end
|
93
83
|
end
|
data/lib/gql/errors.rb
CHANGED
@@ -71,8 +71,8 @@ module GQL
|
|
71
71
|
end
|
72
72
|
|
73
73
|
class InvalidClass < Error
|
74
|
-
def initialize(
|
75
|
-
msg = "#{
|
74
|
+
def initialize(klass, baseclass)
|
75
|
+
msg = "#{klass} must be a (subclass of) #{baseclass}."
|
76
76
|
|
77
77
|
super(msg, 123)
|
78
78
|
end
|
data/lib/gql/executor.rb
CHANGED
@@ -8,16 +8,12 @@ module GQL
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def execute(context = {}, vars = {})
|
11
|
-
|
11
|
+
raise Errors::RootClassNotSet unless GQL.root_class
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
target = GQL.root_target_proc.call(context)
|
18
|
-
|
19
|
-
field = Registry.fetch(field_class).new(ast_root, target, variables, context)
|
20
|
-
field.value
|
13
|
+
root_class = Registry.fetch(GQL.root_class)
|
14
|
+
root_class.id = ast_root.id
|
15
|
+
root_class.proc = GQL.root_target_proc
|
16
|
+
root_class.execute self.class, ast_root, nil, variables.merge(vars), context
|
21
17
|
end
|
22
18
|
end
|
23
19
|
end
|
data/lib/gql/field.rb
CHANGED
@@ -6,6 +6,8 @@ require 'gql/mixins/has_fields'
|
|
6
6
|
|
7
7
|
module GQL
|
8
8
|
class Field
|
9
|
+
ExecutionContext = Struct.new(:target, :context, :field_class)
|
10
|
+
|
9
11
|
class_attribute :id, :proc, instance_accessor: false, instance_predicate: false
|
10
12
|
|
11
13
|
class << self
|
@@ -15,6 +17,14 @@ module GQL
|
|
15
17
|
field_class.proc = proc
|
16
18
|
end
|
17
19
|
end
|
20
|
+
|
21
|
+
def execute(parent, ast_node, target, variables, context)
|
22
|
+
args = [target, context, GQL.debug ? parent : nil]
|
23
|
+
target = ExecutionContext.new(*args).instance_exec(&proc)
|
24
|
+
field = new(ast_node, target, variables, context)
|
25
|
+
|
26
|
+
field.value
|
27
|
+
end
|
18
28
|
end
|
19
29
|
|
20
30
|
extend Mixins::Common
|
data/lib/gql/mixins/has_calls.rb
CHANGED
@@ -80,8 +80,8 @@ module GQL
|
|
80
80
|
case spec
|
81
81
|
when ::Array
|
82
82
|
result_class_from_connection_spec spec.dup
|
83
|
-
when ::Hash
|
84
|
-
|
83
|
+
when ::Hash, ::Proc
|
84
|
+
result_class_from_object_spec spec.dup
|
85
85
|
else
|
86
86
|
spec
|
87
87
|
end
|
@@ -102,7 +102,7 @@ module GQL
|
|
102
102
|
Connection.build_class :result, nil, options
|
103
103
|
end
|
104
104
|
|
105
|
-
def
|
105
|
+
def result_class_from_object_spec(spec)
|
106
106
|
Object.build_class :result, nil, object_class: spec
|
107
107
|
end
|
108
108
|
end
|
@@ -110,7 +110,7 @@ module GQL
|
|
110
110
|
private
|
111
111
|
def value_of_call(ast_call)
|
112
112
|
call_class = call_class_for_id(ast_call.id)
|
113
|
-
call_class.execute
|
113
|
+
call_class.execute self.class, ast_call, target, variables, context
|
114
114
|
end
|
115
115
|
|
116
116
|
def call_class_for_id(id)
|
@@ -126,10 +126,22 @@ module GQL
|
|
126
126
|
end
|
127
127
|
|
128
128
|
def execute(caller_class, ast_node, target, variables, context)
|
129
|
-
|
130
|
-
|
131
|
-
call_class.execute caller_class, ast_node, target, variables, context
|
129
|
+
spurred = spur_call_class(caller_class, id)
|
130
|
+
spurred.execute caller_class, ast_node, target, variables, context
|
132
131
|
end
|
132
|
+
|
133
|
+
def parameters
|
134
|
+
call_class.parameters
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
def call_class
|
139
|
+
@call_class ||= Registry.fetch(call_class_name, Call)
|
140
|
+
end
|
141
|
+
|
142
|
+
def spur_call_class(caller_class, id)
|
143
|
+
caller_class.add_call id, call_class, returns: result_class
|
144
|
+
end
|
133
145
|
end
|
134
146
|
end
|
135
147
|
end
|
@@ -103,36 +103,13 @@ module GQL
|
|
103
103
|
field.value
|
104
104
|
else
|
105
105
|
field_class = field_class_for_id(ast_field.id)
|
106
|
-
|
107
|
-
|
108
|
-
field = field_class.new(ast_field, next_target, variables, context)
|
109
|
-
field.value
|
106
|
+
field_class.execute self.class, ast_field, target, variables, context
|
110
107
|
end
|
111
108
|
end
|
112
109
|
|
113
110
|
def field_class_for_id(id)
|
114
111
|
self.class.fields[id] or raise Errors::FieldNotFound.new(id, self.class)
|
115
112
|
end
|
116
|
-
|
117
|
-
def target_for_field(current_target, proc)
|
118
|
-
args = [current_target, context]
|
119
|
-
args.push self.class if GQL.debug
|
120
|
-
|
121
|
-
method = self.class.const_get(:ExecutionContext).new(*args)
|
122
|
-
method.execute proc
|
123
|
-
end
|
124
|
-
|
125
|
-
class ExecutionContextNoDebug < Struct.new(:target, :context)
|
126
|
-
def execute(method, args = [])
|
127
|
-
instance_exec(*args, &method)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
class ExecutionContextDebug < Struct.new(:target, :context, :field_class)
|
132
|
-
def execute(method, args = [])
|
133
|
-
instance_exec(*args, &method)
|
134
|
-
end
|
135
|
-
end
|
136
113
|
end
|
137
114
|
end
|
138
115
|
end
|
data/lib/gql/number.rb
CHANGED
data/lib/gql/object.rb
CHANGED
@@ -2,26 +2,51 @@ require 'active_support/core_ext/class/attribute'
|
|
2
2
|
|
3
3
|
module GQL
|
4
4
|
class Object < Field
|
5
|
-
class_attribute :
|
5
|
+
class_attribute :object_proc, instance_accessor: false, instance_predicate: false
|
6
6
|
|
7
7
|
class << self
|
8
8
|
def build_class(id, proc, options = {})
|
9
9
|
object_class = options.delete(:object_class) || options.delete(:as)
|
10
|
-
|
10
|
+
object_proc = object_proc_for_class(object_class)
|
11
11
|
|
12
12
|
Class.new(self).tap do |klass|
|
13
13
|
klass.id = id
|
14
14
|
klass.proc = proc
|
15
|
-
klass.
|
15
|
+
klass.object_proc = object_proc
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def object_proc_for_class(object_class)
|
21
|
+
case object_class
|
22
|
+
when ::Hash
|
23
|
+
-> target { object_class[target.class] }
|
24
|
+
when ::Class, ::String
|
25
|
+
-> _ { object_class }
|
26
|
+
when ::Proc
|
27
|
+
object_class
|
28
|
+
else
|
29
|
+
nil # raise error?
|
30
|
+
end
|
31
|
+
end
|
18
32
|
end
|
19
33
|
|
20
34
|
def value
|
21
|
-
field_class = Registry.fetch(
|
35
|
+
field_class = Registry.fetch(object_proc_result)
|
22
36
|
|
23
37
|
field = field_class.new(ast_node, target, variables, context)
|
24
38
|
field.value
|
25
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def object_proc_result
|
43
|
+
proc = self.class.object_proc
|
44
|
+
|
45
|
+
if proc.arity == 1
|
46
|
+
proc.call target
|
47
|
+
else
|
48
|
+
proc.call target, context
|
49
|
+
end
|
50
|
+
end
|
26
51
|
end
|
27
52
|
end
|
data/lib/gql/schema/call.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/object/try'
|
2
|
+
|
1
3
|
module GQL
|
2
4
|
module Schema
|
3
5
|
class Call < GQL::Field
|
@@ -6,7 +8,7 @@ module GQL
|
|
6
8
|
string :id
|
7
9
|
string :name
|
8
10
|
object :result_class, -> { target.result_class || CallerClass }, object_class: Field
|
9
|
-
array :parameters, -> {
|
11
|
+
array :parameters, -> { target.parameters }, item_class: Parameter
|
10
12
|
|
11
13
|
def scalar_value
|
12
14
|
target.name
|
data/lib/gql/schema/list.rb
CHANGED
@@ -1,11 +1,19 @@
|
|
1
1
|
module GQL
|
2
2
|
module Schema
|
3
3
|
class List < GQL::Field
|
4
|
+
RESULT_PROC = -> target, _ { target.superclass == GQL::Call ? 'GQL::Schema::Call' : 'GQL::Schema::Field' }
|
5
|
+
|
4
6
|
call :count, returns: GQL::Number
|
5
7
|
number :count
|
6
8
|
|
7
9
|
call :reverse
|
8
10
|
call :first, -> size { target.first(size) }
|
11
|
+
|
12
|
+
call :find, returns: RESULT_PROC do |id|
|
13
|
+
item = target.find { |item| item.id.to_s == id.to_s }
|
14
|
+
raise(GQL::Error, "id not found: #{id}") unless item
|
15
|
+
item.respond_to?(:spur) ? item.spur : item
|
16
|
+
end
|
9
17
|
end
|
10
18
|
end
|
11
19
|
end
|
data/lib/gql/string.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.22
|
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-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|