diff --git a/.ruby-version b/.ruby-version index 47b322c97..4d54daddb 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.4.1 +4.0.2 diff --git a/Rakefile b/Rakefile index 650923bf8..e14d49aa6 100755 --- a/Rakefile +++ b/Rakefile @@ -151,6 +151,8 @@ 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" + Dir['./spec/*.rb'].sort.each do |adapter| + puts "=== Running #{adapter} ===" + sh 'bundle', 'exec', 'liquid-spec', 'run', adapter, '--no-max-failures' + end end diff --git a/spec/ruby_liquid.rb b/spec/ruby_liquid.rb index 628fbbfe3..c78049776 100644 --- a/spec/ruby_liquid.rb +++ b/spec/ruby_liquid.rb @@ -6,14 +6,24 @@ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__)) require 'liquid' +require_relative 'support/liquid_spec_adapter_helper' LiquidSpec.configure do |config| - # Run core Liquid specs - config.features = [:core] + config.missing_features = [ + :activesupport, + :lax_parsing, + :shopify_filters, + :shopify_includes, + :shopify_blank, + :shopify_error_handling, + :shopify_error_format, + :shopify_string_access, + ] end # Compile a template string into a Liquid::Template LiquidSpec.compile do |ctx, source, options| + options[:error_mode] ||= :strict ctx[:template] = Liquid::Template.parse(source, **options) end @@ -28,9 +38,12 @@ static_environments: assigns, registers: registers, rethrow_errors: options[:strict_errors], + resource_limits: LiquidSpecAdapterHelper.resource_limits(options), ) context.exception_renderer = options[:exception_renderer] if options[:exception_renderer] - ctx[:template].render(context) + LiquidSpecAdapterHelper.with_frozen_time do + ctx[:template].render(context) + end end diff --git a/spec/ruby_liquid_lax.rb b/spec/ruby_liquid_lax.rb index 4681ad415..42cf9a9a3 100644 --- a/spec/ruby_liquid_lax.rb +++ b/spec/ruby_liquid_lax.rb @@ -6,15 +6,24 @@ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__)) require 'liquid' +require_relative 'support/liquid_spec_adapter_helper' LiquidSpec.configure do |config| - config.features = [:core, :lax_parsing] + config.missing_features = [ + :activesupport, + :shopify_filters, + :shopify_includes, + :shopify_blank, + :shopify_error_handling, + :shopify_error_format, + :shopify_string_access, + ] end # Compile a template string into a Liquid::Template LiquidSpec.compile do |ctx, source, options| - # Force lax mode - options = options.merge(error_mode: :lax) + # Default to lax mode while still honoring specs that explicitly set error_mode. + options = { error_mode: :lax }.merge(options) ctx[:template] = Liquid::Template.parse(source, **options) end @@ -26,9 +35,12 @@ static_environments: assigns, registers: registers, rethrow_errors: options[:strict_errors], + resource_limits: LiquidSpecAdapterHelper.resource_limits(options), ) context.exception_renderer = options[:exception_renderer] if options[:exception_renderer] - ctx[:template].render(context) + LiquidSpecAdapterHelper.with_frozen_time do + ctx[:template].render(context) + end end diff --git a/spec/ruby_liquid_with_active_support.rb b/spec/ruby_liquid_with_active_support.rb index d8b05f76c..25e02b3f3 100644 --- a/spec/ruby_liquid_with_active_support.rb +++ b/spec/ruby_liquid_with_active_support.rb @@ -7,14 +7,23 @@ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__)) require 'active_support/all' require 'liquid' +require_relative 'support/liquid_spec_adapter_helper' LiquidSpec.configure do |config| - # Run core Liquid specs plus ActiveSupport SafeBuffer tests - config.features = [:core, :activesupport] + config.missing_features = [ + :lax_parsing, + :shopify_filters, + :shopify_includes, + :shopify_blank, + :shopify_error_handling, + :shopify_error_format, + :shopify_string_access, + ] end # Compile a template string into a Liquid::Template LiquidSpec.compile do |ctx, source, options| + options[:error_mode] ||= :strict ctx[:template] = Liquid::Template.parse(source, **options) end @@ -29,9 +38,12 @@ static_environments: assigns, registers: registers, rethrow_errors: options[:strict_errors], + resource_limits: LiquidSpecAdapterHelper.resource_limits(options), ) context.exception_renderer = options[:exception_renderer] if options[:exception_renderer] - ctx[:template].render(context) + LiquidSpecAdapterHelper.with_frozen_time do + ctx[:template].render(context) + end end diff --git a/spec/ruby_liquid_yjit.rb b/spec/ruby_liquid_yjit.rb index 3ff51d1fd..f43f5ac70 100644 --- a/spec/ruby_liquid_yjit.rb +++ b/spec/ruby_liquid_yjit.rb @@ -13,9 +13,18 @@ require 'active_support/all' require 'liquid' +require_relative 'support/liquid_spec_adapter_helper' LiquidSpec.configure do |config| - config.features = [:core, :activesupport] + config.missing_features = [ + :lax_parsing, + :shopify_filters, + :shopify_includes, + :shopify_blank, + :shopify_error_handling, + :shopify_error_format, + :shopify_string_access, + ] end # Compile a template string into a Liquid::Template @@ -33,9 +42,12 @@ static_environments: assigns, registers: registers, rethrow_errors: options[:strict_errors], + resource_limits: LiquidSpecAdapterHelper.resource_limits(options), ) context.exception_renderer = options[:exception_renderer] if options[:exception_renderer] - ctx[:template].render(context) + LiquidSpecAdapterHelper.with_frozen_time do + ctx[:template].render(context) + end end diff --git a/spec/support/liquid_spec_adapter_helper.rb b/spec/support/liquid_spec_adapter_helper.rb new file mode 100644 index 000000000..a572bbde9 --- /dev/null +++ b/spec/support/liquid_spec_adapter_helper.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module LiquidSpecAdapterHelper + extend self + + def resource_limits(render_options) + return unless render_options[:resource_limits] + + Liquid::ResourceLimits.new({}).tap do |limits| + render_options[:resource_limits].each do |key, value| + limits.public_send(:"#{key}=", value) + end + end + end + + def with_frozen_time(&block) + original_tz = ENV['TZ'] + ENV['TZ'] = 'UTC' + + Liquid::Spec::TimeFreezer.freeze(Liquid::Spec::AdapterRunner::TEST_TIME, &block) + ensure + ENV['TZ'] = original_tz + end +end