haml 5.0.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +38 -0
  5. data/CHANGELOG.md +43 -19
  6. data/Gemfile +18 -0
  7. data/README.md +1 -0
  8. data/Rakefile +6 -12
  9. data/TODO +24 -0
  10. data/benchmark.rb +66 -0
  11. data/haml.gemspec +39 -0
  12. data/lib/haml/.gitattributes +1 -0
  13. data/lib/haml/attribute_parser.rb +4 -0
  14. data/lib/haml/compiler.rb +2 -1
  15. data/lib/haml/helpers/safe_erubi_template.rb +0 -8
  16. data/lib/haml/options.rb +3 -0
  17. data/lib/haml/railtie.rb +11 -2
  18. data/lib/haml/temple_engine.rb +1 -0
  19. data/lib/haml/version.rb +1 -1
  20. data/test/attribute_parser_test.rb +4 -0
  21. data/test/engine_test.rb +7 -0
  22. data/test/filters_test.rb +2 -7
  23. data/test/template_test.rb +10 -0
  24. data/yard/default/.gitignore +1 -0
  25. data/yard/default/fulldoc/html/css/common.sass +15 -0
  26. data/yard/default/layout/html/footer.erb +12 -0
  27. metadata +13 -65
  28. data/test/erb/_av_partial_1.erb +0 -12
  29. data/test/erb/_av_partial_2.erb +0 -8
  30. data/test/erb/action_view.erb +0 -62
  31. data/test/erb/standard.erb +0 -55
  32. data/test/gemfiles/Gemfile.rails-4.0.x +0 -11
  33. data/test/gemfiles/Gemfile.rails-4.0.x.lock +0 -87
  34. data/test/gemfiles/Gemfile.rails-4.1.x +0 -5
  35. data/test/gemfiles/Gemfile.rails-4.2.x +0 -5
  36. data/test/gemfiles/Gemfile.rails-5.0.x +0 -4
  37. data/test/markaby/standard.mab +0 -52
  38. data/test/mocks/article.rb +0 -6
  39. data/test/results/bemit.xhtml +0 -4
  40. data/test/results/content_for_layout.xhtml +0 -12
  41. data/test/results/eval_suppressed.xhtml +0 -9
  42. data/test/results/helpers.xhtml +0 -72
  43. data/test/results/helpful.xhtml +0 -13
  44. data/test/results/just_stuff.xhtml +0 -71
  45. data/test/results/list.xhtml +0 -12
  46. data/test/results/nuke_inner_whitespace.xhtml +0 -40
  47. data/test/results/nuke_outer_whitespace.xhtml +0 -140
  48. data/test/results/original_engine.xhtml +0 -20
  49. data/test/results/partial_layout.xhtml +0 -6
  50. data/test/results/partial_layout_erb.xhtml +0 -6
  51. data/test/results/partials.xhtml +0 -22
  52. data/test/results/render_layout.xhtml +0 -3
  53. data/test/results/silent_script.xhtml +0 -74
  54. data/test/results/standard.xhtml +0 -159
  55. data/test/results/tag_parsing.xhtml +0 -23
  56. data/test/results/very_basic.xhtml +0 -5
  57. data/test/results/whitespace_handling.xhtml +0 -91
  58. data/test/template_test_helper.rb +0 -38
  59. data/test/templates/_av_partial_1.haml +0 -9
  60. data/test/templates/_av_partial_2.haml +0 -5
  61. data/test/templates/_layout.erb +0 -3
  62. data/test/templates/_layout_for_partial.haml +0 -3
  63. data/test/templates/_partial.haml +0 -8
  64. data/test/templates/_text_area.haml +0 -3
  65. data/test/templates/_text_area_helper.html.haml +0 -4
  66. data/test/templates/action_view.haml +0 -47
  67. data/test/templates/bemit.haml +0 -3
  68. data/test/templates/breakage.haml +0 -8
  69. data/test/templates/content_for_layout.haml +0 -8
  70. data/test/templates/eval_suppressed.haml +0 -11
  71. data/test/templates/helpers.haml +0 -55
  72. data/test/templates/helpful.haml +0 -11
  73. data/test/templates/just_stuff.haml +0 -86
  74. data/test/templates/list.haml +0 -12
  75. data/test/templates/nuke_inner_whitespace.haml +0 -32
  76. data/test/templates/nuke_outer_whitespace.haml +0 -144
  77. data/test/templates/original_engine.haml +0 -17
  78. data/test/templates/partial_layout.haml +0 -3
  79. data/test/templates/partial_layout_erb.erb +0 -4
  80. data/test/templates/partialize.haml +0 -1
  81. data/test/templates/partials.haml +0 -12
  82. data/test/templates/render_layout.haml +0 -2
  83. data/test/templates/silent_script.haml +0 -45
  84. data/test/templates/standard.haml +0 -43
  85. data/test/templates/standard_ugly.haml +0 -1
  86. data/test/templates/tag_parsing.haml +0 -21
  87. data/test/templates/very_basic.haml +0 -4
  88. data/test/templates/whitespace_handling.haml +0 -87
  89. data/test/templates/with_bom.haml +0 -1
  90. data/test/test_helper.rb +0 -99
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Haml
3
- VERSION = "5.0.0"
3
+ VERSION = "5.0.1"
4
4
  end
