teaspoon 1.1.5 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +5 -0
  3. data/MIT.LICENSE +2 -2
  4. data/README.md +37 -28
  5. data/app/assets/javascripts/teaspoon/hook.coffee +1 -1
  6. data/app/assets/javascripts/teaspoon/teaspoon.coffee +13 -1
  7. data/app/controllers/teaspoon/suite_controller.rb +18 -13
  8. data/app/views/teaspoon/suite/index.html.erb +1 -1
  9. data/lib/generators/teaspoon/install/install_generator.rb +34 -34
  10. data/lib/generators/teaspoon/install/templates/MISSING_FRAMEWORK +1 -1
  11. data/lib/generators/teaspoon/install/templates/POST_INSTALL +1 -1
  12. data/lib/generators/teaspoon/install/templates/_boot.html.erb +1 -1
  13. data/lib/generators/teaspoon/install/templates/env_comments.rb.tt +8 -8
  14. data/lib/tasks/teaspoon/info.rake +1 -1
  15. data/lib/teaspoon/command_line.rb +76 -76
  16. data/lib/teaspoon/configuration.rb +4 -4
  17. data/lib/teaspoon/console.rb +40 -40
  18. data/lib/teaspoon/coverage.rb +29 -25
  19. data/lib/teaspoon/deprecated.rb +1 -1
  20. data/lib/teaspoon/driver.rb +0 -1
  21. data/lib/teaspoon/driver/browserstack.rb +48 -51
  22. data/lib/teaspoon/driver/phantomjs.rb +25 -25
  23. data/lib/teaspoon/driver/phantomjs/runner.js +31 -3
  24. data/lib/teaspoon/driver/selenium.rb +13 -9
  25. data/lib/teaspoon/engine.rb +26 -15
  26. data/lib/teaspoon/environment.rb +28 -28
  27. data/lib/teaspoon/exceptions.rb +7 -7
  28. data/lib/teaspoon/exporter.rb +23 -23
  29. data/lib/teaspoon/formatter/base.rb +64 -46
  30. data/lib/teaspoon/formatter/clean.rb +2 -2
  31. data/lib/teaspoon/formatter/documentation.rb +40 -40
  32. data/lib/teaspoon/formatter/dot.rb +12 -12
  33. data/lib/teaspoon/formatter/json.rb +21 -21
  34. data/lib/teaspoon/formatter/junit.rb +52 -52
  35. data/lib/teaspoon/formatter/modules/report_module.rb +34 -32
  36. data/lib/teaspoon/formatter/pride.rb +21 -21
  37. data/lib/teaspoon/formatter/rspec_html.rb +31 -31
  38. data/lib/teaspoon/formatter/snowday.rb +6 -5
  39. data/lib/teaspoon/formatter/swayze_or_oprah.rb +91 -91
  40. data/lib/teaspoon/formatter/tap.rb +29 -29
  41. data/lib/teaspoon/formatter/tap_y.rb +57 -57
  42. data/lib/teaspoon/formatter/teamcity.rb +63 -63
  43. data/lib/teaspoon/framework/base.rb +1 -1
  44. data/lib/teaspoon/instrumentation.rb +18 -18
  45. data/lib/teaspoon/registry.rb +8 -8
  46. data/lib/teaspoon/registry/has_default.rb +2 -2
  47. data/lib/teaspoon/runner.rb +37 -37
  48. data/lib/teaspoon/server.rb +30 -29
  49. data/lib/teaspoon/suite.rb +68 -57
  50. data/lib/teaspoon/utility.rb +6 -0
  51. data/lib/teaspoon/version.rb +1 -1
  52. metadata +10 -18
  53. data/lib/teaspoon/driver/capybara_webkit.rb +0 -40
@@ -8,20 +8,20 @@ module Teaspoon
8
8
 
9
9
  protected
10
10
 
11
- def log_spec(result)
12
- return log_str(".", GREEN) if result.passing?
13
- return log_str("*", YELLOW) if result.pending?
14
- log_str("F", RED)
15
- end
11
+ def log_spec(result)
12
+ return log_str(".", GREEN) if result.passing?
13
+ return log_str("*", YELLOW) if result.pending?
14
+ log_str("F", RED)
15
+ end
16
16
 
