class ERBLint::Linters::ArgumentMappers::Base

Provides the base interface to implement an `ArgumentMapper`. Override attribute_to_args in a child class to customize its mapping behavior.

Constants

ATTRIBUTES
DEFAULT_TAG

Public Class Methods

new(tag) click to toggle source
# File lib/primer/view_components/linters/argument_mappers/base.rb, line 19
def initialize(tag)
  @tag = tag
end

Public Instance Methods

attribute_to_args(attribute) click to toggle source
# File lib/primer/view_components/linters/argument_mappers/base.rb, line 48
def attribute_to_args(attribute); end
classes_to_args(classes) click to toggle source

Override this with your component's mappings, it should return a hash with the component's arguments, including a `classes` key that will contain all classes that the mapper couldn't handle. @returns { classes: Array, … }

# File lib/primer/view_components/linters/argument_mappers/base.rb, line 79
def classes_to_args(classes)
  { classes: classes }
end
map_classes(classes_node) click to toggle source
# File lib/primer/view_components/linters/argument_mappers/base.rb, line 50
def map_classes(classes_node)
  erb_helper.raise_if_erb_block(classes_node)

  system_arguments = system_arguments_to_args(classes_node.value)
  args = classes_to_args(system_arguments[:classes]&.split || [])

  invalid_classes = args[:classes].select { |class_name| Primer::Classify::Validation.invalid?(class_name) }

  raise ConversionError, "Cannot convert #{'class'.pluralize(invalid_classes.size)} #{invalid_classes.join(',')}" if invalid_classes.present?

  # Using splat to order the arguments in Component's args -> System Args -> custom classes
  res = {
    **args.except(:classes),
    **system_arguments.except(:classes)
  }

  if args[:classes].present?
    res = {
      **res,
      classes: args[:classes].join(" ").to_json
    }
  end

  res
end
system_arguments_to_args(classes) click to toggle source
# File lib/primer/view_components/linters/argument_mappers/base.rb, line 83
def system_arguments_to_args(classes)
  system_arguments = Primer::Classify::Utilities.classes_to_hash(classes)

  # need to transform symbols to strings with leading `:`
  system_arguments.transform_values do |v|
    v.is_a?(Symbol) ? ":#{v}" : v
  end
end
to_args() click to toggle source
# File lib/primer/view_components/linters/argument_mappers/base.rb, line 27
def to_args
  args = {}

  args[:tag] = ":#{@tag.name}" unless self.class::DEFAULT_TAG.nil? || @tag.name == self.class::DEFAULT_TAG

  @tag.attributes.each do |attribute|
    attr_name = attribute.name

    if self.class::ATTRIBUTES.include?(attr_name)
      args.merge!(attribute_to_args(attribute))
    elsif attr_name == "class"
      args.merge!(map_classes(attribute))
    else
      # Assume the attribute is a system argument.
      args.merge!(SystemArguments.new(attribute).to_args)
    end
  end

  args
end
to_s() click to toggle source
# File lib/primer/view_components/linters/argument_mappers/base.rb, line 23
def to_s
  to_args.map { |k, v| "#{k}: #{v}" }.join(", ")
end

Private Instance Methods

erb_helper() click to toggle source
# File lib/primer/view_components/linters/argument_mappers/base.rb, line 94
def erb_helper
  @erb_helper ||= Helpers::ErbBlock.new
end