gql 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a62133987b6e3870e58eae49d16b0e9b7c71520d
4
- data.tar.gz: d13a2cf25e549aa1ae11e5e0d4f0b5de924698f6
3
+ metadata.gz: defb9d23450cd1caa407d256c9cc8606ced22880
4
+ data.tar.gz: 069be6463c76f8add762ce9dff462e3d36a15a0c
5
5
  SHA512:
6
- metadata.gz: d099ea7a0be26f2df9f0006224c9f92f3e958abcfd80104b1a4f332763cee38b5fd39549f125b68d5a3331f33a81e6975db3d0bcf1b3f546341d44b72eb124a5
7
- data.tar.gz: 40936dedec0db03b6da4a80f80bd8329d66187a43c04628cd6a7f02591c456c1ac8e2de656d7651f897c2258e00402b2547be210efefffb095c5c8b58027f95a
6
+ metadata.gz: c5d31f91c8bb62a86e08a1fe77ba99a860766b67b91099aa8ada33e75cd13f8a57934795b2d14722dd435407a40c775c378deab6922790e6d41252a5faaa7d5a
7
+ data.tar.gz: d7edece3f9ff42860d183bdbd41584ae69bc0d96b82936c8e7b7c625857746edda3f0c27826a72c6ff7f0b989a5a3796a0dae2a241c47274d32d581864c44b81
data/README.md CHANGED
@@ -36,7 +36,7 @@ TODO: Write usage instructions here
36
36
  Run `bin/console` for an interactive prompt (loaded with example models/data) and enter the following:
37
37
 
