curlybars 0.9.13

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 (77) hide show
  1. checksums.yaml +7 -0
  2. data/lib/curlybars.rb +108 -0
  3. data/lib/curlybars/configuration.rb +41 -0
  4. data/lib/curlybars/dependency_tracker.rb +8 -0
  5. data/lib/curlybars/error/base.rb +18 -0
  6. data/lib/curlybars/error/compile.rb +11 -0
  7. data/lib/curlybars/error/lex.rb +22 -0
  8. data/lib/curlybars/error/parse.rb +41 -0
  9. data/lib/curlybars/error/presenter/not_found.rb +23 -0
  10. data/lib/curlybars/error/render.rb +11 -0
  11. data/lib/curlybars/error/validate.rb +18 -0
  12. data/lib/curlybars/lexer.rb +60 -0
  13. data/lib/curlybars/method_whitelist.rb +69 -0
  14. data/lib/curlybars/node/block_helper_else.rb +108 -0
  15. data/lib/curlybars/node/boolean.rb +24 -0
  16. data/lib/curlybars/node/each_else.rb +69 -0
  17. data/lib/curlybars/node/if_else.rb +33 -0
  18. data/lib/curlybars/node/item.rb +31 -0
  19. data/lib/curlybars/node/literal.rb +28 -0
  20. data/lib/curlybars/node/option.rb +25 -0
  21. data/lib/curlybars/node/output.rb +24 -0
  22. data/lib/curlybars/node/partial.rb +24 -0
  23. data/lib/curlybars/node/path.rb +137 -0
  24. data/lib/curlybars/node/root.rb +29 -0
  25. data/lib/curlybars/node/string.rb +24 -0
  26. data/lib/curlybars/node/template.rb +32 -0
  27. data/lib/curlybars/node/text.rb +24 -0
  28. data/lib/curlybars/node/unless_else.rb +33 -0
  29. data/lib/curlybars/node/variable.rb +34 -0
  30. data/lib/curlybars/node/with_else.rb +54 -0
  31. data/lib/curlybars/parser.rb +183 -0
  32. data/lib/curlybars/position.rb +7 -0
  33. data/lib/curlybars/presenter.rb +288 -0
  34. data/lib/curlybars/processor/tilde.rb +31 -0
  35. data/lib/curlybars/processor/token_factory.rb +9 -0
  36. data/lib/curlybars/railtie.rb +18 -0
  37. data/lib/curlybars/rendering_support.rb +222 -0
  38. data/lib/curlybars/safe_buffer.rb +11 -0
  39. data/lib/curlybars/template_handler.rb +93 -0
  40. data/lib/curlybars/version.rb +3 -0
  41. data/spec/acceptance/application_layout_spec.rb +60 -0
  42. data/spec/acceptance/collection_blocks_spec.rb +28 -0
  43. data/spec/acceptance/global_helper_spec.rb +25 -0
  44. data/spec/curlybars/configuration_spec.rb +57 -0
  45. data/spec/curlybars/error/base_spec.rb +41 -0
  46. data/spec/curlybars/error/compile_spec.rb +19 -0
  47. data/spec/curlybars/error/lex_spec.rb +25 -0
  48. data/spec/curlybars/error/parse_spec.rb +74 -0
  49. data/spec/curlybars/error/render_spec.rb +19 -0
  50. data/spec/curlybars/error/validate_spec.rb +19 -0
  51. data/spec/curlybars/lexer_spec.rb +466 -0
  52. data/spec/curlybars/method_whitelist_spec.rb +168 -0
  53. data/spec/curlybars/processor/tilde_spec.rb +60 -0
  54. data/spec/curlybars/rendering_support_spec.rb +426 -0
  55. data/spec/curlybars/safe_buffer_spec.rb +46 -0
  56. data/spec/curlybars/template_handler_spec.rb +222 -0
  57. data/spec/integration/cache_spec.rb +124 -0
  58. data/spec/integration/comment_spec.rb +60 -0
  59. data/spec/integration/exception_spec.rb +31 -0
  60. data/spec/integration/node/block_helper_else_spec.rb +422 -0
  61. data/spec/integration/node/each_else_spec.rb +204 -0
  62. data/spec/integration/node/each_spec.rb +291 -0
  63. data/spec/integration/node/escape_spec.rb +27 -0
  64. data/spec/integration/node/helper_spec.rb +176 -0
  65. data/spec/integration/node/if_else_spec.rb +129 -0
  66. data/spec/integration/node/if_spec.rb +143 -0
  67. data/spec/integration/node/output_spec.rb +68 -0
  68. data/spec/integration/node/partial_spec.rb +66 -0
  69. data/spec/integration/node/path_spec.rb +286 -0
  70. data/spec/integration/node/root_spec.rb +15 -0
  71. data/spec/integration/node/template_spec.rb +86 -0
  72. data/spec/integration/node/unless_else_spec.rb +129 -0
  73. data/spec/integration/node/unless_spec.rb +130 -0
  74. data/spec/integration/node/with_spec.rb +116 -0
  75. data/spec/integration/processor/tilde_spec.rb +38 -0
  76. data/spec/integration/processors_spec.rb +30 -0
  77. metadata +358 -0
