class ERBLint::Linters::ArgumentMappers::Helpers::ErbBlock
provides helpers to identify and deal with ERB blocks.
def any?(attribute)
def any?(attribute) erb_blocks(attribute).any? end
def basic?(attribute)
def basic?(attribute) return false if erb_blocks(attribute).size != 1 attribute.value.match?(INTERPOLATION_REGEX) end
def convert(attribute)
def convert(attribute) raise_error(attribute) unless interpolation?(attribute) if any?(attribute) convert_interpolation(attribute) else attribute.value.to_json end end
def convert_interpolation(attribute)
def convert_interpolation(attribute) if basic?(attribute) m = attribute.value.match(INTERPOLATION_REGEX) return m[:rb].strip end # we use `source` instead of `value` because it does not convert encoded HTML entities. attribute.value_node.loc.source.gsub("<%=", '#{').gsub("%>", "}") end
def erb_blocks(attribute)
def erb_blocks(attribute) (attribute.value_node&.children || []).select { |n| n.try(:type) == :erb } end
def interpolation?(attribute)
def interpolation?(attribute) erb_blocks(attribute).all? do |erb| # If the blocks does not have an indicator, it's not an interpolation. erb.children.to_a.compact.any? { |node| node.type == :indicator } end end
def raise_error(attribute)
def raise_error(attribute) raise ERBLint::Linters::ArgumentMappers::ConversionError, "Cannot convert attribute \"#{attribute.name}\" because its value contains an erb block" end
def raise_if_erb_block(attribute)
def raise_if_erb_block(attribute) raise_error(attribute) if any?(attribute) end