liquid 4.0.0 → 5.0.1

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 (123) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +101 -2
  3. data/README.md +8 -0
  4. data/lib/liquid.rb +18 -5
  5. data/lib/liquid/block.rb +47 -20
  6. data/lib/liquid/block_body.rb +192 -76
  7. data/lib/liquid/condition.rb +69 -29
  8. data/lib/liquid/context.rb +110 -53
  9. data/lib/liquid/document.rb +47 -9
  10. data/lib/liquid/drop.rb +4 -2
  11. data/lib/liquid/errors.rb +20 -18
  12. data/lib/liquid/expression.rb +30 -31
  13. data/lib/liquid/extensions.rb +8 -0
  14. data/lib/liquid/file_system.rb +6 -4
  15. data/lib/liquid/forloop_drop.rb +11 -4
  16. data/lib/liquid/i18n.rb +5 -3
  17. data/lib/liquid/interrupts.rb +3 -1
  18. data/lib/liquid/lexer.rb +35 -26
  19. data/lib/liquid/locales/en.yml +4 -2
  20. data/lib/liquid/parse_context.rb +21 -4
  21. data/lib/liquid/parse_tree_visitor.rb +42 -0
  22. data/lib/liquid/parser.rb +30 -18
  23. data/lib/liquid/parser_switching.rb +17 -3
  24. data/lib/liquid/partial_cache.rb +24 -0
  25. data/lib/liquid/profiler.rb +67 -86
  26. data/lib/liquid/profiler/hooks.rb +26 -14
  27. data/lib/liquid/range_lookup.rb +5 -3
  28. data/lib/liquid/register.rb +6 -0
  29. data/lib/liquid/resource_limits.rb +47 -8
  30. data/lib/liquid/standardfilters.rb +170 -63
  31. data/lib/liquid/static_registers.rb +44 -0
  32. data/lib/liquid/strainer_factory.rb +36 -0
  33. data/lib/liquid/strainer_template.rb +53 -0
  34. data/lib/liquid/tablerowloop_drop.rb +6 -4
  35. data/lib/liquid/tag.rb +28 -6
  36. data/lib/liquid/tag/disableable.rb +22 -0
  37. data/lib/liquid/tag/disabler.rb +21 -0
  38. data/lib/liquid/tags/assign.rb +32 -10
  39. data/lib/liquid/tags/break.rb +8 -3
  40. data/lib/liquid/tags/capture.rb +11 -8
  41. data/lib/liquid/tags/case.rb +41 -27
  42. data/lib/liquid/tags/comment.rb +5 -3
  43. data/lib/liquid/tags/continue.rb +8 -3
  44. data/lib/liquid/tags/cycle.rb +35 -16
  45. data/lib/liquid/tags/decrement.rb +6 -3
  46. data/lib/liquid/tags/echo.rb +34 -0
  47. data/lib/liquid/tags/for.rb +79 -47
  48. data/lib/liquid/tags/if.rb +53 -30
  49. data/lib/liquid/tags/ifchanged.rb +11 -10
  50. data/lib/liquid/tags/include.rb +42 -44
  51. data/lib/liquid/tags/increment.rb +7 -3
  52. data/lib/liquid/tags/raw.rb +14 -11
  53. data/lib/liquid/tags/render.rb +84 -0
  54. data/lib/liquid/tags/table_row.rb +32 -20
  55. data/lib/liquid/tags/unless.rb +15 -15
  56. data/lib/liquid/template.rb +53 -72
  57. data/lib/liquid/template_factory.rb +9 -0
  58. data/lib/liquid/tokenizer.rb +17 -9
  59. data/lib/liquid/usage.rb +8 -0
  60. data/lib/liquid/utils.rb +6 -4
  61. data/lib/liquid/variable.rb +55 -38
  62. data/lib/liquid/variable_lookup.rb +14 -6
  63. data/lib/liquid/version.rb +3 -1
  64. data/test/integration/assign_test.rb +74 -5
  65. data/test/integration/blank_test.rb +11 -8
  66. data/test/integration/block_test.rb +58 -0
  67. data/test/integration/capture_test.rb +18 -10
  68. data/test/integration/context_test.rb +609 -5
  69. data/test/integration/document_test.rb +4 -2
  70. data/test/integration/drop_test.rb +67 -83
  71. data/test/integration/error_handling_test.rb +73 -61
  72. data/test/integration/expression_test.rb +46 -0
  73. data/test/integration/filter_test.rb +53 -42
  74. data/test/integration/hash_ordering_test.rb +5 -3
  75. data/test/integration/output_test.rb +26 -24
  76. data/test/integration/parsing_quirks_test.rb +24 -8
  77. data/test/integration/{render_profiling_test.rb → profiler_test.rb} +84 -25
  78. data/test/integration/security_test.rb +41 -18
  79. data/test/integration/standard_filter_test.rb +513 -210
  80. data/test/integration/tag/disableable_test.rb +59 -0
  81. data/test/integration/tag_test.rb +45 -0
  82. data/test/integration/tags/break_tag_test.rb +4 -2
  83. data/test/integration/tags/continue_tag_test.rb +4 -2
  84. data/test/integration/tags/echo_test.rb +13 -0
  85. data/test/integration/tags/for_tag_test.rb +109 -53
  86. data/test/integration/tags/if_else_tag_test.rb +5 -3
  87. data/test/integration/tags/include_tag_test.rb +83 -52
  88. data/test/integration/tags/increment_tag_test.rb +4 -2
  89. data/test/integration/tags/liquid_tag_test.rb +116 -0
  90. data/test/integration/tags/raw_tag_test.rb +14 -11
  91. data/test/integration/tags/render_tag_test.rb +213 -0
  92. data/test/integration/tags/standard_tag_test.rb +38 -31
  93. data/test/integration/tags/statements_test.rb +23 -21
  94. data/test/integration/tags/table_row_test.rb +2 -0
  95. data/test/integration/tags/unless_else_tag_test.rb +4 -2
  96. data/test/integration/template_test.rb +123 -120
  97. data/test/integration/trim_mode_test.rb +82 -44
  98. data/test/integration/variable_test.rb +46 -31
  99. data/test/test_helper.rb +75 -23
  100. data/test/unit/block_unit_test.rb +19 -24
  101. data/test/unit/condition_unit_test.rb +82 -72
  102. data/test/unit/file_system_unit_test.rb +6 -4
  103. data/test/unit/i18n_unit_test.rb +7 -5
  104. data/test/unit/lexer_unit_test.rb +12 -10
  105. data/test/unit/parse_tree_visitor_test.rb +254 -0
  106. data/test/unit/parser_unit_test.rb +37 -35
  107. data/test/unit/partial_cache_unit_test.rb +128 -0
  108. data/test/unit/regexp_unit_test.rb +17 -15
  109. data/test/unit/static_registers_unit_test.rb +156 -0
  110. data/test/unit/strainer_factory_unit_test.rb +100 -0
  111. data/test/unit/strainer_template_unit_test.rb +82 -0
  112. data/test/unit/tag_unit_test.rb +5 -3
  113. data/test/unit/tags/case_tag_unit_test.rb +3 -1
  114. data/test/unit/tags/for_tag_unit_test.rb +4 -2
  115. data/test/unit/tags/if_tag_unit_test.rb +3 -1
  116. data/test/unit/template_factory_unit_test.rb +12 -0
  117. data/test/unit/template_unit_test.rb +19 -10
  118. data/test/unit/tokenizer_unit_test.rb +26 -19
  119. data/test/unit/variable_unit_test.rb +51 -49
  120. metadata +79 -46
  121. data/lib/liquid/strainer.rb +0 -66
  122. data/test/unit/context_unit_test.rb +0 -483
  123. data/test/unit/strainer_unit_test.rb +0 -148
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class FileSystemUnitTest < Minitest::Test
@@ -11,8 +13,8 @@ class FileSystemUnitTest < Minitest::Test
11
13
 