38
38
  ```ruby
39
- puts q(<<-QUERY_STRING).to_json
39
+ puts query(<<-QUERY_STRING).to_json
40
40
  user(<token>) {
41
41
  id,
42
42
  is_admin,
data/lib/gql.rb CHANGED
@@ -23,14 +23,14 @@ module GQL
23
23
  extend ActiveSupport::Autoload
24
24
 
25
25
  autoload_at 'gql/errors' do
26
+ autoload :CallNotFound
27
+ autoload :FieldNotFound
26
28
  autoload :InvalidNodeClass
29
+ autoload :NoMethodError
30
+ autoload :RootClassNotSet
27
31
  autoload :ScanError
28
32
  autoload :SyntaxError
29
- autoload :UndefinedCall
30
- autoload :UndefinedField
31
33
  autoload :UndefinedNodeClass
32
- autoload :UndefinedRoot
33
- autoload :UndefinedFieldType
34
34
  end
35
35
  end
36
36
 
@@ -50,7 +50,13 @@ module GQL
50
50
  Thread.current[:gql_config] ||= Config.new
51
51
  end
52
52
 
53
- %w(root_node_class field_types default_list_class).each do |method|
53
+ def config=(value)
54
+ Thread.current[:gql_config] = value
55
+ end
56
+
57
+ %w(root_node_class root_target_proc field_types
58
+ default_list_class default_field_proc
59
+ default_call_proc).each do |method|
54
60
  module_eval <<-DELEGATORS, __FILE__, __LINE__ + 1
55
61
  def #{method}
56
62
  config.#{method}
data/lib/gql/call.rb CHANGED
@@ -6,20 +6,11 @@ module GQL
6
6
 
7
7
  class << self
8
8
  def returns(result_class = nil, &block)
9
- if result_class
10
- self.result_class = result_class
11
- elsif block_given?
12
- Class.new(Node).tap do |result_class|
13
- result_class.default_proc = -> id { -> { target[id] } }
14
- result_class.class_eval(&block)
15
-
16
- returns result_class
17
- end
18
- end
9
+ self.result_class = result_class || result_class_from_block(block)
19
10
  end
20
11
 
21
12
  def execute(caller_class, ast_node, target, variables, context)
22
- args = substitute_variables(ast_node.arguments, variables)
13
+ args = substitute_variables(ast_node.arguments, variables.dup)
23
14
  target = new(target, context).execute(*args)
24
15
 
25
16
  next_class = result_class || caller_class
@@ -30,8 +21,16 @@ module GQL
30
21
 
31
22
  private
32
23
  def substitute_variables(args, variables)
24
+ return args unless variables.any?
33
25
  args.map { |arg| arg.is_a?(::Symbol) ? variables[arg] : arg }
34
26
  end
27
+
28
+ def result_class_from_block(block)
29
+ Class.new(Node).tap do |result_class|
30
+ result_class.field_proc = -> id { -> { target[id] } }
31
+ result_class.class_eval(&block)
32
+ end
33
+ end
35
34
  end
36
35
 
37
36
  attr_reader :target, :context
data/lib/gql/config.rb CHANGED
@@ -9,13 +9,21 @@ module GQL
9
9
  raise Errors::InvalidNodeClass.new(value, Node)
10
10
  end
11
11
 
12
- if ENV['DEBUG']
12
+ if value && ENV['DEBUG']
13
13
  value.call :_schema, -> { context[:_schema_root] }, returns: Schema::Root
14
14
  end
15
15
 
16
16
  @@root_node_class = value
17
17
  end
18
18
 
19
+ def root_target_proc
20
+ @@root_target_proc ||= -> context { nil }
21
+ end
22
+
23
+ def root_target_proc=(value)
24
+ @@root_target_proc = value
25
+ end
26
+
19
27
  def field_types
20
28
  @@field_types ||= {
21
29
  array: Array,
@@ -36,7 +44,27 @@ module GQL
36
44
  end
37
45
 
38
46
  def default_list_class=(value)
47
+ unless value.nil? || value <= Node
48
+ raise Errors::InvalidNodeClass.new(value, Node)
49
+ end
50
+
39
51
  @@default_list_class = value
40
52
  end
53
+
54
+ def default_field_proc
55
+ @@default_field_proc ||= -> id { -> { target.public_send(id) } }
56
+ end
57
+
58
+ def default_field_proc=(value)
59
+ @@default_field_proc = value
60
+ end
61
+
62
+ def default_call_proc
63
+ @@default_call_proc ||= -> id { -> (*args) { target.public_send(id, *args) } }
64
+ end
65
+
66
+ def default_call_proc=(value)
67
+ @@default_call_proc = value
68
+ end
41
69
  end
42
70
  end
data/lib/gql/errors.rb CHANGED
@@ -6,60 +6,86 @@ module GQL
6
6
  end
7
7
 
8
8
  module Errors
9
- class UndefinedRoot < Error
10
- def initialize
11
- super('Root node class is undefined. Define it with `GQL.root_node_class = MyRootNode`.')
9
+ class NotFoundError < Error
10
+ private
11
+ def construct_message(node_class, id, name, method)
12
+ items = node_class.send(method).keys.sort.map { |key| "`#{key}'" }
13
+
14
+ msg = "#{node_class} has no #{name} named `#{id}'."
15
+ msg << " Available #{name.pluralize}: #{items.to_sentence}." if items.any?
16
+ msg
17
+ end
18
+ end
19
+
20
+ class CallNotFound < NotFoundError
21
+ def initialize(id, node_class)
22
+ msg = construct_message(node_class, id, 'call', :calls)
23
+
24
+ super(msg)
12
25
  end
13
26
  end
14
27
 
15
- class UndefinedNodeClass < Error
16
- def initialize(node_class, name)
17
- super("#{node_class} must define a #{name} class. Set it with `self.#{name}_class = My#{name.camelize}Class`.")
28
+ class FieldNotFound < NotFoundError
29
+ def initialize(id, node_class)
30
+ msg = construct_message(node_class, id, 'field', :fields)
31
+
32
+ super(msg)
18
33
  end
19
34
  end
20
35
 
21
36
  class InvalidNodeClass < Error
22
37
  def initialize(node_class, super_class)
23
- super("#{node_class} must be a (subclass of) #{super_class}.")
38
+ msg = "#{node_class} must be a (subclass of) #{super_class}."
39
+
40
+ super(msg)
24
41
  end
