mirror of
https://github.com/kemko/liquid.git
synced 2026-01-02 00:05:42 +03:00
Example:
```
// the_count.liquid
{{ number }}! Ah ah ah.
// my_template.liquid
{% for number in range (1..3) %}
{% render "the_count", number: number %}
{% endfor %}
Output:
1! Ah ah ah.
2! Ah ah ah.
3! Ah ah ah.
```
The `render` tag is a more strict version of the `include` tag. It is
designed to isolate itself from the parent rendering context both by
creating a new scope (which does not inherit the parent scope) and by
only inheriting "static" registers.
Static registers are those that do not hold mutable state which could
affect rendering. This again helps `render`ed templates remain entirely
separate from their calling context.
Unlike `include`, `render` does not permit specifying the target
template using a variable, only a string literal. For example, this
means that `{% render my_dynamic_template %}` is invalid syntax. This
will make it possible to statically analyze the dependencies between
templates without making Turing angry.
Note that the `static_environment` of a rendered template is inherited, unlike
the scope and regular environment. This environment is immutable from within the
template.
An alternate syntax, which mimics the `{% include ... for %}` tag is
currently in design discussion.
92 lines
2.3 KiB
Ruby
92 lines
2.3 KiB
Ruby
require 'test_helper'
|
|
|
|
class PartialCacheUnitTest < Minitest::Test
|
|
def test_uses_the_file_system_register_if_present
|
|
context = Liquid::Context.build(
|
|
registers: {
|
|
file_system: StubFileSystem.new('my_partial' => 'my partial body')
|
|
}
|
|
)
|
|
|
|
partial = Liquid::PartialCache.load(
|
|
'my_partial',
|
|
context: context,
|
|
parse_context: Liquid::ParseContext.new
|
|
)
|
|
|
|
assert_equal 'my partial body', partial.render
|
|
end
|
|
|
|
def test_reads_from_the_file_system_only_once_per_file
|
|
file_system = StubFileSystem.new('my_partial' => 'some partial body')
|
|
context = Liquid::Context.build(
|
|
registers: { file_system: file_system }
|
|
)
|
|
|
|
2.times do
|
|
Liquid::PartialCache.load(
|
|
'my_partial',
|
|
context: context,
|
|
parse_context: Liquid::ParseContext.new
|
|
)
|
|
end
|
|
|
|
assert_equal 1, file_system.file_read_count
|
|
end
|
|
|
|
def test_cache_state_is_stored_per_context
|
|
parse_context = Liquid::ParseContext.new
|
|
shared_file_system = StubFileSystem.new(
|
|
'my_partial' => 'my shared value'
|
|
)
|
|
context_one = Liquid::Context.build(
|
|
registers: {
|
|
file_system: shared_file_system
|
|
}
|
|
)
|
|
context_two = Liquid::Context.build(
|
|
registers: {
|
|
file_system: shared_file_system
|
|
}
|
|
)
|
|
|
|
2.times do
|
|
Liquid::PartialCache.load(
|
|
'my_partial',
|
|
context: context_one,
|
|
parse_context: parse_context
|
|
)
|
|
end
|
|
|
|
Liquid::PartialCache.load(
|
|
'my_partial',
|
|
context: context_two,
|
|
parse_context: parse_context
|
|
)
|
|
|
|
assert_equal 2, shared_file_system.file_read_count
|
|
end
|
|
|
|
def test_cache_is_not_broken_when_a_different_parse_context_is_used
|
|
file_system = StubFileSystem.new('my_partial' => 'some partial body')
|
|
context = Liquid::Context.build(
|
|
registers: { file_system: file_system }
|
|
)
|
|
|
|
Liquid::PartialCache.load(
|
|
'my_partial',
|
|
context: context,
|
|
parse_context: Liquid::ParseContext.new(my_key: 'value one')
|
|
)
|
|
Liquid::PartialCache.load(
|
|
'my_partial',
|
|
context: context,
|
|
parse_context: Liquid::ParseContext.new(my_key: 'value two')
|
|
)
|
|
|
|
# Technically what we care about is that the file was parsed twice,
|
|
# but measuring file reads is an OK proxy for this.
|
|
assert_equal 1, file_system.file_read_count
|
|
end
|
|
end
|