rubocop-graphql 0.1.2 → 0.1.3

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
  SHA256:
3
- metadata.gz: 30e4dfa482d073cf52c315042d736a54ce725491b3dcf130c9fecd3987bed8d2
4
- data.tar.gz: 4e2467eab2c0ae0be138f6acf3b21912ad888c7b3cbcad98c2c7b0da3d9579af
3
+ metadata.gz: 03b458539789cb0aeaf7e8852d2c7eba08554f7ef1d3621bce63d7cb271899be
4
+ data.tar.gz: 16da0bb9da9cfdafd6da1d883890d8a96d6387519c7fba8cec883461d5d43130
5
5
  SHA512:
6
- metadata.gz: 6099e724a272914bac6212d07ad92256316db2874b26edcd2daf9e8155668f5ddb6b394221b740e8ed51273b49eb101cd83cba55c59352a6c2cd178e972afb9b
7
- data.tar.gz: 80f3d7cfa9e10f209e3f8d2cbf373ac370dc738da62e05b704f37cb8aaccd41216aed6294f063092d26c606645877b3bc0c2aba77bfabf6b5590b79d31e6928f
6
+ metadata.gz: 12208cd27b2711fb499331e26e0eead2064115d1f7f47dadcbb0ae218ad8d28fd852a5f4a0f1e3bfcecac6302205612b88f57ae65af89735ab9c454b4e3fbc4f
7
+ data.tar.gz: d3c8402557eb2b58f1c7a231d5b7a988d9bcfde59a8aa8b23c106f11cfe4ce6a193a1843165b296999bda3fbaa6d6f43560aff0082dd48ca6b18b0a0f5f3641c
@@ -6,7 +6,7 @@ AllCops:
6
6
  GraphQL/ResolverMethodLength:
7
7
  Enabled: true
8
8
  VersionAdded: '0.80'
9
- Description: 'Avoid resolver methods longer than 10 lines of code.'
9
+ Description: 'Checks resolver methods are not too long'
10
10
  Max: 10
11
11
  CountComments: false
12
12
  ExcludedMethods: []
@@ -23,4 +23,9 @@ GraphQL/FieldDefinitions:
23
23
  GraphQL/FieldDescription:
24
24
  Enabled: true
25
25
  VersionAdded: '0.80'
26
- Description: 'Missing field description'
26
+ Description: 'Ensures all fields have a description'
27
+
28
+ GraphQL/FieldMethod:
29
+ Enabled: true
30
+ VersionAdded: '0.80'
31
+ Description: 'Checks :method option is used for appropriate fields'
@@ -6,7 +6,10 @@ require_relative "rubocop/graphql"
6
6
  require_relative "rubocop/graphql/version"
7
7
  require_relative "rubocop/graphql/inject"
8
8
  require_relative "rubocop/graphql/node_pattern"
9
+
9
10
  require_relative "rubocop/graphql/field"
11
+ require_relative "rubocop/graphql/field_kwargs"
12
+ require_relative "rubocop/graphql/schema_member"
10
13
 
11
14
  RuboCop::GraphQL::Inject.defaults!
12
15
 
@@ -57,10 +57,6 @@ module RuboCop
57
57
  )
58
58
  PATTERN
59
59
 
60
- def_node_matcher :class_body, <<~PATTERN
61
- (class ... (begin $...))
62
- PATTERN
63
-
64
60
  def on_send(node)
65
61
  return if !field_definition?(node) || style != :define_resolver_after_definition
66
62
 
@@ -71,8 +67,11 @@ module RuboCop
71
67
  def on_class(node)
72
68
  return if style != :group_definitions
73
69
 
74
- body = class_body(node)
75
- check_grouped_field_declarations(body) if body
70
+ schema_member = RuboCop::GraphQL::SchemaMember.new(node)
71
+
72
+ if (body = schema_member.body)
73
+ check_grouped_field_declarations(body)
74
+ end
76
75
  end
77
76
 
78
77
  private
@@ -94,10 +93,9 @@ module RuboCop
94
93
  RESOLVER_AFTER_FIELD_MSG = "Define resolver method after field definition."
95
94
 
96
95
  def check_resolver_is_defined_after_definition(field)
97
- return if field.resolver || field.method || field.hash_key
96
+ return if field.kwargs.resolver || field.kwargs.method || field.kwargs.hash_key
98
97
 
99
- root = field.ancestors.find { |parent| root_node?(parent) }
100
- method_definition = find_method_definition(root, field.resolver_method_name)
98
+ method_definition = field.schema_member.find_method_definition(field.resolver_method_name)
101
99
  return unless method_definition