12
14
  def test_local
13
15
  file_system = Liquid::LocalFileSystem.new("/some/path")
14
- assert_equal "/some/path/_mypartial.liquid", file_system.full_path("mypartial")
15
- assert_equal "/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial")
16
+ assert_equal("/some/path/_mypartial.liquid", file_system.full_path("mypartial"))
17
+ assert_equal("/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial"))
16
18
 
17
19
  assert_raises(FileSystemError) do
18
20
  file_system.full_path("../dir/mypartial")
@@ -29,7 +31,7 @@ class FileSystemUnitTest < Minitest::Test
29
31
 
30
32
  def test_custom_template_filename_patterns
31
33
  file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")
32
- assert_equal "/some/path/mypartial.html", file_system.full_path("mypartial")
33
- assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial")
34
+ assert_equal("/some/path/mypartial.html", file_system.full_path("mypartial"))
35
+ assert_equal("/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial"))
34
36
  end
35
37
  end # FileSystemTest
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class I18nUnitTest < Minitest::Test
@@ -8,15 +10,15 @@ class I18nUnitTest < Minitest::Test
8
10
  end
9
11
 
10
12
  def test_simple_translate_string
11
- assert_equal "less is more", @i18n.translate("simple")
13
+ assert_equal("less is more", @i18n.translate("simple"))
12
14
  end
