summaryrefslogtreecommitdiff
path: root/rubocop/cop/graphql/descriptions.rb
diff options
context:
space:
mode:
Diffstat (limited to 'rubocop/cop/graphql/descriptions.rb')
-rw-r--r--rubocop/cop/graphql/descriptions.rb56
1 files changed, 56 insertions, 0 deletions
diff --git a/rubocop/cop/graphql/descriptions.rb b/rubocop/cop/graphql/descriptions.rb
new file mode 100644
index 00000000000..b4e00dfe336
--- /dev/null
+++ b/rubocop/cop/graphql/descriptions.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+# This cop checks for missing GraphQL field descriptions.
+#
+# @example
+#
+# # bad
+# class AwfulClass
+# field :some_field, GraphQL::STRING_TYPE
+# end
+#
+# class TerribleClass
+# argument :some_argument, GraphQL::STRING_TYPE
+# end
+#
+# # good
+# class GreatClass
+# argument :some_field,
+# GraphQL::STRING_TYPE,
+# description: "Well described - a superb description"
+#
+# field :some_field,
+# GraphQL::STRING_TYPE,
+# description: "A thorough and compelling description"
+# end
+
+module RuboCop
+ module Cop
+ module Graphql
+ class Descriptions < RuboCop::Cop::Cop
+ MSG = 'Please add a `description` property.'
+
+ # ability_field and permission_field set a default description.
+ def_node_matcher :fields, <<~PATTERN
+ (send nil? :field $...)
+ PATTERN
+
+ def_node_matcher :arguments, <<~PATTERN
+ (send nil? :argument $...)
+ PATTERN
+
+ def_node_matcher :has_description?, <<~PATTERN
+ (hash <(pair (sym :description) _) ...>)
+ PATTERN
+
+ def on_send(node)
+ matches = fields(node) || arguments(node)
+
+ return if matches.nil?
+
+ add_offense(node, location: :expression) unless has_description?(matches.last)
+ end
+ end
+ end
+ end
+end