curlybars 1.7.0 → 1.9.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/curlybars/error/lex.rb +1 -1
  3. data/lib/curlybars/error/parse.rb +1 -1
  4. data/lib/curlybars/node/path.rb +11 -13
  5. data/lib/curlybars/presenter.rb +2 -2
  6. data/lib/curlybars/template_handler.rb +3 -11
  7. data/lib/curlybars/version.rb +1 -1
  8. metadata +17 -93
  9. data/spec/acceptance/application_layout_spec.rb +0 -60
  10. data/spec/acceptance/collection_blocks_spec.rb +0 -28
  11. data/spec/acceptance/global_helper_spec.rb +0 -25
  12. data/spec/curlybars/configuration_spec.rb +0 -57
  13. data/spec/curlybars/error/base_spec.rb +0 -41
  14. data/spec/curlybars/error/compile_spec.rb +0 -19
  15. data/spec/curlybars/error/lex_spec.rb +0 -25
  16. data/spec/curlybars/error/parse_spec.rb +0 -74
  17. data/spec/curlybars/error/render_spec.rb +0 -19
  18. data/spec/curlybars/error/validate_spec.rb +0 -19
  19. data/spec/curlybars/lexer_spec.rb +0 -490
  20. data/spec/curlybars/method_whitelist_spec.rb +0 -299
  21. data/spec/curlybars/processor/tilde_spec.rb +0 -60
  22. data/spec/curlybars/rendering_support_spec.rb +0 -421
  23. data/spec/curlybars/safe_buffer_spec.rb +0 -46
  24. data/spec/curlybars/template_handler_spec.rb +0 -225
  25. data/spec/integration/cache_spec.rb +0 -126
  26. data/spec/integration/comment_spec.rb +0 -60
  27. data/spec/integration/exception_spec.rb +0 -31
  28. data/spec/integration/node/block_helper_else_spec.rb +0 -420
  29. data/spec/integration/node/each_else_spec.rb +0 -408
  30. data/spec/integration/node/each_spec.rb +0 -289
  31. data/spec/integration/node/escape_spec.rb +0 -27
  32. data/spec/integration/node/helper_spec.rb +0 -186
  33. data/spec/integration/node/if_else_spec.rb +0 -170
  34. data/spec/integration/node/if_spec.rb +0 -153
  35. data/spec/integration/node/output_spec.rb +0 -66
  36. data/spec/integration/node/partial_spec.rb +0 -64
  37. data/spec/integration/node/path_spec.rb +0 -296
  38. data/spec/integration/node/root_spec.rb +0 -13
  39. data/spec/integration/node/sub_expression_spec.rb +0 -426
  40. data/spec/integration/node/template_spec.rb +0 -84
  41. data/spec/integration/node/unless_else_spec.rb +0 -139
  42. data/spec/integration/node/unless_spec.rb +0 -128
  43. data/spec/integration/node/with_spec.rb +0 -178
  44. data/spec/integration/processor/tilde_spec.rb +0 -38
  45. data/spec/integration/processors_spec.rb +0 -29
  46. data/spec/integration/visitor_spec.rb +0 -154