@@ -0,0 +1,129 @@
1
+ describe "{{#unless}}...{{else}}...{{/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 "renders the unless_template" do
9
+ allow(presenter).to receive(:allows_method?).with(:condition) { true }
10
+ allow(presenter).to receive(:condition) { false }
11
+
12
+ template = Curlybars.compile(<<-HBS)
13
+ {{#unless condition}}
14
+ unless_template
15
+ {{else}}
16
+ else_template
17
+ {{/unless}}
18
+ HBS
19
+
20
+ expect(eval(template)).to resemble(<<-HTML)
21
+ unless_template
22
+ HTML
23
+ end
24
+
25
+ it "renders the else_template" do
26
+ allow(presenter).to receive(:allows_method?).with(:condition) { true }
27
+ allow(presenter).to receive(:condition) { true }
28
+
29
+ template = Curlybars.compile(<<-HBS)
30
+ {{#unless condition}}
31
+ unless_template
32
+ {{else}}
33
+ else_template
34
+ {{/unless}}
35
+ HBS
36
+
37
+ expect(eval(template)).to resemble(<<-HTML)
38
+ else_template
39
+ HTML
40
+ end
41
+
42
+ it "allows empty else_template" do
43
+ allow(presenter).to receive(:allows_method?).with(:valid) { true }
44
+ allow(presenter).to receive(:valid) { false }
45
+
46
+ template = Curlybars.compile(<<-HBS)
47
+ {{#unless valid}}
48
+ unless_template
49
+ {{else}}{{/unless}}
50
+ HBS
51
+
52
+ expect(eval(template)).to resemble(<<-HTML)
53
+ unless_template
54
+ HTML
55
+ end
56
+
57
+ it "allows empty unless_template" do
58
+ allow(presenter).to receive(:allows_method?).with(:valid) { true }
59
+ allow(presenter).to receive(:valid) { true }
60
+
61
+ template = Curlybars.compile(<<-HBS)
62
+ {{#unless valid}}{{else}}
63
+ else_template
64
+ {{/unless}}
65
+ HBS
66
+
67
+ expect(eval(template)).to resemble(<<-HTML)
68
+ else_template
69
+ HTML
70
+ end
71
+
72
+ it "allows empty unless_template and else_template" do
73
+ allow(presenter).to receive(:allows_method?).with(:valid) { true }
74
+ allow(presenter).to receive(:valid) { false }
75
+
76
+ template = Curlybars.compile(<<-HBS)
77
+ {{#unless valid}}{{else}}{{/unless}}
78
+ HBS
79
+
80
+ expect(eval(template)).to resemble("")
81
+ end
82
+ end
83
+
84
+ describe "#validate" do
85
+ let(:presenter_class) { double(:presenter_class) }
86
+
87
+ it "validates with errors the condition" do
88
+ dependency_tree = {}
89
+
90
+ source = <<-HBS
91
+ {{#unless condition}}{{else}}{{/unless}}
92
+ HBS
93
+
94
+ errors = Curlybars.validate(dependency_tree, source)
95
+
96
+ expect(errors).not_to be_empty
97
+ end
98
+
99
+ it "validates with errors the nested unless_template" do
100
+ dependency_tree = { condition: nil }
101
+
102
+ source = <<-HBS
103
+ {{#unless condition}}
104
+ {{unallowed_method}}
105
+ {{else}}
106
+ {{/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 else_template" do
115
+ dependency_tree = { condition: nil }
116
+
117
+ source = <<-HBS
118
+ {{#unless condition}}
119
+ {{else}}
120
+ {{unallowed_method}}
121
+ {{/unless}}
122
+ HBS
123
+
124
+ errors = Curlybars.validate(dependency_tree, source)
125
+
126
+ expect(errors).not_to be_empty
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,130 @@
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) { true }
10
+ allow(presenter).to receive(:condition) { 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) { true }
25
+ allow(presenter).to receive(:condition) { 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) { true }
38
+ allow(presenter).to receive(:allows_method?).with(:second_condition) { true }
39
+ allow(presenter).to receive(:first_condition) { false }
40
+ allow(presenter).to receive(:second_condition) { 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) { true }
59
+ allow(presenter).to receive(:valid) { 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) { true }
70
+ allow(presenter).to receive(:allows_method?).with(:second_condition) { true }
71
+ allow(presenter).to receive(:first_condition) { false }
72
+ allow(presenter).to receive(:second_condition) { 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
+ let(:presenter_class) { double(:presenter_class) }
103
+
104
+ it "validates with errors the condition" do
105
+ dependency_tree = {}
106
+
107
+ source = <<-HBS
108
+ {{#unless condition}}{{/unless}}
109
+ HBS
110
+
111
+ errors = Curlybars.validate(dependency_tree, source)
112
+
113
+ expect(errors).not_to be_empty
114
+ end
115
+
116
+ it "validates with errors the nested template" do
117
+ dependency_tree = { condition: nil }
118
+
119
+ source = <<-HBS
120
+ {{#unless condition}}
121
+ {{unallowed_method}}
122
+ {{/unless}}
123
+ HBS
124
+
125
+ errors = Curlybars.validate(dependency_tree, source)
126
+
127
+ expect(errors).not_to be_empty
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,116 @@
1
+ describe "{{#with presenter}}...{{/with}}" 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 "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 empty with_template" do
35
+ template = Curlybars.compile(<<-HBS)
36
+ {{#with user}}{{/with}}
37
+ HBS
38
+
39
+ expect(eval(template)).to resemble("")
40
+ end
41
+
42
+ it "renders the else templte if the context is nil" do
43
+ template = Curlybars.compile(<<-HBS)
44
+ {{#with return_nil}}
45
+ text
46
+ {{else}}
47
+ else
48
+ {{/with}}
49
+ HBS
50
+
51
+ expect(eval(template)).to resemble(<<-HTML)
52
+ else
53
+ HTML
54
+ end
55
+
56
+ it "renders nothing if the context is nil and no else block is specified" do
57
+ template = Curlybars.compile(<<-HBS)
58
+ {{#with return_nil}}
59
+ text
60
+ {{/with}}
61
+ HBS
62
+
63
+ expect(eval(template)).to resemble("")
64
+ end
65
+
66
+ it "raises an exception if the parameter is not a context type object" do
67
+ template = Curlybars.compile(<<-HBS)
68
+ {{#with return_true}}{{/with}}
69
+ HBS
70
+
71
+ expect do
72
+ eval(template)
73
+ end.to raise_error(Curlybars::Error::Render)
74
+ end
75
+ end
76
+
77
+ describe "#validate" do
78
+ let(:presenter_class) { double(:presenter_class) }
79
+
80
+ it "without errors" do
81
+ dependency_tree = { a_presenter: {} }
82
+
83
+ source = <<-HBS
84
+ {{#with a_presenter}}{{/with}}
85
+ HBS
86
+
87
+ errors = Curlybars.validate(dependency_tree, source)
88
+
89
+ expect(errors).to be_empty
90
+ end
91
+
92
+ it "with errors due to a leaf" do
93
+ dependency_tree = { not_a_presenter: nil }
94
+
95
+ source = <<-HBS
96
+ {{#with not_a_presenter}}{{/with}}
97
+ HBS
98
+
99
+ errors = Curlybars.validate(dependency_tree, source)
100
+
101
+ expect(errors).not_to be_empty
102
+ end
103
+
104
+ it "with errors due unallowed method" do
105
+ dependency_tree = {}
106
+
107
+ source = <<-HBS
108
+ {{#with unallowed}}{{/with}}
109
+ HBS
110
+
111
+ errors = Curlybars.validate(dependency_tree, source)
112
+
113
+ expect(errors).not_to be_empty
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,38 @@
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, "source", run_processors: false)
34
+
35
+ expect(Curlybars::Processor::Tilde).to have_received(:process!)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,30 @@
1
+ describe "processors" do
2
+ let(:presenter) { double(:presenter, dependency_tree: { curlybars: nil }) }
3
+ let(:global_helpers_providers) { [] }
4
+ let(:processor) { double(:processor) }
5
+
6
+ before do
7
+ allow(Curlybars.configuration).to receive(:custom_processors).and_return([processor])
8
+ allow(processor).to receive(:process!)
9
+ end
10
+
11
+ describe "validation" do
12
+ it "are run by default" do
13
+ Curlybars.validate(presenter, "source")
14
+
15
+ expect(processor).to have_received(:process!)
16
+ end
17
+
18
+ it "are not run when run_processors is true" do
19
+ Curlybars.validate(presenter, "source", run_processors: true)
20
+
21
+ expect(processor).to have_received(:process!)
22
+ end
23
+
24
+ it "are not run when run_processors is false" do
25
+ Curlybars.validate(presenter, "source", run_processors: false)
26
+
27
+ expect(processor).not_to have_received(:process!)
28
+ end
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,358 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: curlybars
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.13
5
+ platform: ruby
6
+ authors:
7
+ - Libo Cannici
8
+ - Cristian Planas
9
+ - Ilkka Oksanen
10
+ - Mauro Codella
11
+ - Luís Almeida
12
+ - Andreas Garnæs
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+ date: 2018-01-11 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: actionpack
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: '4.2'
25
+ - - "<"
26
+ - !ruby/object:Gem::Version
27
+ version: '5.2'
28
+ type: :runtime
29
+ prerelease: false
30
+ version_requirements: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '4.2'
35
+ - - "<"
36
+ - !ruby/object:Gem::Version
37
+ version: '5.2'
38
+ - !ruby/object:Gem::Dependency
39
+ name: ffi
40
+ requirement: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ - !ruby/object:Gem::Dependency
53
+ name: rltk
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ type: :runtime
60
+ prerelease: false
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ - !ruby/object:Gem::Dependency
67
+ name: bundler
68
+ requirement: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ type: :development
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ - !ruby/object:Gem::Dependency
81
+ name: byebug
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '3.5'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '3.5'
94
+ - !ruby/object:Gem::Dependency
95
+ name: genspec
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ - !ruby/object:Gem::Dependency
109
+ name: private_gem
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ type: :development
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ - !ruby/object:Gem::Dependency
123
+ name: railties
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '4.2'
129
+ - - "<"
130
+ - !ruby/object:Gem::Version
131
+ version: '5.2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '4.2'
139
+ - - "<"
140
+ - !ruby/object:Gem::Version
141
+ version: '5.2'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rake
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ type: :development
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ - !ruby/object:Gem::Dependency
157
+ name: rspec-rails
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '3.5'
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '3.5'
170
+ - !ruby/object:Gem::Dependency
171
+ name: rubocop
172
+ requirement: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: 0.51.0
177
+ type: :development
178
+ prerelease: false
179
+ version_requirements: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - "~>"
182
+ - !ruby/object:Gem::Version
183
+ version: 0.51.0
184
+ - !ruby/object:Gem::Dependency
185
+ name: rubocop-rspec
186
+ requirement: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - "~>"
189
+ - !ruby/object:Gem::Version
190
+ version: 1.19.0
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: 1.19.0
198
+ - !ruby/object:Gem::Dependency
199
+ name: wwtd
200
+ requirement: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 0.5.3
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: 0.5.3
212
+ description: |-
213
+ A view layer for your Rails apps that separates
214
+ structure and logic, using Handlebars templates.
215
+
216
+ Strongly inspired by Curly Template gem by Daniel Schierbeck
217
+ email: libo@zendesk.com
218
+ executables: []
219
+ extensions: []
220
+ extra_rdoc_files: []
221
+ files:
222
+ - lib/curlybars.rb
223
+ - lib/curlybars/configuration.rb
224
+ - lib/curlybars/dependency_tracker.rb
225
+ - lib/curlybars/error/base.rb
226
+ - lib/curlybars/error/compile.rb
227
+ - lib/curlybars/error/lex.rb
228
+ - lib/curlybars/error/parse.rb
229
+ - lib/curlybars/error/presenter/not_found.rb
230
+ - lib/curlybars/error/render.rb
231
+ - lib/curlybars/error/validate.rb
232
+ - lib/curlybars/lexer.rb
233
+ - lib/curlybars/method_whitelist.rb
234
+ - lib/curlybars/node/block_helper_else.rb
235
+ - lib/curlybars/node/boolean.rb
236
+ - lib/curlybars/node/each_else.rb
237
+ - lib/curlybars/node/if_else.rb
238
+ - lib/curlybars/node/item.rb
239
+ - lib/curlybars/node/literal.rb
240
+ - lib/curlybars/node/option.rb
241
+ - lib/curlybars/node/output.rb
242
+ - lib/curlybars/node/partial.rb
243
+ - lib/curlybars/node/path.rb
244
+ - lib/curlybars/node/root.rb
245
+ - lib/curlybars/node/string.rb
246
+ - lib/curlybars/node/template.rb
247
+ - lib/curlybars/node/text.rb
248
+ - lib/curlybars/node/unless_else.rb
249
+ - lib/curlybars/node/variable.rb
250
+ - lib/curlybars/node/with_else.rb
251
+ - lib/curlybars/parser.rb
252
+ - lib/curlybars/position.rb
253
+ - lib/curlybars/presenter.rb
254
+ - lib/curlybars/processor/tilde.rb
255
+ - lib/curlybars/processor/token_factory.rb
256
+ - lib/curlybars/railtie.rb
257
+ - lib/curlybars/rendering_support.rb
258
+ - lib/curlybars/safe_buffer.rb
259
+ - lib/curlybars/template_handler.rb
260
+ - lib/curlybars/version.rb
261
+ - spec/acceptance/application_layout_spec.rb
262
+ - spec/acceptance/collection_blocks_spec.rb
263
+ - spec/acceptance/global_helper_spec.rb
264
+ - spec/curlybars/configuration_spec.rb
265
+ - spec/curlybars/error/base_spec.rb
266
+ - spec/curlybars/error/compile_spec.rb
267
+ - spec/curlybars/error/lex_spec.rb
268
+ - spec/curlybars/error/parse_spec.rb
269
+ - spec/curlybars/error/render_spec.rb
270
+ - spec/curlybars/error/validate_spec.rb
271
+ - spec/curlybars/lexer_spec.rb
272
+ - spec/curlybars/method_whitelist_spec.rb
273
+ - spec/curlybars/processor/tilde_spec.rb
274
+ - spec/curlybars/rendering_support_spec.rb
275
+ - spec/curlybars/safe_buffer_spec.rb
276
+ - spec/curlybars/template_handler_spec.rb
277
+ - spec/integration/cache_spec.rb
278
+ - spec/integration/comment_spec.rb
279
+ - spec/integration/exception_spec.rb
280
+ - spec/integration/node/block_helper_else_spec.rb
281
+ - spec/integration/node/each_else_spec.rb
282
+ - spec/integration/node/each_spec.rb
283
+ - spec/integration/node/escape_spec.rb
284
+ - spec/integration/node/helper_spec.rb
285
+ - spec/integration/node/if_else_spec.rb
286
+ - spec/integration/node/if_spec.rb
287
+ - spec/integration/node/output_spec.rb
288
+ - spec/integration/node/partial_spec.rb
289
+ - spec/integration/node/path_spec.rb
290
+ - spec/integration/node/root_spec.rb
291
+ - spec/integration/node/template_spec.rb
292
+ - spec/integration/node/unless_else_spec.rb
293
+ - spec/integration/node/unless_spec.rb
294
+ - spec/integration/node/with_spec.rb
295
+ - spec/integration/processor/tilde_spec.rb
296
+ - spec/integration/processors_spec.rb
297
+ homepage: https://github.com/zendesk/curlybars
298
+ licenses:
299
+ - Apache-2.0
300
+ metadata: {}
301
+ post_install_message:
302
+ rdoc_options:
303
+ - "--charset=UTF-8"
304
+ require_paths:
305
+ - lib
306
+ required_ruby_version: !ruby/object:Gem::Requirement
307
+ requirements:
308
+ - - ">="
309
+ - !ruby/object:Gem::Version
310
+ version: '0'
311
+ required_rubygems_version: !ruby/object:Gem::Requirement
312
+ requirements:
313
+ - - ">="
314
+ - !ruby/object:Gem::Version
315
+ version: '0'
316
+ requirements: []
317
+ rubyforge_project:
318
+ rubygems_version: 2.7.3
319
+ signing_key:
320
+ specification_version: 4
321
+ summary: Create your views using Handlebars templates!
322
+ test_files:
323
+ - spec/acceptance/application_layout_spec.rb
324
+ - spec/acceptance/collection_blocks_spec.rb
325
+ - spec/acceptance/global_helper_spec.rb
326
+ - spec/curlybars/configuration_spec.rb
327
+ - spec/curlybars/error/base_spec.rb
328
+ - spec/curlybars/error/compile_spec.rb
329
+ - spec/curlybars/error/lex_spec.rb
330
+ - spec/curlybars/error/parse_spec.rb
331
+ - spec/curlybars/error/render_spec.rb
332
+ - spec/curlybars/error/validate_spec.rb
333
+ - spec/curlybars/lexer_spec.rb
334
+ - spec/curlybars/method_whitelist_spec.rb
335
+ - spec/curlybars/processor/tilde_spec.rb
336
+ - spec/curlybars/rendering_support_spec.rb
337
+ - spec/curlybars/safe_buffer_spec.rb
338
+ - spec/curlybars/template_handler_spec.rb
339
+ - spec/integration/cache_spec.rb
340
+ - spec/integration/comment_spec.rb
341
+ - spec/integration/exception_spec.rb
342
+ - spec/integration/node/block_helper_else_spec.rb
343
+ - spec/integration/node/each_else_spec.rb
344
+ - spec/integration/node/each_spec.rb
345
+ - spec/integration/node/escape_spec.rb
346
+ - spec/integration/node/helper_spec.rb
347
+ - spec/integration/node/if_else_spec.rb
348
+ - spec/integration/node/if_spec.rb
349
+ - spec/integration/node/output_spec.rb
350
+ - spec/integration/node/partial_spec.rb
351
+ - spec/integration/node/path_spec.rb
352
+ - spec/integration/node/root_spec.rb
353
+ - spec/integration/node/template_spec.rb
354
+ - spec/integration/node/unless_else_spec.rb
355
+ - spec/integration/node/unless_spec.rb
356
+ - spec/integration/node/with_spec.rb
357
+ - spec/integration/processor/tilde_spec.rb
358
+ - spec/integration/processors_spec.rb