@@ -65,6 +65,10 @@ class AttributeParserTeset < Haml::TestCase
65
65
  it { assert_parse(nil, '%Q[f#{o}o] => bar ') }
66
66
  end
67
67
 
68
+ describe 'string interpolation' do
69
+ it { assert_parse({ 'foo' => %q["#{bar baz, '/abc/'}"] }, %q[{foo: "#{bar baz, '/abc/'}"}]) }
70
+ end
71
+
68
72
  describe 'multi lines' do
69
73
  it { assert_parse({ 'a' => 'b', 'c' => 'd' }, "{a: b,\nc: d}") }
70
74
  end
@@ -151,6 +151,13 @@ class EngineTest < Haml::TestCase
151
151
  assert_equal("<p class='3'>foo</p>", render("%p{:class => 1+2} foo").chomp)
152
152
  end
153
153
 
154
+ def test_attributes_with_interpolation
155
+ assert_equal("<iframe id='test' src='http://www.google.com/abc/'></iframe>\n", render(<<-'HAML'))
156
+ - base_url = "http://www.google.com"
157
+ %iframe#test{src: "#{File.join base_url, '/abc/'}"}
158
+ HAML
159
+ end
160
+
154
161
  def test_class_attr_with_array
155
162
  assert_equal("<p class='a b'>foo</p>\n", render("%p{:class => %w[a b]} foo")) # basic
156
163
  assert_equal("<p class='a b css'>foo</p>\n", render("%p.css{:class => %w[a b]} foo")) # merge with css
@@ -126,23 +126,18 @@ end
126
126
 
127
127
  class ErbFilterTest < Haml::TestCase
128
128
  test "multiline expressions should work" do
129
- html = "foobarbaz\n"
129
+ html = "foobarbaz\n\n"
130
130
  haml = %Q{:erb\n <%= "foo" +\n "bar" +\n "baz" %>}
131
131
  assert_equal(html, render(haml))
132
132
  end
133
133
 
134
134
  test "should evaluate in the same context as Haml" do
135
135
  haml = ":erb\n <%= foo %>"
136
- html = "bar\n"
136
+ html = "bar\n\n"
137
137
  scope = Object.new.instance_eval {foo = "bar"; nil if foo; binding}
138
138
  assert_equal(html, render(haml, :scope => scope))
139
139
  end
140
140
 
141
- test "should use Rails's XSS safety features" do
142
- assert_equal("&lt;img&gt;\n", render(":erb\n <%= '<img>' %>"))
143
- assert_equal("<img>\n", render(":erb\n <%= '<img>'.html_safe %>"))
144
- end
145
-
146
141
  end
147
142
 