25
42
  end
26
43
 
27
- class UndefinedFieldType < Error
28
- def initialize(id)
29
- types = GQL.field_types.keys.sort.map { |id| "`#{id}`" }
30
- types = types.size > 0 ? " Available types: #{types.to_sentence}." : ''
44
+ class NoMethodError < Error
45
+ attr_reader :cause
31
46
 
32
- super("The field type `#{id}` is undefined. Define it with `GQL.field_types[:#{id}] = My#{id.to_s.camelize}`.#{types}")
33
- end
34
- end
47
+ def initialize(node_class, id, cause)
48
+ @cause = cause
35
49
 
36
- class UndefinedCall < Error
37
- def initialize(id, node_class)
38
- calls = node_class.calls.keys.sort.map { |id| "`#{id}`" }
39
- calls = calls.size > 0 ? " Available calls: #{calls.to_sentence}." : ''
50
+ msg = "Undefined method `#{id}' for #{node_class}. "
51
+ msg << "Did you try to add a field of type `#{id}'? "
52
+ msg << "If so, you have to register your field type first "
53
+ msg << "like this: `GQL.field_types[:#{id}] = My#{id.to_s.camelize}'. "
54
+ msg << "The following field types are currently registered: "
55
+ msg << GQL.field_types.keys.sort.map { |id| "`#{id}'" }.to_sentence
40
56
 
41
- super("#{node_class} has no call named `#{id}`.#{calls}")
57
+ super(msg)
42
58
  end
43
59
  end
44
60
 
45
- class UndefinedField < Error
46
- def initialize(id, node_class)
47
- fields = node_class.fields.keys.sort.map { |id| "`#{id}`" }
48
- fields = fields.size > 0 ? " Available fields: #{fields.to_sentence}." : ''
61
+ class RootClassNotSet < Error
62
+ def initialize
63
+ msg = "GQL root node class is not set. "
64
+ msg << "Set it with `GQL.root_node_class = MyRootNode'."
49
65
 
50
- super("#{node_class} has no field named `#{id}`.#{fields}")
66
+ super(msg)
51
67
  end
52
68
  end
53
69
 
70
+ class ScanError < Error
71
+ end
72
+
54
73
  class SyntaxError < Error
55
74
  def initialize(lineno, value, token)
56
75
  token = 'character' if token == 'error' || token == %Q{"#{value}"}
76
+ msg = "Unexpected #{token}: `#{value}' (line #{lineno})."
57
77
 
58
- super("Unexpected #{token}: `#{value}` (line #{lineno}).")
78
+ super(msg)
59
79
  end
60
80
  end
61
81
 
62
- class ScanError < Error
82
+ class UndefinedNodeClass < Error
83
+ def initialize(node_class, name)
84
+ msg = "#{node_class} must have a #{name} class set. "
85
+ msg << "Set it with `self.#{name}_class = My#{name.camelize}Class'."
86
+
87
+ super(msg)
88
+ end
63
89
  end
64
90
  end
65
91
  end
data/lib/gql/executor.rb CHANGED
@@ -10,11 +10,13 @@ module GQL
10
10
  def execute(context = {})
11
11
  node_class = GQL.root_node_class
12
12
 
13
- raise Errors::UndefinedRoot if node_class.nil?
13
+ raise Errors::RootClassNotSet if node_class.nil?
14
14
 
15
15
  context[:_schema_root] = node_class if ENV['DEBUG']
16
16
 
17
- node = node_class.new(ast_root, nil, variables, context)
17
+ target = GQL.root_target_proc.call(context)
18
+
19
+ node = node_class.new(ast_root, target, variables, context)
18
20
  node.value
19
21
  end
20
22
  end
