turnip_formatter 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +1 -1
  2. data/{spec/examples → example}/README.md +8 -8
  3. data/{spec/examples → example}/features/battle.feature +0 -0
  4. data/{spec/examples → example}/features/battle2.feature +0 -0
  5. data/{spec/examples → example}/features/battle3.feature +0 -0
  6. data/{spec/examples → example}/features/songs.feature +0 -0
  7. data/{spec/examples → example}/images/background.png +0 -0
  8. data/{spec/examples → example}/images/basic_step.png +0 -0
  9. data/{spec/examples → example}/images/failed_step.png +0 -0
  10. data/{spec/examples → example}/images/multiline.png +0 -0
  11. data/{spec/examples → example}/images/outline.png +0 -0
  12. data/{spec/examples → example}/images/pending_step.png +0 -0
  13. data/{spec/examples → example}/images/tag_step.png +0 -0
  14. data/{spec/examples → example}/spec_helper.rb +0 -0
  15. data/{spec/examples → example}/steps/spell_steps.rb +0 -0
  16. data/{spec/examples → example}/steps/steps.rb +0 -0
  17. data/lib/turnip_formatter/formatter.css +0 -21
  18. data/lib/turnip_formatter/formatter.scss +0 -32
  19. data/lib/turnip_formatter/scenario.rb +5 -0
  20. data/lib/turnip_formatter/step/dsl.rb +5 -5
  21. data/lib/turnip_formatter/step/failure.rb +0 -8
  22. data/lib/turnip_formatter/step/pending.rb +0 -7
  23. data/lib/turnip_formatter/step.rb +4 -4
  24. data/lib/turnip_formatter/step_template/exception.rb +61 -0
  25. data/lib/turnip_formatter/step_template/source.rb +46 -0
  26. data/lib/turnip_formatter/step_template.rb +8 -0
  27. data/lib/turnip_formatter/template/exception.erb +26 -0
  28. data/lib/turnip_formatter/template/exception_backtrace.erb +7 -0
  29. data/lib/turnip_formatter/template/scenario.erb +24 -0
  30. data/lib/turnip_formatter/template/scenario_tags.erb +5 -0
  31. data/lib/turnip_formatter/template/section_report.erb +15 -0
  32. data/lib/turnip_formatter/template/step_multiline.erb +1 -0
  33. data/lib/turnip_formatter/template/step_outline.erb +9 -0
  34. data/lib/turnip_formatter/template.rb +88 -125
  35. data/lib/turnip_formatter/version.rb +1 -1
  36. data/lib/turnip_formatter.rb +1 -0
  37. data/spec/turnip_formatter/step/failure_spec.rb +19 -4
  38. data/spec/turnip_formatter/step/pending_spec.rb +18 -4
  39. data/spec/turnip_formatter/step_spec.rb +37 -24
  40. data/spec/turnip_formatter/{template/step_exception_spec.rb → step_template/exception_spec.rb} +4 -4
  41. data/spec/turnip_formatter/{template/step_source_spec.rb → step_template/source_spec.rb} +5 -5
  42. data/spec/turnip_formatter/template_spec.rb +60 -40
  43. data/turnip_formatter.gemspec +2 -1
  44. metadata +47 -44
  45. data/lib/turnip_formatter/template/step_exception.rb +0 -30
  46. data/lib/turnip_formatter/template/step_multiline.rb +0 -13
  47. data/lib/turnip_formatter/template/step_outline.rb +0 -29
  48. data/lib/turnip_formatter/template/step_source.rb +0 -15
  49. data/spec/turnip_formatter/template/step_multiline_spec.rb +0 -18
  50. data/spec/turnip_formatter/template/step_outline_spec.rb +0 -31
@@ -5,16 +5,42 @@ require 'rspec/core/formatters/helpers'
5
5
  require 'turnip_formatter/template/tab/speed_statistics'
6
6
  require 'turnip_formatter/template/tab/feature_statistics'
7
7
  require 'turnip_formatter/template/tab/tag_statistics'
8
+ require 'sass'
8
9
 
9
10
  module TurnipFormatter
10
11
  class Template
11
12
  include ERB::Util
12
13
  include RSpec::Core::BacktraceFormatter
13
14
 