102
100
 
103
101
  field_sibling_index = if field_definition_with_body?(field.parent)
@@ -110,18 +108,6 @@ module RuboCop
110
108
 
111
109
  add_offense(field.node, message: RESOLVER_AFTER_FIELD_MSG)
112
110
  end
113
-
114
- def find_method_definition(root, method_name)
115
- class_body(root).find { |node| node.def_type? && node.method_name == method_name }
116
- end
117
-
118
- def root_node?(node)
119
- node.parent.nil? || root_with_siblings?(node.parent)
120
- end
121
-
122
- def root_with_siblings?(node)
123
- node.begin_type? && node.parent.nil?
124
- end
125
111
  end
126
112
  end
127
113
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module GraphQL
6
+ # This cop prevents defining unnecessary resolver methods in cases
7
+ # when :method option can be used
8
+ #
9
+ # @example
10
+ # # good
11
+ #
12
+ # class Types::UserType < Types::BaseObject
13
+ # field :phone, String, null: true, method: :home_phone
14
+ # end
15
+ #
16
+ # # bad
17
+ #
18
+ # class Types::UserType < Types::BaseObject
19
+ # field :phone, String, null: true
20
+ #
21
+ # def phone
22
+ # object.home_phone
23
+ # end
24
+ # end
25
+ #
26
+ class FieldMethod < Cop
27
+ include RuboCop::GraphQL::NodePattern
28
+
29
+ def_node_matcher :method_to_use, <<~PATTERN
30
+ (def
31
+ _
32
+ (args)
33
+ (send
34
+ (send nil? :object) $_
35
+ )
36
+ )
37
+ PATTERN
38
+
39
+ MSG = "Use method: :%<method_name>s"
40
+
41
+ def on_send(node)
42
+ return unless field_definition?(node)
43
+
44
+ field = RuboCop::GraphQL::Field.new(node)
45
+
46
+ method_name = field.resolver_method_name
47
+ method_definition = field.schema_member.find_method_definition(method_name)
48
+
49
+ if (method_name = method_to_use(method_definition))
50
+ add_offense(node, message: message(method_name))
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def message(method_name)
57
+ format(MSG, method_name: method_name)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -4,4 +4,5 @@ require_relative "graphql/cop"
4
4
 
5
5
  require_relative "graphql/field_definitions"
6
6
  require_relative "graphql/field_description"
7
+ require_relative "graphql/field_method"
7
8
  require_relative "graphql/resolver_method_length"
@@ -6,7 +6,7 @@ module RuboCop
6
6
  extend Forwardable
7
7
  extend RuboCop::NodePattern::Macros
8
8
 
9
- def_delegators :@node, :sibling_index, :parent, :ancestors
9
+ def_delegators :@node, :sibling_index, :parent
10
10
 
11
11
  def_node_matcher :field_kwargs, <<~PATTERN
