temple 0.6.7 → 0.10.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 (79) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yml +34 -0
  3. data/.gitignore +1 -0
  4. data/CHANGES +106 -1
  5. data/EXPRESSIONS.md +3 -2
  6. data/Gemfile +0 -1
  7. data/README.md +14 -10
  8. data/Rakefile +4 -11
  9. data/lib/temple/engine.rb +7 -3
  10. data/lib/temple/erb/engine.rb +5 -3
  11. data/lib/temple/erb/parser.rb +1 -1
  12. data/lib/temple/erb/trimming.rb +11 -26
  13. data/lib/temple/filters/ambles.rb +21 -0
  14. data/lib/temple/filters/encoding.rb +1 -1
  15. data/lib/temple/filters/eraser.rb +1 -1
  16. data/lib/temple/filters/escapable.rb +2 -2
  17. data/lib/temple/filters/remove_bom.rb +2 -9
  18. data/lib/temple/filters/static_analyzer.rb +30 -0
  19. data/lib/temple/filters/string_splitter.rb +141 -0
  20. data/lib/temple/filters/validator.rb +1 -1
  21. data/lib/temple/generator.rb +32 -6
  22. data/lib/temple/generators/array.rb +2 -2
  23. data/lib/temple/generators/array_buffer.rb +6 -5
  24. data/lib/temple/generators/erb.rb +1 -5
  25. data/lib/temple/generators/rails_output_buffer.rb +7 -8
  26. data/lib/temple/generators/string_buffer.rb +2 -2
  27. data/lib/temple/html/attribute_merger.rb +6 -11
  28. data/lib/temple/html/attribute_remover.rb +1 -1
  29. data/lib/temple/html/attribute_sorter.rb +1 -1
  30. data/lib/temple/html/fast.rb +49 -44
  31. data/lib/temple/html/pretty.rb +34 -43
  32. data/lib/temple/html/safe.rb +23 -0
  33. data/lib/temple/map.rb +105 -0
  34. data/lib/temple/mixins/dispatcher.rb +10 -7
  35. data/lib/temple/mixins/engine_dsl.rb +42 -67
  36. data/lib/temple/mixins/grammar_dsl.rb +10 -8
  37. data/lib/temple/mixins/options.rb +26 -24
  38. data/lib/temple/mixins/template.rb +3 -3
  39. data/lib/temple/static_analyzer.rb +77 -0
  40. data/lib/temple/templates/rails.rb +17 -36
  41. data/lib/temple/templates/tilt.rb +7 -13
  42. data/lib/temple/utils.rb +27 -29
  43. data/lib/temple/version.rb +1 -1
  44. data/lib/temple.rb +8 -4
  45. data/spec/engine_spec.rb +189 -0
  46. data/{test/test_erb.rb → spec/erb_spec.rb} +12 -13
  47. data/spec/filter_spec.rb +29 -0
  48. data/{test/filters/test_code_merger.rb → spec/filters/code_merger_spec.rb} +7 -7
  49. data/{test/filters/test_control_flow.rb → spec/filters/control_flow_spec.rb} +13 -13
  50. data/{test/filters/test_dynamic_inliner.rb → spec/filters/dynamic_inliner_spec.rb} +18 -18
  51. data/{test/filters/test_eraser.rb → spec/filters/eraser_spec.rb} +13 -13
  52. data/{test/filters/test_escapable.rb → spec/filters/escapable_spec.rb} +15 -13
  53. data/{test/filters/test_multi_flattener.rb → spec/filters/multi_flattener_spec.rb} +4 -4
  54. data/spec/filters/static_analyzer_spec.rb +35 -0
  55. data/{test/filters/test_static_merger.rb → spec/filters/static_merger_spec.rb} +7 -7
  56. data/spec/filters/string_splitter_spec.rb +50 -0
  57. data/spec/generator_spec.rb +158 -0
  58. data/spec/grammar_spec.rb +47 -0
  59. data/{test/html/test_attribute_merger.rb → spec/html/attribute_merger_spec.rb} +11 -11
  60. data/{test/html/test_attribute_remover.rb → spec/html/attribute_remover_spec.rb} +7 -7
  61. data/{test/html/test_attribute_sorter.rb → spec/html/attribute_sorter_spec.rb} +8 -8
  62. data/{test/html/test_fast.rb → spec/html/fast_spec.rb} +23 -23
  63. data/{test/html/test_pretty.rb → spec/html/pretty_spec.rb} +9 -15
  64. data/spec/map_spec.rb +39 -0
  65. data/{test/mixins/test_dispatcher.rb → spec/mixins/dispatcher_spec.rb} +12 -12
  66. data/{test/mixins/test_grammar_dsl.rb → spec/mixins/grammar_dsl_spec.rb} +19 -19
  67. data/{test/helper.rb → spec/spec_helper.rb} +9 -15
  68. data/spec/static_analyzer_spec.rb +39 -0
  69. data/spec/utils_spec.rb +39 -0
  70. data/temple.gemspec +4 -2
  71. metadata +62 -63
  72. data/.travis.yml +0 -13
  73. data/lib/temple/hash.rb +0 -104
  74. data/test/test_engine.rb +0 -170
  75. data/test/test_filter.rb +0 -29
  76. data/test/test_generator.rb +0 -136
  77. data/test/test_grammar.rb +0 -47
  78. data/test/test_hash.rb +0 -39
  79. data/test/test_utils.rb +0 -39
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Temple::HTML::Fast do
4
4
  before do
