graphql-client 0.2.1 → 0.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92517699fcc7f893fbcb3509710c652ce988c348
4
- data.tar.gz: f8c7a89ad56791a82bd2190045ecb73e7c13cda0
3
+ metadata.gz: 261b7d370edcba549d839ac1faa87f1e33ba4966
4
+ data.tar.gz: 4c64adc1352929f43f3d2f44f6a698d61c9a0e0b
5
5
  SHA512:
6
- metadata.gz: 66d40ba79f8cd348f11c2f20c2d4318bfbf84f8132cb61af589f67e7d19ab3192e9db162053b2afdd34a6b013aabeb5ed5a264e5d55eda2b1518a60588e39995
7
- data.tar.gz: 3d7dea0a68e49397b5fa3eb8f77108e25d572231ed93cc2ae27d9b498945bcbe83c3e0418d8e697e101bce0532f92db9cae4304f21566c366e15e5cfcc114abc
6
+ metadata.gz: 6b3c3460544febc35e64b5c4f1da101d8651cee640bdc8ff3a224f4ff6d9edebae2c306d00ad5841990fbed84d92a9a50282aabcf1fce7a532490bc7e9d55e23
7
+ data.tar.gz: 2a7df513bf269e8cde27157ff3c0a917dd665c73efce31230750d9ef897e36681ada81b7a0d55b1fb47b80e57a4e1e2898b3ed085be89cbc14013ba5d15840e4
@@ -1,3 +1,4 @@
1
+ require "active_support/core_ext/hash/keys"
1
2
  require "active_support/inflector"
2
3
  require "active_support/notifications"
3
4
  require "graphql"
@@ -193,8 +194,13 @@ module GraphQL
193
194
 
194
195
  errors = validator.validate(query)
195
196
  errors.fetch(:errors).each do |error|
196
- validation_line = error["locations"][0]["line"]
197
- error = ValidationError.new(error["message"])
197
+ if error.respond_to?(:message)
198
+ validation_line = error.line
199
+ error = ValidationError.new(error.message)
200
+ else # TODO: Remove when only supporting graphql-ruby 1.x
201
+ validation_line = error["locations"][0]["line"]
202
+ error = ValidationError.new(error["message"])
203
+ end
198
204
  error.set_backtrace(["#{filename}:#{lineno + validation_line}"] + caller) if filename && lineno
199
205
  raise error
200
206
  end
@@ -245,6 +251,8 @@ module GraphQL
245
251
  raise TypeError, "expected definition to be a #{OperationDefinition.name} but was #{document.class.name}"
246
252
  end
247
253
 
254
+ variables = variables.deep_stringify_keys
255
+
248
256
  document = definition.document
249
257
  operation = definition.definition_node
250
258
 
@@ -25,9 +25,8 @@ module GraphQL
25
25
  # defined.
26
26
  def self.extract_graphql_section(src)
27
27
  query_string = src.scan(/<%graphql([^%]+)%>/).flatten.first
28
- if query_string
29
- return query_string, Regexp.last_match.pre_match.count("\n") + 1
30
- end
28
+ return nil unless query_string
29
+ [query_string, Regexp.last_match.pre_match.count("\n") + 1]
31
30
  end
32
31
 
33
32
  # Internal: Extend Rails' Erubis handler to simply ignore <%graphql
@@ -22,6 +22,7 @@ module GraphQL
22
22
  node.selections.each do |selection|
23
23
  case selection
24
24
  when Language::Nodes::FragmentSpread
25
+ nil
25
26
  when Language::Nodes::Field
26
27
  field_name = selection.alias || selection.name
27
28
  field_klass = selection.selections.any? ? wrap(selection, name: "#{name}[:#{field_name}]") : nil
@@ -115,15 +116,12 @@ module GraphQL
115
116
  when Hash
116
117
  new(obj, errors)
117
118
  when self
118
- return obj
119
+ obj
119
120
  when QueryResult
120
121
  spreads = Set.new(self.spreads(obj.class.source_node).map(&:name))
121
122
 
122
123
  unless spreads.include?(source_node.name)