13
15
 
14
16
  def test_nested_translate_string
15
- assert_equal "something wasn't right", @i18n.translate("errors.syntax.oops")
17
+ assert_equal("something wasn't right", @i18n.translate("errors.syntax.oops"))
16
18
  end
17
19
 
18
20
  def test_single_string_interpolation
19
- assert_equal "something different", @i18n.translate("whatever", something: "different")
21
+ assert_equal("something different", @i18n.translate("whatever", something: "different"))
20
22
  end
21
23
 
22
24
  # def test_raises_translation_error_on_undefined_interpolation_key
@@ -26,12 +28,12 @@ class I18nUnitTest < Minitest::Test
26
28
  # end
27
29
 
28
30
  def test_raises_unknown_translation
29
- assert_raises I18n::TranslationError do
31
+ assert_raises(I18n::TranslationError) do
30
32
  @i18n.translate("doesnt_exist")
31
33
  end
32
34
  end
33
35
 
34
36
  def test_sets_default_path_to_en
35
- assert_equal I18n::DEFAULT_LOCALE, I18n.new.path
37
+ assert_equal(I18n::DEFAULT_LOCALE, I18n.new.path)
36
38
  end
37
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class LexerUnitTest < Minitest::Test
@@ -5,42 +7,42 @@ class LexerUnitTest < Minitest::Test
5
7
 
6
8
  def test_strings
7
9
  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
10
+ assert_equal([[:string, %('this is a test""')], [:string, %("wat 'lol'")], [:end_of_string]], tokens)
9
11
  end
10
12
 
11
13
  def test_integer
12
14
  tokens = Lexer.new('hi 50').tokenize
13
- assert_equal [[:id, 'hi'], [:number, '50'], [:end_of_string]], tokens
15
+ assert_equal([[:id, 'hi'], [:number, '50'], [:end_of_string]], tokens)
14
16
  end
15
17
 
16
18
  def test_float
17
19
  tokens = Lexer.new('hi 5.0').tokenize
18
- assert_equal [[:id, 'hi'], [:number, '5.0'], [:end_of_string]], tokens
20
+ assert_equal([[:id, 'hi'], [:number, '5.0'], [:end_of_string]], tokens)
19
21
  end
20
22
 
21
23
  def test_comparison
