Class: GraphQL::Modernize::Rules::VisibilityPlugin

Inherits:
Base
  • Object
show all
Defined in:
lib/graphql/modernize/rules/deprecation.rb

Instance Attribute Summary

Attributes inherited from Base

#offenses

Instance Method Summary collapse

Methods inherited from Base

#initialize, node_pattern, node_types, rule, #visit

Constructor Details

This class inherits a constructor from GraphQL::Modernize::Rules::Base

Instance Method Details

#on_match(node, _captures) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/graphql/modernize/rules/deprecation.rb', line 126

def on_match(node, _captures)
  context = context_for(node)
  return unless inside?(node, :schema)
  return if hierarchy.visible_definitions.empty? || !hierarchy.visibility_plugin_target?(context.class_name)

  return if hierarchy.visibility_plugin_ambiguous?(context.class_name)

  definition = hierarchy.visible_definitions.first
  message = "visible? (#{definition.path}:#{definition.line}) requires a Visibility plugin"
  migration_errors = config.rule_options(self.class..id).fetch("migration_errors", true)
  plugin = "use GraphQL::Schema::Visibility, migration_errors: #{migration_errors}"
  add_offense(node.location, message: message) { |rw| rw.insert_into_body(node, plugin, position: :end) }
end

#on_visibility_call(node, _captures) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/graphql/modernize/rules/deprecation.rb', line 140

def on_visibility_call(node, _captures)
  context = context_for(node)
  return unless inside?(node, :schema)

  plugin = constant_source(node.arguments&.arguments&.first)
  return unless %w[GraphQL::Schema::Visibility GraphQL::Schema::Warden].include?(plugin)
  if hierarchy.visibility_plugin_ambiguous?(context.class_name)
    return add_offense(node.location, safety: :manual,
                                      message: "Resolve conditional Visibility plugin configuration manually")
  end
  return unless plugin == "GraphQL::Schema::Visibility"
  return unless hierarchy.visibility_plugin_misplaced?(context.class_name, rewriter.source_file.path,
                                                       node.location.start_offset)

  message = "Move `use GraphQL::Schema::Visibility` after root type configuration"
  line_end = rewriter.source_file.line_end(node.location.end_offset - 1)
  trailing = rewriter.source_file.source.byteslice(node.location.end_offset,
                                                   line_end - node.location.end_offset).strip
  if node.block || !standalone_line?(node) || !trailing.empty?
    return add_offense(node.location, safety: :manual, message: message)
  end

  source = rewriter.dedent(node.location.slice)
  add_offense(node.location, message: message) do |rw|
    rw.remove_line(node)
    rw.insert_into_body(context.class_node, source, position: :end)
  end
end