@@ -1,128 +0,0 @@
1
- describe "{{#unless}}...{{/unless}}" do
2
- let(:global_helpers_providers) { [] }
3
-
4
- describe "#compile" do
5
- let(:post) { double("post") }
6
- let(:presenter) { IntegrationTest::Presenter.new(double("view_context"), post: post) }
7
-
8
- it "returns unless_template when condition is false" do
9
- allow(presenter).to receive(:allows_method?).with(:condition).and_return(true)
10
- allow(presenter).to receive(:condition).and_return(false)
11
-
12
- template = Curlybars.compile(<<-HBS)
13
- {{#unless condition}}
14
- unless_template
15
- {{/unless}}
16
- HBS
17
-
18
- expect(eval(template)).to resemble(<<-HTML)
19
- unless_template
20
- HTML
21
- end
22
-
23
- it "doesn't return unless_template when condition is true" do
24
- allow(presenter).to receive(:allows_method?).with(:condition).and_return(true)
25
- allow(presenter).to receive(:condition).and_return(true)
26
-
27
- template = Curlybars.compile(<<-HBS)
28
- {{#unless condition}}
29
- unless_template
30
- {{/unless}}
31
- HBS
32
-
33
- expect(eval(template)).to resemble("")
34
- end
35
-
36
- it "works with nested unless blocks (double negative)" do
37
- allow(presenter).to receive(:allows_method?).with(:first_condition).and_return(true)
38
- allow(presenter).to receive(:allows_method?).with(:second_condition).and_return(true)
39
- allow(presenter).to receive(:first_condition).and_return(false)
40
- allow(presenter).to receive(:second_condition).and_return(false)
41
-
42
- template = Curlybars.compile(<<-HBS)
43
- {{#unless first_condition}}
44
- {{#unless second_condition}}
45
- inner_unless_template
46
- {{/unless}}
47
- outer_unless_template
48
- {{/unless}}
49
- HBS
50
-
51
- expect(eval(template)).to resemble(<<-HTML)
52
- inner_unless_template
53
- outer_unless_template
54
- HTML
55
- end
56
-
57
- it "allows empty unless_template" do
58
- allow(presenter).to receive(:allows_method?).with(:valid).and_return(true)
59
- allow(presenter).to receive(:valid).and_return(true)
60
-
61
- template = Curlybars.compile(<<-HBS)
62
- {{#unless valid}}{{/unless}}
63
- HBS
64
-
65
- expect(eval(template)).to resemble("")
66
- end
67
-
68
- it "works with nested unless blocks (negative and positive)" do
69
- allow(presenter).to receive(:allows_method?).with(:first_condition).and_return(true)
70
- allow(presenter).to receive(:allows_method?).with(:second_condition).and_return(true)
71
- allow(presenter).to receive(:first_condition).and_return(false)
72
- allow(presenter).to receive(:second_condition).and_return(true)
73
-
74
- template = Curlybars.compile(<<-HBS)
75
- {{#unless first_condition}}
76
- {{#unless second_condition}}
77
- inner_unless_template
78
- {{/unless}}
79
- outer_unless_template
80
- {{/unless}}
81
- HBS
82
-
83
- expect(eval(template)).to resemble(<<-HTML)
84
- outer_unless_template
85
- HTML
86
- end
87
-
88
- it "allows usage of variables in condition" do
89
- template = Curlybars.compile(<<-HBS)
90
- {{#each two_elements}}
91
- {{#unless @first}}I am the second!{{/unless}}
92
- {{/each}}
93
- HBS
94
-
95
- expect(eval(template)).to resemble(<<-HTML)
96
- I am the second!
97
- HTML
98
- end
99
- end
100
-
101
- describe "#validate" do
102
- it "validates with errors the condition" do
103
- dependency_tree = {}
104
-
105
- source = <<-HBS
106
- {{#unless condition}}{{/unless}}
107
- HBS
108
-
109
- errors = Curlybars.validate(dependency_tree, source)
110
-
111
- expect(errors).not_to be_empty
112
- end
113
-
114
- it "validates with errors the nested template" do
115
- dependency_tree = { condition: nil }
116
-
117
- source = <<-HBS
118
- {{#unless condition}}
119
- {{unallowed_method}}
120
- {{/unless}}
121
- HBS
122
-
123
- errors = Curlybars.validate(dependency_tree, source)
124
-
125
- expect(errors).not_to be_empty
126
- end
127
- end
128
- end
@@ -1,178 +0,0 @@
1
- describe "{{#with presenter}}...{{/with}}" do
2
- let(:global_helpers_providers) { [IntegrationTest::GlobalHelperProvider.new] }
3
-
4
- describe "#compile" do
5
- let(:post) { double("post") }
6
- let(:presenter) { IntegrationTest::Presenter.new(double("view_context"), post: post) }
7
-
8
- it "works scopes one level" do
9
- template = Curlybars.compile(<<-HBS)
10
- {{#with user}}
11
- {{avatar.url}}
12
- {{/with}}
13
- HBS
14
-
15
- expect(eval(template)).to resemble(<<-HTML)
16
- http://example.com/foo.png
17
- HTML
18
- end
19
-
20
- it "scopes two levels" do
21
- template = Curlybars.compile(<<-HBS)
22
- {{#with user}}
23
- {{#with avatar}}
24
- {{url}}
25
- {{/with}}
26
- {{/with}}
27
- HBS
28
-
29
- expect(eval(template)).to resemble(<<-HTML)
30
- http://example.com/foo.png
31
- HTML
32
- end
33
-
34
- it "allows subexpressions" do
35
- template = Curlybars.compile(<<-HBS)
36
- {{#with (translate user "sk-SK")}}
37
- {{avatar.url}}
38
- {{/with}}
39
- HBS
40
-
41
- expect(eval(template)).to resemble(<<-HTML)
42
- http://example.com/foo.png?locale=sk-SK
43
- HTML
44
- end
45
-
46
- it "allows empty with_template" do
47
- template = Curlybars.compile(<<-HBS)
48
- {{#with user}}{{/with}}
49
- HBS
50
-
51
- expect(eval(template)).to resemble("")
52
- end
53
-
54
- it "renders the else template if the context is nil" do
55
- template = Curlybars.compile(<<-HBS)
56
- {{#with return_nil}}
57
- text
58
- {{else}}
59
- else
60
- {{/with}}
61
- HBS
62
-
63
- expect(eval(template)).to resemble(<<-HTML)
64
- else
65
- HTML
66
- end
67
-
68
- it "renders nothing if the context is nil and no else block is specified" do
69
- template = Curlybars.compile(<<-HBS)
70
- {{#with return_nil}}
71
- text
72
- {{/with}}
73
- HBS
74
-
75
- expect(eval(template)).to resemble("")
76
- end
77
-
78
- it "raises an exception if the parameter is not a context type object" do
79
- template = Curlybars.compile(<<-HBS)
80
- {{#with return_true}}{{/with}}
81
- HBS
82
-
83
- expect do
84
- eval(template)
85
- end.to raise_error(Curlybars::Error::Render)
86
- end
87
- end
88
-
89
- describe "#validate" do
90
- it "without errors" do
91
- dependency_tree = { a_presenter: {} }
92
-
93
- source = <<-HBS
94
- {{#with a_presenter}}{{/with}}
95
- HBS
96
-
97
- errors = Curlybars.validate(dependency_tree, source)
98
-
99
- expect(errors).to be_empty
100
- end
101
-
102
- it "without errors when a presenter helper is used" do
103
- dependency_tree = { translate_article: [:helper, { title: nil }] }
104
-
105
- source = <<-HBS
106
- {{#with (translate_article 12345 "en-US")}}
107
- {{title}}
108
- {{/with}}
109
- HBS
110
-
111
- errors = Curlybars.validate(dependency_tree, source)
112
-
113
- expect(errors).to be_empty
114
- end
115
-
116
- it "without errors when a generic presenter helper is used" do
117
- dependency_tree = { article: { title: nil }, translate: [:helper, {}] }
118
-
119
- source = <<-HBS
120
- {{#with (translate article "en-US")}}
121
- {{title}}
122
- {{/with}}
123
- HBS
124
-
125
- errors = Curlybars.validate(dependency_tree, source)
126
-
127
- expect(errors).to be_empty
128
- end
129
-
130
- it "with errors due to a leaf" do
131
- dependency_tree = { not_a_presenter: nil }
132
-
133
- source = <<-HBS
134
- {{#with not_a_presenter}}{{/with}}
135
- HBS
136
-
137
- errors = Curlybars.validate(dependency_tree, source)
138
-
139
- expect(errors).not_to be_empty
140
- end
141
-
142
- it "with errors due unallowed method" do
143
- dependency_tree = {}
144
-
145
- source = <<-HBS
146
- {{#with unallowed}}{{/with}}
147
- HBS
148
-
149
- errors = Curlybars.validate(dependency_tree, source)
150
-
151
- expect(errors).not_to be_empty
152
- end
153
-
154
- it "with errors due collection helpers" do
155
- dependency_tree = { reverse_articles: [:helper, [{ title: nil }]] }
156
-
157
- source = <<-HBS
158
- {{#with (reverse_articles)}}{{/with}}
159
- HBS
160
-
161
- errors = Curlybars.validate(dependency_tree, source)
162
-
163
- expect(errors).not_to be_empty
164
- end
165
-
166
- it "with errors due generic collection helpers" do
167
- dependency_tree = { articles: [{ title: nil }], slice: [:helper, [{}]] }
168
-
169
- source = <<-HBS
170
- {{#with (slice articles 0 4)}}{{/with}}
171
- HBS
172
-
173
- errors = Curlybars.validate(dependency_tree, source)
174
-
175
- expect(errors).not_to be_empty
176
- end
177
- end
178
- end
@@ -1,38 +0,0 @@
1
- describe "tilde operator" do
2
- let(:global_helpers_providers) { [] }
3
-
4
- describe "compilation" do
5
- let(:post) { double("post") }
6
- let(:presenter) { IntegrationTest::Presenter.new(double("view_context"), post: post) }
7
-
8
- it "{{~ ... }} removes trailing whitespaces and newlines from the previous :TEXT" do
9
- template = Curlybars.compile("before \r\t\n{{~'curlybars'}}\n\t\r after")
10
-
11
- expect(eval(template)).to resemble("beforecurlybars\n\t\r after")
12
- end
13
-
14
- it "{{ ... ~}} removes trailing whitespaces and newlines from the next :TEXT" do
15
- template = Curlybars.compile("before \r\t\n{{'curlybars'~}}\n\t\r after")
16
-
17
- expect(eval(template)).to resemble("before \r\t\ncurlybarsafter")
18
- end
19
-
20
- it "{{~ ... ~}} does not remove trailing whitespaces and newlines from the next :TEXT" do
21
- template = Curlybars.compile("before \r\t\n{{~'curlybars'~}}\n\t\r after")
22
-
23
- expect(eval(template)).to resemble("beforecurlybarsafter")
24
- end
25
- end
26
-
27
- describe "validation" do
28
- let(:presenter) { double(:presenter, dependency_tree: { curlybars: nil }) }
29
-
30
- it "runs even when 'run_processors' flag is set to false" do
31
- allow(Curlybars::Processor::Tilde).to receive(:process!)
32
-
33
- Curlybars.validate(presenter.dependency_tree, "source", run_processors: false)
34
-
35
- expect(Curlybars::Processor::Tilde).to have_received(:process!)
36
- end
37
- end
38
- end
@@ -1,29 +0,0 @@
1
- describe "processors" do
2
- let(:presenter) { double(:presenter, dependency_tree: { curlybars: nil }) }
3
- let(:processor) { double(:processor) }
4
-
5
- before do
6
- allow(Curlybars.configuration).to receive(:custom_processors).and_return([processor])
7
- allow(processor).to receive(:process!)
8
- end
9
-
10
- describe "validation" do
11
- it "are run by default" do
12
- Curlybars.validate(presenter.dependency_tree, "source")
13
-
14
- expect(processor).to have_received(:process!)
15
- end
16
-
17
- it "are run when run_processors is true" do
18
- Curlybars.validate(presenter.dependency_tree, "source", run_processors: true)
19
-
20
- expect(processor).to have_received(:process!)
21
- end
22
-
23
- it "are not run when run_processors is false" do
24
- Curlybars.validate(presenter.dependency_tree, "source", run_processors: false)
25
-
26
- expect(processor).not_to have_received(:process!)
27
- end
28
- end
29
- end
@@ -1,154 +0,0 @@
1
- describe "visitor" do
2
- let(:source) do
3
- <<-HBS
4
- {{#print_args_and_options 'first' 'second' key='value'}}
5
- {{/print_args_and_options}}
6
-
7
- {{calc (calc 1 "+" 2) "*" 3}}
8
-
9
- {{#render_inverse}}
10
- fn
11
- {{else}}
12
- inverse
13
- {{@variable}}
14
- {{/render_inverse}}
15
-
16
- {{#each foo}}
17
- top
18
- {{#each bar}}
19
- middle
20
- {{#each baz}}
21
- inner
22
- {{else}}
23
- inner inverse
24
- {{/each}}
25
- {{/each}}
26
- {{/each}}
27
-
28
- {{#if valid}}
29
- if_template
30
- {{#if bar}}
31
- foo
32
- {{else}}
33
- qux
34
- {{/if}}
35
- {{/if}}
36
-
37
- {{#if baz}}
38
- qux
39
- {{/if}}
40
-
41
- {{> partial}}
42
-
43
- {{user.avatar.url}}
44
- {{#with this}}
45
- {{user.avatar.url}}
46
- {{/with}}
47
-
48
- {{#unless things}}
49
- hi
50
- {{/unless}}
51
- HBS
52
- end
53
-
54
- describe ".visit" do
55
- it "visits BlockHelperElse nodes" do
56
- visitor = counting_visitor_for(Curlybars::Node::BlockHelperElse)
57
- output = Curlybars.visit(visitor, source)
58
- expect(output).to eq(5)
59
- end
60
-
61
- it "visits EachElse nodes" do
62
- visitor = counting_visitor_for(Curlybars::Node::EachElse)
63
- output = Curlybars.visit(visitor, source)
64
- expect(output).to eq(3)
65
- end
66
-
67
- it "visits IfElse nodes" do
68
- visitor = counting_visitor_for(Curlybars::Node::IfElse)
69
- output = Curlybars.visit(visitor, source)
70
- expect(output).to eq(3)
71
- end
72
-
73
- it "visits Item nodes" do
74
- visitor = counting_visitor_for(Curlybars::Node::Item)
75
- output = Curlybars.visit(visitor, source)
76
- expect(output).to eq(44)
77
- end
78
-
79
- it "visits Literal nodes" do
80
- visitor = counting_visitor_for(Curlybars::Node::Literal)
81
- output = Curlybars.visit(visitor, source)
82
- expect(output).to eq(8)
83
- end
84
-
85
- it "visits Option nodes" do
86
- visitor = counting_visitor_for(Curlybars::Node::Option)
87
- output = Curlybars.visit(visitor, source)
88
- expect(output).to eq(1)
89
- end
90
-
91
- it "visits Partial nodes" do
92
- visitor = counting_visitor_for(Curlybars::Node::Partial)
93
- output = Curlybars.visit(visitor, source)
94
- expect(output).to eq(1)
95
- end
96
-
97
- it "visits Path nodes" do
98
- visitor = counting_visitor_for(Curlybars::Node::Path)
99
- output = Curlybars.visit(visitor, source)
100
- expect(output).to eq(15)
101
- end
102
-
103
- it "visits Root nodes" do
104
- visitor = counting_visitor_for(Curlybars::Node::Root)
105
- output = Curlybars.visit(visitor, source)
106
- expect(output).to eq(1)
107
- end
108
-
109
- it "visits SubExpression nodes" do
110
- visitor = counting_visitor_for(Curlybars::Node::SubExpression)
111
- output = Curlybars.visit(visitor, source)
112
- expect(output).to eq(1)
113
- end
114
-
115
- it "visits Template nodes" do
116
- visitor = counting_visitor_for(Curlybars::Node::Template)
117
- output = Curlybars.visit(visitor, source)
118
- expect(output).to eq(14)
119
- end
120
-
121
- it "visits Text nodes" do
122
- visitor = counting_visitor_for(Curlybars::Node::Text)
123
- output = Curlybars.visit(visitor, source)
124
- expect(output).to eq(29)
125
- end
126
-
127
- it "visits UnlessElse nodes" do
128
- visitor = counting_visitor_for(Curlybars::Node::UnlessElse)
129
- output = Curlybars.visit(visitor, source)
130
- expect(output).to eq(1)
131
- end
132
-
133
- it "visits Variable nodes" do
134
- visitor = counting_visitor_for(Curlybars::Node::Variable)
135
- output = Curlybars.visit(visitor, source)
136
- expect(output).to eq(1)
137
- end
138
-
139
- it "visits WithElse nodes" do
140
- visitor = counting_visitor_for(Curlybars::Node::WithElse)
141
- output = Curlybars.visit(visitor, source)
142
- expect(output).to eq(1)
143
- end
144
- end
145
-
146
- def counting_visitor_for(klass)
147
- Class.new(Curlybars::Visitor) do
148
- define_method "visit_#{klass.name.demodulize.underscore}" do |node|
149
- self.context += 1
150
- super(node)
151
- end
152
- end.new(0)
153
- end
154
- end