mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-12 23:40:45 -07:00
clean up all warnings by using new Environment
This commit is contained in:
@@ -68,7 +68,6 @@ require 'liquid/extensions'
|
|||||||
require 'liquid/errors'
|
require 'liquid/errors'
|
||||||
require 'liquid/interrupts'
|
require 'liquid/interrupts'
|
||||||
require 'liquid/strainer_template'
|
require 'liquid/strainer_template'
|
||||||
require 'liquid/strainer_factory'
|
|
||||||
require 'liquid/expression'
|
require 'liquid/expression'
|
||||||
require 'liquid/context'
|
require 'liquid/context'
|
||||||
require 'liquid/tag'
|
require 'liquid/tag'
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Liquid
|
|
||||||
# StrainerFactory is the factory for the filters system.
|
|
||||||
module StrainerFactory
|
|
||||||
extend self
|
|
||||||
|
|
||||||
def add_global_filter(filter, environment = Environment.default)
|
|
||||||
Deprecations.warn("StrainerFactory.add_global_filter", "Environment#register_filter")
|
|
||||||
environment.register_filter(filter)
|
|
||||||
end
|
|
||||||
|
|
||||||
def create(context, filters = Const::EMPTY_ARRAY, environment = Environment.default)
|
|
||||||
Deprecations.warn("StrainerFactory.create", "StrainerFactory.create_strainer")
|
|
||||||
environment.create_strainer(context, filters)
|
|
||||||
end
|
|
||||||
|
|
||||||
def global_filter_names(environment = Environment.default)
|
|
||||||
Deprecations.warn("StrainerFactory.global_filter_names", "Environment#filter_method_names")
|
|
||||||
Environment.strainer_template.filter_method_names
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -4,7 +4,8 @@ require 'benchmark/ips'
|
|||||||
require_relative 'theme_runner'
|
require_relative 'theme_runner'
|
||||||
|
|
||||||
RubyVM::YJIT.enable if defined?(RubyVM::YJIT)
|
RubyVM::YJIT.enable if defined?(RubyVM::YJIT)
|
||||||
Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first
|
Liquid::Environment.default.error_mode = ARGV.first.to_sym if ARGV.first
|
||||||
|
|
||||||
profiler = ThemeRunner.new
|
profiler = ThemeRunner.new
|
||||||
|
|
||||||
Benchmark.ips do |x|
|
Benchmark.ips do |x|
|
||||||
|
|||||||
@@ -11,11 +11,12 @@ require_relative 'shop_filter'
|
|||||||
require_relative 'tag_filter'
|
require_relative 'tag_filter'
|
||||||
require_relative 'weight_filter'
|
require_relative 'weight_filter'
|
||||||
|
|
||||||
Liquid::Template.register_tag('paginate', Paginate)
|
default_environment = Liquid::Environment.default
|
||||||
Liquid::Template.register_tag('form', CommentForm)
|
default_environment.register_tag('paginate', Paginate)
|
||||||
|
default_environment.register_tag('form', CommentForm)
|
||||||
|
|
||||||
Liquid::Template.register_filter(JsonFilter)
|
default_environment.register_filter(JsonFilter)
|
||||||
Liquid::Template.register_filter(MoneyFilter)
|
default_environment.register_filter(MoneyFilter)
|
||||||
Liquid::Template.register_filter(WeightFilter)
|
default_environment.register_filter(WeightFilter)
|
||||||
Liquid::Template.register_filter(ShopFilter)
|
default_environment.register_filter(ShopFilter)
|
||||||
Liquid::Template.register_filter(TagFilter)
|
default_environment.register_filter(TagFilter)
|
||||||
|
|||||||
@@ -203,20 +203,19 @@ class ErrorHandlingTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_setting_default_exception_renderer
|
def test_setting_default_exception_renderer
|
||||||
old_exception_renderer = Liquid::Template.default_exception_renderer
|
|
||||||
exceptions = []
|
exceptions = []
|
||||||
Liquid::Template.default_exception_renderer = ->(e) {
|
default_exception_renderer = ->(e) {
|
||||||
exceptions << e
|
exceptions << e
|
||||||
''
|
''
|
||||||
}
|
}
|
||||||
template = Liquid::Template.parse('This is a runtime error: {{ errors.argument_error }}')
|
|
||||||
|
env = Liquid::Environment.build(exception_renderer: default_exception_renderer)
|
||||||
|
template = Liquid::Template.parse('This is a runtime error: {{ errors.argument_error }}', environment: env)
|
||||||
|
|
||||||
output = template.render('errors' => ErrorDrop.new)
|
output = template.render('errors' => ErrorDrop.new)
|
||||||
|
|
||||||
assert_equal('This is a runtime error: ', output)
|
assert_equal('This is a runtime error: ', output)
|
||||||
assert_equal([Liquid::ArgumentError], template.errors.map(&:class))
|
assert_equal([Liquid::ArgumentError], template.errors.map(&:class))
|
||||||
ensure
|
|
||||||
Liquid::Template.default_exception_renderer = old_exception_renderer if old_exception_renderer
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_setting_exception_renderer_on_environment
|
def test_setting_exception_renderer_on_environment
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class ProfilerTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
Liquid::Template.file_system = ProfilingFileSystem.new
|
Liquid::Environment.default.file_system = ProfilingFileSystem.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_template_allows_flagging_profiling
|
def test_template_allows_flagging_profiling
|
||||||
|
|||||||
@@ -174,10 +174,10 @@ class IncludeTagTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Liquid::Template.file_system = infinite_file_system.new
|
env = Liquid::Environment.build(file_system: infinite_file_system.new)
|
||||||
|
|
||||||
assert_raises(Liquid::StackLevelError) do
|
assert_raises(Liquid::StackLevelError) do
|
||||||
Template.parse("{% include 'loop' %}").render!
|
Template.parse("{% include 'loop' %}", environment: env).render!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -264,26 +264,27 @@ class IncludeTagTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_does_not_add_error_in_strict_mode_for_missing_variable
|
def test_does_not_add_error_in_strict_mode_for_missing_variable
|
||||||
Liquid::Template.file_system = TestFileSystem.new
|
env = Liquid::Environment.build(file_system: TestFileSystem.new)
|
||||||
|
|
||||||
a = Liquid::Template.parse(' {% include "nested_template" %}')
|
a = Liquid::Template.parse(' {% include "nested_template" %}', environment: env)
|
||||||
a.render!
|
a.render!
|
||||||
assert_empty(a.errors)
|
assert_empty(a.errors)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_passing_options_to_included_templates
|
def test_passing_options_to_included_templates
|
||||||
Liquid::Template.file_system = TestFileSystem.new
|
env = Liquid::Environment.build(file_system: TestFileSystem.new)
|
||||||
|
|
||||||
assert_raises(Liquid::SyntaxError) do
|
assert_raises(Liquid::SyntaxError) do
|
||||||
Template.parse("{% include template %}", error_mode: :strict).render!("template" => '{{ "X" || downcase }}')
|
Template.parse("{% include template %}", error_mode: :strict, environment: env).render!("template" => '{{ "X" || downcase }}')
|
||||||
end
|
end
|
||||||
with_error_mode(:lax) do
|
with_error_mode(:lax) do
|
||||||
assert_equal('x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: true).render!("template" => '{{ "X" || downcase }}'))
|
assert_equal('x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: true, environment: env).render!("template" => '{{ "X" || downcase }}'))
|
||||||
end
|
end
|
||||||
assert_raises(Liquid::SyntaxError) do
|
assert_raises(Liquid::SyntaxError) do
|
||||||
Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:locale]).render!("template" => '{{ "X" || downcase }}')
|
Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:locale], environment: env).render!("template" => '{{ "X" || downcase }}')
|
||||||
end
|
end
|
||||||
with_error_mode(:lax) do
|
with_error_mode(:lax) do
|
||||||
assert_equal('x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:error_mode]).render!("template" => '{{ "X" || downcase }}'))
|
assert_equal('x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:error_mode], environment: env).render!("template" => '{{ "X" || downcase }}'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -334,8 +335,11 @@ class IncludeTagTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_including_with_strict_variables
|
def test_including_with_strict_variables
|
||||||
Liquid::Template.file_system = StubFileSystem.new({ "simple" => "simple" })
|
env = Liquid::Environment.build(
|
||||||
template = Liquid::Template.parse("{% include 'simple' %}", error_mode: :warn)
|
file_system: StubFileSystem.new('simple' => 'simple'),
|
||||||
|
)
|
||||||
|
|
||||||
|
template = Liquid::Template.parse("{% include 'simple' %}", error_mode: :warn, environment: env)
|
||||||
template.render(nil, strict_variables: true)
|
template.render(nil, strict_variables: true)
|
||||||
|
|
||||||
assert_equal([], template.errors)
|
assert_equal([], template.errors)
|
||||||
|
|||||||
@@ -82,19 +82,22 @@ class RenderTagTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_recursively_rendered_template_does_not_produce_endless_loop
|
def test_recursively_rendered_template_does_not_produce_endless_loop
|
||||||
Liquid::Template.file_system = StubFileSystem.new('loop' => '{% render "loop" %}')
|
env = Liquid::Environment.build(
|
||||||
|
file_system: StubFileSystem.new('loop' => '{% render "loop" %}'),
|
||||||
|
)
|
||||||
|
|
||||||
assert_raises(Liquid::StackLevelError) do
|
assert_raises(Liquid::StackLevelError) do
|
||||||
Template.parse('{% render "loop" %}').render!
|
Template.parse('{% render "loop" %}', environment: env).render!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_sub_contexts_count_towards_the_same_recursion_limit
|
def test_sub_contexts_count_towards_the_same_recursion_limit
|
||||||
Liquid::Template.file_system = StubFileSystem.new(
|
env = Liquid::Environment.build(
|
||||||
'loop_render' => '{% render "loop_render" %}',
|
file_system: StubFileSystem.new('loop_render' => '{% render "loop_render" %}'),
|
||||||
)
|
)
|
||||||
|
|
||||||
assert_raises(Liquid::StackLevelError) do
|
assert_raises(Liquid::StackLevelError) do
|
||||||
Template.parse('{% render "loop_render" %}').render!
|
Template.parse('{% render "loop_render" %}', environment: env).render!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -13,7 +13,7 @@ if (env_mode = ENV['LIQUID_PARSER_MODE'])
|
|||||||
puts "-- #{env_mode.upcase} ERROR MODE"
|
puts "-- #{env_mode.upcase} ERROR MODE"
|
||||||
mode = env_mode.to_sym
|
mode = env_mode.to_sym
|
||||||
end
|
end
|
||||||
Liquid::Template.error_mode = mode
|
Liquid::Environment.default.error_mode = mode
|
||||||
|
|
||||||
if ENV['LIQUID_C'] == '1'
|
if ENV['LIQUID_C'] == '1'
|
||||||
puts "-- LIQUID C"
|
puts "-- LIQUID C"
|
||||||
@@ -88,11 +88,11 @@ module Minitest
|
|||||||
end
|
end
|
||||||
|
|
||||||
def with_error_mode(mode)
|
def with_error_mode(mode)
|
||||||
old_mode = Liquid::Template.error_mode
|
old_mode = Liquid::Environment.default.error_mode
|
||||||
Liquid::Template.error_mode = mode
|
Liquid::Environment.default.error_mode = mode
|
||||||
yield
|
yield
|
||||||
ensure
|
ensure
|
||||||
Liquid::Template.error_mode = old_mode
|
Liquid::Environment.default.error_mode = old_mode
|
||||||
end
|
end
|
||||||
|
|
||||||
def with_custom_tag(tag_name, tag_class, &block)
|
def with_custom_tag(tag_name, tag_class, &block)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
class StrainerFactoryUnitTest < Minitest::Test
|
class EnvironmentFilterTest < Minitest::Test
|
||||||
include Liquid
|
include Liquid
|
||||||
|
|
||||||
module AccessScopeFilters
|
module AccessScopeFilters
|
||||||
@@ -16,8 +16,6 @@ class StrainerFactoryUnitTest < Minitest::Test
|
|||||||
private :private_filter
|
private :private_filter
|
||||||
end
|
end
|
||||||
|
|
||||||
StrainerFactory.add_global_filter(AccessScopeFilters)
|
|
||||||
|
|
||||||
module LateAddedFilter
|
module LateAddedFilter
|
||||||
def late_added_filter(_input)
|
def late_added_filter(_input)
|
||||||
"filtered"
|
"filtered"
|
||||||
@@ -25,24 +23,28 @@ class StrainerFactoryUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@context = Context.build
|
@environment = Liquid::Environment.build do |env|
|
||||||
|
env.register_filter(AccessScopeFilters)
|
||||||
|
end
|
||||||
|
|
||||||
|
@context = Context.build(environment: @environment)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_strainer
|
def test_strainer
|
||||||
strainer = StrainerFactory.create(@context)
|
strainer = @environment.create_strainer(@context)
|
||||||
assert_equal(5, strainer.invoke('size', 'input'))
|
assert_equal(5, strainer.invoke('size', 'input'))
|
||||||
assert_equal("public", strainer.invoke("public_filter"))
|
assert_equal("public", strainer.invoke("public_filter"))
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_stainer_raises_argument_error
|
def test_stainer_raises_argument_error
|
||||||
strainer = StrainerFactory.create(@context)
|
strainer = @environment.create_strainer(@context)
|
||||||
assert_raises(Liquid::ArgumentError) do
|
assert_raises(Liquid::ArgumentError) do
|
||||||
strainer.invoke("public_filter", 1)
|
strainer.invoke("public_filter", 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_stainer_argument_error_contains_backtrace
|
def test_stainer_argument_error_contains_backtrace
|
||||||
strainer = StrainerFactory.create(@context)
|
strainer = @environment.create_strainer(@context)
|
||||||
|
|
||||||
exception = assert_raises(Liquid::ArgumentError) do
|
exception = assert_raises(Liquid::ArgumentError) do
|
||||||
strainer.invoke("public_filter", 1)
|
strainer.invoke("public_filter", 1)
|
||||||
@@ -57,7 +59,7 @@ class StrainerFactoryUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_strainer_only_invokes_public_filter_methods
|
def test_strainer_only_invokes_public_filter_methods
|
||||||
strainer = StrainerFactory.create(@context)
|
strainer = @environment.create_strainer(@context)
|
||||||
assert_equal(false, strainer.class.invokable?('__test__'))
|
assert_equal(false, strainer.class.invokable?('__test__'))
|
||||||
assert_equal(false, strainer.class.invokable?('test'))
|
assert_equal(false, strainer.class.invokable?('test'))
|
||||||
assert_equal(false, strainer.class.invokable?('instance_eval'))
|
assert_equal(false, strainer.class.invokable?('instance_eval'))
|
||||||
@@ -66,18 +68,18 @@ class StrainerFactoryUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_strainer_returns_nil_if_no_filter_method_found
|
def test_strainer_returns_nil_if_no_filter_method_found
|
||||||
strainer = StrainerFactory.create(@context)
|
strainer = @environment.create_strainer(@context)
|
||||||
assert_nil(strainer.invoke("private_filter"))
|
assert_nil(strainer.invoke("private_filter"))
|
||||||
assert_nil(strainer.invoke("undef_the_filter"))
|
assert_nil(strainer.invoke("undef_the_filter"))
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_strainer_returns_first_argument_if_no_method_and_arguments_given
|
def test_strainer_returns_first_argument_if_no_method_and_arguments_given
|
||||||
strainer = StrainerFactory.create(@context)
|
strainer = @environment.create_strainer(@context)
|
||||||
assert_equal("password", strainer.invoke("undef_the_method", "password"))
|
assert_equal("password", strainer.invoke("undef_the_method", "password"))
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_strainer_only_allows_methods_defined_in_filters
|
def test_strainer_only_allows_methods_defined_in_filters
|
||||||
strainer = StrainerFactory.create(@context)
|
strainer = @environment.create_strainer(@context)
|
||||||
assert_equal("1 + 1", strainer.invoke("instance_eval", "1 + 1"))
|
assert_equal("1 + 1", strainer.invoke("instance_eval", "1 + 1"))
|
||||||
assert_equal("puts", strainer.invoke("__send__", "puts", "Hi Mom"))
|
assert_equal("puts", strainer.invoke("__send__", "puts", "Hi Mom"))
|
||||||
assert_equal("has_method?", strainer.invoke("invoke", "has_method?", "invoke"))
|
assert_equal("has_method?", strainer.invoke("invoke", "has_method?", "invoke"))
|
||||||
@@ -86,7 +88,9 @@ class StrainerFactoryUnitTest < Minitest::Test
|
|||||||
def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
|
def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
|
||||||
a = Module.new
|
a = Module.new
|
||||||
b = Module.new
|
b = Module.new
|
||||||
strainer = StrainerFactory.create(@context, [a, b])
|
|
||||||
|
strainer = @environment.create_strainer(@context, [a, b])
|
||||||
|
|
||||||
assert_kind_of(StrainerTemplate, strainer)
|
assert_kind_of(StrainerTemplate, strainer)
|
||||||
assert_kind_of(a, strainer)
|
assert_kind_of(a, strainer)
|
||||||
assert_kind_of(b, strainer)
|
assert_kind_of(b, strainer)
|
||||||
@@ -94,8 +98,10 @@ class StrainerFactoryUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_add_global_filter_clears_cache
|
def test_add_global_filter_clears_cache
|
||||||
assert_equal('input', StrainerFactory.create(@context).invoke('late_added_filter', 'input'))
|
assert_equal('input', @environment.create_strainer(@context).invoke('late_added_filter', 'input'))
|
||||||
StrainerFactory.add_global_filter(LateAddedFilter)
|
|
||||||
assert_equal('filtered', StrainerFactory.create(nil).invoke('late_added_filter', 'input'))
|
@environment.register_filter(LateAddedFilter)
|
||||||
|
|
||||||
|
assert_equal('filtered', @environment.create_strainer(nil).invoke('late_added_filter', 'input'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -25,11 +25,13 @@ class StrainerTemplateUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_add_filter_raises_when_module_privately_overrides_registered_public_methods
|
def test_add_filter_raises_when_module_privately_overrides_registered_public_methods
|
||||||
strainer = Context.new.strainer
|
|
||||||
|
|
||||||
error = assert_raises(Liquid::MethodOverrideError) do
|
error = assert_raises(Liquid::MethodOverrideError) do
|
||||||
strainer.class.add_filter(PrivateMethodOverrideFilter)
|
Liquid::Environment.build do |env|
|
||||||
|
env.register_filter(PublicMethodOverrideFilter)
|
||||||
|
env.register_filter(PrivateMethodOverrideFilter)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
assert_equal('Liquid error: Filter overrides registered public methods as non public: public_filter', error.message)
|
assert_equal('Liquid error: Filter overrides registered public methods as non public: public_filter', error.message)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -42,11 +44,13 @@ class StrainerTemplateUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_add_filter_raises_when_module_overrides_registered_public_method_as_protected
|
def test_add_filter_raises_when_module_overrides_registered_public_method_as_protected
|
||||||
strainer = Context.new.strainer
|
|
||||||
|
|
||||||
error = assert_raises(Liquid::MethodOverrideError) do
|
error = assert_raises(Liquid::MethodOverrideError) do
|
||||||
strainer.class.add_filter(ProtectedMethodOverrideFilter)
|
Liquid::Environment.build do |env|
|
||||||
|
env.register_filter(PublicMethodOverrideFilter)
|
||||||
|
env.register_filter(ProtectedMethodOverrideFilter)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
assert_equal('Liquid error: Filter overrides registered public methods as non public: public_filter', error.message)
|
assert_equal('Liquid error: Filter overrides registered public methods as non public: public_filter', error.message)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user