graphql 0.18.3 → 0.18.4

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: e542df508ad2037e784439e944e47df3711dc7b7
4
- data.tar.gz: 4623d2ac01705a25245a114aec72a71117172c77
3
+ metadata.gz: 45a2831bb2cf4c54f83f856f5e614a64b4e2a06e
4
+ data.tar.gz: ca550cdf4e4e9772f0facd364295754bf2bc1440
5
5
  SHA512:
6
- metadata.gz: d2b6f96474c81050d2f626e62ab96c784459662f3676c6b4a28ea8d36def062e5de6b1cefa097705f6c93be2b026dfb6cea1184b9e736d9fd0618024442b8d83
7
- data.tar.gz: de4ea313f70e012ad7152a71dbfe459d62fa4988b43f6947791d00c1fa45eb377962331e8db7f504a96ca331d27d962933874af4afae405a4794be2c82c2d714
6
+ metadata.gz: 3b52b0fd7948401ad258096f00611d63d7576d83981bd7efbda85a5d34fb7e3938ec661f357d92ab7d8bcf158a3e56ccc2be60a8402249746a9f14cda3edc601
7
+ data.tar.gz: 06cab8b10aa6f6d1fd03049e24cdca3f97c014801d16fbc127d6adb6f81b55bad57797c35cfeacf4e0958834cd5e74e9e8925ca304b9e70439028ae31e1f9ba7
@@ -5,13 +5,12 @@ module GraphQL
5
5
  def initialize(field_name, value)
6
6
  @field_name = field_name
7
7
  @value = value
8
+ super("Cannot return null for non-nullable field #{@field_name}")
8
9
  end
9
10
 
10
11
  # @return [Hash] An entry for the response's "errors" key
11
12
  def to_h
12
- {
13
- "message" => "Cannot return null for non-nullable field #{@field_name}"
14
- }
13
+ { "message" => message }
15
14
  end
16
15
 
17
16
  # @return [Boolean] Whether the null in question was caused by another error
@@ -63,30 +63,33 @@ module GraphQL
63
63
  end
64
64
 
65
65
  @arguments_cache = Hash.new { |h, k| h[k] = {} }
66
+ @validation_errors = []
67
+ @analysis_errors = []
68
+ @internal_representation = nil
69
+ @was_validated = false
66
70
  end
67
71
 
68
72
  # Get the result for this query, executing it once
69
73
  def result
70
74
  @result ||= begin
71
- if @validate && (validation_errors.any? || analysis_errors.any?)
72
- { "errors" => validation_errors + analysis_errors}
75
+ if !valid?
76
+ all_errors = validation_errors + analysis_errors
77
+ if all_errors.any?
78
+ { "errors" => all_errors }
79
+ else
80
+ nil
81
+ end
73
82
  else
74
83
  Executor.new(self).result
75
84
  end
76
85
  end
77
-
78
86
  end
79
87
 
80
88
 
81
89
  # This is the operation to run for this query.
82
90
  # If more than one operation is present, it must be named at runtime.
83
91
  # @return [GraphQL::Language::Nodes::OperationDefinition, nil]
84
- def selected_operation
85
- @selected_operation ||= begin
86
- perform_validation
87
- @selected_operation
88
- end
89
- end
92
+ attr_reader :selected_operation
90
93
 
91
94
  # Determine the values for variables of this query, using default values
92
95
  # if a value isn't provided at runtime.
@@ -101,18 +104,25 @@ module GraphQL
101
104
  )
102
105
  end
103
106
 
107
+ # @return [Hash<String, nil => GraphQL::InternalRepresentation::Node] Operation name -> Irep node pairs
104
108
  def internal_representation
105
- @internal_representation ||= begin
106
- perform_validation
107
- @internal_representation
108
- end
109
+ valid?
110
+ @internal_representation
109
111
  end
110
112
 
113
+ # TODO this should probably contain error instances, not hashes
114
+ # @return [Array<Hash>] Static validation errors for the query string
111
115
  def validation_errors