123
- message = "couldn't cast #{obj.inspect} to #{inspect}\n\n"
124
- suggestion = "\n ...#{name || 'YourFragment'} # SUGGESTION"
125
- message << GraphQL::Language::Generation.generate(obj.class.source_node).sub(/\n}$/, "#{suggestion}\n}")
126
- raise TypeError, message
124
+ raise TypeError, "couldn't cast #{obj.inspect} to #{inspect}"
127
125
  end
128
126
  cast(obj.to_h, obj.errors)
129
127
  when Array
@@ -0,0 +1,17 @@
1
+ require "rubocop"
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module GraphQL
6
+ # Public: Cop for enforcing non-interpolated GRAPHQL heredocs.
7
+ class Heredoc < Cop
8
+ def on_str(node)
9
+ return unless node.location.is_a?(Parser::Source::Map::Heredoc)
10
+ return unless node.location.expression.source == "<<-GRAPHQL"
11
+
12
+ add_offense(node, :expression, "GraphQL heredocs should be quoted. <<-'GRAPHQL'")
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,63 @@
1
+ require "active_support/inflector"
2
+ require "graphql"
3
+ require "graphql/client/erubis"
4
+ require "rubocop"
5
+
6
+ module RuboCop
7
+ module Cop
8
+ module GraphQL
9
+ # Public: Rubocop for catching overfetched fields in ERB templates.
10
+ class Overfetch < Cop
11
+ def_node_search :send_methods, "(send ...)"
12
+
13
+ def investigate(processed_source)
14
+ erb = File.read(processed_source.buffer.name)
15
+ query, = ::GraphQL::Client::Erubis.extract_graphql_section(erb)
16
+ return unless query
17
+
18
+ aliases = {}
19
+ fields = {}
20
+ ranges = {}
21
+
22
+ # TODO: Use GraphQL client parser
23
+ document = ::GraphQL.parse(query.gsub(/::/, "__"))
24
+
25
+ visitor = ::GraphQL::Language::Visitor.new(document)
26
+ visitor[::GraphQL::Language::Nodes::Field] << ->(node, _parent) do
27
+ name = node.alias || node.name
28
+ fields[name] ||= 0
29
+ field_aliases(name).each { |n| (aliases[n] ||= []) << name }
30
+ ranges[name] ||= source_range(processed_source.buffer, node.line, 0)
31
+ end
32
+ visitor.visit
33
+
34
+ send_methods(processed_source.ast).each do |node|
35
+ _receiver, method_name, *_args = *node
36
+ aliases.fetch(method_name.to_s, []).each do |field_name|
37
+ fields[field_name] += 1
38
+ end
39
+ end
40
+
41
+ fields.each do |field, count|
42
+ next if count > 0
43
+ add_offense(nil, ranges[field], "GraphQL field '#{field}' query but was not used in template.")
44
+ end
45
+ end
46
+
47
+ def field_aliases(name)
48
+ names = Set.new
49
+
50
+ names << name
51
+ names << "#{name}?"
52
+
53
+ names << underscore_name = ActiveSupport::Inflector.underscore(name)
54
+ names << "#{underscore_name}?"
55
+
56
+ names << "each_node" if name == "edges" || name == "node"
57
+
58
+ names
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-11 00:00:00.000000000 Z
11
+ date: 2016-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -34,9 +34,6 @@ dependencies:
34
34
  name: graphql
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '0.19'
40
37
  - - ">="
41
38
  - !ruby/object:Gem::Version
42
39
  version: 0.19.2
@@ -44,9 +41,6 @@ dependencies:
44
41
  prerelease: false
45
42
  version_requirements: !ruby/object:Gem::Requirement
46
43
  requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '0.19'
50
44
  - - ">="
51
45
  - !ruby/object:Gem::Version
52
46
  version: 0.19.2
@@ -133,6 +127,8 @@ files:
133
127
  - lib/graphql/client/response.rb
134
128
  - lib/graphql/client/view_module.rb
135
129
  - lib/graphql/language/nodes/deep_freeze_ext.rb
130
+ - lib/rubocop/cop/graphql/heredoc.rb
131
+ - lib/rubocop/cop/graphql/overfetch.rb
136
132
  homepage: https://github.com/github/graphql-client
137
133
  licenses:
138
134
  - MIT