148
143
  class JavascriptFilterTest < Haml::TestCase
@@ -250,6 +250,16 @@ HAML
250
250
  assert_equal("Foo & Bar &amp; Baz\n", render('Foo #{Haml::Util.html_safe("&")} Bar #{"&"} Baz', :action_view))
251
251
  end
252
252
 
253
+ def test_xss_protection_with_erb_filter
254
+ if defined?(Haml::SafeErubiTemplate)
255
+ assert_equal("&lt;img&gt;\n\n", render(":erb\n <%= '<img>' %>", :action_view))
256
+ assert_equal("<img>\n\n", render(":erb\n <%= '<img>'.html_safe %>", :action_view))
257
+ else # For Haml::SafeErubisTemplate
258
+ assert_equal("&lt;img&gt;\n", render(":erb\n <%= '<img>' %>", :action_view))
259
+ assert_equal("<img>\n", render(":erb\n <%= '<img>'.html_safe %>", :action_view))
260
+ end
261
+ end
262
+
253
263
  def test_rendered_string_is_html_safe
254
264
  assert(render("Foo").html_safe?)
255
265
  end
@@ -0,0 +1 @@
1
+ *.css
@@ -0,0 +1,15 @@
1
+ #filecontents
2
+ *:target, dt:target + dd
3
+ background-color: #ccf
4
+ border: 1px solid #88b
5
+ dt
6
+ font-weight: bold
7
+ dd
8
+ margin:
9
+ left: 0
10
+ bottom: 0.7em
11
+ padding-left: 3em
12
+ dt:target
13
+ border-bottom-style: none
14
+ & + dd
15
+ border-top-style: none
@@ -0,0 +1,12 @@
1
+ <%= superb :footer %>
2
+ <% if ENV["ANALYTICS"] %>
3
+ <script type="text/javascript">
4
+ var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
5
+ document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
6
+ </script>
7
+ <script type="text/javascript">
8
+ try {
9
+ var pageTracker = _gat._getTracker("<%= ENV["ANALYTICS"] %>");
10
+ pageTracker._trackPageview();
11
+ } catch(err) {}</script>
12
+ <% end %>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haml
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 5.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natalie Weizenbaum
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-04-27 00:00:00.000000000 Z
14
+ date: 2017-05-03 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: temple
@@ -111,15 +111,23 @@ executables:
111
111
  extensions: []
112
112
  extra_rdoc_files: []
113
113
  files:
114
+ - ".gitignore"
115
+ - ".gitmodules"
116
+ - ".travis.yml"
114
117
  - ".yardopts"
115
118
  - CHANGELOG.md
116
119
  - FAQ.md
120
+ - Gemfile
117
121
  - MIT-LICENSE
118
122
  - README.md
119
123
  - REFERENCE.md
120
124
  - Rakefile
125
+ - TODO
126
+ - benchmark.rb
121
127
  - bin/haml
128
+ - haml.gemspec
122
129
  - lib/haml.rb
130
+ - lib/haml/.gitattributes
123
131
  - lib/haml/attribute_builder.rb
124
132
  - lib/haml/attribute_compiler.rb
125
133
  - lib/haml/attribute_parser.rb
@@ -151,76 +159,16 @@ files:
151
159
  - lib/haml/version.rb
152
160
  - test/attribute_parser_test.rb
153
161
  - test/engine_test.rb
154
- - test/erb/_av_partial_1.erb
155
- - test/erb/_av_partial_2.erb
156
- - test/erb/action_view.erb
157
- - test/erb/standard.erb
158
162
  - test/filters_test.rb
159
- - test/gemfiles/Gemfile.rails-4.0.x
160
- - test/gemfiles/Gemfile.rails-4.0.x.lock
161
- - test/gemfiles/Gemfile.rails-4.1.x
162
- - test/gemfiles/Gemfile.rails-4.2.x
163
- - test/gemfiles/Gemfile.rails-5.0.x
164
163
  - test/helper_test.rb
