liquid 2.6.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +46 -13
  3. data/README.md +27 -2
  4. data/lib/liquid/block.rb +85 -51
  5. data/lib/liquid/block_body.rb +123 -0
  6. data/lib/liquid/condition.rb +26 -15
  7. data/lib/liquid/context.rb +106 -140
  8. data/lib/liquid/document.rb +3 -3
  9. data/lib/liquid/drop.rb +17 -1
  10. data/lib/liquid/errors.rb +50 -2
  11. data/lib/liquid/expression.rb +33 -0
  12. data/lib/liquid/file_system.rb +17 -6
  13. data/lib/liquid/i18n.rb +39 -0
  14. data/lib/liquid/interrupts.rb +1 -1
  15. data/lib/liquid/lexer.rb +51 -0
  16. data/lib/liquid/locales/en.yml +22 -0
  17. data/lib/liquid/parser.rb +90 -0
  18. data/lib/liquid/parser_switching.rb +31 -0
  19. data/lib/liquid/profiler/hooks.rb +23 -0
  20. data/lib/liquid/profiler.rb +159 -0
  21. data/lib/liquid/range_lookup.rb +22 -0
  22. data/lib/liquid/standardfilters.rb +143 -55
  23. data/lib/liquid/strainer.rb +14 -4
  24. data/lib/liquid/tag.rb +25 -9
  25. data/lib/liquid/tags/assign.rb +12 -9
  26. data/lib/liquid/tags/break.rb +1 -1
  27. data/lib/liquid/tags/capture.rb +10 -8
  28. data/lib/liquid/tags/case.rb +13 -13
  29. data/lib/liquid/tags/comment.rb +9 -2
  30. data/lib/liquid/tags/continue.rb +1 -4
  31. data/lib/liquid/tags/cycle.rb +5 -7
  32. data/lib/liquid/tags/decrement.rb +3 -4
  33. data/lib/liquid/tags/for.rb +69 -36
  34. data/lib/liquid/tags/if.rb +52 -25
  35. data/lib/liquid/tags/ifchanged.rb +3 -3
  36. data/lib/liquid/tags/include.rb +19 -8
  37. data/lib/liquid/tags/increment.rb +4 -8
  38. data/lib/liquid/tags/raw.rb +4 -7
  39. data/lib/liquid/tags/table_row.rb +73 -0
  40. data/lib/liquid/tags/unless.rb +2 -4
  41. data/lib/liquid/template.rb +124 -14
  42. data/lib/liquid/token.rb +18 -0
  43. data/lib/liquid/utils.rb +13 -4
  44. data/lib/liquid/variable.rb +103 -25
  45. data/lib/liquid/variable_lookup.rb +78 -0
  46. data/lib/liquid/version.rb +1 -1
  47. data/lib/liquid.rb +19 -11
  48. data/test/fixtures/en_locale.yml +9 -0
  49. data/test/{liquid → integration}/assign_test.rb +18 -1
  50. data/test/integration/blank_test.rb +106 -0
  51. data/test/{liquid → integration}/capture_test.rb +3 -3
  52. data/test/integration/context_test.rb +32 -0
  53. data/test/integration/drop_test.rb +271 -0
  54. data/test/integration/error_handling_test.rb +207 -0
  55. data/test/{liquid → integration}/filter_test.rb +11 -11
  56. data/test/integration/hash_ordering_test.rb +23 -0
  57. data/test/{liquid → integration}/output_test.rb +13 -13
  58. data/test/integration/parsing_quirks_test.rb +116 -0
  59. data/test/integration/render_profiling_test.rb +154 -0
  60. data/test/{liquid → integration}/security_test.rb +10 -10
  61. data/test/{liquid → integration}/standard_filter_test.rb +148 -32
  62. data/test/{liquid → integration}/tags/break_tag_test.rb +1 -1
  63. data/test/{liquid → integration}/tags/continue_tag_test.rb +1 -1
  64. data/test/{liquid → integration}/tags/for_tag_test.rb +80 -2
  65. data/test/{liquid → integration}/tags/if_else_tag_test.rb +24 -21
  66. data/test/integration/tags/include_tag_test.rb +234 -0
  67. data/test/{liquid → integration}/tags/increment_tag_test.rb +1 -1
  68. data/test/{liquid → integration}/tags/raw_tag_test.rb +2 -1
  69. data/test/{liquid → integration}/tags/standard_tag_test.rb +28 -26
  70. data/test/integration/tags/statements_test.rb +113 -0
  71. data/test/{liquid/tags/html_tag_test.rb → integration/tags/table_row_test.rb} +5 -5
  72. data/test/{liquid → integration}/tags/unless_else_tag_test.rb +1 -1
  73. data/test/{liquid → integration}/template_test.rb +81 -45
  74. data/test/integration/variable_test.rb +82 -0
  75. data/test/test_helper.rb +73 -20
  76. data/test/{liquid/block_test.rb → unit/block_unit_test.rb} +2 -5
  77. data/test/{liquid/condition_test.rb → unit/condition_unit_test.rb} +23 -1
  78. data/test/{liquid/context_test.rb → unit/context_unit_test.rb} +39 -25
  79. data/test/{liquid/file_system_test.rb → unit/file_system_unit_test.rb} +11 -5
  80. data/test/unit/i18n_unit_test.rb +37 -0
  81. data/test/unit/lexer_unit_test.rb +48 -0
  82. data/test/{liquid/module_ex_test.rb → unit/module_ex_unit_test.rb} +7 -7
  83. data/test/unit/parser_unit_test.rb +82 -0
  84. data/test/{liquid/regexp_test.rb → unit/regexp_unit_test.rb} +3 -3
  85. data/test/{liquid/strainer_test.rb → unit/strainer_unit_test.rb} +20 -1
  86. data/test/unit/tag_unit_test.rb +16 -0
  87. data/test/unit/tags/case_tag_unit_test.rb +10 -0
  88. data/test/unit/tags/for_tag_unit_test.rb +13 -0
  89. data/test/unit/tags/if_tag_unit_test.rb +8 -0
  90. data/test/unit/template_unit_test.rb +69 -0
  91. data/test/unit/tokenizer_unit_test.rb +38 -0
  92. data/test/unit/variable_unit_test.rb +139 -0
  93. metadata +135 -67
  94. data/lib/extras/liquid_view.rb +0 -51
  95. data/lib/liquid/htmltags.rb +0 -73
  96. data/test/liquid/drop_test.rb +0 -180
  97. data/test/liquid/error_handling_test.rb +0 -81
  98. data/test/liquid/hash_ordering_test.rb +0 -25
  99. data/test/liquid/parsing_quirks_test.rb +0 -52
  100. data/test/liquid/tags/include_tag_test.rb +0 -166
  101. data/test/liquid/tags/statements_test.rb +0 -134
  102. data/test/liquid/variable_test.rb +0 -186
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ class LexerUnitTest < Minitest::Test
4
+ include Liquid
5
+
6
+ def test_strings
7
+ tokens = Lexer.new(%! 'this is a test""' "wat 'lol'"!).tokenize
8
+ assert_equal [[:string,%!'this is a test""'!], [:string, %!"wat 'lol'"!], [:end_of_string]], tokens
9
+ end
10
+
11
+ def test_integer
12
+ tokens = Lexer.new('hi 50').tokenize
13
+ assert_equal [[:id,'hi'], [:number, '50'], [:end_of_string]], tokens
14
+ end
15
+
16
+ def test_float
17
+ tokens = Lexer.new('hi 5.0').tokenize
18
+ assert_equal [[:id,'hi'], [:number, '5.0'], [:end_of_string]], tokens
19
+ end
20
+
21
+ def test_comparison
22
+ tokens = Lexer.new('== <> contains').tokenize
23
+ assert_equal [[:comparison,'=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens
24
+ end
25
+
26
+ def test_specials
27
+ tokens = Lexer.new('| .:').tokenize
28
+ assert_equal [[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens
29
+ tokens = Lexer.new('[,]').tokenize
30
+ assert_equal [[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens
31
+ end
32
+
33
+ def test_fancy_identifiers
34
+ tokens = Lexer.new('hi! five?').tokenize
35
+ assert_equal [[:id,'hi!'], [:id, 'five?'], [:end_of_string]], tokens
36
+ end
37
+
38
+ def test_whitespace
39
+ tokens = Lexer.new("five|\n\t ==").tokenize
40
+ assert_equal [[:id,'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens
41
+ end
42
+
43
+ def test_unexpected_character
44
+ assert_raises(SyntaxError) do
45
+ Lexer.new("%").tokenize
46
+ end
47
+ end
48
+ end
@@ -36,7 +36,7 @@ class TestClassC::LiquidDropClass
36
36
  end
37
37
  end
38
38
 
39
- class ModuleExTest < Test::Unit::TestCase
39
+ class ModuleExUnitTest < Minitest::Test
40
40
  include Liquid
41
41
 
42
42
  def setup
@@ -77,11 +77,11 @@ class ModuleExTest < Test::Unit::TestCase
77
77
  end
78
78
 
79
79
  def test_should_use_regular_objects_as_drops
80
- assert_equal 'allowedA', Liquid::Template.parse("{{ a.allowedA }}").render('a'=>@a)
81
- assert_equal 'allowedB', Liquid::Template.parse("{{ a.chainedB.allowedB }}").render('a'=>@a)
82
- assert_equal 'allowedC', Liquid::Template.parse("{{ a.chainedB.chainedC.allowedC }}").render('a'=>@a)
83
- assert_equal 'another_allowedC', Liquid::Template.parse("{{ a.chainedB.chainedC.another_allowedC }}").render('a'=>@a)
84
- assert_equal '', Liquid::Template.parse("{{ a.restricted }}").render('a'=>@a)
85
- assert_equal '', Liquid::Template.parse("{{ a.unknown }}").render('a'=>@a)
80
+ assert_template_result 'allowedA', "{{ a.allowedA }}", 'a'=>@a
81
+ assert_template_result 'allowedB', "{{ a.chainedB.allowedB }}", 'a'=>@a
82
+ assert_template_result 'allowedC', "{{ a.chainedB.chainedC.allowedC }}", 'a'=>@a
83
+ assert_template_result 'another_allowedC', "{{ a.chainedB.chainedC.another_allowedC }}", 'a'=>@a
84
+ assert_template_result '', "{{ a.restricted }}", 'a'=>@a
85
+ assert_template_result '', "{{ a.unknown }}", 'a'=>@a
86
86
  end
87
87
  end # ModuleExTest
@@ -0,0 +1,82 @@
1
+ require 'test_helper'
2
+
3
+ class ParserUnitTest < Minitest::Test
4
+ include Liquid
5
+
6
+ def test_consume
7
+ p = Parser.new("wat: 7")
8
+ assert_equal 'wat', p.consume(:id)
9
+ assert_equal ':', p.consume(:colon)
10
+ assert_equal '7', p.consume(:number)
11
+ end
12
+
13
+ def test_jump
14
+ p = Parser.new("wat: 7")
15
+ p.jump(2)
16
+ assert_equal '7', p.consume(:number)
17
+ end
18
+
19
+ def test_consume?
20
+ p = Parser.new("wat: 7")
21
+ assert_equal 'wat', p.consume?(:id)
22
+ assert_equal false, p.consume?(:dot)
23
+ assert_equal ':', p.consume(:colon)
24
+ assert_equal '7', p.consume?(:number)
25
+ end
26
+
27
+ def test_id?
28
+ p = Parser.new("wat 6 Peter Hegemon")
29
+ assert_equal 'wat', p.id?('wat')
30
+ assert_equal false, p.id?('endgame')
31
+ assert_equal '6', p.consume(:number)
32
+ assert_equal 'Peter', p.id?('Peter')
33
+ assert_equal false, p.id?('Achilles')
34
+ end
35
+
36
+ def test_look
37
+ p = Parser.new("wat 6 Peter Hegemon")
38
+ assert_equal true, p.look(:id)
39
+ assert_equal 'wat', p.consume(:id)
40
+ assert_equal false, p.look(:comparison)
41
+ assert_equal true, p.look(:number)
42
+ assert_equal true, p.look(:id, 1)
43
+ assert_equal false, p.look(:number, 1)
44
+ end
45
+
46
+ def test_expressions
47
+ p = Parser.new("hi.there hi[5].! hi.there.bob")
48
+ assert_equal 'hi.there', p.expression
49
+ assert_equal 'hi[5].!', p.expression
50
+ assert_equal 'hi.there.bob', p.expression
51
+
52
+ p = Parser.new("567 6.0 'lol' \"wut\"")
53
+ assert_equal '567', p.expression
54
+ assert_equal '6.0', p.expression
55
+ assert_equal "'lol'", p.expression
56
+ assert_equal '"wut"', p.expression
57
+ end
58
+
59
+ def test_ranges
60
+ p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
61
+ assert_equal '(5..7)', p.expression
62
+ assert_equal '(1.5..9.6)', p.expression
63
+ assert_equal '(young..old)', p.expression
64
+ assert_equal '(hi[5].wat..old)', p.expression
65
+ end
66
+
67
+ def test_arguments
68
+ p = Parser.new("filter: hi.there[5], keyarg: 7")
69
+ assert_equal 'filter', p.consume(:id)
70
+ assert_equal ':', p.consume(:colon)
71
+ assert_equal 'hi.there[5]', p.argument
72
+ assert_equal ',', p.consume(:comma)
73
+ assert_equal 'keyarg: 7', p.argument
74
+ end
75
+
76
+ def test_invalid_expression
77
+ assert_raises(SyntaxError) do
78
+ p = Parser.new("==")
79
+ p.expression
80
+ end
81
+ end
82
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class RegexpTest < Test::Unit::TestCase
3
+ class RegexpUnitTest < Minitest::Test
4
4
  include Liquid
5
5
 
6
6
  def test_empty
@@ -21,11 +21,11 @@ class RegexpTest < Test::Unit::TestCase
21
21
  assert_equal ['<style', 'class="hello">', '</style>'], %|<style class="hello">' </style>|.scan(QuotedFragment)
22
22
  end
23
23
 
24
- def test_quoted_words
24
+ def test_double_quoted_words
25
25
  assert_equal ['arg1', 'arg2', '"arg 3"'], 'arg1 arg2 "arg 3"'.scan(QuotedFragment)
26
26
  end
27
27
 
28
- def test_quoted_words
28
+ def test_single_quoted_words
29
29
  assert_equal ['arg1', 'arg2', "'arg 3'"], 'arg1 arg2 \'arg 3\''.scan(QuotedFragment)
30
30
  end
31
31
 
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class StrainerTest < Test::Unit::TestCase
3
+ class StrainerUnitTest < Minitest::Test
4
4
  include Liquid
5
5
 
6
6
  module AccessScopeFilters
@@ -22,6 +22,13 @@ class StrainerTest < Test::Unit::TestCase
22
22
  assert_equal "public", strainer.invoke("public_filter")
23
23
  end
24
24
 
25
+ def test_stainer_raises_argument_error
26
+ strainer = Strainer.create(nil)
27
+ assert_raises(Liquid::ArgumentError) do
28
+ strainer.invoke("public_filter", 1)
29
+ end
30
+ end
31
+
25
32
  def test_strainer_only_invokes_public_filter_methods
26
33
  strainer = Strainer.create(nil)
27
34
  assert_equal false, strainer.invokable?('__test__')
@@ -49,4 +56,16 @@ class StrainerTest < Test::Unit::TestCase
49
56
  assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke")
50
57
  end
51
58
 
59
+ def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
60
+ a = Module.new
61
+ b = Module.new
62
+ strainer = Strainer.create(nil, [a,b])
63
+ assert_kind_of Strainer, strainer
64
+ assert_kind_of a, strainer
65
+ assert_kind_of b, strainer
66
+ Strainer.class_variable_get(:@@filters).each do |m|
67
+ assert_kind_of m, strainer
68
+ end
69
+ end
70
+
52
71
  end # StrainerTest
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ class TagUnitTest < Minitest::Test
4
+ include Liquid
5
+
6
+ def test_tag
7
+ tag = Tag.parse('tag', [], [], {})
8
+ assert_equal 'liquid::tag', tag.name
9
+ assert_equal '', tag.render(Context.new)
10
+ end
11
+
12
+ def test_return_raw_text_of_tag
13
+ tag = Tag.parse("long_tag", "param1, param2, param3", [], {})
14
+ assert_equal("long_tag param1, param2, param3", tag.raw)
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ require 'test_helper'
2
+
3
+ class CaseTagUnitTest < Minitest::Test
4
+ include Liquid
5
+
6
+ def test_case_nodelist
7
+ template = Liquid::Template.parse('{% case var %}{% when true %}WHEN{% else %}ELSE{% endcase %}')
8
+ assert_equal ['WHEN', 'ELSE'], template.root.nodelist[0].nodelist
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ require 'test_helper'
2
+
3
+ class ForTagUnitTest < Minitest::Test
4
+ def test_for_nodelist
5
+ template = Liquid::Template.parse('{% for item in items %}FOR{% endfor %}')
6
+ assert_equal ['FOR'], template.root.nodelist[0].nodelist
7
+ end
8
+
9
+ def test_for_else_nodelist
10
+ template = Liquid::Template.parse('{% for item in items %}FOR{% else %}ELSE{% endfor %}')
11
+ assert_equal ['FOR', 'ELSE'], template.root.nodelist[0].nodelist
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class IfTagUnitTest < Minitest::Test
4
+ def test_if_nodelist
5
+ template = Liquid::Template.parse('{% if true %}IF{% else %}ELSE{% endif %}')
6
+ assert_equal ['IF', 'ELSE'], template.root.nodelist[0].nodelist
7
+ end
8
+ end
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ class TemplateUnitTest < Minitest::Test
4
+ include Liquid
5
+
6
+ def test_sets_default_localization_in_document
7
+ t = Template.new
8
+ t.parse('')
9
+ assert_instance_of I18n, t.root.options[:locale]
10
+ end
11
+
12
+ def test_sets_default_localization_in_context_with_quick_initialization
13
+ t = Template.new
14
+ t.parse('{{foo}}', :locale => I18n.new(fixture("en_locale.yml")))
15
+
16
+ assert_instance_of I18n, t.root.options[:locale]
17
+ assert_equal fixture("en_locale.yml"), t.root.options[:locale].path
18
+ end
19
+
20
+ def test_with_cache_classes_tags_returns_the_same_class
21
+ original_cache_setting = Liquid.cache_classes
22
+ Liquid.cache_classes = true
23
+
24
+ original_klass = Class.new
25
+ Object.send(:const_set, :CustomTag, original_klass)
26
+ Template.register_tag('custom', CustomTag)
27
+
28
+ Object.send(:remove_const, :CustomTag)
29
+
30
+ new_klass = Class.new
31
+ Object.send(:const_set, :CustomTag, new_klass)
32
+
33
+ assert Template.tags['custom'].equal?(original_klass)
34
+ ensure
35
+ Object.send(:remove_const, :CustomTag)
36
+ Template.tags.delete('custom')
37
+ Liquid.cache_classes = original_cache_setting
38
+ end
39
+
40
+ def test_without_cache_classes_tags_reloads_the_class
41
+ original_cache_setting = Liquid.cache_classes
42
+ Liquid.cache_classes = false
43
+
44
+ original_klass = Class.new
45
+ Object.send(:const_set, :CustomTag, original_klass)
46
+ Template.register_tag('custom', CustomTag)
47
+
48
+ Object.send(:remove_const, :CustomTag)
49
+
50
+ new_klass = Class.new
51
+ Object.send(:const_set, :CustomTag, new_klass)
52
+
53
+ assert Template.tags['custom'].equal?(new_klass)
54
+ ensure
55
+ Object.send(:remove_const, :CustomTag)
56
+ Template.tags.delete('custom')
57
+ Liquid.cache_classes = original_cache_setting
58
+ end
59
+
60
+ class FakeTag; end
61
+
62
+ def test_tags_delete
63
+ Template.register_tag('fake', FakeTag)
64
+ assert_equal FakeTag, Template.tags['fake']
65
+
66
+ Template.tags.delete('fake')
67
+ assert_nil Template.tags['fake']
68
+ end
69
+ end
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+
3
+ class TokenizerTest < Minitest::Test
4
+ def test_tokenize_strings
5
+ assert_equal [' '], tokenize(' ')
6
+ assert_equal ['hello world'], tokenize('hello world')
7
+ end
8
+
9
+ def test_tokenize_variables
10
+ assert_equal ['{{funk}}'], tokenize('{{funk}}')
11
+ assert_equal [' ', '{{funk}}', ' '], tokenize(' {{funk}} ')
12
+ assert_equal [' ', '{{funk}}', ' ', '{{so}}', ' ', '{{brother}}', ' '], tokenize(' {{funk}} {{so}} {{brother}} ')
13
+ assert_equal [' ', '{{ funk }}', ' '], tokenize(' {{ funk }} ')
14
+ end
15
+
16
+ def test_tokenize_blocks
17
+ assert_equal ['{%comment%}'], tokenize('{%comment%}')
18
+ assert_equal [' ', '{%comment%}', ' '], tokenize(' {%comment%} ')
19
+
20
+ assert_equal [' ', '{%comment%}', ' ', '{%endcomment%}', ' '], tokenize(' {%comment%} {%endcomment%} ')
21
+ assert_equal [' ', '{% comment %}', ' ', '{% endcomment %}', ' '], tokenize(" {% comment %} {% endcomment %} ")
22
+ end
23
+
24
+ def test_calculate_line_numbers_per_token_with_profiling
25
+ template = Liquid::Template.parse("", :profile => true)
26
+
27
+ assert_equal [1], template.send(:tokenize, "{{funk}}").map(&:line_number)
28
+ assert_equal [1, 1, 1], template.send(:tokenize, " {{funk}} ").map(&:line_number)
29
+ assert_equal [1, 2, 2], template.send(:tokenize, "\n{{funk}}\n").map(&:line_number)
30
+ assert_equal [1, 1, 3], template.send(:tokenize, " {{\n funk \n}} ").map(&:line_number)
31
+ end
32
+
33
+ private
34
+
35
+ def tokenize(source)
36
+ Liquid::Template.new.send(:tokenize, source)
37
+ end
38
+ end
@@ -0,0 +1,139 @@
1
+ require 'test_helper'
2
+
3
+ class VariableUnitTest < Minitest::Test
4
+ include Liquid
5
+
6
+ def test_variable
7
+ var = Variable.new('hello')
8
+ assert_equal VariableLookup.new('hello'), var.name
9
+ end
10
+
11
+ def test_filters
12
+ var = Variable.new('hello | textileze')
13
+ assert_equal VariableLookup.new('hello'), var.name
14
+ assert_equal [['textileze',[]]], var.filters
15
+
16
+ var = Variable.new('hello | textileze | paragraph')
17
+ assert_equal VariableLookup.new('hello'), var.name
18
+ assert_equal [['textileze',[]], ['paragraph',[]]], var.filters
19
+
20
+ var = Variable.new(%! hello | strftime: '%Y'!)
21
+ assert_equal VariableLookup.new('hello'), var.name
22
+ assert_equal [['strftime',['%Y']]], var.filters
23
+
24
+ var = Variable.new(%! 'typo' | link_to: 'Typo', true !)
25
+ assert_equal 'typo', var.name
26
+ assert_equal [['link_to',['Typo', true]]], var.filters
27
+
28
+ var = Variable.new(%! 'typo' | link_to: 'Typo', false !)
29
+ assert_equal 'typo', var.name
30
+ assert_equal [['link_to',['Typo', false]]], var.filters
31
+
32
+ var = Variable.new(%! 'foo' | repeat: 3 !)
33
+ assert_equal 'foo', var.name
34
+ assert_equal [['repeat',[3]]], var.filters
35
+
36
+ var = Variable.new(%! 'foo' | repeat: 3, 3 !)
37
+ assert_equal 'foo', var.name
38
+ assert_equal [['repeat',[3,3]]], var.filters
39
+
40
+ var = Variable.new(%! 'foo' | repeat: 3, 3, 3 !)
41
+ assert_equal 'foo', var.name
42
+ assert_equal [['repeat',[3,3,3]]], var.filters
43
+
44
+ var = Variable.new(%! hello | strftime: '%Y, okay?'!)
45
+ assert_equal VariableLookup.new('hello'), var.name
46
+ assert_equal [['strftime',['%Y, okay?']]], var.filters
47
+
48
+ var = Variable.new(%! hello | things: "%Y, okay?", 'the other one'!)
49
+ assert_equal VariableLookup.new('hello'), var.name
50
+ assert_equal [['things',['%Y, okay?','the other one']]], var.filters
51
+ end
52
+
53
+ def test_filter_with_date_parameter
54
+ var = Variable.new(%! '2006-06-06' | date: "%m/%d/%Y"!)
55
+ assert_equal '2006-06-06', var.name
56
+ assert_equal [['date',['%m/%d/%Y']]], var.filters
57
+ end
58
+
59
+ def test_filters_without_whitespace
60
+ var = Variable.new('hello | textileze | paragraph')
61
+ assert_equal VariableLookup.new('hello'), var.name
62
+ assert_equal [['textileze',[]], ['paragraph',[]]], var.filters
63
+
64
+ var = Variable.new('hello|textileze|paragraph')
65
+ assert_equal VariableLookup.new('hello'), var.name
66
+ assert_equal [['textileze',[]], ['paragraph',[]]], var.filters
67
+
68
+ var = Variable.new("hello|replace:'foo','bar'|textileze")
69
+ assert_equal VariableLookup.new('hello'), var.name
70
+ assert_equal [['replace', ['foo', 'bar']], ['textileze', []]], var.filters
71
+ end
72
+
73
+ def test_symbol
74
+ var = Variable.new("http://disney.com/logo.gif | image: 'med' ", :error_mode => :lax)
75
+ assert_equal VariableLookup.new('http://disney.com/logo.gif'), var.name
76
+ assert_equal [['image',['med']]], var.filters
77
+ end
78
+
79
+ def test_string_to_filter
80
+ var = Variable.new("'http://disney.com/logo.gif' | image: 'med' ")
81
+ assert_equal 'http://disney.com/logo.gif', var.name
82
+ assert_equal [['image',['med']]], var.filters
83
+ end
84
+
85
+ def test_string_single_quoted
86
+ var = Variable.new(%| "hello" |)
87
+ assert_equal 'hello', var.name
88
+ end
89
+
90
+ def test_string_double_quoted
91
+ var = Variable.new(%| 'hello' |)
92
+ assert_equal 'hello', var.name
93
+ end
94
+
95
+ def test_integer
96
+ var = Variable.new(%| 1000 |)
97
+ assert_equal 1000, var.name
98
+ end
99
+
100
+ def test_float
101
+ var = Variable.new(%| 1000.01 |)
102
+ assert_equal 1000.01, var.name
103
+ end
104
+
105
+ def test_string_with_special_chars
106
+ var = Variable.new(%| 'hello! $!@.;"ddasd" ' |)
107
+ assert_equal 'hello! $!@.;"ddasd" ', var.name
108
+ end
109
+
110
+ def test_string_dot
111
+ var = Variable.new(%| test.test |)
112
+ assert_equal VariableLookup.new('test.test'), var.name
113
+ end
114
+
115
+ def test_filter_with_keyword_arguments
116
+ var = Variable.new(%! hello | things: greeting: "world", farewell: 'goodbye'!)
117
+ assert_equal VariableLookup.new('hello'), var.name
118
+ assert_equal [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters
119
+ end
120
+
121
+ def test_lax_filter_argument_parsing
122
+ var = Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !, :error_mode => :lax)
123
+ assert_equal VariableLookup.new('number_of_comments'), var.name
124
+ assert_equal [['pluralize',['comment','comments']]], var.filters
125
+ end
126
+
127
+ def test_strict_filter_argument_parsing
128
+ with_error_mode(:strict) do
129
+ assert_raises(SyntaxError) do
130
+ Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !)
131
+ end
132
+ end
133
+ end
134
+
135
+ def test_output_raw_source_of_variable
136
+ var = Variable.new(%! name_of_variable | upcase !)
137
+ assert_equal " name_of_variable | upcase ", var.raw
138
+ end
139
+ end