14
- autoload :StepOutline, 'turnip_formatter/template/step_outline'
15
- autoload :StepMultiline, 'turnip_formatter/template/step_multiline'
16
- autoload :StepSource, 'turnip_formatter/template/step_source'
17
- autoload :StepException, 'turnip_formatter/template/step_exception'
15
+ class << self
16
+ def add_js(js_string)
17
+ js_list << js_string
18
+ end
19
+
20
+ def js_render
21
+ js_list.join("\n")
22
+ end
23
+
24
+ def css_render
25
+ css_list.join("\n")
26
+ end
27
+
28
+ def add_scss(scss_string)
29
+ css_list << scss_compile(scss_string)
30
+ end
31
+
32
+ def js_list
33
+ @js_list ||= []
34
+ end
35
+
36
+ def css_list
37
+ @css_list ||= []
38
+ end
39
+
40
+ def scss_compile(scss)
41
+ Sass::Engine.new(scss, syntax: :scss).render
42
+ end
43
+ end
18
44
 
19
45
  def print_header
20
46
  <<-EOS
@@ -29,7 +55,8 @@ module TurnipFormatter
29
55
 
30
56
  <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/smoothness/jquery-ui.css">
31
57
  <style>
32
- #{File.read(File.dirname(__FILE__) + '/formatter.css')}
58
+ #{File.read(File.dirname(__FILE__) + '/formatter.css')}
59
+ #{self.class.css_render}
33
60
  </style>
34
61
 
35
62
  <script>
@@ -83,11 +110,13 @@ module TurnipFormatter
83
110
  1: { sorter: false }
84
111
  }
85
112
  });
113
+
114
+ #{self.class.js_render}
86
115
  });
87
116
  </script>
88
117
  </head>
89
118
  <body>
90
- #{report_area}
119
+ #{print_section_report}
91
120
  <div id="main" role="main">
92
121
  <ul>
93
122
  <li><a href="#steps-statistics">Steps</a></li>
@@ -159,27 +188,50 @@ module TurnipFormatter
159
188
  end
160
189
 
161
190
  def print_scenario(scenario)
162
- template_scenario.result(binding)
191
+ render_template(:scenario, { scenario: scenario })
163
192
  end
164
193
 
165
194
  def print_runtime_error(example, exception)
166
195
  exception.set_backtrace(format_backtrace(exception.backtrace))
167
- template_exception.result(binding)
196
+ render_template(:exception, { example: example, exception: exception })
168
197
  end
169
198
 
170
- private
199
+ def print_exception_backtrace(e)
200
+ render_template(:exception_backtrace, { backtrace: e.backtrace })
201
+ end
202
+
203
+ def print_scenario_tags(scenario)
204
+ if scenario.tags.empty?
205
+ ''
206
+ else
207
+ render_template(:scenario_tags, { tags: scenario.tags })
208
+ end
209
+ end
210
+
211
+ def print_step_extra_args(extra_args)
212
+ extra_args.map do |arg|
213
+ if arg.instance_of?(Turnip::Table)
214
+ print_step_outline(arg)
215
+ else
216
+ print_step_multiline(arg)
217
+ end
218
+ end.join("\n")
219
+ end
171
220
 
172
- def feature_name(scenario)
173
- path = RSpec::Core::Metadata::relative_path(scenario.feature_file_path)
174
- name = scenario.feature_name
175
- "\"#{name}\" in #{path}"
221
+ def print_step_outline(table)
222
+ render_template(:step_outline, { table: table.to_a })
176
223
  end
177
224
 
178
- def scenario_tags(scenario)
179
- return '' if scenario.tags.empty?
180
- template_scenario_tags.result(binding)
225
+ def print_step_multiline(lines)
226
+ render_template(:step_multiline, { lines: lines })
181
227
  end
182
228
 
229
+ def print_section_report
230
+ render_template(:section_report)
231
+ end
232
+
233
+ private
234
+
183
235
  def step_attr(step)
184
236
  attr = 'step'
185
237
  attr += " #{step.status}" if step.attention?
@@ -191,129 +243,40 @@ module TurnipFormatter
191
243
 
192
244
  step.docs.each do |style, template|
193
245
  if style == :extra_args
194
- output << step_extra_args(template[:value])
246
+ output << print_step_extra_args(template[:value])
195
247
  else
196
- output << step_template(style, template[:klass]).build(template[:value])
248
+ output << template[:klass].build(template[:value])
197
249
  end
198
250
  end
199
251
 
200
252
  output.join("\n")
201
253
  end
202
254
 
203
- def step_extra_args(extra_args)
204
- extra_args.map do |arg|
205
- klass = arg.instance_of?(Turnip::Table) ? StepOutline : StepMultiline
206
- klass.build(arg)
207
- end.join("\n")
208
- end
209
-
210
- def step_template(style, klass)
211
- return klass if !!klass
212
-
213
- # call Built-in template (StepException, StepSource, etc...)
214
- klass = ['step', style.to_s].map(&:capitalize).join
215
- self.class.const_get(klass)
255
+ #
256
+ # @example
257
+ # render_template(:main, { name: 'user' })
258
+ # # => ERB.new('/path/to/main.erb') render { name: 'user' }
259
+ #
260
+ def render_template(name, params = {})
261
+ render_template_list(name).result(template_params_binding(params))
216
262
  end
217
263
 
218
- def report_area
219
- <<-EOS
220
- <div id="report">
221
- <h1>Turnip Report</h1>
222
- <section class="checkbox">
223
- <label for="passed_check">Passed</label><input type="checkbox" checked id="passed_check">
224
- <label for="failed_check">Failed</label><input type="checkbox" checked id="failed_check">
225
- <label for="pending_check">Pending</label><input type="checkbox" checked id="pending_check">
226
- </section>
227
-
228
- <section class="result">
229
- <p>
230
- <span id="total_count"></span> Scenario (<span id="failed_count"></span> failed <span id="pending_count"></span> pending).
231
- </p>
232
- <p>Finished in <span id="total_time"></span></p>
233
- </section>
234
- </div>
235
- EOS
236
- end
237
-
238
- def template_scenario
239
- @template_scenario ||= ERB.new(<<-EOS)
240
- <section class="scenario <%= h(scenario.status) %>">
241
- <header>
242
- <span class="permalink">
243
- <a href="#<%= scenario.id %>">&para;</a>
244
- </span>
245
- <span class="scenario_name" id="<%= scenario.id %>">
246
- Scenario: <%= h(scenario.name) %>
247
- </span>
248
- <span class="feature_name">
249
- (Feature: <%= h(feature_name(scenario)) %>)
250
- at <%= h(scenario.run_time) %> sec
251
- </span>
252
- </header>
253
- <%= scenario_tags(scenario) %>
254
- <ul class="steps">
255
- <% scenario.steps.each do |step| %>
256
- <li <%= step_attr(step) %>><span><%= h(step.name) %></span>
257
- <div class="args"><%= step_args(step) %></div>
258
- </li>
259
- <% end %>
260
- </ul>
261
- </section>
262
- EOS
263
- end
264
+ def render_template_list(name)
265
+ if templates[name].nil?
266
+ path = File.dirname(__FILE__) + "/template/#{name.to_s}.erb"
267
+ templates[name] = ERB.new(File.read(path))
268
+ end
264
269
 
265
- def template_scenario_tags
266
- @template_scenario_tags ||= ERB.new(<<-EOS)
267
- <ul class="tags">
268
- <% scenario.tags.each do |tag| %>
269
- <li>@<%= h(tag) %></li>
270
- <% end %>
271
- </ul>
272
- EOS
270
+ templates[name]
273
271
  end
274
272
 
275
- def template_exception
276
- @template_exception ||= ERB.new(<<-EOS)
277
- <section class="exception">
278
- <h1>TurnipFormatter RuntimeError</h1>
279
- <dl>
280
- <dt>Runtime Exception</dt>
281
- <dd><%= h(exception.to_s) %></dd>
282
-
283
- <dt>Runtime Exception Backtrace</dt>
284
- <%= template_exception_backtrace(exception) %>
285
-
286
- <dt>Example Full Description</dt>
287
- <dd><%= h(example.metadata[:full_description]) %></dd>
288
-
289
- <% if example.exception %>
290
- <dt>Example Exception</dt>
291
- <dd><%= h(example.exception.to_s) %></dd>
292
-
293
- <dt>Example Backtrace</dt>
294
- <%= template_exception_backtrace(example.exception) %>
295
- <% end %>
296
-
297
- <% if example.pending %>
298
- <dt>Example Pending description</dt>
299
- <dd><%= h(example.metadata[:description]) %></dd>
300
- <% end %>
301
- </dl>
302
- </section>
303
- EOS
273
+ def template_params_binding(params)
274
+ code = params.keys.map { |k| "#{k} = params[#{k.inspect}];" }.join
275
+ eval(code + ";binding")
304
276
  end
305
277
 
306
- def template_exception_backtrace(exception)
307
- @template_exception_backtrace ||= ERB.new(<<-EOS)
308
- <dd>
309
- <ol>
310
- <% exception.backtrace.each do |line| %>
311
- <li><%= h(line) %></li>
312
- <% end %>
313
- </ol>
314
- </dd>
315
- EOS
316
- @template_exception_backtrace.result(binding)
278
+ def templates
279
+ @templates ||= {}
317
280
  end
318
281
  end
319
282
  end
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module TurnipFormatter
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -6,6 +6,7 @@ require 'turnip'
6
6
  module TurnipFormatter
7
7
  require 'rspec/core/formatters/turnip_formatter'
8
8
  require 'turnip_formatter/template'
9
+ require 'turnip_formatter/step_template'
9
10
  require 'turnip_formatter/ext/turnip/rspec'
10
11
  require 'turnip_formatter/ext/turnip/builder'
11
12
  end
@@ -13,25 +13,40 @@ module TurnipFormatter
13
13
  step
14
14
  end
15
15
 
16
+ let(:klasses) do
17
+ builtin_klass1 = ::TurnipFormatter::StepTemplate::Source
18
+ builtin_klass2 = ::TurnipFormatter::StepTemplate::Exception
19
+ [builtin_klass1, builtin_klass2]
20
+ end
21
+
16
22
  it 'exists built-in step template' do
17
23
  templates = TurnipFormatter::Step::Failure.templates
18
- expect(templates.keys).to eq([:source, :exception])
24
+ expect(templates.keys).to include(*klasses)
19
25
  end
20
26
 
21
27
  context 'add custom step template' do
28
+ let :custom_template do
29
+ Module.new do
30
+ def self.build(message)
31
+ '[error] ' + message
32
+ end
33
+ end
34
+ end
35
+
22
36
  before do
23
- TurnipFormatter::Step::Failure.add_template :custom do
37
+ TurnipFormatter::Step::Failure.add_template(custom_template) do
24
38
  example.example_group.description
25
39
  end
26
40
  end
27
41
 
28
42
  after do
29
- TurnipFormatter::Step::Failure.remove_template :custom
43
+ TurnipFormatter::Step::Failure.remove_template(custom_template)
30
44
  end
31
45
 
32
46
  it 'should get custom step template' do
33
47
  templates = TurnipFormatter::Step::Failure.templates
34
- expect(templates.keys).to eq([:source, :exception, :custom])
48
+ klasses << custom_template
49
+ expect(templates.keys).to include(*klasses)
35
50
  end
36
51
  end
37
52
 
@@ -13,25 +13,39 @@ module TurnipFormatter
13
13
  step
14
14
  end
15
15
 
16
+ let(:klasses) do
17
+ builtin_klass = ::TurnipFormatter::StepTemplate::Exception
18
+ [builtin_klass]
19
+ end
20
+
16
21
  it 'exists built-in step template' do
17
22
  templates = TurnipFormatter::Step::Pending.templates
18
- expect(templates.keys).to eq([:exception])
23
+ expect(templates.keys).to include(*klasses)
19
24
  end
20
25
 
21
26
  context 'add custom step template' do
27
+ let :custom_template do
28
+ Module.new do
29
+ def self.build(message)
30
+ '[pending] ' + message
31
+ end
32
+ end
33
+ end
34
+
22
35
  before do
23
- TurnipFormatter::Step::Pending.add_template :custom do
36
+ TurnipFormatter::Step::Pending.add_template custom_template do
24
37
  example.example_group.description
25
38
  end
26
39
  end
27
40
 
28
41
  after do
29
- TurnipFormatter::Step::Failure.remove_template :custom
42
+ TurnipFormatter::Step::Failure.remove_template custom_template
30
43
  end
31
44
 
32
45
  it 'should get custom step template' do
33
46
  templates = TurnipFormatter::Step::Pending.templates
34
- expect(templates.keys).to eq([:exception, :custom])
47
+ klasses << custom_template
48
+ expect(templates.keys).to include(*klasses)
35
49
  end
36
50
  end
37
51
 
@@ -22,8 +22,8 @@ module TurnipFormatter
22
22
  it { should include :extra_args }
23
23
  end
24
24
 
25
- describe '#add_template' do
26
- let :custom_template do
25
+ context 'using template' do
26
+ let :custom_template1 do
27
27
  Module.new do
28
28
  def self.build(hoge)
29
29
  hoge * 3
@@ -31,42 +31,55 @@ module TurnipFormatter
31
31
  end
32
32
  end
33
33
 
34
- before do
35
- TurnipFormatter::Step.add_template :hoge, :source1 do
36
- 'aiueo'
34
+ let :custom_template2 do
35
+ Module.new do
36
+ def self.build(hoge)
37
+ 'aiueo' + hoge
38
+ end
37
39
  end
40
+ end
38
41
 
39
- TurnipFormatter::Step.add_template :hoge, :source2, custom_template do
42
+ before do
43
+ TurnipFormatter::Step.add_template :hoge, custom_template1 do
40
44
  '12345'
41
45
  end