165
- - test/markaby/standard.mab
166
- - test/mocks/article.rb
167
164
  - test/options_test.rb
168
165
  - test/parser_test.rb
169
- - test/results/bemit.xhtml
170
- - test/results/content_for_layout.xhtml
171
- - test/results/eval_suppressed.xhtml
172
- - test/results/helpers.xhtml
173
- - test/results/helpful.xhtml
174
- - test/results/just_stuff.xhtml
175
- - test/results/list.xhtml
176
- - test/results/nuke_inner_whitespace.xhtml
177
- - test/results/nuke_outer_whitespace.xhtml
178
- - test/results/original_engine.xhtml
179
- - test/results/partial_layout.xhtml
180
- - test/results/partial_layout_erb.xhtml
181
- - test/results/partials.xhtml
182
- - test/results/render_layout.xhtml
183
- - test/results/silent_script.xhtml
184
- - test/results/standard.xhtml
185
- - test/results/tag_parsing.xhtml
186
- - test/results/very_basic.xhtml
187
- - test/results/whitespace_handling.xhtml
188
166
  - test/template_test.rb
189
- - test/template_test_helper.rb
190
- - test/templates/_av_partial_1.haml
191
- - test/templates/_av_partial_2.haml
192
- - test/templates/_layout.erb
193
- - test/templates/_layout_for_partial.haml
194
- - test/templates/_partial.haml
195
- - test/templates/_text_area.haml
196
- - test/templates/_text_area_helper.html.haml
197
- - test/templates/action_view.haml
198
- - test/templates/bemit.haml
199
- - test/templates/breakage.haml
200
- - test/templates/content_for_layout.haml
201
- - test/templates/eval_suppressed.haml
202
- - test/templates/helpers.haml
203
- - test/templates/helpful.haml
204
- - test/templates/just_stuff.haml
205
- - test/templates/list.haml
206
- - test/templates/nuke_inner_whitespace.haml
207
- - test/templates/nuke_outer_whitespace.haml
208
- - test/templates/original_engine.haml
209
- - test/templates/partial_layout.haml
210
- - test/templates/partial_layout_erb.erb
211
- - test/templates/partialize.haml
212
- - test/templates/partials.haml
213
- - test/templates/render_layout.haml
214
- - test/templates/silent_script.haml
215
- - test/templates/standard.haml
216
- - test/templates/standard_ugly.haml
217
- - test/templates/tag_parsing.haml
218
- - test/templates/very_basic.haml
219
- - test/templates/whitespace_handling.haml
220
- - test/templates/with_bom.haml
221
167
  - test/temple_line_counter_test.rb
222
- - test/test_helper.rb
223
168
  - test/util_test.rb
169
+ - yard/default/.gitignore
170
+ - yard/default/fulldoc/html/css/common.sass
171
+ - yard/default/layout/html/footer.erb
224
172
  homepage: http://haml.info/
225
173
  licenses:
226
174
  - MIT