@@ -6,37 +6,37 @@ describe Temple::HTML::Fast do
6
6
  end
7
7
 
8
8
  it 'should compile html doctype' do
9
- @html.call([:multi, [:html, :doctype, '5']]).should.equal [:multi, [:static, '<!DOCTYPE html>']]
10
- @html.call([:multi, [:html, :doctype, 'html']]).should.equal [:multi, [:static, '<!DOCTYPE html>']]
11
- @html.call([:multi, [:html, :doctype, '1.1']]).should.equal [:multi,
9
+ expect(@html.call([:multi, [:html, :doctype, '5']])).to eq([:multi, [:static, '<!DOCTYPE html>']])
10
+ expect(@html.call([:multi, [:html, :doctype, 'html']])).to eq([:multi, [:static, '<!DOCTYPE html>']])
11
+ expect(@html.call([:multi, [:html, :doctype, '1.1']])).to eq [:multi,
12
12
  [:static, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">']]
13
13
  end
14
14
 
15
15
  it 'should compile xml encoding' do
16
- @html.call([:html, :doctype, 'xml latin1']).should.equal [:static, "<?xml version=\"1.0\" encoding=\"latin1\" ?>"]
16
+ expect(@html.call([:html, :doctype, 'xml latin1'])).to eq([:static, "<?xml version=\"1.0\" encoding=\"latin1\" ?>"])
17
17
  end
18
18
 
19
19
  it 'should compile html comment' do
20
- @html.call([:html, :comment, [:static, 'test']]).should.equal [:multi, [:static, "<!--"], [:static, "test"], [:static, "-->"]]
20
+ expect(@html.call([:html, :comment, [:static, 'test']])).to eq([:multi, [:static, "<!--"], [:static, "test"], [:static, "-->"]])
21
21
  end
22
22
 
23
23
  it 'should compile js wrapped in comments' do
24
- Temple::HTML::Fast.new(:js_wrapper => nil).call([:html, :js, [:static, 'test']]).should.equal [:static, "test"]
25
- Temple::HTML::Fast.new(:js_wrapper => :comment).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]]
26
- Temple::HTML::Fast.new(:js_wrapper => :cdata).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]]
27
- Temple::HTML::Fast.new(:js_wrapper => :both).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n//-->"]]
24
+ expect(Temple::HTML::Fast.new(js_wrapper: nil).call([:html, :js, [:static, 'test']])).to eq([:static, "test"])
25
+ expect(Temple::HTML::Fast.new(js_wrapper: :comment).call([:html, :js, [:static, 'test']])).to eq([:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]])
26
+ expect(Temple::HTML::Fast.new(js_wrapper: :cdata).call([:html, :js, [:static, 'test']])).to eq([:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]])
27
+ expect(Temple::HTML::Fast.new(js_wrapper: :both).call([:html, :js, [:static, 'test']])).to eq([:multi, [:static, "<!--\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n//-->"]])
28
28
  end