112
- @validation_errors ||= begin
113
- perform_validation
114
- @validation_errors
115
- end
116
+ valid?
117
+ @validation_errors
118
+ end
119
+
120
+
121
+ # TODO this should probably contain error instances, not hashes
122
+ # @return [Array<Hash>] Errors for this particular query run (eg, exceeds max complexity)
123
+ def analysis_errors
124
+ valid?
125
+ @analysis_errors
116
126
  end
117
127
 
118
128
  # Node-level cache for calculating arguments. Used during execution and query analysis.
@@ -127,24 +137,59 @@ module GraphQL
127
137
  end
128
138
  end
129
139
 
140
+ # @return [GraphQL::Language::Nodes::Document, nil]
141
+ def selected_operation
142
+ @selected_operation ||= find_operation(@operations, @operation_name)
143
+ end
144
+
145
+ def valid?
146
+ if !@was_validated
147
+ @was_validated = true
148
+ @valid = if @validate
149
+ document_valid? && query_possible? && query_valid?
150
+ else
151
+ true
152
+ end
153
+ end
154
+
155
+ @valid
156
+ end
157
+
130
158
  private
131
159
 
132
- def perform_validation
133
- @selected_operation = find_operation(@operations, @operation_name)
160
+ # Assert that the passed-in query string is internally consistent
161
+ def document_valid?
134
162
  validation_result = schema.static_validator.validate(self)
135
163
  @validation_errors = validation_result[:errors]
136
164
  @internal_representation = validation_result[:irep]
137
- if @validation_errors.none?
138
- # Accessing variables will raise errors if there are any :S
139
- variables
140
- end
141
- nil
165
+ @validation_errors.none?
166
+ end
167
+
168
+ # Given that the document is valid, do we have what we need to
169
+ # execute the document this time?
170
+ # - Is there an operation to run?
171
+ # - Are all variables accounted for?
172
+ def query_possible?
173
+ !selected_operation.nil? && variables
174
+ true
142
175
  rescue GraphQL::Query::OperationNameMissingError, GraphQL::Query::VariableValidationError => err
143
- @validation_errors = [err.to_h]
144
- @internal_representation = nil
145
- nil
176
+ @validation_errors << err.to_h
177
+ false
146
178
  end
147
179
 
180
+ # Given that we _could_ execute this query, _should_ we?
181
+ # - Does it violate any query analyzers?
182
+ def query_valid?
183
+ @analysis_errors = begin
184
+ if @query_analyzers.any?
185
+ reduce_results = GraphQL::Analysis.analyze_query(self, @query_analyzers)
186
+ reduce_results.select { |r| r.is_a?(GraphQL::AnalysisError) }.map(&:to_h)
187
+ else
188
+ []
189
+ end
190
+ end
191
+ @analysis_errors.none?
192
+ end
148
193
 
149
194
  def find_operation(operations, operation_name)
150
195
  if operations.length == 1
@@ -157,19 +202,5 @@ module GraphQL
157
202
  operations[operation_name]
158
203
  end
159
204
  end
160
-
161
- def analysis_errors
162
- @analysis_errors ||= begin
163
- if validation_errors.any?
164
- # Can't reduce an invalid query
165
- []
166
- elsif @query_analyzers.any?
167
- reduce_results = GraphQL::Analysis.analyze_query(self, @query_analyzers)
168
- reduce_results.select { |r| r.is_a?(GraphQL::AnalysisError) }.map(&:to_h)
169
- else
170
- []
171
- end
172
- end
173
- end
174
205
  end
175
206
  end
@@ -1,3 +1,3 @@
1
1
  module GraphQL
2
- VERSION = "0.18.3"
2
+ VERSION = "0.18.4"
3
3
  end
@@ -30,4 +30,14 @@ describe GraphQL::StaticValidation::FragmentsAreUsed do
30
30
  "path"=>["query getCheese", "... undefinedFields"]
31
31
  })
32
32
  end
33
+
34
+ describe "queries that are comments" do
35
+ let(:query_string) {%|
36
+ # I am a comment.
37
+ |}
38
+ let(:result) { DummySchema.execute(query_string) }
39
+ it "handles them gracefully" do
40
+ assert_equal({}, result)
41
+ end
42
+ end
33
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.3
4
+ version: 0.18.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-22 00:00:00.000000000 Z
11
+ date: 2016-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: codeclimate-test-reporter