@@ -1,12 +0,0 @@
1
- <h2>This is a pretty complicated partial</h2>
2
- <div class="partial">
3
- <p>It has several nested partials,</p>
4
- <ul>
5
- <% 5.times do %>
6
- <li>
7
- <strong>Partial:</strong>
8
- <% @nesting = 5 %>
9
- <%= render :partial => 'erb/av_partial_2' %>
10
- <% end %>
11
- </ul>
12
- </div>
@@ -1,8 +0,0 @@
1
- <% @nesting -= 1 %>
2
- <div class="partial" level="<%= @nesting %>">
3
- <h3>This is a crazy deep-nested partial.</h3>
4
- <p>Nesting level <%= @nesting %></p>
5
- <% if @nesting > 0 %>
6
- <%= render :partial => 'erb/av_partial_2' %>
7
- <% end %>
8
- </div>
@@ -1,62 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en-US'>
3
- <head>
4
- <title>Hampton Catlin Is Totally Awesome</title>
5
- <meta content='text/html; charset=utf-8' http-equiv='Content-Type' />
6
- </head>
7
- <body>
8
- <h1>
9
- This is very much like the standard template,
10
- except that it has some ActionView-specific stuff.
11
- It's only used for benchmarking.
12
- </h1>
13
- <div class="crazy_partials">
14
- <%= render :partial => 'erb/av_partial_1' %>
15
- </div>
16
- <!-- You're In my house now! -->
17
- <div class='header'>
18
- Yes, ladies and gentileman. He is just that egotistical.
19
- Fantastic! This should be multi-line output
20
- The question is if this would translate! Ahah!
21
- <%= 1 + 9 + 8 + 2 %>
22
- <%# numbers should work and this should be ignored %>
23
- </div>
24
- <% 120.times do |number| -%>
25
- <%= number %>
26
- <% end -%>
27
- <div id='body'><%= " Quotes should be loved! Just like people!" %></div>
28
- Wow.
29
- <p>
30
- <%= "Holy cow " +
31
- "multiline " +
32
- "tags! " +
33
- "A pipe (|) even!" %>
34
- <%= [1, 2, 3].collect { |n| "PipesIgnored|" } %>
35
- <%= [1, 2, 3].collect { |n|
36
- n.to_s
37
- }.join("|") %>
38
- </p>
39
- <div class='silent'>
40
- <% foo = String.new
41
- foo << "this"
42
- foo << " shouldn't"
43
- foo << " evaluate" %>
44
- <%= foo + "but now it should!" %>
45
- <%# Woah crap a comment! %>
46
- </div>
47
- <ul class='really cool'>
48
- <% ('a'..'f').each do |a|%>
49
- <li><%= a %>
50
- <% end %>
51
- <div class='of_divs_with_underscore' id='combo'><%= @should_eval = "with this text" %></div>
52
- <%= [ 104, 101, 108, 108, 111 ].map do |byte|
53
- byte.chr
54
- end %>
55
- <div class='footer'>
56
- <strong class='shout'>
57
- <%= "This is a really long ruby quote. It should be loved and wrapped because its more than 50 characters. This value may change in the future and this test may look stupid.\n" +
58
- " So, I'm just making it *really* long. God, I hope this works" %>
59
- </strong>
60
- </div>
61
- </body>
62
- </html>
@@ -1,55 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en-US' lang='en-US'>
3
- <head>
4
- <title>Hampton Catlin Is Totally Awesome</title>
5
- <meta content='text/html; charset=utf-8' http-equiv='Content-Type' />
6
- </head>
7
- <body>
8
- <!-- You're In my house now! -->
9
- <div class='header'>
10
- Yes, ladies and gentileman. He is just that egotistical.
11
- Fantastic! This should be multi-line output
12
- The question is if this would translate! Ahah!
13
- <%= 1 + 9 + 8 + 2 %>
14
- <%# numbers should work and this should be ignored %>
15
- </div>
16
- <% 120.times do |number| -%>
17
- <%= number %>
18
- <% end -%>
19
- <div id='body'><%= " Quotes should be loved! Just like people!" %></div>
20
- Wow.
21
- <p code="<%= 1 + 2 %>">
22
- <%= "Holy cow " +
23
- "multiline " +
24
- "tags! " +
25
- "A pipe (|) even!" %>
26
- <%= [1, 2, 3].collect { |n| "PipesIgnored|" }.join %>
27
- <%= [1, 2, 3].collect { |n|
28
- n.to_s
29
- }.join("|") %>
30
- </p>
31
- <% bar = 17 %>
32
- <div class='silent' foo="<%= bar %>">
33
- <% foo = String.new
34
- foo << "this"
35
- foo << " shouldn't"
36
- foo << " evaluate" %>
37
- <%= foo + "but now it should!" %>
38
- <%# Woah crap a comment! %>
39
- </div>
40
- <ul class='really cool'>
41
- <% ('a'..'f').each do |a|%>
42
- <li><%= a %></li>
43
- <% end %>
44
- <div class='of_divs_with_underscore' id='combo'><%= @should_eval = "with this text" %></div>
45
- <%= "foo".each_line do |line|
46
- nil
47
- end %>
48
- <div class='footer'>
49
- <strong class='shout'>
50
- <%= "This is a really long ruby quote. It should be loved and wrapped because its more than 50 characters. This value may change in the future and this test may look stupid.\n" +
51
- " So, I'm just making it *really* long. God, I hope this works" %>
52
- </strong>
53
- </div>
54
- </body>
55
- </html>
@@ -1,11 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- if ENV['TRAVIS']
4
- platform :mri_21 do
5
- gem 'coveralls', require: false
6
- end
7
- end
8
-
9
- gem 'rails', '~> 4.0.0'
10
- gem 'nokogiri', RUBY_VERSION < '2.1' ? '~> 1.6.0' : '>= 1.7'
11
- gemspec :path => '../..'
@@ -1,87 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- haml (4.0.7)
5
- tilt
6
-
7
- GEM
8
- remote: http://rubygems.org/
9
- specs:
10
- actionmailer (4.0.13)
11
- actionpack (= 4.0.13)
12
- mail (~> 2.5, >= 2.5.4)
13
- actionpack (4.0.13)
14
- activesupport (= 4.0.13)
15
- builder (~> 3.1.0)
16
- erubis (~> 2.7.0)
17
- rack (~> 1.5.2)
18
- rack-test (~> 0.6.2)
19
- activemodel (4.0.13)
20
- activesupport (= 4.0.13)
21
- builder (~> 3.1.0)
22
- activerecord (4.0.13)
23
- activemodel (= 4.0.13)
24
- activerecord-deprecated_finders (~> 1.0.2)
25
- activesupport (= 4.0.13)
26
- arel (~> 4.0.0)
27
- activerecord-deprecated_finders (1.0.4)
28
- activesupport (4.0.13)
29
- i18n (~> 0.6, >= 0.6.9)
30
- minitest (~> 4.2)
31
- multi_json (~> 1.3)
32
- thread_safe (~> 0.1)
33
- tzinfo (~> 0.3.37)
34
- arel (4.0.2)
35
- builder (3.1.4)
36
- concurrent-ruby (1.0.2)
37
- erubis (2.7.0)
38
- i18n (0.7.0)
39
- mail (2.6.4)
40
- mime-types (>= 1.16, < 4)
41
- mime-types (2.99.2)
42
- minitest (4.7.5)
43
- multi_json (1.12.1)
44
- nokogiri (1.5.11)
45
- rack (1.5.5)
46
- rack-test (0.6.3)
47
- rack (>= 1.0)
48
- rails (4.0.13)
49
- actionmailer (= 4.0.13)
50
- actionpack (= 4.0.13)
51
- activerecord (= 4.0.13)
52
- activesupport (= 4.0.13)
53
- bundler (>= 1.3.0, < 2.0)
54
- railties (= 4.0.13)
55
- sprockets-rails (~> 2.0)
56
- railties (4.0.13)
57
- actionpack (= 4.0.13)
58
- activesupport (= 4.0.13)
59
- rake (>= 0.8.7)
60
- thor (>= 0.18.1, < 2.0)
61
- rake (11.2.2)
62
- rbench (0.2.3)
63
- sprockets (3.7.0)
64
- concurrent-ruby (~> 1.0)
65
- rack (> 1, < 3)
66
- sprockets-rails (2.3.3)
67
- actionpack (>= 3.0)
68
- activesupport (>= 3.0)
69
- sprockets (>= 2.8, < 4.0)
70
- thor (0.19.1)
71
- thread_safe (0.3.5)
72
- tilt (2.0.5)
73
- tzinfo (0.3.51)
74
-
75
- PLATFORMS
76
- ruby
77
-
78
- DEPENDENCIES
79
- haml!
80
- mime-types (< 3)
81
- minitest
82
- nokogiri (~> 1.5.10)
83
- rails (~> 4.0.0)
84
- rbench
85
-
86
- BUNDLED WITH
87
- 1.12.5