class ERBLint::Linters::ArgumentMappers::Base
Override attribute_to_args in a child class to customize its mapping behavior.
Provides the base interface to implement an ‘ArgumentMapper`.
def attribute_to_args(attribute); end
def attribute_to_args(attribute); end
def classes_to_args(classes)
-
(classes: Array, ...)-
def classes_to_args(classes) { classes: classes } end
def erb_helper
def erb_helper @erb_helper ||= Helpers::ErbBlock.new end
def initialize(tag)
def initialize(tag) @tag = tag end
def map_classes(classes_node)
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
def system_arguments_to_args(classes)
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
def to_args
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
def to_s
def to_s to_args.map { |k, v| "#{k}: #{v}" }.join(", ") end