22
- tokens = Lexer.new('== <> contains').tokenize
23
- assert_equal [[:comparison, '=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens
24
+ tokens = Lexer.new('== <> contains ').tokenize
25
+ assert_equal([[:comparison, '=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens)
24
26
  end
25
27
 
26
28
  def test_specials
27
29
  tokens = Lexer.new('| .:').tokenize
28
- assert_equal [[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens
30
+ assert_equal([[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens)
29
31
  tokens = Lexer.new('[,]').tokenize
30
- assert_equal [[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens
32
+ assert_equal([[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens)
31
33
  end
32
34
 
33
35
  def test_fancy_identifiers
34
36
  tokens = Lexer.new('hi five?').tokenize
35
- assert_equal [[:id, 'hi'], [:id, 'five?'], [:end_of_string]], tokens
37
+ assert_equal([[:id, 'hi'], [:id, 'five?'], [:end_of_string]], tokens)
36
38
 
37
39
  tokens = Lexer.new('2foo').tokenize
38
- assert_equal [[:number, '2'], [:id, 'foo'], [:end_of_string]], tokens
40
+ assert_equal([[:number, '2'], [:id, 'foo'], [:end_of_string]], tokens)
39
41
  end
40
42
 
41
43
  def test_whitespace
42
44
  tokens = Lexer.new("five|\n\t ==").tokenize
43
- assert_equal [[:id, 'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens
45
+ assert_equal([[:id, 'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens)
44
46
  end
45
47
 
46
48
  def test_unexpected_character
@@ -0,0 +1,254 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ParseTreeVisitorTest < Minitest::Test
6
+ include Liquid
7
+
8
+ def test_variable
9
+ assert_equal(
10
+ ["test"],
11
+ visit(%({{ test }}))
12
+ )
13
+ end
14
+
15
+ def test_varible_with_filter
16
+ assert_equal(
17
+ ["test", "infilter"],
18
+ visit(%({{ test | split: infilter }}))
19
+ )
20
+ end
21
+
22
+ def test_dynamic_variable
23
+ assert_equal(
24
+ ["test", "inlookup"],
25
+ visit(%({{ test[inlookup] }}))
26
+ )
27
+ end
28
+
29
+ def test_echo
30
+ assert_equal(
31
+ ["test"],
32
+ visit(%({% echo test %}))
33
+ )
34
+ end
35
+
36
+ def test_if_condition
37
+ assert_equal(
38
+ ["test"],
39
+ visit(%({% if test %}{% endif %}))
40
+ )
41
+ end
42
+
43
+ def test_complex_if_condition
44
+ assert_equal(
45
+ ["test"],
46
+ visit(%({% if 1 == 1 and 2 == test %}{% endif %}))
47
+ )
48
+ end
49
+
50
+ def test_if_body
51
+ assert_equal(
52
+ ["test"],
53
+ visit(%({% if 1 == 1 %}{{ test }}{% endif %}))
54
+ )
55
+ end
56
+
57
+ def test_unless_condition
58
+ assert_equal(
59
+ ["test"],
60
+ visit(%({% unless test %}{% endunless %}))
61
+ )
62
+ end
63
+
64
+ def test_complex_unless_condition
65
+ assert_equal(
66
+ ["test"],
67
+ visit(%({% unless 1 == 1 and 2 == test %}{% endunless %}))
68
+ )
69
+ end
70
+
71
+ def test_unless_body
72
+ assert_equal(
73
+ ["test"],
74
+ visit(%({% unless 1 == 1 %}{{ test }}{% endunless %}))
75
+ )
76
+ end
77
+
78
+ def test_elsif_condition
79
+ assert_equal(
80
+ ["test"],
81
+ visit(%({% if 1 == 1 %}{% elsif test %}{% endif %}))
82
+ )
83
+ end
84
+
85
+ def test_complex_elsif_condition
86
+ assert_equal(
87
+ ["test"],
88
+ visit(%({% if 1 == 1 %}{% elsif 1 == 1 and 2 == test %}{% endif %}))
89
+ )
90
+ end
91
+
92
+ def test_elsif_body
93
+ assert_equal(
94
+ ["test"],
95
+ visit(%({% if 1 == 1 %}{% elsif 2 == 2 %}{{ test }}{% endif %}))
96
+ )
97
+ end
98
+
99
+ def test_else_body
100
+ assert_equal(
101
+ ["test"],
102
+ visit(%({% if 1 == 1 %}{% else %}{{ test }}{% endif %}))
103
+ )
104
+ end
105
+
106
+ def test_case_left
107
+ assert_equal(
108
+ ["test"],
109
+ visit(%({% case test %}{% endcase %}))
110
+ )
111
+ end
112
+
113
+ def test_case_condition
114
+ assert_equal(
115
+ ["test"],
116
+ visit(%({% case 1 %}{% when test %}{% endcase %}))
117
+ )
118
+ end
119
+
120
+ def test_case_when_body
121
+ assert_equal(
122
+ ["test"],
123
+ visit(%({% case 1 %}{% when 2 %}{{ test }}{% endcase %}))
124
+ )
125
+ end
126
+
127
+ def test_case_else_body
128
+ assert_equal(
129
+ ["test"],
130
+ visit(%({% case 1 %}{% else %}{{ test }}{% endcase %}))
131
+ )
132
+ end
133
+
134
+ def test_for_in
135
+ assert_equal(
136
+ ["test"],
137
+ visit(%({% for x in test %}{% endfor %}))
138
+ )
139
+ end
140
+
141
+ def test_for_limit
142
+ assert_equal(
143
+ ["test"],
144
+ visit(%({% for x in (1..5) limit: test %}{% endfor %}))
145
+ )
146
+ end
147
+
148
+ def test_for_offset
149
+ assert_equal(
150
+ ["test"],
151
+ visit(%({% for x in (1..5) offset: test %}{% endfor %}))
152
+ )
153
+ end
154
+
155
+ def test_for_body
156
+ assert_equal(
157
+ ["test"],
158
+ visit(%({% for x in (1..5) %}{{ test }}{% endfor %}))
159
+ )
160
+ end
161
+
162
+ def test_tablerow_in
163
+ assert_equal(
164
+ ["test"],
165
+ visit(%({% tablerow x in test %}{% endtablerow %}))
166
+ )
167
+ end
168
+
169
+ def test_tablerow_limit
170
+ assert_equal(
171
+ ["test"],
172
+ visit(%({% tablerow x in (1..5) limit: test %}{% endtablerow %}))
173
+ )
174
+ end
175
+
176
+ def test_tablerow_offset
177
+ assert_equal(
178
+ ["test"],
179
+ visit(%({% tablerow x in (1..5) offset: test %}{% endtablerow %}))
180
+ )
181
+ end
182
+
183
+ def test_tablerow_body
184
+ assert_equal(
185
+ ["test"],
186
+ visit(%({% tablerow x in (1..5) %}{{ test }}{% endtablerow %}))
187
+ )
188
+ end
189
+
190
+ def test_cycle
191
+ assert_equal(
192
+ ["test"],
193
+ visit(%({% cycle test %}))
194
+ )
195
+ end
196
+
197
+ def test_assign
198
+ assert_equal(
199
+ ["test"],
200
+ visit(%({% assign x = test %}))
201
+ )
202
+ end
203
+
204
+ def test_capture
205
+ assert_equal(
206
+ ["test"],
207
+ visit(%({% capture x %}{{ test }}{% endcapture %}))
208
+ )
209
+ end
210
+
211
+ def test_include
212
+ assert_equal(
213
+ ["test"],
214
+ visit(%({% include test %}))
215
+ )
216
+ end
217
+
218
+ def test_include_with
219
+ assert_equal(
220
+ ["test"],
221
+ visit(%({% include "hai" with test %}))
222
+ )
223
+ end
224
+
225
+ def test_include_for
226
+ assert_equal(
227
+ ["test"],
228
+ visit(%({% include "hai" for test %}))
229
+ )
230
+ end
231
+
232
+ def test_preserve_tree_structure
233
+ assert_equal(
234
+ [[nil, [
235
+ [nil, [[nil, [["other", []]]]]],
236
+ ["test", []],
237
+ ["xs", []],
238
+ ]]],
239
+ traversal(%({% for x in xs offset: test %}{{ other }}{% endfor %})).visit
240
+ )
241
+ end
242
+
243
+ private
244
+
245
+ def traversal(template)
246
+ ParseTreeVisitor
247
+ .for(Template.parse(template).root)
248
+ .add_callback_for(VariableLookup) { |node| node.name } # rubocop:disable Style/SymbolProc
249
+ end
250
+
251
+ def visit(template)
252
+ traversal(template).visit.flatten.compact
253
+ end
254
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class ParserUnitTest < Minitest::Test
@@ -5,72 +7,72 @@ class ParserUnitTest < Minitest::Test
5
7
 
6
8
  def test_consume
7
9
  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)
10
+ assert_equal('wat', p.consume(:id))
11
+ assert_equal(':', p.consume(:colon))
12
+ assert_equal('7', p.consume(:number))
11
13
  end
12
14
 
13
15
  def test_jump
14
16
  p = Parser.new("wat: 7")
15
17
  p.jump(2)
16
- assert_equal '7', p.consume(:number)
18
+ assert_equal('7', p.consume(:number))
17
19
  end
18
20
 
19
21
  def test_consume?
20
22
  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)
23
+ assert_equal('wat', p.consume?(:id))
24
+ assert_equal(false, p.consume?(:dot))
25
+ assert_equal(':', p.consume(:colon))
26
+ assert_equal('7', p.consume?(:number))
25
27
  end
26
28
 
27
29
  def test_id?
28
30
  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')
31
+ assert_equal('wat', p.id?('wat'))
32
+ assert_equal(false, p.id?('endgame'))
33
+ assert_equal('6', p.consume(:number))
34
+ assert_equal('Peter', p.id?('Peter'))
35
+ assert_equal(false, p.id?('Achilles'))
34
36
  end
35
37
 
36
38
  def test_look
37
39
  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)
40
+ assert_equal(true, p.look(:id))
41
+ assert_equal('wat', p.consume(:id))
42
+ assert_equal(false, p.look(:comparison))
43
+ assert_equal(true, p.look(:number))
44
+ assert_equal(true, p.look(:id, 1))
45
+ assert_equal(false, p.look(:number, 1))
44
46
  end
45
47
 
46
48
  def test_expressions
47
49
  p = Parser.new("hi.there hi?[5].there? hi.there.bob")
48
- assert_equal 'hi.there', p.expression
49
- assert_equal 'hi?[5].there?', p.expression
50
- assert_equal 'hi.there.bob', p.expression
50
+ assert_equal('hi.there', p.expression)
51
+ assert_equal('hi?[5].there?', p.expression)
52
+ assert_equal('hi.there.bob', p.expression)
51
53
 
52
54
  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
55
+ assert_equal('567', p.expression)
56
+ assert_equal('6.0', p.expression)
57
+ assert_equal("'lol'", p.expression)
58
+ assert_equal('"wut"', p.expression)
57
59
  end
58
60
 
59
61
  def test_ranges
60
62
  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
63
+ assert_equal('(5..7)', p.expression)
64
+ assert_equal('(1.5..9.6)', p.expression)
65
+ assert_equal('(young..old)', p.expression)
66
+ assert_equal('(hi[5].wat..old)', p.expression)
65
67
  end
66
68
 
67
69
  def test_arguments
68
70
  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
71
+ assert_equal('filter', p.consume(:id))
72
+ assert_equal(':', p.consume(:colon))
73
+ assert_equal('hi.there[5]', p.argument)
74
+ assert_equal(',', p.consume(:comma))
75
+ assert_equal('keyarg: 7', p.argument)
74
76
  end
75
77
 
76
78
  def test_invalid_expression