@@ -0,0 +1,83 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/core_ext/array/extract_options'
3
+ require 'active_support/core_ext/class/attribute'
4
+ require 'active_support/core_ext/string/inflections'
5
+ require 'active_support/core_ext/object/try'
6
+
7
+ module GQL
8
+ module HasCalls
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ class_attribute :calls, :call_proc, instance_accessor: false, instance_predicate: false
13
+ self.calls = {}
14
+ end
15
+
16
+ module ClassMethods
17
+ def call(id, *args)
18
+ options = args.extract_options!
19
+
20
+ call_spec = args.shift || proc_for_call(id)
21
+ result_spec = options[:returns] || call_spec.try(:result_class)
22
+ result_class = result_class_from_spec(result_spec)
23
+
24
+ Node.validate_is_subclass! result_class, 'result' if result_class
25
+
26
+ call_class = call_class_from_spec(call_spec)
27
+ call_class.id = id.to_s
28
+ call_class.result_class = result_class
29
+
30
+ self.const_set "#{id.to_s.camelize}Call", call_class
31
+ self.calls = calls.merge(id.to_sym => call_class)
32
+ end
33
+
34
+ private
35
+ def proc_for_call(id)
36
+ instance_exec id, &(call_proc || GQL.default_call_proc)
37
+ end
38
+
39
+ def result_class_from_spec(spec)
40
+ return spec unless spec.is_a? ::Array
41
+
42
+ result_class_from_connection_spec spec.dup
43
+ end
44
+
45
+ def result_class_from_connection_spec(spec)
46
+ if spec.size == 1
47
+ spec.unshift GQL.default_list_class
48
+ end
49
+
50
+ options = {
51
+ list_class: spec.first,
52
+ item_class: spec.last
53
+ }
54
+
55
+ Connection.build_class :result, nil, options
56
+ end
57
+
58
+ def call_class_from_spec(spec)
59
+ return Class.new(spec) unless spec.is_a?(Proc)
60
+
61
+ Class.new(Call).tap do |call_class|
62
+ call_class.class_eval do
63
+ self.proc = spec
64
+
65
+ def execute(*args)
66
+ instance_exec(*args, &self.class.proc)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ private
74
+ def value_of_call(ast_call)
75
+ call_class = call_class_for_id(ast_call.id)
76
+ call_class.execute(self.class, ast_call, target, variables, context)
77
+ end
78
+
79
+ def call_class_for_id(id)
80
+ self.class.calls[id] or raise Errors::CallNotFound.new(id, self.class)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,103 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/core_ext/array/extract_options'
3
+ require 'active_support/core_ext/class/attribute'
4
+ require 'active_support/core_ext/string/inflections'
5
+
6
+ module GQL
7
+ module HasFields
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ class_attribute :fields, :field_proc, instance_accessor: false, instance_predicate: false
12
+ self.fields = {}
13
+ end
14
+
15
+ module ClassMethods
16
+ def field(id, *args)
17
+ options = args.extract_options!
18
+ type = options.delete(:type) || Node
19
+ proc = args.shift || proc_for_field(id)
20
+
21
+ Node.validate_is_subclass! type, 'type'
22
+
23
+ type.build_class(id, proc, options).tap do |field_class|
24
+ self.const_set "#{id.to_s.camelize}Field", field_class
25
+ self.fields = fields.merge(id.to_sym => field_class)
26
+ end
27
+ end
28
+
29
+ def cursor(id_or_proc)
30
+ id = id_or_proc.is_a?(Proc) ? nil : id_or_proc
31
+ proc = id ? -> { target.public_send(id) } : id_or_proc
32
+
33
+ field :cursor, proc, type: Raw
34
+ end
35
+
36
+ def respond_to?(method, *args)
37
+ super || GQL.field_types.has_key?(method)
38
+ end
39
+
40
+ def method_missing(method, *args, &block)
41
+ if type = GQL.field_types[method]
42
+ define_field_method method, type
43
+ send method, *args, &block
44
+ else
45
+ super
46
+ end
47
+ rescue NoMethodError => exc
48
+ raise Errors::NoMethodError.new(self, method, exc)
49
+ end
50
+
51
+ private
52
+ def proc_for_field(id)
53
+ instance_exec id, &(field_proc || GQL.default_field_proc)
54
+ end
55
+
56
+ def define_field_method(name, type)
57
+ Node.define_singleton_method name do |*args, &block|
58
+ options = args.extract_options!.merge(type: type)
59
+ args = args.push(options)
60
+
61
+ field(*args, &block)
62
+ end
63
+ end
64
+ end
65
+
66
+ private
67
+ def value_of_fields(ast_fields)
68
+ ast_fields.reduce({}) do |result, ast_field|
69
+ key = ast_field.alias_id || ast_field.id
70
+
71
+ result.merge key => value_of_field(ast_field)
72
+ end
73
+ end
74
+
75
+ def value_of_field(ast_field)
76
+ if ast_field.id == :node
77
+ field = self.class.new(ast_field, target, variables, context)
78
+ field.value
79
+ else
80
+ field_class = field_class_for_id(ast_field.id)
81
+ next_target = target_for_field(target, field_class.proc)
82
+
83
+ field = field_class.new(ast_field, next_target, variables, context)
84
+ field.value
85
+ end
86
+ end
87
+
88
+ def field_class_for_id(id)
89
+ self.class.fields[id] or raise Errors::FieldNotFound.new(id, self.class)
90
+ end
91
+
92
+ def target_for_field(current_target, proc)
93
+ method = ExecutionContext.new(current_target, context)
94
+ method.execute proc
95
+ end
96
+
97
+ class ExecutionContext < Struct.new(:target, :context)
98
+ def execute(method, args = [])
99
+ instance_exec(*args, &method)
100
+ end
101
+ end
102
+ end
103
+ end
data/lib/gql/node.rb CHANGED
@@ -1,27 +1,14 @@
1
1
  require 'active_support/core_ext/class/attribute'