17
- def log_console(message)
18
- log_str(message)
19
- end
17
+ def log_console(message)
18
+ log_str(message)
19
+ end
20
20
 
21
- def log_result(result)
22
- log_line("\n")
23
- super
24
- end
21
+ def log_result(result)
22
+ log_line("\n")
23
+ super
24
+ end
25
25
  end
26
26
  end
27
27
  end
@@ -5,33 +5,33 @@ module Teaspoon
5
5
  class Json < Base
6
6
  protected
7
7
 
8
- def log_runner(result)
9
- log_result(result)
10
- end
8
+ def log_runner(result)
9
+ log_result(result)
10
+ end
11
11
 
12
- def log_suite(result)
13
- log_result(result)
14
- end
12
+ def log_suite(result)
13
+ log_result(result)
14
+ end
15
15
 
16
- def log_spec(result)
17
- log_result(result)
18
- end
16
+ def log_spec(result)
17
+ log_result(result)
18
+ end
19
19
 
20
- def log_error(result)
21
- log_result(result)
22
- end
20
+ def log_error(result)
21
+ log_result(result)
22
+ end
23
23
 
24
- def log_exception(result)
25
- log_result(result)
26
- end
24
+ def log_exception(result)
25
+ log_result(result)
26
+ end
27
27
 
28
- def log_console(message)
29
- log_line(%{{"type":"console","log":"#{message.gsub(/\n$/, '').gsub('\n', '\\n')}"}})
30
- end
28
+ def log_console(message)
29
+ log_line(%{{"type":"console","log":"#{message.gsub(/\n$/, '').gsub('\n', '\\n')}"}})
30
+ end
31
31
 
32
- def log_result(result)
33
- log_str(result.original_json)
34
- end
32
+ def log_result(result)
33
+ log_str(result.original_json)
34
+ end
35
35
  end
36
36
  end
37
37
  end
@@ -6,75 +6,75 @@ module Teaspoon
6
6
  class Junit < Base
7
7
  protected
8
8
 
9
- def log_runner(result)
10
- log_line(%{<?xml version="1.0" encoding="UTF-8"?>})
11
- log_line(%{<testsuites name="Teaspoon">})
12
- start_time = Time.parse(result.start).iso8601
13
- log_line(%{<testsuite name="#{escape(@suite_name)}" tests="#{@total_count}" timestamp="#{start_time}">})
14
- end
9
+ def log_runner(result)
10
+ log_line(%{<?xml version="1.0" encoding="UTF-8"?>})
11
+ log_line(%{<testsuites name="Teaspoon">})
12
+ start_time = Time.parse(result.start).iso8601
13
+ log_line(%{<testsuite name="#{escape(@suite_name)}" tests="#{@total_count}" timestamp="#{start_time}">})
14
+ end
15
15
 
16
- def log_suite(result)
17
- log_end_suite
18
- log_line(%{<testsuite name="#{escape(result.label)}">})
19
- end
16
+ def log_suite(result)
17
+ log_end_suite
18
+ log_line(%{<testsuite name="#{escape(result.label)}">})
19
+ end
20
20
 
21
- def log_passing_spec(result)
22
- log_junit_spec(suite: result.suite, label: result.label)
23
- end
21
+ def log_passing_spec(result)
22
+ log_junit_spec(suite: result.suite, label: result.label)
23
+ end
24
24
 
25
- def log_pending_spec(result)
26
- log_junit_spec(suite: result.suite, label: result.label) do
27
- log_line(%{ <skipped/>})
25
+ def log_pending_spec(result)
26
+ log_junit_spec(suite: result.suite, label: result.label) do
27
+ log_line(%{ <skipped/>})
28
+ end
28
29
  end
29
- end
30
30
 
