summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/liquid-4.0.4/lib/liquid/strainer.rb
diff options
context:
space:
mode:
authorBenjamin Sanders <ben@Benjamins-MacBook-Pro.local>2025-10-11 10:34:24 -0400
committerBenjamin Sanders <ben@Benjamins-MacBook-Pro.local>2025-10-11 10:34:24 -0400
commit5571dc766e2143e39762ff0b47c41d1c2e154f4c (patch)
treef4f124d314a7e76c04484515aa0fd1f2e271a601 /vendor/bundle/ruby/3.4.0/gems/liquid-4.0.4/lib/liquid/strainer.rb
parent359f3309c97fc894b63e0a295c76ab298504d635 (diff)
Vendor bundled gems for deployment
Diffstat (limited to 'vendor/bundle/ruby/3.4.0/gems/liquid-4.0.4/lib/liquid/strainer.rb')
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/liquid-4.0.4/lib/liquid/strainer.rb66
1 files changed, 66 insertions, 0 deletions
diff --git a/vendor/bundle/ruby/3.4.0/gems/liquid-4.0.4/lib/liquid/strainer.rb b/vendor/bundle/ruby/3.4.0/gems/liquid-4.0.4/lib/liquid/strainer.rb
new file mode 100644
index 0000000..76d56d2
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/liquid-4.0.4/lib/liquid/strainer.rb
@@ -0,0 +1,66 @@
+require 'set'
+
+module Liquid
+ # Strainer is the parent class for the filters system.
+ # New filters are mixed into the strainer class which is then instantiated for each liquid template render run.
+ #
+ # The Strainer only allows method calls defined in filters given to it via Strainer.global_filter,
+ # Context#add_filters or Template.register_filter
+ class Strainer #:nodoc:
+ @@global_strainer = Class.new(Strainer) do
+ @filter_methods = Set.new
+ end
+ @@strainer_class_cache = Hash.new do |hash, filters|
+ hash[filters] = Class.new(@@global_strainer) do
+ @filter_methods = @@global_strainer.filter_methods.dup
+ filters.each { |f| add_filter(f) }
+ end
+ end
+
+ def initialize(context)
+ @context = context
+ end
+
+ class << self
+ attr_reader :filter_methods
+ end
+
+ def self.add_filter(filter)
+ raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module)
+ unless self.include?(filter)
+ invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) }
+ if invokable_non_public_methods.any?
+ raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}"
+ else
+ send(:include, filter)
+ @filter_methods.merge(filter.public_instance_methods.map(&:to_s))
+ end
+ end
+ end
+
+ def self.global_filter(filter)
+ @@strainer_class_cache.clear
+ @@global_strainer.add_filter(filter)
+ end
+
+ def self.invokable?(method)
+ @filter_methods.include?(method.to_s)
+ end
+
+ def self.create(context, filters = [])
+ @@strainer_class_cache[filters].new(context)
+ end
+
+ def invoke(method, *args)
+ if self.class.invokable?(method)
+ send(method, *args)
+ elsif @context && @context.strict_filters
+ raise Liquid::UndefinedFilter, "undefined filter #{method}"
+ else
+ args.first
+ end
+ rescue ::ArgumentError => e
+ raise Liquid::ArgumentError, e.message, e.backtrace
+ end
+ end
+end