2
- require 'active_support/core_ext/string/inflections'
3
- require 'active_support/core_ext/array/extract_options'
4
- require 'active_support/core_ext/object/try'
2
+
3
+ require 'gql/has_calls'
4
+ require 'gql/has_fields'
5
5
 
6
6
  module GQL
7
7
  class Node
8
- class ExecutionContext
9
- attr_reader :target, :context
10
-
11
- def initialize(target, context)
12
- @target, @context = target, context
13
- end
14
-
15
- def execute(method, args = [])
16
- instance_exec(*args, &method)
17
- end
18
- end
19
-
20
- class_attribute :id, :proc, :calls, :fields, :default_proc, instance_accessor: false, instance_predicate: false
8
+ include HasCalls
9
+ include HasFields
21
10
 
22
- self.calls = {}
23
- self.fields = {}
24
- self.default_proc = -> id { -> { target.public_send(id) } }
11
+ class_attribute :id, :proc, instance_accessor: false, instance_predicate: false
25
12
 
26
13
  class << self
27
14
  def build_class(id, proc, options = {})
@@ -31,76 +18,6 @@ module GQL
31
18
  end
32
19
  end
33
20
 
34
- def call(id, *args)
35
- if id.is_a? Hash
36
- id.each do |name, call_class|
37
- call name, call_class
38
- end
39
- else
40
- options = args.extract_options!
41
-
42
- proc_or_class = args.shift || -> (*pargs) { target.public_send(id, *pargs) }
43
- result_class = options[:returns] || proc_or_class.try(:result_class)
44
-
45
- if result_class.is_a? ::Array
46
- if result_class.size == 1
47
- result_class.unshift GQL.default_list_class || Connection
48
- end
49
-
50
- options = {
51
- list_class: result_class.first,
52
- item_class: result_class.last
53
- }
54
-
55
- result_class = Connection.build_class(:result, nil, options)
56
- elsif result_class
57
- Node.validate_is_subclass! result_class, 'result'
58
- end
59
-
60
- call_class =
61
- if proc_or_class.is_a? Proc
62
- Class.new(Call).tap do |klass|
63
- klass.class_eval do
64
- self.proc = proc_or_class
65
-
66
- def execute(*args)
67
- instance_exec(*args, &self.class.proc)
68
- end
69
- end
70
-
71
- self.const_set "#{id.to_s.camelize}Call", klass
72
- end
73
- else
74
- proc_or_class
75
- end
76
-
77
- call_class.id = id.to_s
78
- call_class.result_class = result_class
79
-
80
- self.calls = calls.merge(id.to_sym => call_class)
81
- end
82
- end
83
-
84
- def field(id, *args)
85
- options = args.extract_options!
86
- proc = args.shift || instance_exec(id, &default_proc)
87
- type = options.delete(:type) || Node
88
-
89
- Node.validate_is_subclass! type, 'type'
90
-
91
- type.build_class(id, proc, options).tap do |field_class|
92
- self.const_set "#{id.to_s.camelize}Field", field_class
93
- self.fields = fields.merge(id.to_sym => field_class)
94
- end
95
- end
96
-
97
- def cursor(id_or_proc)
98
- id = id_or_proc.is_a?(Proc) ? nil : id_or_proc
99
- proc = id ? -> { target.public_send(id) } : id_or_proc
100
-
101
- field :cursor, proc, type: Raw
102
- end
103
-
104
21
  def validate_is_subclass!(subclass, name)
