curlybars 0.9.13

Sign up to get free protection for your applications and to get access to all the features.
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