12
12
  (send nil? :field
@@ -18,27 +18,11 @@ module RuboCop
18
18
  PATTERN
19
19
 
20
20
  def_node_matcher :field_name, <<~PATTERN
21
- (send nil? :field (:sym $...) ...)
21
+ (send nil? :field (:sym $_) ...)
22
22
  PATTERN
23
23
 
24
24
  def_node_matcher :field_description, <<~PATTERN
25
- (send nil? :field _ _ (:str $...) ...)
26
- PATTERN
27
-
28
- def_node_matcher :resolver_kwarg?, <<~PATTERN
29
- (pair (sym :resolver) ...)
30
- PATTERN
31
-
32
- def_node_matcher :method_kwarg?, <<~PATTERN
33
- (pair (sym :method) ...)
34
- PATTERN
35
-
36
- def_node_matcher :hash_key_kwarg?, <<~PATTERN
37
- (pair (sym :hash_key) ...)
38
- PATTERN
39
-
40
- def_node_matcher :resolver_method_option, <<~PATTERN
41
- (pair (sym :resolver_method) (sym $...))
25
+ (send nil? :field _ _ (:str $_) ...)
42
26
  PATTERN
43
27
 
44
28
  attr_reader :node
@@ -48,31 +32,37 @@ module RuboCop
48
32
  end
49
33
 
50
34
  def name
51
- @name ||= field_name(@node).first
35
+ field_name(@node)
52
36
  end
53
37
 
54
38
  def description
55
- @name ||= field_description(@node)
39
+ field_description(@node)
40
+ end
41
+
42
+ def resolver_method_name
43
+ kwargs.resolver_method_name || name
56
44
  end
57
45
 
58
46
  def kwargs
59
- @kwargs ||= field_kwargs(@node) || []
47
+ @kwargs ||= FieldKwargs.new(field_kwargs(@node))
60
48
  end
61
49
 
62
- def resolver
63
- kwargs.find { |kwarg| resolver_kwarg?(kwarg) }
50
+ def schema_member
51
+ @schema_member ||= SchemaMember.new(root_node)
64
52
  end
65
53
 
66
- def method
67
- kwargs.find { |kwarg| method_kwarg?(kwarg) }
54
+ private
55
+
56
+ def root_node
57
+ @node.ancestors.find { |parent| root_node?(parent) }
68
58
  end
69
59
 
70
- def hash_key
71
- kwargs.find { |kwarg| hash_key_kwarg?(kwarg) }
60
+ def root_node?(node)
61
+ node.parent.nil? || root_with_siblings?(node.parent)
72
62
  end
73
63
 
74
- def resolver_method_name
75
- @resolver_method_name ||= kwargs.flat_map { |kwarg| resolver_method_option(kwarg) }.compact.first || name
64
+ def root_with_siblings?(node)
65
+ node.begin_type? && node.parent.nil?
76
66
  end
77
67
  end
78
68
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module GraphQL
5
+ class FieldKwargs
6
+ extend RuboCop::NodePattern::Macros
7
+
8
+ def_node_matcher :resolver_kwarg?, <<~PATTERN
9
+ (pair (sym :resolver) ...)
10
+ PATTERN
11
+
12
+ def_node_matcher :method_kwarg?, <<~PATTERN
13
+ (pair (sym :method) ...)
14
+ PATTERN
15
+
16
+ def_node_matcher :hash_key_kwarg?, <<~PATTERN
17
+ (pair (sym :hash_key) ...)
18
+ PATTERN
19
+
20
+ def_node_matcher :resolver_method_option, <<~PATTERN
21
+ (pair (sym :resolver_method) (sym $...))
22
+ PATTERN
23
+
24
+ def initialize(nodes)
25
+ @nodes = nodes
26
+ end
27
+
28
+ def resolver
29
+ @nodes.find { |kwarg| resolver_kwarg?(kwarg) }
30
+ end
31
+
32
+ def method
33
+ @nodes.find { |kwarg| method_kwarg?(kwarg) }
34
+ end
35
+
36
+ def hash_key
37
+ @nodes.find { |kwarg| hash_key_kwarg?(kwarg) }
38
+ end
39
+
40
+ def resolver_method_name
41
+ @resolver_method_name ||= @nodes.flat_map { |kwarg| resolver_method_option(kwarg) }.compact.first
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module GraphQL
5
+ class SchemaMember
6
+ extend RuboCop::NodePattern::Macros
7
+
8
+ def_node_matcher :class_contents, <<~PATTERN
9
+ (class _ _ $_)
10
+ PATTERN
11
+
12
+ attr_reader :node
13
+
14
+ def initialize(node)
15
+ @node = node
16
+ end
17
+
18
+ def find_method_definition(method_name)
19
+ body.find { |node| node.def_type? && node.method_name == method_name }
20
+ end
21
+
22
+ def body
23
+ contents = class_contents(@node)
24
+
25
+ if contents.nil?
26
+ []
27
+ elsif contents.begin_type?
28
+ contents.child_nodes
29
+ else
30
+ [contents]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  module RuboCop
2
2
  module GraphQL
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Tsepelev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-25 00:00:00.000000000 Z
11
+ date: 2020-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,12 +80,15 @@ files:
80
80
  - lib/rubocop/cop/graphql/cop.rb
81
81
  - lib/rubocop/cop/graphql/field_definitions.rb
82
82
  - lib/rubocop/cop/graphql/field_description.rb
83
+ - lib/rubocop/cop/graphql/field_method.rb
83
84
  - lib/rubocop/cop/graphql/resolver_method_length.rb
84
85
  - lib/rubocop/cop/graphql_cops.rb
85
86
  - lib/rubocop/graphql.rb
86
87
  - lib/rubocop/graphql/field.rb
88
+ - lib/rubocop/graphql/field_kwargs.rb
87
89
  - lib/rubocop/graphql/inject.rb
88
90
  - lib/rubocop/graphql/node_pattern.rb
91
+ - lib/rubocop/graphql/schema_member.rb
89
92
  - lib/rubocop/graphql/version.rb
90
93
  homepage: https://github.com/DmitryTsepelev/rubocop-graphql
91
94
  licenses: