teaspoon 1.1.3 → 1.2.2

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 +47 -0
  3. data/MIT.LICENSE +2 -2
  4. data/README.md +56 -35
  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/_boot.html.erb +1 -1
  9. data/app/views/teaspoon/suite/index.html.erb +1 -1
  10. data/lib/generators/teaspoon/install/install_generator.rb +34 -34
  11. data/lib/generators/teaspoon/install/templates/MISSING_FRAMEWORK +1 -1
  12. data/lib/generators/teaspoon/install/templates/POST_INSTALL +1 -1
  13. data/lib/generators/teaspoon/install/templates/env_comments.rb.tt +9 -7
  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 +41 -40
  18. data/lib/teaspoon/coverage.rb +29 -25
  19. data/lib/teaspoon/deprecated.rb +1 -1
  20. data/lib/teaspoon/driver.rb +1 -1
  21. data/lib/teaspoon/driver/browserstack.rb +111 -0
  22. data/lib/teaspoon/driver/phantomjs.rb +25 -26
  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 +32 -27
  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 -51
  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 +9 -9
  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 +22 -15
  53. data/lib/teaspoon/driver/capybara_webkit.rb +0 -40
@@ -5,35 +5,35 @@ module Teaspoon
5
5
  class Tap < Base
6
6
  protected
7
7
 