105
22
  if subclass.nil?
106
23
  raise Errors::UndefinedNodeClass.new(self, name)
@@ -110,27 +27,6 @@ module GQL
110
27
  raise Errors::InvalidNodeClass.new(subclass, self)
111
28
  end
112
29
  end
113
-
114
- def respond_to?(method, *args)
115
- super || GQL.field_types.has_key?(method)
116
- end
117
-
118
- def method_missing(method, *args, &block)
119
- if type = GQL.field_types[method]
120
- Node.define_singleton_method method do |*margs, &mblock|
121
- options = margs.extract_options!.merge(type: type)
122
- margs = margs.push(options)
123
-
124
- field(*margs, &mblock)
125
- end
126
-
127
- send method, *args, &block
128
- else
129
- super
130
- end
131
- rescue NoMethodError
132
- raise Errors::UndefinedFieldType, method
133
- end
134
30
  end
135
31
 
136
32
  attr_reader :ast_node, :target, :variables, :context
@@ -150,44 +46,6 @@ module GQL
150
46
  end
151
47
  end
152
48
 
153
- def value_of_call(ast_call)
154
- call_class = self.class.calls[ast_call.id]
155
-
156
- if call_class.nil?
157
- raise Errors::UndefinedCall.new(ast_call.id, self.class)
158
- end
159
-
160
- call_class.execute(self.class, ast_call, target, variables, context)
161
- end
162
-
163
- def value_of_fields(ast_fields)
164
- ast_fields.reduce({}) do |result, ast_field|
165
- key = ast_field.alias_id || ast_field.id
166
-
167
- result.merge key => value_of_field(ast_field)
168
- end
169
- end
170
-
171
- def value_of_field(ast_field)
172
- case ast_field.id
173
- when :node
174
- field = self.class.new(ast_field, target, variables, context)
175
- field.value
176
- else
177
- field_class = self.class.fields[ast_field.id]
178
-
179
- if field_class.nil?
180
- raise Errors::UndefinedField.new(ast_field.id, self.class)
181
- end
182
-
183
- method = ExecutionContext.new(target, context)
184
- target = method.execute(field_class.proc)
185
-
186
- field = field_class.new(ast_field, target, variables, context)
187
- field.value
188
- end
189
- end
190
-
191
49
  def raw_value
192
50
  nil
193
51
  end
data/lib/gql/parser.rb CHANGED
@@ -27,6 +27,15 @@ module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 135)
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
+
30
39
  class Node < Struct.new(:id, :alias_id, :call, :fields)
31
40
  def as_json(*)
