Class: RuboCop::Cop::Primer::PrimerOcticon

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/primer/primer_octicon.rb

Overview

This cop ensures that components use System Arguments instead of CSS classes.

bad octicon(:icon) octicon(“icon”) octicon(“icon-with-daashes”) octicon(@ivar) octicon(condition > “icon” : “other-icon”)

good primer_octicon(:icon) primer_octicon(:“icon-with-daashes”) primer_octicon(@ivar) primer_octicon(condition > “icon” : “other-icon”)

Constant Summary collapse

INVALID_MESSAGE =
"Replace the octicon helper with primer_octicon. See https://primer.style/view-components/components/octicon for details.\n"
SIZE_ATTRIBUTES =
%w[height width size].freeze
STRING_ATTRIBUTES =
%w[aria- data-].freeze
REST_ATTRIBUTES =
%w[title].freeze
VALID_ATTRIBUTES =
[*SIZE_ATTRIBUTES, *STRING_ATTRIBUTES, *REST_ATTRIBUTES, "class"].freeze
STRING_ATTRIBUTE_REGEX =
Regexp.union(STRING_ATTRIBUTES).freeze
ATTRIBUTE_REGEX =
Regexp.union(VALID_ATTRIBUTES).freeze
INVALID_ATTRIBUTE =
-1

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/rubocop/cop/primer/primer_octicon.rb', line 40

def on_send(node)
  return unless node.method_name == :octicon
  return unless node.arguments?

  kwargs = kwargs(node)

  return unless kwargs.type == :hash

  attributes = kwargs.keys.map(&:value)

  # Don't convert unknown attributes
  return unless attributes.all? { |attribute| attribute.match?(ATTRIBUTE_REGEX) }
  # Can't convert size
  return if octicon_size_attributes(kwargs) == INVALID_ATTRIBUTE

  # find class pair
  classes = classes(kwargs)

  return if classes == INVALID_ATTRIBUTE

  # check if classes are convertible
  if classes.present?
    system_arguments = ::Primer::Classify::Utilities.classes_to_hash(classes)
    invalid_classes = (system_arguments[:classes]&.split(" ") || []).select { |class_name| ::Primer::Classify::Validation.invalid?(class_name) }

    # Uses system argument that can't be converted
    return if invalid_classes.present?
  end

  add_offense(node, message: INVALID_MESSAGE) do |corrector|
    kwargs = kwargs(node)

    # Converting arguments for the component
    classes = classes(kwargs)
    size_attributes = transform_sizes(kwargs)
    rest_attributes = rest_args(kwargs)

    args = arguments_as_string(node, size_attributes, rest_attributes, classes)
    if node.dot?
      corrector.replace(node.loc.expression, "#{node.receiver.source}.primer_octicon(#{args})")
    else
      corrector.replace(node.loc.expression, "primer_octicon(#{args})")
    end
  end
end