teaspoon 1.1.5 → 1.2.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 (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
@@ -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,7 +22,7 @@ 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
 
@@ -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
@@ -20,50 +20,50 @@ module Teaspoon
20
20
 
21
21
  private
22
22
 
23
- def resolve_formatter(formatter)
24
- formatter, output = formatter.to_s.split(">")
25
- Teaspoon::Formatter.fetch(formatter).new(@suite_name, output)
26
- end
23
+ def resolve_formatter(formatter)
24
+ formatter, output = formatter.to_s.split(">")
25
+ Teaspoon::Formatter.fetch(formatter).new(@suite_name, output)
26
+ end
27
27
 
28
- def notify_formatters(event, result)
29
- @formatters.each { |f| f.send(event, result) if f.respond_to?(event) }
30
- send(:"on_#{event}", result) if respond_to?(:"on_#{event}", true)
31
- end
28
+ def notify_formatters(event, result)
29
+ @formatters.each { |f| f.send(event, result) if f.respond_to?(event) }
30
+ send(:"on_#{event}", result) if respond_to?(:"on_#{event}", true)
31
+ end
32
32
 
33
- def result_from_line(line)
34
- json = JSON.parse(line)
35
- return false unless json && json["_teaspoon"] && json["type"]
36
- json["original_json"] = line
37
- return result_from_json(json)
38
- rescue JSON::ParserError
39
- false
40
- end
33
+ def result_from_line(line)
34
+ json = JSON.parse(line)
35
+ return false unless json && json["_teaspoon"] && json["type"]
36
+ json["original_json"] = line
37
+ result_from_json(json)
38
+ rescue JSON::ParserError
39
+ false
40
+ end
41
41
 
42
- def result_from_json(json)
43
- result = Teaspoon::Result.build_from_json(json)
44
- @failure_count += 1 if result.failing?
45
- result
46
- end
42
+ def result_from_json(json)
43
+ result = Teaspoon::Result.build_from_json(json)
44
+ @failure_count += 1 if result.failing?
45
+ result
46
+ end
47
47
 
48
- def on_exception(result)
49
- raise Teaspoon::RunnerError.new(result.message)
50
- end
48
+ def on_exception(result)
49
+ raise Teaspoon::RunnerError.new(result.message)
50
+ end
51
51
 
52
- def on_result(result)
53
- resolve_coverage(result.coverage)
54
- notify_formatters("complete", @failure_count)
55
- end
52
+ def on_result(result)
53
+ resolve_coverage(result.coverage)
54
+ notify_formatters("complete", @failure_count)
55
+ end
56
56
 
57
- def resolve_coverage(data)
58
- return unless Teaspoon.configuration.use_coverage
59
- raise Teaspoon::IstanbulNotFoundError unless Teaspoon::Instrumentation.executable
57
+ def resolve_coverage(data)
58
+ return unless Teaspoon.configuration.use_coverage
59
+ raise Teaspoon::IstanbulNotFoundError unless Teaspoon::Instrumentation.executable
60
60
 
61
- coverage = Teaspoon::Coverage.new(@suite_name, data)
62
- coverage.generate_reports { |msg| notify_formatters("coverage", msg) }
63
- coverage.check_thresholds do |msg|
64
- notify_formatters("threshold_failure", msg)
65
- @failure_count += 1
61
+ coverage = Teaspoon::Coverage.new(@suite_name, data)
62
+ coverage.generate_reports { |msg| notify_formatters("coverage", msg) }
63
+ coverage.check_thresholds do |msg|
64
+ notify_formatters("threshold_failure", msg)
65
+ @failure_count += 1
66
+ end
66
67
  end
67
- end
68
68
  end
69
69
  end
@@ -37,38 +37,39 @@ module Teaspoon
37
37
 
38
38
  protected
39
39
 
40
- def wait_until_started(thread)
41
- Timeout.timeout(Teaspoon.configuration.server_timeout.to_i) { thread.join(0.1) until responsive? }
42
- rescue Timeout::Error
43
- raise Timeout::Error.new("consider increasing the timeout with `config.server_timeout`")
44
- end
40
+ def wait_until_started(thread)
41
+ Timeout.timeout(Teaspoon.configuration.server_timeout.to_i) { thread.join(0.1) until responsive? }
42
+ rescue Timeout::Error
43
+ raise Timeout::Error.new("consider increasing the timeout with `config.server_timeout`")
44
+ end
45
45
 
46
- def disable_logging
47
- return unless defined?(Thin)
48
- if Teaspoon.configuration.suppress_log
49
- Thin::Logging.silent = true
50
- else
51
- Thin::Logging.trace = false
46
+ def disable_logging
47
+ return unless defined?(Thin)
48
+ if Teaspoon.configuration.suppress_log
49
+ Thin::Logging.silent = true
50
+ else
51
+ Thin::Logging.trace = false
52
+ end
52
53
  end
53
- end
54
54
 
55
- def rack_options
56
- {
57
- app: Rails.application,
58
- Host: host,
59
- Port: port,
60
- environment: "test",
61
- AccessLog: [],
62
- Logger: Rails.logger,
63
- server: Teaspoon.configuration.server
64
- }
65
- end
55
+ def rack_options
56
+ {
57
+ app: Rails.application,
58
+ Host: host,
59
+ Port: port,
60
+ environment: "test",
61
+ AccessLog: [],
62
+ Logger: Rails.logger,
63
+ server: Teaspoon.configuration.server,
64
+ Silent: true
65
+ }
66
+ end
66
67
 
67
- def find_available_port
68
- server = TCPServer.new(host, 0)
69
- server.addr[1]
70
- ensure
71
- server.close if server
72
- end
68
+ def find_available_port
69
+ server = TCPServer.new(host, 0)
70
+ server.addr[1]
71
+ ensure
72
+ server.close if server
73
+ end
73
74
  end
74
75
  end
@@ -42,78 +42,89 @@ module Teaspoon
42
42
 
43
43
  protected
44
44
 
45
- def specs
46
- files = specs_from_file
47
- return files unless files.empty?
48
- glob.map { |file| asset_from_file(file) }
49
- end
45
+ def specs
46
+ files = specs_from_file
47
+ return files unless files.empty?
48
+ glob.map { |file| asset_from_file(file) }
49
+ end
50
50
 
51
- def asset_tree(sources)
52
- sources.flat_map do |source|
53
- asset = @env.find_asset(source)
51
+ def asset_tree(sources)
52
+ sources.flat_map do |source|
53
+ asset = @env.find_asset(source, accept: "application/javascript", pipeline: :debug)
54
+
55
+ if asset && asset.respond_to?(:logical_path)
56
+ asset_and_dependencies(asset).map { |a| asset_url(a) }
57
+ else
58
+ source.blank? ? [] : [source]
59
+ end
60
+ end.compact.uniq
61
+ end
54
62
 
55
- if asset && asset.respond_to?(:logical_path)
56
- assets = config.expand_assets ? asset.to_a : [asset]
57
- assets.map { |a| asset_url(a) }
63
+ def asset_url(asset)
64
+ params = []
65
+ params << "body=1" if config.expand_assets
66
+ params << "instrument=1" if instrument_file?(asset.filename)
67
+ url = asset.logical_path
68
+ url += "?#{params.join("&")}" if params.any?
69
+ url
70
+ end
71
+
72
+ def asset_and_dependencies(asset)
73
+ if config.expand_assets
74
+ if asset.respond_to?(:to_a)
75
+ asset.to_a
76
+ else
77
+ asset.metadata[:included].map { |uri| @env.load(uri) }
78
+ end
58
79
  else
59
- source.blank? ? [] : [source]
80
+ [asset]
60
81
  end
61
- end.compact.uniq
62
- end
82
+ end
63
83
 
64
- def asset_url(asset)
65
- params = []
66
- params << "body=1" if config.expand_assets
67
- params << "instrument=1" if instrument_file?(asset.pathname.to_s)
68
- url = asset.logical_path
69
- url += "?#{params.join("&")}" if params.any?
70
- url
71
- end
84
+ def instrument_file?(file)
85
+ return false unless coverage_requested?
86
+ return false if matched_spec_file?(file)
87
+ true
88
+ end
72
89
 
73
- def instrument_file?(file)
74
- return false unless coverage_requested?
75
- return false if matched_spec_file?(file)
76
- true
77
- end
90
+ def coverage_requested?
91
+ @options[:coverage] || Teaspoon.configuration.use_coverage
92
+ end
78
93
 
79
- def coverage_requested?
80
- @options[:coverage] || Teaspoon.configuration.use_coverage
81
- end
94
+ def matched_spec_file?(file)
95
+ glob.include?(file)
96
+ end
82
97
 
83
- def matched_spec_file?(file)
84
- glob.include?(file)
85
- end
98
+ def asset_from_file(original)
99
+ filename = original
100
+ Rails.application.config.assets.paths.each do |path|
101
+ filename = filename.gsub(%r(^#{Regexp.escape(path.to_s)}[\/|\\]), "")
102
+ end
86
103
 
87
- def asset_from_file(original)
88
- filename = original
89
- Rails.application.config.assets.paths.each do |path|
90
- filename = filename.gsub(%r(^#{Regexp.escape(path.to_s)}[\/|\\]), "")
104
+ raise Teaspoon::AssetNotServableError.new(filename: filename) if filename == original
105
+ normalize_js_extension(filename)
91
106
  end
92
107
 
93
- raise Teaspoon::AssetNotServableError.new(filename: filename) if filename == original
94
- normalize_js_extension(filename)
95
- end
96
-
97
- def normalize_js_extension(original_filename)
98
- config.js_extensions.inject(original_filename.gsub(".erb", "")) do |filename, extension|
99
- filename.gsub(Regexp.new(extension.to_s + "$"), ".js")
108
+ def normalize_js_extension(original_filename)
109
+ config.js_extensions.inject(original_filename.gsub(".erb", "")) do |filename, extension|
110
+ filename.gsub(Regexp.new(extension.to_s + "$"), ".js")
111
+ end
100
112
  end
101
- end
102
113
 
103
- def glob
104
- @glob ||= Dir[config.matcher.present? ? Teaspoon.configuration.root.join(config.matcher) : ""].sort!
105
- end
114
+ def glob
115
+ @glob ||= Dir[config.matcher.present? ? Teaspoon.configuration.root.join(config.matcher) : ""].sort!
116
+ end
106
117
 
107
- def suite_configuration
108
- config = Teaspoon.configuration.suite_configs[name]
109
- raise Teaspoon::UnknownSuite.new(name: name) unless config.present?
110
- config[:instance] ||= Teaspoon::Configuration::Suite.new(name, &config[:block])
111
- end
118
+ def suite_configuration
119
+ config = Teaspoon.configuration.suite_configs[name]
120
+ raise Teaspoon::UnknownSuite.new(name: name) unless config.present?
121
+ config[:instance] ||= Teaspoon::Configuration::Suite.new(name, &config[:block])
122
+ end
112
123
 
113
- def specs_from_file
114
- Array(@options[:file]).map do |filename|
115
- asset_from_file(File.expand_path(Teaspoon.configuration.root.join(filename)))
124
+ def specs_from_file
125
+ Array(@options[:file]).map do |filename|
126
+ asset_from_file(File.expand_path(Teaspoon.configuration.root.join(filename)))
127
+ end
116
128
  end
117
- end
118
129
  end
119
130
  end
@@ -1,4 +1,10 @@
1
+ require "pathname"
2
+
1
3
  module Teaspoon
4
+ def self.root
5
+ defined?(Rails) ? Rails.root : Pathname.new(Dir.pwd)
6
+ end
7
+
2
8
  def self.abort(message = nil, code = 1)
3
9
  STDOUT.print("#{message}\n") if message
4
10
  exit(code)
@@ -1,3 +1,3 @@
1
1
  module Teaspoon
2
- VERSION = "1.1.5"
2
+ VERSION = "1.2.0"
3
3
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teaspoon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - jejacks0n
8
+ - mikepack
8
9
  - jayzes
9
10
  - jedschneider
10
- - mikepack
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2016-03-25 00:00:00.000000000 Z
14
+ date: 2020-03-02 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: railties
@@ -20,9 +20,6 @@ dependencies:
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
22
  version: 3.2.5
23
- - - "<"
24
- - !ruby/object:Gem::Version
25
- version: '6'
26
23
  type: :runtime
27
24
  prerelease: false
28
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -30,13 +27,10 @@ dependencies:
30
27
  - - ">="
31
28
  - !ruby/object:Gem::Version
32
29
  version: 3.2.5
33
- - - "<"
34
- - !ruby/object:Gem::Version
35
- version: '6'
36
- description: Run Javascript tests using Jasmine, Mocha or QUnit in the browser or
37
- headless using PhantomJS, Selenium Webdriver, or Capybara Webkit
30
+ description: Run your Javascript tests using Jasmine, Mocha or QUnit using a variety
31
+ of platforms.
38
32
  email:
39
- - info@modeset.com
33
+ - jejacks0n@gmail.com
40
34
  executables:
41
35
  - teaspoon
42
36
  extensions: []
@@ -96,7 +90,6 @@ files:
96
90
  - lib/teaspoon/driver.rb
97
91
  - lib/teaspoon/driver/base.rb
98
92
  - lib/teaspoon/driver/browserstack.rb
99
- - lib/teaspoon/driver/capybara_webkit.rb
100
93
  - lib/teaspoon/driver/phantomjs.rb
101
94
  - lib/teaspoon/driver/phantomjs/runner.js
102
95
  - lib/teaspoon/driver/selenium.rb
@@ -130,7 +123,7 @@ files:
130
123
  - lib/teaspoon/suite.rb
131
124
  - lib/teaspoon/utility.rb
132
125
  - lib/teaspoon/version.rb
133
- homepage: https://github.com/modeset/teaspoon
126
+ homepage: https://github.com/jejacks0n/teaspoon
134
127
  licenses:
135
128
  - MIT
136
129
  metadata: {}
@@ -140,17 +133,16 @@ require_paths:
140
133
  - lib
141
134
  required_ruby_version: !ruby/object:Gem::Requirement
142
135
  requirements:
143
- - - ">="
136
+ - - "~>"
144
137
  - !ruby/object:Gem::Version
145
- version: '0'
138
+ version: '2.4'
146
139
  required_rubygems_version: !ruby/object:Gem::Requirement
147
140
  requirements:
148
141
  - - ">="
149
142
  - !ruby/object:Gem::Version
150
143
  version: '0'
151
144
  requirements: []
152
- rubyforge_project:
153
- rubygems_version: 2.5.1
145
+ rubygems_version: 3.0.3
154
146
  signing_key:
155
147
  specification_version: 4
156
148
  summary: 'Teaspoon: A Javascript test runner built on top of Rails'