32
41
  {
@@ -300,14 +309,14 @@ module_eval(<<'.,.,', 'parser.racc', 4)
300
309
 
301
310
  module_eval(<<'.,.,', 'parser.racc', 8)
302
311
  def _reduce_2(val, _values, result)
303
- result = Node.new(nil, nil, val[0], nil )
312
+ result = Root.new(val[0], nil )
304
313
  result
305
314
  end
306
315
  .,.,
307
316
 
308
317
  module_eval(<<'.,.,', 'parser.racc', 9)
309
318
  def _reduce_3(val, _values, result)
310
- result = Node.new(nil, nil, nil, val[1])
319
+ result = Root.new(nil, val[1])
311
320
  result
312
321
  end
313
322
  .,.,
@@ -6,15 +6,7 @@ module GQL
6
6
  string :id
7
7
  string :type, -> { target.name }
8
8
  object :result_class, -> { target.result_class || Placeholder }, node_class: Node
9
-
10
-
11
- array :parameters, -> {
12
- if target.proc
13
- target.proc.parameters
14
- else
15
- target.instance_method(:execute).parameters
16
- end
17
- }, item_class: Parameter
9
+ array :parameters, -> { (target.proc || target.instance_method(:execute)).parameters }, item_class: Parameter
18
10
  end
19
11
  end
20
12
  end
@@ -1,6 +1,6 @@
1
1
  module GQL
2
2
  module Schema
3
- class List < GQL::Connection
3
+ class List < GQL::Node
4
4
  number :count
5
5
 
6
6
  call :reverse
@@ -1,30 +1,20 @@
1
1
  module GQL
2
2
  module Schema
3
3
  class Parameter < GQL::Node
4
- cursor -> { target[1].to_s }
4
+ MODES = {
5
+ req: 'required',
6
+ opt: 'optional',
7
+ rest: 'rest',
8
+ keyreq: 'required keyword',
9
+ key: 'optional keyword',
10
+ keyrest: 'keyword rest',
11
+ block: 'block'
12
+ }.freeze
5
13
 
6
- string :id, -> { target[1].to_s }
14
+ cursor -> { target[1].to_s }
7
15
 
8
- string :mode, -> {
9
- case target[0]
10
- when :req
11
- 'required'
12
- when :opt
13
- 'optional'
14
- when :rest
15
- 'rest'
16
- when :keyreq
17
- 'required keyword'
18
- when :key
19
- 'optional keyword'
20
- when :keyrest
21
- 'keyword rest'
22
- when :block
23
- 'block'
24
- else
25
- target[0].to_s
26
- end
27
- }
16
+ string :id, -> { target[1].to_s }
17
+ string :mode, -> { MODES[target[0]] || target[0].to_s }
28
18
  end
29
19
  end
30
20
  end
data/lib/gql/tokenizer.rb CHANGED
@@ -103,7 +103,10 @@ class GQL::Parser < Racc::Parser
103
103
  when (text = @ss.scan(/.*(?=\*\/)/))
104
104
  ;
105
105
 
106
- when (text = @ss.scan(/(.|\n)*(?=\*\/)/))
106
+ when (text = @ss.scan(/.+(?=\n)/))
107
+ ;
108
+
109
+ when (text = @ss.scan(/\n/))
107
110
  ;
108
111
 
109
112
  else
data/lib/gql/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module GQL
2
- VERSION = '0.0.10'
2
+ VERSION = '0.0.11'
3
3
  end
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.10
4
+ version: 0.0.11
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-08 00:00:00.000000000 Z
11
+ date: 2015-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codeclimate-test-reporter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.4'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.4'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: activesupport
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -111,6 +125,8 @@ files:
111
125
  - lib/gql/connection.rb
112
126
  - lib/gql/errors.rb
113
127
  - lib/gql/executor.rb
128
+ - lib/gql/has_calls.rb
129
+ - lib/gql/has_fields.rb
114
130
  - lib/gql/node.rb
115
131
  - lib/gql/number.rb
116
132
  - lib/gql/object.rb
@@ -138,7 +154,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
154
  requirements:
139
155
  - - ">="
140
156
  - !ruby/object:Gem::Version
141
- version: 2.2.0
157
+ version: '2.1'
142
158
  required_rubygems_version: !ruby/object:Gem::Requirement
143
159
  requirements:
144
160
  - - ">="