8
- def log_runner(_result)
9
- log_line("1..#{@total_count}")
10
- end
11
-
12
- def log_passing_spec(result)
13
- log_line("ok #{@run_count} - #{result.description}")
14
- end
15
-
16
- def log_pending_spec(result)
17
- log_line("ok #{@run_count} - [pending] #{result.description}")
18
- end
19
-
20
- def log_failing_spec(result)
21
- log_line("not ok #{@run_count} - #{result.description}")
22
- log_line(" FAIL #{result.message}")
23
- end
24
-
25
- def log_console(message)
26
- log_line("# #{message.gsub(/\n$/, '')}")
27
- end
28
-
29
- def log_coverage(message)
30
- log_line("# #{message.gsub(/\n/, "\n# ")}")
31
- end
32
-
33
- def log_threshold_failure(message)
34
- log_line("not ok #{@run_count + 1} - Coverage threshold failed")
35
- log_line("# #{message.gsub(/\n/, "\n# ")}")
36
- end
8
+ def log_runner(_result)
9
+ log_line("1..#{@total_count}")
10
+ end
11
+
12
+ def log_passing_spec(result)
13
+ log_line("ok #{@run_count} - #{result.description}")
14
+ end
15
+
16
+ def log_pending_spec(result)
17
+ log_line("ok #{@run_count} - [pending] #{result.description}")
18
+ end
19
+
20
+ def log_failing_spec(result)
21
+ log_line("not ok #{@run_count} - #{result.description}")
22
+ log_line(" FAIL #{result.message}")
23
+ end
24
+
25
+ def log_console(message)
26
+ log_line("# #{message.gsub(/\n$/, '')}")
27
+ end
28
+
29
+ def log_coverage(message)
30
+ log_line("# #{message.gsub(/\n/, "\n# ")}")
31
+ end
32
+
33
+ def log_threshold_failure(message)
34
+ log_line("not ok #{@run_count + 1} - Coverage threshold failed")
35
+ log_line("# #{message.gsub(/\n/, "\n# ")}")
36
+ end
37
37
  end
38
38
  end
39
39
  end
@@ -6,71 +6,71 @@ module Teaspoon
6
6
  class TapY < Base
7
7
  protected
8
8
 
9
- def log_runner(result)
10
- log "type" => "suite",
11
- "start" => result.start,
12
- "count" => result.total,
13
- "seed" => 0,
14
- "rev" => 4
15
- end
9
+ def log_runner(result)
10
+ log "type" => "suite",
11
+ "start" => result.start,
12
+ "count" => result.total,
13
+ "seed" => 0,
14
+ "rev" => 4
15
+ end
16
16
 
17
- def log_suite(result)
18
- log "type" => "case",
19
- "label" => result.label,
20
- "level" => result.level
21
- end
17
+ def log_suite(result)
18
+ log "type" => "case",
19
+ "label" => result.label,
20
+ "level" => result.level
21
+ end
22
22
 
23
- def log_passing_spec(result)
24
- log "type" => "test",
25
- "status" => "pass",
26
- "label" => result.label,
27
- "stdout" => @stdout
28
- end
23
+ def log_passing_spec(result)
24
+ log "type" => "test",
25
+ "status" => "pass",
26
+ "label" => result.label,
27
+ "stdout" => @stdout
28
+ end
29
29
 
30
- def log_pending_spec(result)
31
- log "type" => "test",
32
- "status" => "pending",
33
- "label" => result.label,
34
- "stdout" => @stdout,
35
- "exception" => {
36
- "message" => result.message
37
- }
38
- end
30
+ def log_pending_spec(result)
31
+ log "type" => "test",
32
+ "status" => "pending",
33
+ "label" => result.label,
34
+ "stdout" => @stdout,
35
+ "exception" => {
36
+ "message" => result.message
37
+ }
38
+ end
39
39
 
40
- def log_failing_spec(result)
41
- log "type" => "test",
42
- "status" => "fail",
43
- "label" => result.label,
44
- "stdout" => @stdout,
45
- "exception" => {
46
- "message" => result.message,
47
- "backtrace" => ["#{result.link}#:0"],
48
- "file" => "unknown",
49
- "line" => "unknown",
50
- "source" => "unknown",
51
- "snippet" => { "0" => result.link },
52
- "class" => "Unknown"
53
- }
54
- end
40
+ def log_failing_spec(result)
41
+ log "type" => "test",
42
+ "status" => "fail",
43
+ "label" => result.label,
44
+ "stdout" => @stdout,
45
+ "exception" => {
46
+ "message" => result.message,
47
+ "backtrace" => ["#{result.link}#:0"],
48
+ "file" => "unknown",
49
+ "line" => "unknown",
50
+ "source" => "unknown",
51
+ "snippet" => { "0" => result.link },
52
+ "class" => "Unknown"
53
+ }
54
+ end
55
55
 
56
- def log_result(result)
57
- log "type" => "final",
58
- "time" => result.elapsed,
59
- "counts" => {
60
- "total" => @run_count,
61
- "pass" => @passes.size,
62
- "fail" => @failures.size,
63
- "error" => @errors.size,
64
- "omit" => 0,
65
- "todo" => @pendings.size
66
- }
67
- end
56
+ def log_result(result)
57
+ log "type" => "final",
58
+ "time" => result.elapsed,
59
+ "counts" => {
60
+ "total" => @run_count,
61
+ "pass" => @passes.size,
62
+ "fail" => @failures.size,
63
+ "error" => @errors.size,
64
+ "omit" => 0,
65
+ "todo" => @pendings.size
66
+ }
67
+ end
68
68
 
69
69
  private
70
70
 
71
- def log(hash)
72
- log_str(hash.to_yaml)
73
- end
71
+ def log(hash)
72
+ log_str(hash.to_yaml)
73
+ end
74
74
  end
75
75
  end
76
76
  end
@@ -10,87 +10,87 @@ module Teaspoon
10
10
 
11
11
  protected
12
12
 
13
- def log_runner(result)
14
- log("testCount count='#{result.total}' timestamp='#{result.start}'")
15
- end
16
-
17
- def log_suite(result)
18
- log_end_suite
19
- log("testSuiteStarted name='#{result.label}'")
20
- end
13
+ def log_runner(result)
14
+ log("testCount count='#{result.total}' timestamp='#{result.start}'")
15
+ end
21
16
 
22
- def log_passing_spec(result)
23
- log_teamcity_spec(type: "testStarted", desc: escape(result.description))
24
- end
17
+ def log_suite(result)
18
+ log_end_suite
19
+ log("testSuiteStarted name='#{result.label}'")
20
+ end
25
21
 
26
- def log_pending_spec(result)
27
- log_teamcity_spec(type: "testIgnored", desc: escape(result.description))
28
- end
22
+ def log_passing_spec(result)
23
+ log_teamcity_spec(type: "testStarted", desc: escape(result.description))
24
+ end
29
25
 
30
- def log_failing_spec(result)
31
- log_teamcity_spec(type: "testStarted", desc: escape(result.description)) do
32
- log("testFailed name='#{escape(result.description)}' message='#{escape(result.message)}'")
26
+ def log_pending_spec(result)
27
+ log_teamcity_spec(type: "testIgnored", desc: escape(result.description))
33
28
  end
34
- end
35
29
 
36
- def log_error(result)
37
- log("message text='#{escape(result.message)}' errorDetails='#{escape_trace(result.trace)}' status='ERROR'")
38
- end
30
+ def log_failing_spec(result)
31
+ log_teamcity_spec(type: "testStarted", desc: escape(result.description)) do
32
+ log("testFailed name='#{escape(result.description)}' message='#{escape(result.message)}'")
33
+ end
34
+ end
39
35
 
40
- def log_result(result)
41
- log_end_suite
42
- @result = result
43
- end
36
+ def log_error(result)
37
+ log("message text='#{escape(result.message)}' errorDetails='#{escape_trace(result.trace)}' status='ERROR'")
38
+ end
44
39
 
45
- def log_coverage(message)
46
- log("testSuiteStarted name='Coverage summary'")
47
- log_line(message)
48
- log("testSuiteFinished name='Coverage summary'")
49
- end
40
+ def log_result(result)
41
+ log_end_suite
42
+ @result = result
43
+ end
50
44
 
51
- def log_threshold_failure(message)
52
- log("testSuiteStarted name='Coverage thresholds'")
53
- log_teamcity_spec(type: "testStarted", desc: "Coverage thresholds") do
54
- log("testFailed name='Coverage thresholds' message='were not met'")
45
+ def log_coverage(message)
46
+ log("testSuiteStarted name='Coverage summary'")
55
47
  log_line(message)
48
+ log("testSuiteFinished name='Coverage summary'")
56
49
  end
57
- log("testSuiteFinished name='Coverage thresholds'")
58
- end
59
50
 
60
- def log_complete(failure_count)
61
- log_line("\nFinished in #{@result.elapsed} seconds")
62
- stats = "#{pluralize('example', run_count)}, #{pluralize('failure', failure_count)}"
63
- stats << ", #{pendings.size} pending" if pendings.size > 0
64
- log_line(stats)
65
- log_line if failure_count > 0
66
- end
51
+ def log_threshold_failure(message)
52
+ log("testSuiteStarted name='Coverage thresholds'")
53
+ log_teamcity_spec(type: "testStarted", desc: "Coverage thresholds") do
54
+ log("testFailed name='Coverage thresholds' message='were not met'")
55
+ log_line(message)
56
+ end
57
+ log("testSuiteFinished name='Coverage thresholds'")
58
+ end
59
+
60
+ def log_complete(failure_count)
61
+ log_line("\nFinished in #{@result.elapsed} seconds")
62
+ stats = "#{pluralize('example', run_count)}, #{pluralize('failure', failure_count)}"
63
+ stats << ", #{pendings.size} pending" if pendings.size > 0
64
+ log_line(stats)
65
+ log_line if failure_count > 0
66
+ end
67
67
 
68
68
  private
69
69
 
70
- def log_end_suite
71
- log("testSuiteFinished name='#{escape(@last_suite.label)}'") if @last_suite
72
- end
70
+ def log_end_suite
71
+ log("testSuiteFinished name='#{escape(@last_suite.label)}'") if @last_suite
72
+ end
73
73
 
74
- def log_teamcity_spec(opts, &_block)
75
- log("#{opts[:type]} name='#{opts[:desc]}' captureStandardOutput='true'")
76
- log_line(@stdout.gsub(/\n$/, "")) unless @stdout.blank?
77
- yield if block_given?
78
- log("testFinished name='#{opts[:desc]}'")
79
- end
74
+ def log_teamcity_spec(opts, &_block)
75
+ log("#{opts[:type]} name='#{opts[:desc]}' captureStandardOutput='true'")
76
+ log_line(@stdout.gsub(/\n$/, "")) unless @stdout.blank?
77
+ yield if block_given?
78
+ log("testFinished name='#{opts[:desc]}'")
79
+ end
80
80
 
81
- def log(str)
82
- log_line("##teamcity[#{str}]")
83
- end
81
+ def log(str)
82
+ log_line("##teamcity[#{str}]")
83
+ end
84
84
 
85
- def escape(str)
86
- str = str.gsub(/[|'\[\]]/) { |c| "|#{c}" }
87
- str.gsub("\n", "|n").gsub("\r", "|r")
88
- end
85
+ def escape(str)
86
+ str = str.gsub(/[|'\[\]]/) { |c| "|#{c}" }
87
+ str.gsub("\n", "|n").gsub("\r", "|r")
88
+ end
89
89
 
90
- def escape_trace(trace)
91
- lines = trace.map { |t| ["#{t['file']}:#{t['line']}", t["function"]].compact.join(" ") }
92
- escape(lines.join("\n"))
93
- end
90
+ def escape_trace(trace)
91
+ lines = trace.map { |t| ["#{t['file']}:#{t['line']}", t["function"]].compact.join(" ") }
92
+ escape(lines.join("\n"))
93
+ end
94
94
  end
95
95
  end
96
96
  end
@@ -13,7 +13,7 @@ module Teaspoon
13
13
  base._asset_paths = []
14
14
  base._template_paths = []
15
15
  base._install_path = "spec"
16
- base._install_proc = proc {}
16
+ base._install_proc = proc { }
17
17
  end
18
18
 
19
19
  def framework_name(name = nil)
@@ -43,28 +43,28 @@ module Teaspoon
43
43
 
44
44
  protected
45
45
 
46
- def self.ignored?(asset)
47
- Array(Teaspoon::Coverage.configuration.ignore).any? do |ignore|
48
- asset.pathname.to_s.match(ignore)
46
+ def self.ignored?(asset)
47
+ Array(Teaspoon::Coverage.configuration.ignore).any? do |ignore|
48
+ asset.filename.match(ignore)
49
+ end
50
+ rescue Teaspoon::UnknownCoverage
51
+ false
49
52
  end
50
- rescue Teaspoon::UnknownCoverage
51
- false
52
- end
53
53
 
54
- def add_instrumentation(asset)
55
- source_path = asset.pathname.to_s
56
- Dir.mktmpdir do |temp_path|
57
- input_path = File.join(temp_path, File.basename(source_path)).sub(/\.js.+/, ".js")
58
- File.open(input_path, "w") { |f| f.write(asset.source) }
59
- instrument(input_path).gsub(input_path, source_path)
54
+ def add_instrumentation(asset)
55
+ source_path = asset.filename
56
+ Dir.mktmpdir do |temp_path|
57
+ input_path = File.join(temp_path, File.basename(source_path)).sub(/\.js.+/, ".js")
58
+ File.open(input_path, "w") { |f| f.write(asset.source) }
59
+ instrument(input_path).gsub(input_path, source_path)
60
+ end
60
61
  end
61
- end
62
62
 
63
- def instrument(input)
64
- result = %x{#{self.class.executable} instrument --embed-source #{input.shellescape}}
65
- return result if $?.exitstatus == 0
66
- raise Teaspoon::DependencyError.new("Unable to add instrumentation to #{File.basename(input)}.")
67
- end
63
+ def instrument(input)
64
+ result = %x{#{self.class.executable} instrument --embed-source #{input.shellescape}}
65
+ return result if $?.exitstatus == 0
66
+ raise Teaspoon::DependencyError.new("Unable to add instrumentation to #{File.basename(input)}.")
67
+ end
68
68
  end
69
69
 
70
70
  module SprocketsInstrumentation
@@ -22,11 +22,11 @@ module Teaspoon
22
22
  if !(driver = @registry[normalize_name(name)])
23
23
  raise not_found_exception.new(name: name, available: available.keys)
24
24
  end
25
-
25
+
26
26
  driver.call
27
27
  end
28
28
 
29
- def equal?(one, two)
29
+ def matches?(one, two)
30
30
  normalize_name(one) == normalize_name(two)
31
31
  end
32
32
 
@@ -36,12 +36,12 @@ module Teaspoon
36
36
 
37
37
  private
38
38
 
39
- def normalize_name(name)
40
- name.to_s.gsub(/[-|\s]/, '_').to_sym
41
- end
39
+ def normalize_name(name)
40
+ name.to_s.gsub(/[-|\s]/, "_").to_sym
41
+ end
42
42
 
43
- def not_found_exception
44
- @not_found_exception || Teaspoon::NotFoundInRegistry
45
- end
43
+ def not_found_exception
44
+ @not_found_exception || Teaspoon::NotFoundInRegistry
45
+ end
46
46
  end
47
- end
47
+ end
@@ -2,10 +2,10 @@ module Teaspoon
2
2
  module Registry
3
3
  module HasDefault
4
4
  def default
5
- available.find do |formatter,options|
5
+ available.find do |formatter, options|
6
6
  options[:default]
7
7
  end.first
8
8
  end
9
9
  end
10
10
  end
11
- end
11
+ end