diff --git a/Gemfile b/Gemfile index add47963..4b68a939 100644 --- a/Gemfile +++ b/Gemfile @@ -33,6 +33,6 @@ end group :spec do # Using feature branch until https://github.com/Shopify/liquid-spec/pull/97 is merged - gem 'liquid-spec', github: 'Shopify/liquid-spec', branch: 'add-per-spec-required-features' + gem 'liquid-spec', github: 'Shopify/liquid-spec', branch: 'main' gem 'activesupport', require: false end diff --git a/Rakefile b/Rakefile index 83afcbfa..650923bf 100755 --- a/Rakefile +++ b/Rakefile @@ -148,3 +148,9 @@ end task :console do exec 'irb -I lib -r liquid' end + +desc('run liquid-spec suite across all adapters') +task :spec do + adapters = Dir['./spec/*.rb'].join(',') + sh "bundle exec liquid-spec matrix --adapters=#{adapters} --reference=ruby_liquid" +end diff --git a/lib/liquid/condition.rb b/lib/liquid/condition.rb index eb674ced..9d55c42b 100644 --- a/lib/liquid/condition.rb +++ b/lib/liquid/condition.rb @@ -126,22 +126,26 @@ module Liquid def call_method_literal(literal, value) method_name = literal.method_name - # If the object responds to the method, use it + # If the object responds to the method (e.g., ActiveSupport is loaded), use it if value.respond_to?(method_name) - return value.send(method_name) - end - - # Implement blank?/empty? for common types that don't have it - # (ActiveSupport adds these, but Liquid should work without it) - case method_name - when :blank? - liquid_blank?(value) - when :empty? - liquid_empty?(value) + value.send(method_name) + else + # Emulate ActiveSupport's blank?/empty? to make Liquid invariant + # to whether ActiveSupport is loaded or not + case method_name + when :blank? + liquid_blank?(value) + when :empty? + liquid_empty?(value) + else + false + end end end # Implement blank? semantics matching ActiveSupport + # blank? returns true for nil, false, empty strings, whitespace-only strings, + # empty arrays, and empty hashes def liquid_blank?(value) case value when NilClass, FalseClass @@ -149,7 +153,7 @@ module Liquid when TrueClass, Numeric false when String - # Blank if empty or whitespace only + # Blank if empty or whitespace only (matches ActiveSupport) value.empty? || value.match?(/\A\s*\z/) when Array, Hash value.empty? @@ -160,7 +164,7 @@ module Liquid end # Implement empty? semantics - # Note: nil is NOT empty (but IS blank). empty? checks if a collection has zero elements. + # Note: nil is NOT empty. empty? checks if a collection has zero elements. def liquid_empty?(value) case value when String, Array, Hash diff --git a/spec/ruby_liquid.rb b/spec/ruby_liquid.rb index 5eda72da..062e635f 100644 --- a/spec/ruby_liquid.rb +++ b/spec/ruby_liquid.rb @@ -13,15 +13,16 @@ LiquidSpec.configure do |config| end # Compile a template string into a Liquid::Template -LiquidSpec.compile do |source, options| +LiquidSpec.compile do |ctx, source, options| Liquid::Template.parse(source, **options) end # Render a compiled template with the given context +# @param ctx [Hash] adapter context (unused) # @param template [Liquid::Template] compiled template # @param assigns [Hash] environment variables # @param options [Hash] :registers, :strict_errors, :exception_renderer -LiquidSpec.render do |template, assigns, options| +LiquidSpec.render do |ctx, template, assigns, options| registers = Liquid::Registers.new(options[:registers] || {}) context = Liquid::Context.build( diff --git a/spec/ruby_liquid_with_active_support.rb b/spec/ruby_liquid_with_active_support.rb index 4a6f0057..ab1ada37 100644 --- a/spec/ruby_liquid_with_active_support.rb +++ b/spec/ruby_liquid_with_active_support.rb @@ -14,15 +14,16 @@ LiquidSpec.configure do |config| end # Compile a template string into a Liquid::Template -LiquidSpec.compile do |source, options| +LiquidSpec.compile do |ctx, source, options| Liquid::Template.parse(source, **options) end # Render a compiled template with the given context +# @param ctx [Hash] adapter context (unused) # @param template [Liquid::Template] compiled template # @param assigns [Hash] environment variables # @param options [Hash] :registers, :strict_errors, :exception_renderer -LiquidSpec.render do |template, assigns, options| +LiquidSpec.render do |ctx, template, assigns, options| registers = Liquid::Registers.new(options[:registers] || {}) context = Liquid::Context.build(