29
29
 
30
30
  it 'should guess default js comment' do
31
- Temple::HTML::Fast.new(:js_wrapper => :guess, :format => :xhtml).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]]
32
- Temple::HTML::Fast.new(:js_wrapper => :guess, :format => :html).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]]
31
+ expect(Temple::HTML::Fast.new(js_wrapper: :guess, format: :xhtml).call([:html, :js, [:static, 'test']])).to eq([:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]])
32
+ expect(Temple::HTML::Fast.new(js_wrapper: :guess, format: :html).call([:html, :js, [:static, 'test']])).to eq([:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]])
33
33
  end
34
34
 
35
35
  it 'should compile autoclosed html tag' do
36
- @html.call([:html, :tag,
36
+ expect(@html.call([:html, :tag,
37
37
  'img', [:attrs],
38
38
  [:multi, [:newline]]
39
- ]).should.equal [:multi,
39
+ ])).to eq [:multi,
40
40
  [:static, "<img"],
41
41
  [:attrs],
42
42
  [:static, " />"],
@@ -44,18 +44,18 @@ describe Temple::HTML::Fast do
44
44
  end
45
45
 
46
46
  it 'should compile explicitly closed html tag' do
47
- @html.call([:html, :tag,
47
+ expect(@html.call([:html, :tag,
48
48
  'closed', [:attrs]
49
- ]).should.equal [:multi,
49
+ ])).to eq [:multi,
50
50
  [:static, "<closed"],
51
51
  [:attrs],
52
52
  [:static, " />"]]
53
53
  end
54
54
 
55
55
  it 'should compile html with content' do
56
- @html.call([:html, :tag,
56
+ expect(@html.call([:html, :tag,
57
57
  'div', [:attrs], [:content]
58
- ]).should.equal [:multi,
58
+ ])).to eq [:multi,
59
59
  [:static, "<div"],
60
60
  [:attrs],
61
61
  [:static, ">"],
@@ -64,13 +64,13 @@ describe Temple::HTML::Fast do
64
64
  end
65
65
 
66
66
  it 'should compile html with attrs' do
67
- @html.call([:html, :tag,
67
+ expect(@html.call([:html, :tag,
68
68
  'div',
69
69
  [:html, :attrs,
70
70
  [:html, :attr, 'id', [:static, 'test']],
71
71
  [:html, :attr, 'class', [:dynamic, 'block']]],
72
72
  [:content]
73
- ]).should.equal [:multi,
73
+ ])).to eq [:multi,
74
74
  [:static, "<div"],
75
75
  [:multi,
76
76
  [:multi, [:static, " id=\""], [:static, "test"], [:static, '"']],
@@ -82,16 +82,16 @@ describe Temple::HTML::Fast do
82
82
 
83
83
  it 'should keep codes intact' do
84
84
  exp = [:multi, [:code, 'foo']]
85
- @html.call(exp).should.equal exp
85
+ expect(@html.call(exp)).to eq(exp)
86
86
  end
87
87
 
88
88
  it 'should keep statics intact' do
89
89
  exp = [:multi, [:static, '<']]
90
- @html.call(exp).should.equal exp
90
+ expect(@html.call(exp)).to eq(exp)
91
91
  end
92
92
 
93
93
  it 'should keep dynamic intact' do
94
94
  exp = [:multi, [:dynamic, 'foo']]
95
- @html.call(exp).should.equal exp
95
+ expect(@html.call(exp)).to eq(exp)
96
96
  end
97
97
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Temple::HTML::Pretty do
4
4
  before do
@@ -6,9 +6,9 @@ describe Temple::HTML::Pretty do
6
6
  end
7
7
 
8
8
  it 'should indent nested tags' do
9
- @html.call([:html, :tag, 'div', [:multi],
9
+ expect(@html.call([:html, :tag, 'div', [:multi],
10
10
  [:html, :tag, 'p', [:multi], [:multi, [:static, 'text'], [:dynamic, 'code']]]
11
- ]).should.equal [:multi,
11
+ ])).to eq [:multi,
12
12
  [:code, "_temple_html_pretty1 = /<code|<pre|<textarea/"],
13
13
  [:multi,
14
14
  [:static, "<div"],
@@ -20,18 +20,15 @@ describe Temple::HTML::Pretty do
20
20
  [:static, ">"],
21
21
  [:multi,
22
22
  [:static, "\n text"],
23
- [:multi,
24
- [:code, "_temple_html_pretty2 = (code).to_s"],
25
- [:code, "if _temple_html_pretty1 !~ _temple_html_pretty2; _temple_html_pretty2 = _temple_html_pretty2.gsub(\"\n\", \"\\n \"); end"],
26
- [:dynamic, "_temple_html_pretty2"]]],
23
+ [:dynamic, "::Temple::Utils.indent_dynamic((code), false, \"\\n \", _temple_html_pretty1)"]],
27
24
  [:static, "\n </p>"]],
28
25
  [:static, "\n</div>"]]]
29
26
  end
30
27
 
31
28
  it 'should not indent preformatted tags' do
32
- @html.call([:html, :tag, 'pre', [:multi],
29
+ expect(@html.call([:html, :tag, 'pre', [:multi],
33
30
  [:html, :tag, 'p', [:multi], [:static, 'text']]
34
- ]).should.equal [:multi,
31
+ ])).to eq [:multi,
35
32
  [:code, "_temple_html_pretty1 = /<code|<pre|<textarea/"],
36
33
  [:multi,
37
34
  [:static, "<pre"],
@@ -48,14 +45,11 @@ describe Temple::HTML::Pretty do
48
45
 
49
46
  it 'should not escape html_safe strings' do
50
47
  with_html_safe do
51
- @html.call(
48
+ expect(@html.call(
52
49
  [:dynamic, '"text<".html_safe']
53
- ).should.equal [:multi,
50
+ )).to eq [:multi,
54
51
  [:code, "_temple_html_pretty1 = /<code|<pre|<textarea/"],
55
- [:multi,
56
- [:code, "_temple_html_pretty2 = (\"text<\".html_safe).to_s"],
57
- [:code, "if _temple_html_pretty1 !~ _temple_html_pretty2; _temple_html_pretty3 = _temple_html_pretty2.html_safe?; _temple_html_pretty2 = _temple_html_pretty2.gsub(\"\n\", \"\\n\"); _temple_html_pretty2 = _temple_html_pretty2.html_safe if _temple_html_pretty3; end"],
58
- [:dynamic, "_temple_html_pretty2"]]]
52
+ [:dynamic, "::Temple::Utils.indent_dynamic((\"text<\".html_safe), nil, \"\\n\", _temple_html_pretty1)"]]
59
53
  end
60
54
  end
61
55
  end
data/spec/map_spec.rb ADDED
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Temple::ImmutableMap do
4
+ it 'has read accessor' do
5
+ hash = Temple::ImmutableMap.new({a: 1},{b: 2, a: 3})
6
+ expect(hash[:a]).to eq(1)
7
+ expect(hash[:b]).to eq(2)
8
+ end
9
+
10
+ it 'has include?' do
11
+ hash = Temple::ImmutableMap.new({a: 1},{b: 2, a: 3})
12
+ expect(hash).to include(:a)
13
+ expect(hash).to include(:b)
14
+ expect(hash).not_to include(:c)
15
+ end
16
+
17
+ it 'has values' do
18
+ expect(Temple::ImmutableMap.new({a: 1},{b: 2, a: 3}).values.sort).to eq([1,2])
19
+ end
20
+
21
+ it 'has keys' do
22
+ expect(Temple::ImmutableMap.new({a: 1},{b: 2, a: 3}).keys).to eq([:a,:b])
23
+ end
24
+
25
+ it 'has to_a' do
26
+ expect(Temple::ImmutableMap.new({a: 1},{b: 2, a: 3}).to_a).to eq([[:a, 1], [:b, 2]])
27
+ end
28
+ end
29
+
30
+ describe Temple::MutableMap do
31
+ it 'has write accessor' do
32
+ parent = {a: 1}
33
+ hash = Temple::MutableMap.new(parent)
34
+ expect(hash[:a]).to eq(1)
35
+ hash[:a] = 2
36
+ expect(hash[:a]).to eq(2)
37
+ expect(parent[:a]).to eq(1)
38
+ end
39
+ end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'spec_helper'
2
2
 
3
3
  class FilterWithDispatcherMixin
4
4
  include Temple::Mixins::Dispatcher
@@ -40,31 +40,31 @@ describe Temple::Mixins::Dispatcher do
40
40
  end
41
41
 
42
42
  it 'should return unhandled expressions' do
43
- @filter.call([:unhandled]).should.equal [:unhandled]
43
+ expect(@filter.call([:unhandled])).to eq([:unhandled])
44
44
  end
45
45
 
46
46
  it 'should dispatch first level' do
47
- @filter.call([:test, 42]).should.equal [:on_test, 42]
47
+ expect(@filter.call([:test, 42])).to eq([:on_test, 42])
48
48
  end
49
49
 
50
50
  it 'should dispatch second level' do
51
- @filter.call([:second, :test, 42]).should.equal [:on_second_test, 42]
51
+ expect(@filter.call([:second, :test, 42])).to eq([:on_second_test, 42])
52
52
  end
53
53
 
54
54
  it 'should dispatch second level if prefixed' do
55
- @filter.call([:test, :check, 42]).should.equal [:on_check, 42]
55
+ expect(@filter.call([:test, :check, 42])).to eq([:on_check, 42])
56
56
  end
57
57
 
58
58
  it 'should dispatch parent level' do
59
- @filter.call([:a, 42]).should == [:a, 42]
60
- @filter.call([:a, :b, 42]).should == [:on_ab, 42]
61
- @filter.call([:a, :b, :test, 42]).should == [:on_ab_test, 42]
62
- @filter.call([:a, :b, :c, 42]).should == [:on_ab, :c, 42]
63
- @filter.call([:a, :b, :c, :d, 42]).should == [:on_ab, :c, :d, 42]
64
- @filter.call([:a, :b, :c, :d, :test, 42]).should == [:on_abcd_test, 42]
59
+ expect(@filter.call([:a, 42])).to eq [:a, 42]
60
+ expect(@filter.call([:a, :b, 42])).to eq [:on_ab, 42]
61
+ expect(@filter.call([:a, :b, :test, 42])).to eq [:on_ab_test, 42]
62
+ expect(@filter.call([:a, :b, :c, 42])).to eq [:on_ab, :c, 42]
63
+ expect(@filter.call([:a, :b, :c, :d, 42])).to eq [:on_ab, :c, :d, 42]
64
+ expect(@filter.call([:a, :b, :c, :d, :test, 42])).to eq [:on_abcd_test, 42]
65
65
  end
66
66
 
67
67
  it 'should dispatch zero level' do
68
- FilterWithDispatcherMixinAndOn.new.call([:foo,42]).should == [:on_zero, :foo, 42]
68
+ expect(FilterWithDispatcherMixinAndOn.new.call([:foo,42])).to eq [:on_zero, :foo, 42]
69
69
  end
70
70
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'spec_helper'
2
2
 
3
3
  module BasicGrammar
4
4
  extend Temple::Mixins::GrammarDSL
@@ -28,42 +28,42 @@ end
28
28
 
29
29
  describe Temple::Mixins::GrammarDSL do
30
30
  it 'should support class types' do
31
- BasicGrammar.should.match :symbol
32
- BasicGrammar.should.not.match [:symbol]
33
- BasicGrammar.should.not.match 'string'
34
- BasicGrammar.should.not.match ['string']
31
+ expect(BasicGrammar).to be_match(:symbol)
32
+ expect(BasicGrammar).not_to be_match([:symbol])
33
+ expect(BasicGrammar).not_to be_match('string')
34
+ expect(BasicGrammar).not_to be_match(['string'])
35
35
  end
36
36
 
37
37
  it 'should support value types' do
38
- BasicGrammar.should.match 42
39
- BasicGrammar.should.not.match 43
38
+ expect(BasicGrammar).to be_match(42)
39
+ expect(BasicGrammar).not_to be_match(43)
40
40
  end
41
41
 
42
42
  it 'should support nesting' do
43
- BasicGrammar.should.match [:zero_or_more, [:zero_or_more]]
43
+ expect(BasicGrammar).to be_match([:zero_or_more, [:zero_or_more]])
44
44
  end
45
45
 
46
46
  it 'should support *' do
47
- BasicGrammar.should.match [:zero_or_more]
48
- BasicGrammar.should.match [:zero_or_more, nil, 42]
47
+ expect(BasicGrammar).to be_match([:zero_or_more])
48
+ expect(BasicGrammar).to be_match([:zero_or_more, nil, 42])
49
49
  end
50
50
 
51
51
  it 'should support +' do
52
- BasicGrammar.should.not.match [:one_or_more]
53
- BasicGrammar.should.match [:one_or_more, 42]
54
- BasicGrammar.should.match [:one_or_more, 42, nil]
52
+ expect(BasicGrammar).not_to be_match([:one_or_more])
53
+ expect(BasicGrammar).to be_match( [:one_or_more, 42])
54
+ expect(BasicGrammar).to be_match( [:one_or_more, 42, nil])
55
55
  end
56
56
 
57
57
  it 'should support ?' do
58
- BasicGrammar.should.not.match [:zero_or_one, nil, 42]
59
- BasicGrammar.should.match [:zero_or_one]
60
- BasicGrammar.should.match [:zero_or_one, 42]
58
+ expect(BasicGrammar).not_to be_match([:zero_or_one, nil, 42])
59
+ expect(BasicGrammar).to be_match( [:zero_or_one])
60
+ expect(BasicGrammar).to be_match( [:zero_or_one, 42])
61
61
  end
62
62
 
63
63
  it 'should support extended grammars' do
64
- ExtendedGrammar.should.match [:extended, [:extended, 42]]
65
- BasicGrammar.should.not.match [:zero_or_more, [:extended, nil]]
66
- BasicGrammar.should.not.match [:extended, [:extended, 42]]
64
+ expect(ExtendedGrammar).to be_match([:extended, [:extended, 42]])
65
+ expect(BasicGrammar).not_to be_match([:zero_or_more, [:extended, nil]])
66
+ expect(BasicGrammar).not_to be_match([:extended, [:extended, 42]])
67
67
  end
68
68
 
69
69
  it 'should have validate!' do
@@ -1,20 +1,10 @@
1
- require 'bacon'
2
1
  require 'temple'
3
2
 
4
- class HtmlSafeString < String
5
- def html_safe?
6
- true
7
- end
8
-
9
- def to_s
10
- self
11
- end
12
- end
13
-
14
3
  module TestHelper
15
4
  def with_html_safe
5
+ require 'temple/html/safe'
16
6
  String.send(:define_method, :html_safe?) { false }
17
- String.send(:define_method, :html_safe) { HtmlSafeString.new(self) }
7
+ String.send(:define_method, :html_safe) { Temple::HTML::SafeString.new(self) }
18
8
  yield
19
9
  ensure
20
10
  String.send(:undef_method, :html_safe?) if String.method_defined?(:html_safe?)
@@ -22,14 +12,18 @@ module TestHelper
22
12
  end
23
13
 
24
14
  def grammar_validate(grammar, exp, message)
25
- lambda { grammar.validate!(exp) }.should.raise(Temple::InvalidExpression).message.should.equal message
15
+ expect { grammar.validate!(exp) }.to raise_error(Temple::InvalidExpression, message)
26
16
  end
27
17
 
28
18
  def erb(src, options = {})
29
19
  Temple::ERB::Template.new(options) { src }.render
30
20
  end
21
+
22
+ def erubi(src, options = {})
23
+ Tilt::ErubiTemplate.new(options) { src }.render
24
+ end
31
25
  end
32
26
 
33
- class Bacon::Context
34
- include TestHelper
27
+ RSpec.configure do |config|
28
+ config.include TestHelper
35
29
  end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Temple::StaticAnalyzer do
4
+ describe '.available?' do
5
+ it 'should return true if its dependency is available' do
6
+ expect(Temple::StaticAnalyzer.available?).to eq(defined?(Ripper) && Ripper.respond_to?(:lex))
7
+ end
8
+ end
9
+
10
+ if Temple::StaticAnalyzer.available?
11
+ describe '.static?' do
12
+ it 'should return true if given Ruby expression is static' do
13
+ ['true', 'false', '"hello world"', "[1, { 2 => 3 }]", "[\n1,\n]"].each do |exp|
14
+ expect(Temple::StaticAnalyzer.static?(exp)).to eq(true)
15
+ end
16
+ end
17
+
18
+ it 'should return false if given Ruby expression is dynamic' do
19
+ ['1 + 2', 'variable', 'method_call(a)', 'CONSTANT'].each do |exp|
20
+ expect(Temple::StaticAnalyzer.static?(exp)).to eq(false)
21
+ end
22
+ end
23
+ end
24
+
25
+ describe '.syntax_error?' do
26
+ it 'should return false if given Ruby expression is valid' do
27
+ ['Foo.bar.baz { |c| c.d! }', '{ foo: bar }'].each do |exp|
28
+ expect(Temple::StaticAnalyzer.syntax_error?(exp)).to eq(false)
29
+ end
30
+ end
31
+
32
+ it 'should return true if given Ruby expression is invalid' do
33
+ ['Foo.bar.baz { |c| c.d! ', ' foo: bar '].each do |exp|
34
+ expect(Temple::StaticAnalyzer.syntax_error?(exp)).to eq(true)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ class UniqueTest
4
+ include Temple::Utils
5
+ end
6
+
7
+ describe Temple::Utils do
8
+ it 'has empty_exp?' do
9
+ expect(Temple::Utils.empty_exp?([:multi])).to eq(true)
10
+ expect(Temple::Utils.empty_exp?([:multi, [:multi]])).to eq(true)
11
+ expect(Temple::Utils.empty_exp?([:multi, [:multi, [:newline]], [:newline]])).to eq(true)
12
+ expect(Temple::Utils.empty_exp?([:multi])).to eq(true)
13
+ expect(Temple::Utils.empty_exp?([:multi, [:multi, [:static, 'text']]])).to eq(false)
14
+ expect(Temple::Utils.empty_exp?([:multi, [:newline], [:multi, [:dynamic, 'text']]])).to eq(false)
15
+ end
16
+
17
+ it 'has unique_name' do
18
+ u = UniqueTest.new
19
+ expect(u.unique_name).to eq('_uniquetest1')
20
+ expect(u.unique_name).to eq('_uniquetest2')
21
+ expect(UniqueTest.new.unique_name).to eq('_uniquetest1')
22
+ end
23
+
24
+ it 'has escape_html' do
25
+ expect(Temple::Utils.escape_html('<')).to eq('&lt;')
26
+ end
27
+
28
+ it 'should escape unsafe html strings' do
29
+ with_html_safe do
30
+ expect(Temple::Utils.escape_html_safe('<')).to eq('&lt;')
31
+ end
32
+ end
33
+
34
+ it 'should not escape safe html strings' do
35
+ with_html_safe do
36
+ expect(Temple::Utils.escape_html_safe('<'.html_safe)).to eq('<')
37
+ end
38
+ end
39
+ end
data/temple.gemspec CHANGED
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  require File.dirname(__FILE__) + '/lib/temple/version'
3
2
  require 'date'
4
3
 
@@ -18,9 +17,12 @@ Gem::Specification.new do |s|
18
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
18
  s.license = 'MIT'
20
19
 
20
+ s.required_ruby_version = '>= 2.5.0'
21
+
21
22
  # Tilt is only development dependency because most parts of Temple
22
23
  # can be used without it.
23
24
  s.add_development_dependency('tilt')
24
- s.add_development_dependency('bacon')
25
+ s.add_development_dependency('rspec')
25
26
  s.add_development_dependency('rake')
27
+ s.add_development_dependency('erubi')
26
28
  end