liquid_interpolatable.rb 2.2KB

    module LiquidInterpolatable extend ActiveSupport::Concern included do validate :validate_interpolation end def valid?(context = nil) super rescue Liquid::Error errors.empty? end def validate_interpolation interpolated rescue Liquid::Error => e errors.add(:options, "has an error with Liquid templating: #{e.message}") false end def interpolate_options(options, event = {}) case options when String interpolate_string(options, event) when ActiveSupport::HashWithIndifferentAccess, Hash options.inject(ActiveSupport::HashWithIndifferentAccess.new) { |memo, (key, value)| memo[key] = interpolate_options(value, event); memo } when Array options.map { |value| interpolate_options(value, event) } else options end end def interpolated(event = {}) key = [options, event] @interpolated_cache ||= {} @interpolated_cache[key] ||= interpolate_options(options, event) @interpolated_cache[key] end def interpolate_string(string, event) Liquid::Template.parse(string).render!(event.to_liquid, registers: {agent: self}) end require 'uri' module Filters # Percent encoding for URI conforming to RFC 3986. # Ref: http://tools.ietf.org/html/rfc3986#page-12 def uri_escape(string) CGI.escape(string) rescue string end # Escape a string for use in XPath expression def to_xpath(string) subs = string.to_s.scan(/\G(?:\A\z|[^"]+|[^']+)/).map { |x| case x when /"/ %Q{'#{x}'} else %Q{"#{x}"} end } if subs.size == 1 subs.first else 'concat(' << subs.join(', ') << ')' end end end Liquid::Template.register_filter(LiquidInterpolatable::Filters) module Tags class Credential < Liquid::Tag def initialize(tag_name, name, tokens) super @credential_name = name.strip end def render(context) credential = context.registers[:agent].credential(@credential_name) raise "No user credential named '#{@credential_name}' defined" if credential.nil? credential end end end Liquid::Template.register_tag('credential', LiquidInterpolatable::Tags::Credential) end