46
+
47
+ TurnipFormatter::Step.add_template :hoge, custom_template2 do
48
+ 'abcde'
49
+ end
42
50
  end
43
51
 
44
52
  after do
45
- TurnipFormatter::Step.remove_template(:hoge, :source1)
46
- TurnipFormatter::Step.remove_template(:hoge, :source2)
53
+ TurnipFormatter::Step.remove_template(:hoge, custom_template1)
54
+ TurnipFormatter::Step.remove_template(:hoge, custom_template2)
47
55
  end
48
56
 
49
- it 'can add step template' do
50
- style = TurnipFormatter::Step.templates[:hoge][:source1]
51
- expect(style[:block].call).to eq('aiueo')
57
+ describe '#add_template' do
58
+ it 'can add step template' do
59
+ style1 = TurnipFormatter::Step.templates[:hoge][custom_template1]
60
+ klass1 = style1[:klass]
61
+ block1 = style1[:block]
62
+ expect(klass1.build(block1.call)).to eq('123451234512345')
52
63
 
53
- style = TurnipFormatter::Step.templates[:hoge][:source2]
54
- expect(style[:klass].build(style[:block].call)).to eq('123451234512345')
64
+ style2 = TurnipFormatter::Step.templates[:hoge][custom_template2]
65
+ klass2 = style2[:klass]
66
+ block2 = style2[:block]
67
+ expect(klass2.build(block2.call)).to eq('aiueoabcde')
68
+ end
55
69
  end
56
- end
57
70
 
58
- describe '#remove_template' do
59
- it 'can remove step template' do
60
- TurnipFormatter::Step.add_template :hoge, :style1 do ; 'aiueo' end
61
- TurnipFormatter::Step.add_template :hoge, :style2 do ; '12345' end
62
- expect(TurnipFormatter::Step.templates[:hoge]).to have_key :style1
63
- expect(TurnipFormatter::Step.templates[:hoge]).to have_key :style2
71
+ describe '#remove_template' do
72
+ it 'can remove step template' do
73
+ expect(TurnipFormatter::Step.templates[:hoge]).to have_key custom_template1
74
+ expect(TurnipFormatter::Step.templates[:hoge]).to have_key custom_template2
64
75
 
65
- TurnipFormatter::Step.remove_template(:hoge, :style1)
66
- expect(TurnipFormatter::Step.templates[:hoge]).to have_key :style2
76
+ TurnipFormatter::Step.remove_template(:hoge, custom_template1)
77
+ expect(TurnipFormatter::Step.templates[:hoge]).not_to have_key custom_template1
78
+ expect(TurnipFormatter::Step.templates[:hoge]).to have_key custom_template2
67
79
 
68
- TurnipFormatter::Step.remove_template(:hoge, :style2)
69
- expect(TurnipFormatter::Step.templates).not_to have_key(:hoge)
80
+ TurnipFormatter::Step.remove_template(:hoge, custom_template2)
81
+ expect(TurnipFormatter::Step.templates).not_to have_key custom_template2
82
+ end
70
83
  end
71
84
  end
72
85
  end
@@ -1,12 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  require 'spec_helper'
4
- require 'turnip_formatter/template/step_exception'
4
+ require 'turnip_formatter/step_template/exception'
5
5
 
6
6
  module TurnipFormatter
7
- class Template
8
- describe StepException do
9
- let(:template) { ::TurnipFormatter::Template::StepException }
7
+ module StepTemplate
8
+ describe Exception do
9
+ let(:template) { ::TurnipFormatter::StepTemplate::Exception }
10
10
  let(:exception) do
11
11
  StandardError.new('StepExceptionError').tap do |e|
12
12
  e.set_backtrace('/path/to/error.rb: 10')
@@ -1,19 +1,19 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  require 'spec_helper'
4
- require 'turnip_formatter/template/step_source'
4
+ require 'turnip_formatter/step_template/source'
5
5
 
6
6
  module TurnipFormatter
7
- class Template
8
- describe StepSource do
9
- let(:template) { ::TurnipFormatter::Template::StepSource }
7
+ module StepTemplate
8
+ describe Source do
9
+ let(:template) { ::TurnipFormatter::StepTemplate::Source }
10
10
  let(:source) { __FILE__ + ':3' }
11
11
 
12
12
  describe '.build' do
13
13
  subject { template.build(source) }
14
14
  it do
15
15
  should match '<pre class="source"><code class="ruby">'
16
- should match "require 'turnip_formatter/template/step_source'"
16
+ should match "require 'turnip_formatter/step_template/source'"
17
17
  end
18
18
  end
19
19
  end