31
- def log_failing_spec(result)
32
- log_junit_spec(suite: result.suite, label: result.label) do
33
- log_line(%{ <failure type="AssertionFailed">#{cdata(result.message)}</failure>})
31
+ def log_failing_spec(result)
32
+ log_junit_spec(suite: result.suite, label: result.label) do
33
+ log_line(%{ <failure type="AssertionFailed">#{cdata(result.message)}</failure>})
34
+ end
34
35
  end
35
- end
36
36
 
37
- def log_result(_result)
38
- log_end_suite
39
- end
37
+ def log_result(_result)
38
+ log_end_suite
39
+ end
40
40
 
41
- def log_coverage(message)
42
- properties = "<properties>#{cdata(message)}</properties>"
43
- log_line(%{<testsuite name="Coverage summary" tests="0">\n#{properties}\n</testsuite>})
44
- end
41
+ def log_coverage(message)
42
+ properties = "<properties>#{cdata(message)}</properties>"
43
+ log_line(%{<testsuite name="Coverage summary" tests="0">\n#{properties}\n</testsuite>})
44
+ end
45
45
 
46
- def log_threshold_failure(message)
47
- log_line(%{<testsuite name="Coverage thresholds" tests="1">})
48
- log_junit_spec(suite: "Coverage thresholds", label: "were not met") do
49
- log_line(%{ <failure type="AssertionFailed">#{cdata(message)}</failure>})
46
+ def log_threshold_failure(message)
47
+ log_line(%{<testsuite name="Coverage thresholds" tests="1">})
48
+ log_junit_spec(suite: "Coverage thresholds", label: "were not met") do
49
+ log_line(%{ <failure type="AssertionFailed">#{cdata(message)}</failure>})
50
+ end
51
+ log_line(%{</testsuite>})
50
52
  end
51
- log_line(%{</testsuite>})
52
- end
53
53
 
54
- def log_complete(_failure_count)
55
- log_line(%{</testsuite>\n</testsuites>})
56
- end
54
+ def log_complete(_failure_count)
55
+ log_line(%{</testsuite>\n</testsuites>})
56
+ end
57
57
 
58
58
  private
59
59
 
60
- def log_end_suite
61
- log_line(%{</testsuite>}) if @last_suite
62
- end
60
+ def log_end_suite
61
+ log_line(%{</testsuite>}) if @last_suite
62
+ end
63
63
 
64
- def log_junit_spec(opts, &_block)
65
- log_line(%{<testcase classname="#{escape(opts[:suite])}" name="#{escape(opts[:label])}">})
66
- yield if block_given?
67
- log_line(%{<system-out>#{cdata(@stdout)}</system-out>}) unless @stdout.blank?
68
- log_line(%{</testcase>})
69
- end
64
+ def log_junit_spec(opts, &_block)
65
+ log_line(%{<testcase classname="#{escape(opts[:suite])}" name="#{escape(opts[:label])}">})
66
+ yield if block_given?
67
+ log_line(%{<system-out>#{cdata(@stdout)}</system-out>}) unless @stdout.blank?
68
+ log_line(%{</testcase>})
69
+ end
70
70
 
71
- def escape(str)
72
- CGI::escapeHTML(str)
73
- end
71
+ def escape(str)
72
+ CGI.escapeHTML(str)
73
+ end
74
74
 
75
- def cdata(str)
76
- "\n<![CDATA[\n#{str.gsub(/\n$/, '')}\n]]>\n"
77
- end
75
+ def cdata(str)
76
+ "\n<![CDATA[\n#{str.gsub(/\n$/, '')}\n]]>\n"
77
+ end
78
78
  end
79
79
  end
80
80
  end
@@ -15,6 +15,8 @@ module Teaspoon
15
15
  log_line
16
16
  end
17
17
 
18
+ alias_method :log_exception, :log_error
19
+
18
20
  def log_result(result)
19
21
  log_information
20
22
  log_stats(result)
@@ -31,46 +33,46 @@ module Teaspoon
31
33
 
32
34
  private
33
35
 
34
- def log_information
35
- log_pending if pendings.size > 0
36
- log_failures if failures.size > 0
37
- end
36
+ def log_information
37
+ log_pending if pendings.size > 0
38
+ log_failures if failures.size > 0
39
+ end
38
40
 
39
- def log_pending
40
- log_line("Pending:")
41
- pendings.each do |result|
42
- log_line(" #{result.description}", YELLOW)
43
- log_line(" # Not yet implemented\n", CYAN)
41
+ def log_pending
42
+ log_line("Pending:")
43
+ pendings.each do |result|
44
+ log_line(" #{result.description}", YELLOW)
45
+ log_line(" # Not yet implemented\n", CYAN)
46
+ end
44
47
  end
45
- end
46
48
 
47
- def log_failures
48
- log_line("Failures:\n")
49
- failures.each_with_index do |failure, index|
50
- log_line(" #{index + 1}) #{failure.description}")
51
- log_line(" Failure/Error: #{failure.message}\n", RED)
49
+ def log_failures
50
+ log_line("Failures:\n")
51
+ failures.each_with_index do |failure, index|
52
+ log_line(" #{index + 1}) #{failure.description}")
53
+ log_line(" Failure/Error: #{failure.message}\n", RED)
54
+ end
52
55
  end
53
- end
54
56
 
55
- def log_stats(result)
56
- log_line("Finished in #{result.elapsed} seconds")
57
- stats = "#{pluralize('example', run_count)}, #{pluralize('failure', failures.size)}"
58
- stats << ", #{pendings.size} pending" if pendings.size > 0
59
- log_line(stats, stats_color)
60
- end
57
+ def log_stats(result)
58
+ log_line("Finished in #{result.elapsed} seconds")
59
+ stats = "#{pluralize('example', run_count)}, #{pluralize('failure', failures.size)}"
60
+ stats << ", #{pendings.size} pending" if pendings.size > 0
61
+ log_line(stats, stats_color)
62
+ end
61
63
 
62
- def log_failed_examples
63
- return if failures.size == 0
64
- log_line
65
- log_line("Failed examples:\n")
66
- failures.each do |failure|
67
- log_line("teaspoon -s #{@suite_name} --filter=\"#{failure.link}\"", RED)
64
+ def log_failed_examples
65
+ return if failures.size == 0
66
+ log_line
67
+ log_line("Failed examples:\n")
68
+ failures.each do |failure|
69
+ log_line("teaspoon -s #{@suite_name} --filter=\"#{failure.link}\"", RED)
70
+ end
68
71
  end
69
- end
70
72
 
71
- def stats_color
72
- failures.size > 0 ? RED : pendings.size > 0 ? YELLOW : GREEN
73
- end
73
+ def stats_color
74
+ failures.size > 0 ? RED : pendings.size > 0 ? YELLOW : GREEN
75
+ end
74
76
  end
75
77
  end
76
78
  end
@@ -12,34 +12,34 @@ module Teaspoon
12
12
 
13
13
  protected
14
14
 
15
- def log_spec(result)
16
- return log_pride if result.passing?
17
- super
18
- end
15
+ def log_spec(result)
16
+ return log_pride if result.passing?
17
+ super
18
+ end
19
19
 
20
20
  private
21
21
 
22
- def log_pride
23
- return log_str(".") unless Teaspoon.configuration.color
24
- log_str("\e[38;5;#{next_color}m.\e[0m")
25
- end
22
+ def log_pride
23
+ return log_str(".") unless Teaspoon.configuration.color
24
+ log_str("\e[38;5;#{next_color}m.\e[0m")
25
+ end
26
26
 
27
- def colors
28
- @colors ||= (0...42).map do |i|
29
- i *= 1.0 / 6
30
- 36 * calc_color(i) + 6 * calc_color(i + 2 * PI_3) + calc_color(i + 4 * PI_3) + 16
27
+ def colors
28
+ @colors ||= (0...42).map do |i|
29
+ i *= 1.0 / 6
30
+ 36 * calc_color(i) + 6 * calc_color(i + 2 * PI_3) + calc_color(i + 4 * PI_3) + 16
31
+ end
31
32
  end
32
- end
33
33
 
34
- def calc_color(val)
35
- (3 * Math.sin(val) + 3).to_i
36
- end
34
+ def calc_color(val)
35
+ (3 * Math.sin(val) + 3).to_i
36
+ end
37
37
 
38
- def next_color
39
- c = colors[@color_index % colors.size]
40
- @color_index += 1
41
- c
42
- end
38
+ def next_color
39
+ c = colors[@color_index % colors.size]
40
+ @color_index += 1
41
+ c
42
+ end
43
43
  end
44
44
  end
45
45
  end
@@ -38,38 +38,38 @@ module Teaspoon
38
38
 
39
39
  private
40
40
 
41
- def log_suite_start(result)
42
- @current_suite << result.label
43
- log_template @suite_start_template, result
44
- end
41
+ def log_suite_start(result)
42
+ @current_suite << result.label
43
+ log_template @suite_start_template, result
44
+ end
45
45
 
46
- def log_suite_end
47
- log_template @suite_end_template, @current_suite.pop
48
- end
46
+ def log_suite_end
47
+ log_template @suite_end_template, @current_suite.pop
48
+ end
49
49
 
50
- def template(contents)
51
- Template.new contents
52
- end
50
+ def template(contents)
51
+ Template.new contents
52
+ end
53
53
 
54
- def log_template(template, object)
55
- log_str template.render(object)
56
- end
54
+ def log_template(template, object)
55
+ log_str template.render(object)
56
+ end
57
57
 
58
- class Template
59
- include ERB::Util
58
+ class Template
59
+ include ERB::Util
60
60
 
61
- def initialize(contents)
62
- @template = contents
63
- end
61
+ def initialize(contents)
62
+ @template = contents
63
+ end
64
64
 
65
- def render(obj)
66
- @o = obj
67
- ERB.new(@template).result binding
65
+ def render(obj)
66
+ @o = obj
67
+ ERB.new(@template).result binding
68
+ end
68
69
  end
69
- end
70
70
 
71
- module Templates
72
- CSS = <<-CSS.strip_heredoc
71
+ module Templates
72
+ CSS = <<-CSS.strip_heredoc
73
73
  body {
74
74
  margin: 0;
75
75
  padding: 0;
@@ -191,7 +191,7 @@ module Teaspoon
191
191
  }
192
192
  CSS
193
193
 
194
- JAVASCRIPT = <<-JAVASCRIPT.strip_heredoc
194
+ JAVASCRIPT = <<-JAVASCRIPT.strip_heredoc
195
195
  (function() {
196
196
  "use strict";
197
197
 
@@ -386,7 +386,7 @@ module Teaspoon
386
386
  })();
387
387
  JAVASCRIPT
388
388
 
389
- HEADER = <<-HTML.strip_heredoc
389
+ HEADER = <<-HTML.strip_heredoc
390
390
  <!DOCTYPE html>
391
391
  <html>
392
392
  <head>
@@ -422,13 +422,13 @@ module Teaspoon
422
422
  <div class="results">
423
423
  HTML
424
424
 
425
- SUITE_START = <<-HTML.strip_heredoc
425
+ SUITE_START = <<-HTML.strip_heredoc
426
426
  <div class="example_group">
427
427
  <dl>
428
428
  <dt><%= h @o.label %></dt>
429
429
  HTML
430
430
 
431
- SPEC = <<-HTML.strip_heredoc
431
+ SPEC = <<-HTML.strip_heredoc
432
432
  <dd class="example <%= h @o.status %>">
433
433
  <span class="spec-name"><%= h @o.label %></span>
434
434
  <span class="duration"><%= h "\#{@o.elapsed}s" if @o.elapsed %></span>
@@ -441,12 +441,12 @@ module Teaspoon
441
441
  </dd>
442
442
  HTML
443
443
 
444
- SUITE_END = <<-HTML.strip_heredoc
444
+ SUITE_END = <<-HTML.strip_heredoc
445
445
  </dl>
446
446
  </div>
447
447
  HTML
448
448
 
449
- FOOTER = <<-HTML.strip_heredoc
449
+ FOOTER = <<-HTML.strip_heredoc
450
450
  </div>
451
451
  </div>
452
452
 
@@ -458,7 +458,7 @@ module Teaspoon
458
458
  </body>
459
459
  </html>
460
460
  HTML
461
- end
461
+ end
462
462
  end
463
463
  end
464
464
  end