teaspoon 0.9.1 → 1.0.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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +141 -0
  3. data/README.md +9 -19
  4. data/{vendor → app}/assets/javascripts/support/bind-poly.js +0 -0
  5. data/{vendor → app}/assets/javascripts/support/sinon.js +0 -0
  6. data/app/assets/javascripts/teaspoon-filterer.js +55 -0
  7. data/app/assets/javascripts/teaspoon/error.coffee +5 -0
  8. data/app/assets/javascripts/teaspoon/{base/fixture.coffee → fixture.coffee} +15 -15
  9. data/app/assets/javascripts/teaspoon/{base/hook.coffee → hook.coffee} +0 -0
  10. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/console.coffee +18 -10
  11. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html.coffee +43 -40
  12. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/base_view.coffee +0 -0
  13. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/failure_view.coffee +2 -0
  14. data/app/assets/javascripts/teaspoon/reporters/html/progress_view.coffee +18 -0
  15. data/app/assets/javascripts/teaspoon/{base/reporters/html/progress_view.coffee → reporters/html/radial_progress_view.coffee} +1 -34
  16. data/app/assets/javascripts/teaspoon/reporters/html/simple_progress_view.coffee +15 -0
  17. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/spec_view.coffee +5 -3
  18. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/suite_view.coffee +4 -2
  19. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/template.coffee +0 -0
  20. data/app/assets/javascripts/teaspoon/{base/runner.coffee → runner.coffee} +7 -3
  21. data/app/assets/javascripts/teaspoon/teaspoon.coffee +90 -32
  22. data/app/controllers/teaspoon/suite_controller.rb +5 -0
  23. data/app/views/teaspoon/suite/index.html.erb +1 -1
  24. data/lib/generators/teaspoon/install/install_generator.rb +67 -37
  25. data/lib/generators/teaspoon/install/templates/MISSING_FRAMEWORK +14 -0
  26. data/lib/generators/teaspoon/install/{POST_INSTALL → templates/POST_INSTALL} +0 -0
  27. data/lib/generators/teaspoon/install/templates/env.rb.tt +14 -0
  28. data/lib/generators/teaspoon/install/templates/{jasmine/env_comments.rb.tt → env_comments.rb.tt} +34 -43
  29. data/lib/tasks/teaspoon/info.rake +17 -0
  30. data/lib/teaspoon-devkit.rb +61 -0
  31. data/lib/teaspoon.rb +2 -0
  32. data/lib/teaspoon/command_line.rb +19 -14
  33. data/lib/teaspoon/configuration.rb +24 -35
  34. data/lib/teaspoon/console.rb +11 -21
  35. data/lib/teaspoon/coverage.rb +14 -7
  36. data/lib/teaspoon/deprecated.rb +22 -4
  37. data/lib/teaspoon/driver.rb +15 -0
  38. data/lib/teaspoon/driver/base.rb +7 -0
  39. data/lib/teaspoon/{drivers/capybara_webkit_driver.rb → driver/capybara_webkit.rb} +8 -5
  40. data/lib/teaspoon/{drivers/phantomjs_driver.rb → driver/phantomjs.rb} +8 -4
  41. data/lib/teaspoon/{drivers → driver}/phantomjs/runner.js +0 -0
  42. data/lib/teaspoon/{drivers/selenium_driver.rb → driver/selenium.rb} +11 -9
  43. data/lib/teaspoon/engine.rb +38 -25
  44. data/lib/teaspoon/environment.rb +24 -15
  45. data/lib/teaspoon/exceptions.rb +154 -41
  46. data/lib/teaspoon/exporter.rb +2 -2
  47. data/lib/teaspoon/formatter.rb +30 -0
  48. data/lib/teaspoon/{formatters → formatter}/base.rb +2 -36
  49. data/lib/teaspoon/{formatters/clean_formatter.rb → formatter/clean.rb} +4 -2
  50. data/lib/teaspoon/{formatters/documentation_formatter.rb → formatter/documentation.rb} +4 -3
  51. data/lib/teaspoon/{formatters/dot_formatter.rb → formatter/dot.rb} +4 -3
  52. data/lib/teaspoon/{formatters/json_formatter.rb → formatter/json.rb} +4 -2
  53. data/lib/teaspoon/{formatters/junit_formatter.rb → formatter/junit.rb} +3 -2
  54. data/lib/teaspoon/{formatters → formatter}/modules/report_module.rb +1 -1
  55. data/lib/teaspoon/{formatters/pride_formatter.rb → formatter/pride.rb} +4 -2
  56. data/lib/teaspoon/{formatters/rspec_html_formatter.rb → formatter/rspec_html.rb} +3 -2
  57. data/lib/teaspoon/{formatters/snowday_formatter.rb → formatter/snowday.rb} +3 -2
  58. data/lib/teaspoon/formatter/swayze_or_oprah.rb +111 -0
  59. data/lib/teaspoon/{formatters/tap_formatter.rb → formatter/tap.rb} +4 -2
  60. data/lib/teaspoon/{formatters/tap_y_formatter.rb → formatter/tap_y.rb} +3 -2
  61. data/lib/teaspoon/{formatters/teamcity_formatter.rb → formatter/teamcity.rb} +4 -2
  62. data/lib/teaspoon/framework.rb +17 -0
  63. data/lib/teaspoon/framework/base.rb +88 -0
  64. data/lib/teaspoon/instrumentation.rb +12 -2
  65. data/lib/teaspoon/registry.rb +47 -0
  66. data/lib/teaspoon/registry/has_default.rb +11 -0
  67. data/lib/teaspoon/runner.rb +6 -7
  68. data/lib/teaspoon/server.rb +2 -2
  69. data/lib/teaspoon/suite.rb +28 -30
  70. data/lib/teaspoon/utility.rb +5 -0
  71. data/lib/teaspoon/version.rb +1 -1
  72. metadata +52 -276
  73. data/app/assets/javascripts/teaspoon-jasmine.js +0 -1344
  74. data/app/assets/javascripts/teaspoon-mocha.js +0 -1350
  75. data/app/assets/javascripts/teaspoon-qunit.js +0 -1415
  76. data/app/assets/javascripts/teaspoon-teaspoon.js +0 -51
  77. data/app/assets/javascripts/teaspoon/base/teaspoon.coffee +0 -69
  78. data/app/assets/javascripts/teaspoon/jasmine.coffee +0 -119
  79. data/app/assets/javascripts/teaspoon/jasmine/reporters/html.coffee +0 -11
  80. data/app/assets/javascripts/teaspoon/mocha.coffee +0 -90
  81. data/app/assets/javascripts/teaspoon/mocha/reporters/console.coffee +0 -16
  82. data/app/assets/javascripts/teaspoon/mocha/reporters/html.coffee +0 -27
  83. data/app/assets/javascripts/teaspoon/qunit.coffee +0 -81
  84. data/app/assets/javascripts/teaspoon/qunit/reporters/console.coffee +0 -25
  85. data/app/assets/javascripts/teaspoon/qunit/reporters/html.coffee +0 -80
  86. data/lib/generators/teaspoon/install/templates/jasmine/env.rb +0 -11
  87. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +0 -31
  88. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +0 -31
  89. data/lib/generators/teaspoon/install/templates/mocha/env.rb +0 -11
  90. data/lib/generators/teaspoon/install/templates/mocha/env_comments.rb.tt +0 -187
  91. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +0 -40
  92. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +0 -40
  93. data/lib/generators/teaspoon/install/templates/qunit/env.rb +0 -11
  94. data/lib/generators/teaspoon/install/templates/qunit/env_comments.rb.tt +0 -187
  95. data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +0 -29
  96. data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +0 -30
  97. data/lib/teaspoon/drivers/base.rb +0 -10
  98. data/lib/teaspoon/formatters/description.rb +0 -36
  99. data/lib/teaspoon/formatters/swayze_or_oprah_formatter.rb +0 -101
  100. data/spec/dummy/Rakefile +0 -7
  101. data/spec/dummy/app/assets/javascripts/instrumented1.coffee +0 -1
  102. data/spec/dummy/app/assets/javascripts/instrumented2.coffee +0 -1
  103. data/spec/dummy/app/assets/javascripts/integration/integration.coffee +0 -1
  104. data/spec/dummy/app/assets/javascripts/integration/integration_spec.coffee +0 -32
  105. data/spec/dummy/app/assets/javascripts/integration/spec_helper.coffee +0 -7
  106. data/spec/dummy/app/assets/javascripts/specs/asset_spec.js +0 -11
  107. data/spec/dummy/config.ru +0 -15
  108. data/spec/dummy/config/application.rb +0 -29
  109. data/spec/dummy/config/boot.rb +0 -3
  110. data/spec/dummy/config/environment.rb +0 -5
  111. data/spec/dummy/config/environments/development.rb +0 -41
  112. data/spec/dummy/config/environments/production.rb +0 -79
  113. data/spec/dummy/config/environments/test.rb +0 -42
  114. data/spec/dummy/config/routes.rb +0 -2
  115. data/spec/dummy/config/secrets.yml +0 -22
  116. data/spec/dummy/log/.gitkeep +0 -0
  117. data/spec/dummy/public/favicon.ico +0 -0
  118. data/spec/dummy/script/rails +0 -6
  119. data/spec/features/console_reporter_spec.rb +0 -62
  120. data/spec/features/hooks_spec.rb +0 -60
  121. data/spec/features/html_reporter_spec.rb +0 -81
  122. data/spec/features/install_generator_spec.rb +0 -54
  123. data/spec/features/instrumentation_spec.rb +0 -21
  124. data/spec/fixtures/coverage.json +0 -243
  125. data/spec/javascripts/fixtures/_body.html.erb +0 -1
  126. data/spec/javascripts/fixtures/fixture.html.haml +0 -4
  127. data/spec/javascripts/fixtures/fixture.json +0 -4
  128. data/spec/javascripts/jasmine_helper.coffee +0 -3
  129. data/spec/javascripts/mocha_helper.coffee +0 -4
  130. data/spec/javascripts/spec_helper.coffee +0 -7
  131. data/spec/javascripts/stylesheets/stylesheet.css.scss +0 -0
  132. data/spec/javascripts/support/json2.js +0 -486
  133. data/spec/javascripts/support/support.js.coffee +0 -0
  134. data/spec/javascripts/teaspoon/base/fixture_spec.coffee +0 -93
  135. data/spec/javascripts/teaspoon/base/reporters/console_spec.coffee +0 -162
  136. data/spec/javascripts/teaspoon/base/reporters/html/base_view_spec.coffee +0 -88
  137. data/spec/javascripts/teaspoon/base/reporters/html/failure_view_spec.coffee +0 -28
  138. data/spec/javascripts/teaspoon/base/reporters/html/progress_view_spec.coffee +0 -1
  139. data/spec/javascripts/teaspoon/base/reporters/html/spec_view_spec.coffee +0 -1
  140. data/spec/javascripts/teaspoon/base/reporters/html/suite_view_spec.coffee +0 -1
  141. data/spec/javascripts/teaspoon/base/reporters/html_spec.coffee +0 -372
  142. data/spec/javascripts/teaspoon/base/runner_spec.coffee +0 -58
  143. data/spec/javascripts/teaspoon/base/teaspoon_spec.coffee +0 -47
  144. data/spec/javascripts/teaspoon/jasmine/fixture_jspec.coffee +0 -13
  145. data/spec/javascripts/teaspoon/jasmine/models_jspec.coffee +0 -101
  146. data/spec/javascripts/teaspoon/jasmine/reporters/html_jspec.coffee +0 -17
  147. data/spec/javascripts/teaspoon/jasmine/runner_jspec.coffee +0 -59
  148. data/spec/javascripts/teaspoon/jasmine/spec_jspec.coffee +0 -3
  149. data/spec/javascripts/teaspoon/mocha/fixture_mspec.coffee +0 -12
  150. data/spec/javascripts/teaspoon/mocha/models_mspec.coffee +0 -93
  151. data/spec/javascripts/teaspoon/mocha/reporters/console_mspec.coffee +0 -24
  152. data/spec/javascripts/teaspoon/mocha/reporters/html_mspec.coffee +0 -41
  153. data/spec/javascripts/teaspoon/mocha/runner_mspec.coffee +0 -23
  154. data/spec/javascripts/teaspoon/mocha/spec_mspec.coffee +0 -9
  155. data/spec/javascripts/teaspoon/other/erb_spec.js.coffee.erb +0 -4
  156. data/spec/javascripts/teaspoon/phantomjs/runner_spec.coffee +0 -161
  157. data/spec/javascripts/turbolinks_helper.coffee +0 -2
  158. data/spec/spec_helper.rb +0 -25
  159. data/spec/support/aruba.rb +0 -15
  160. data/spec/teaspoon/command_line_spec.rb +0 -157
  161. data/spec/teaspoon/configuration_spec.rb +0 -236
  162. data/spec/teaspoon/console_spec.rb +0 -224
  163. data/spec/teaspoon/coverage_spec.rb +0 -118
  164. data/spec/teaspoon/drivers/base_spec.rb +0 -5
  165. data/spec/teaspoon/drivers/capybara_webkit_driver_spec.rb +0 -39
  166. data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +0 -66
  167. data/spec/teaspoon/drivers/selenium_driver_spec.rb +0 -68
  168. data/spec/teaspoon/engine_spec.rb +0 -22
  169. data/spec/teaspoon/environment_spec.rb +0 -109
  170. data/spec/teaspoon/exceptions_spec.rb +0 -57
  171. data/spec/teaspoon/exporter_spec.rb +0 -96
  172. data/spec/teaspoon/formatters/base_spec.rb +0 -259
  173. data/spec/teaspoon/formatters/clean_formatter_spec.rb +0 -37
  174. data/spec/teaspoon/formatters/documentation_formatter_spec.rb +0 -127
  175. data/spec/teaspoon/formatters/dot_formatter_spec.rb +0 -116
  176. data/spec/teaspoon/formatters/json_formatter_spec.rb +0 -77
  177. data/spec/teaspoon/formatters/junit_formatter_spec.rb +0 -114
  178. data/spec/teaspoon/formatters/pride_formatter_spec.rb +0 -37
  179. data/spec/teaspoon/formatters/rspec_html_formatter_spec.rb +0 -107
  180. data/spec/teaspoon/formatters/snowday_formatter_spec.rb +0 -35
  181. data/spec/teaspoon/formatters/tap_formatter_spec.rb +0 -72
  182. data/spec/teaspoon/formatters/tap_y_formatter_spec.rb +0 -80
  183. data/spec/teaspoon/formatters/teamcity_formatter_spec.rb +0 -148
  184. data/spec/teaspoon/instrumentation_spec.rb +0 -113
  185. data/spec/teaspoon/result_spec.rb +0 -98
  186. data/spec/teaspoon/runner_spec.rb +0 -116
  187. data/spec/teaspoon/server_spec.rb +0 -105
  188. data/spec/teaspoon/suite_spec.rb +0 -138
  189. data/spec/teaspoon_env.rb +0 -39
  190. data/test/javascripts/qunit_helper.coffee +0 -3
  191. data/test/javascripts/teaspoon/qunit/fixture_test.coffee +0 -10
  192. data/test/javascripts/teaspoon/qunit/models_test.coffee +0 -66
  193. data/test/javascripts/teaspoon/qunit/reporters/console_test.coffee +0 -3
  194. data/test/javascripts/teaspoon/qunit/reporters/html/failure_view_test.coffee +0 -3
  195. data/test/javascripts/teaspoon/qunit/reporters/html/spec_view_test.coffee +0 -3
  196. data/test/javascripts/teaspoon/qunit/reporters/html/suite_view_test.coffee +0 -3
  197. data/test/javascripts/teaspoon/qunit/reporters/html_test.coffee +0 -3
  198. data/test/javascripts/teaspoon/qunit/runner_test.coffee +0 -18
  199. data/vendor/assets/javascripts/jasmine/1.3.1.js +0 -2602
  200. data/vendor/assets/javascripts/jasmine/2.0.0.js +0 -2412
  201. data/vendor/assets/javascripts/jasmine/MIT.LICENSE +0 -20
  202. data/vendor/assets/javascripts/mocha/1.10.0.js +0 -5374
  203. data/vendor/assets/javascripts/mocha/1.17.1.js +0 -5813
  204. data/vendor/assets/javascripts/mocha/MIT.LICENSE +0 -22
  205. data/vendor/assets/javascripts/qunit/1.12.0.js +0 -2212
  206. data/vendor/assets/javascripts/qunit/1.14.0.js +0 -2288
  207. data/vendor/assets/javascripts/qunit/MIT.LICENSE +0 -21
  208. data/vendor/assets/javascripts/support/chai-1.10.0.js +0 -4800
  209. data/vendor/assets/javascripts/support/chai-jq-0.0.7.js +0 -524
  210. data/vendor/assets/javascripts/support/chai.js +0 -4782
  211. data/vendor/assets/javascripts/support/expect.js +0 -1284
  212. data/vendor/assets/javascripts/support/jasmine-jquery-1.7.0.js +0 -720
  213. data/vendor/assets/javascripts/support/jasmine-jquery-2.0.0.js +0 -812
  214. data/vendor/assets/javascripts/support/sinon-chai.js +0 -126
@@ -5,11 +5,12 @@ module Teaspoon
5
5
  def initialize(options = {})
6
6
  @default_options = options
7
7
  @suites = {}
8
+ Teaspoon::Environment.check_env!(options[:environment])
8
9
  Teaspoon::Environment.load(options)
9
10
 
10
11
  @server = start_server
11
- rescue Teaspoon::ServerException => e
12
- abort(e.message)
12
+ rescue Teaspoon::ServerError => e
13
+ Teaspoon.abort(e.message)
13
14
  end
14
15
 
15
16
  def options
@@ -26,11 +27,11 @@ module Teaspoon
26
27
  execute_without_handling(options)
27
28
  rescue Teaspoon::Failure
28
29
  false
29
- rescue Teaspoon::RunnerException => e
30
+ rescue Teaspoon::RunnerError => e
30
31
  log(e.message)
31
32
  false
32
33
  rescue Teaspoon::Error => e
33
- abort(e.message)
34
+ Teaspoon.abort(e.message)
34
35
  end
35
36
 
36
37
  def execute_without_handling(execute_options = {})
@@ -47,9 +48,7 @@ module Teaspoon
47
48
  end
48
49
 
49
50
  def run_specs(suite)
50
- unless Teaspoon.configuration.suite_configs[suite.to_s]
51
- raise Teaspoon::UnknownSuite, "Unknown suite: \"#{suite}\""
52
- end
51
+ raise Teaspoon::UnknownSuite.new(name: suite) unless Teaspoon.configuration.suite_configs[suite.to_s]
53
52
 
54
53
  log("Teaspoon running #{suite} suite at #{base_url_for(suite)}")
55
54
  runner = Teaspoon::Runner.new(suite)
@@ -59,9 +58,7 @@ module Teaspoon
59
58
  end
60
59
 
61
60
  def export(suite)
62
- unless Teaspoon.configuration.suite_configs[suite.to_s]
63
- raise Teaspoon::UnknownSuite, "Unknown suite: \"#{suite}\""
64
- end
61
+ raise Teaspoon::UnknownSuite.new(name: suite) unless Teaspoon.configuration.suite_configs[suite.to_s]
65
62
 
66
63
  log("Teaspoon exporting #{suite} suite at #{base_url_for(suite)}")
67
64
  Teaspoon::Exporter.new(suite, url_for(suite, false), options[:export]).export
@@ -94,10 +91,8 @@ module Teaspoon
94
91
 
95
92
  def driver
96
93
  return @driver if @driver
97
- klass = "#{Teaspoon.configuration.driver.to_s.camelize}Driver"
98
- @driver = Teaspoon::Drivers.const_get(klass).new(Teaspoon.configuration.driver_options)
99
- rescue NameError
100
- raise Teaspoon::UnknownDriver, "Unknown driver: \"#{Teaspoon.configuration.driver}\""
94
+ driver = Teaspoon::Driver.fetch(Teaspoon.configuration.driver)
95
+ @driver = driver.new(Teaspoon.configuration.driver_options)
101
96
  end
102
97
 
103
98
  def base_url_for(suite)
@@ -117,13 +112,8 @@ module Teaspoon
117
112
  "#{parts.join('&')}" if parts.present?
118
113
  end
119
114
 
120
- def log(str, force = false)
121
- STDOUT.print("#{str}\n") if force || !Teaspoon.configuration.suppress_log
122
- end
123
-
124
- def abort(message = nil)
125
- log(message, true) if message
126
- exit(1)
115
+ def log(str)
116
+ STDOUT.print("#{str}\n") unless Teaspoon.configuration.suppress_log
127
117
  end
128
118
  end
129
119
  end
@@ -1,10 +1,18 @@
1
1
  module Teaspoon
2
2
  class Coverage
3
- def initialize(suite_name, config_name, data)
3
+ def self.configuration(name = Teaspoon.configuration.use_coverage)
4
+ name = normalize_config_name(name)
5
+ config = Teaspoon.configuration.coverage_configs[name]
6
+
7
+ raise Teaspoon::UnknownCoverage.new(name: name) unless config.present?
8
+ config[:instance] ||= Teaspoon::Configuration::Coverage.new(&config[:block])
9
+ end
10
+
11
+ def initialize(suite_name, data)
4
12
  @suite_name = suite_name
5
13
  @data = data
6
14
  @executable = Teaspoon::Instrumentation.executable
7
- @config = coverage_configuration(config_name.to_s)
15
+ @config = self.class.configuration
8
16
  end
9
17
 
10
18
  def generate_reports(&block)
@@ -31,10 +39,9 @@ module Teaspoon
31
39
 
32
40
  private
33
41
 
34
- def coverage_configuration(name)
35
- config = Teaspoon.configuration.coverage_configs[name]
36
- raise Teaspoon::UnknownCoverage, "Unknown coverage configuration \"#{name}\"" unless config.present?
37
- config[:instance] ||= Teaspoon::Configuration::Coverage.new(&config[:block])
42
+ def self.normalize_config_name(name)
43
+ return "default" if name == true
44
+ name.to_s
38
45
  end
39
46
 
40
47
  def input_path(&block)
@@ -49,7 +56,7 @@ module Teaspoon
49
56
  output_path = File.join(@config.output_path, @suite_name)
50
57
  result = %x{#{@executable} report --include=#{input.shellescape} --dir #{output_path} #{format} 2>&1}
51
58
  return result.gsub("Done", "").gsub("Using reporter [#{format}]", "").strip if $?.exitstatus == 0
52
- raise Teaspoon::DependencyFailure, "Could not generate coverage report for #{format}"
59
+ raise Teaspoon::DependencyError.new("Unable to generate #{format} coverage report.")
53
60
  end
54
61
 
55
62
  def threshold_args
@@ -1,6 +1,9 @@
1
1
  module Teaspoon
2
2
  def self.setup(&block)
3
- Teaspoon.dep("Teaspoon.setup is deprecated, use Teaspoon.configure instead. The /initializer/teaspoon.rb file should be removed, and a new teaspoon_env.rb file should be created by running the install generator.")
3
+ Teaspoon.dep(
4
+ "Teaspoon.setup is deprecated, use Teaspoon.configure instead. The /initializer/teaspoon.rb file should be " +
5
+ "removed, and a new teaspoon_env.rb file should be created by running the install generator."
6
+ )
4
7
  configure(&block)
5
8
  end
6
9
 
@@ -20,7 +23,10 @@ module Teaspoon
20
23
  end
21
24
 
22
25
  def self.fixture_path=(*args)
23
- Teaspoon.dep("the teaspoon fixture_path directive has been changed to fixture_paths, which expects an array, please update your configuration.")
26
+ Teaspoon.dep(
27
+ "the teaspoon fixture_path directive has been changed to fixture_paths, which expects an array, please " +
28
+ "update your configuration."
29
+ )
24
30
  self.fixture_paths = args
25
31
  end
26
32
 
@@ -59,12 +65,24 @@ teaspoon coverage directive has changed and is now more flexible, define coverag
59
65
 
60
66
  class Suite
61
67
  def js_config=(*_args)
62
- Teaspoon.dep("the teaspoon suite js_config directive is no longer used, use the install generator to install the boot partial and customize it instead.", :js_config)
68
+ Teaspoon.dep(
69
+ "the teaspoon suite js_config directive is no longer used, use the install generator to install the boot " +
70
+ "partial and customize it instead.", :js_config
71
+ )
63
72
  end
64
73
 
65
74
  def normalize_asset_path=(*_args)
66
- Teaspoon.dep("the teaspoon suite normalize_asset_path directive is no longer used, reopen Teaspoon::Suite and define a normalize_js_extension method instead.", :normalize_asset_path)
75
+ Teaspoon.dep(
76
+ "the teaspoon suite normalize_asset_path directive is no longer used, reopen Teaspoon::Suite and define a " +
77
+ "normalize_js_extension method instead.", :normalize_asset_path
78
+ )
67
79
  end
80
+
81
+ def no_coverage(*)
82
+ Teaspoon.dep("suite.no_coverage has been removed in Teaspoon 1.0. Please use coverage.ignore instead. https://github.com/modeset/teaspoon/blob/master/CHANGELOG.md")
83
+ []
84
+ end
85
+ alias_method :no_coverage=, :no_coverage
68
86
  end
69
87
  end
70
88
  end
@@ -0,0 +1,15 @@
1
+ require "teaspoon/registry"
2
+ require "teaspoon/registry/has_default"
3
+
4
+ module Teaspoon
5
+ module Driver
6
+ extend Teaspoon::Registry
7
+ extend Teaspoon::Registry::HasDefault
8
+
9
+ not_found_in_registry Teaspoon::UnknownDriver
10
+ end
11
+ end
12
+
13
+ Teaspoon::Driver.register(:phantomjs, "Teaspoon::Driver::Phantomjs", "teaspoon/driver/phantomjs", default: true)
14
+ Teaspoon::Driver.register(:selenium, "Teaspoon::Driver::Selenium", "teaspoon/driver/selenium")
15
+ Teaspoon::Driver.register(:capybara_webkit, "Teaspoon::Driver::CapybaraWebkit", "teaspoon/driver/capybara_webkit")
@@ -0,0 +1,7 @@
1
+ module Teaspoon
2
+ module Driver
3
+ class Base
4
+ # Here in case we need it.
5
+ end
6
+ end
7
+ end
@@ -1,14 +1,17 @@
1
+ # :nocov:
1
2
  begin
2
3
  require "capybara-webkit"
3
4
  rescue LoadError
4
- STDOUT.print("Could not find Capybara Webkit. Install the capybara-webkit gem.\n")
5
- exit(1)
5
+ Teaspoon.abort("Could not find Capybara Webkit. Install the capybara-webkit gem.")
6
6
  end
7
+ # :nocov:
8
+
9
+ require "teaspoon/driver/base"
7
10
 
8
11
  module Teaspoon
9
- module Drivers
10
- class CapybaraWebkitDriver < Base
11
- def initialize(_ = nil)
12
+ module Driver
13
+ class CapybaraWebkit < Base
14
+ def initialize(_options = nil)
12
15
  end
13
16
 
14
17
  def run_specs(runner, url)
@@ -1,12 +1,16 @@
1
+ # :nocov:
1
2
  begin
2
3
  require "phantomjs"
3
4
  rescue LoadError
4
5
  # if we can't load phantomjs, assume the cli is installed and in the path
5
6
  end
7
+ # :nocov:
8
+
9
+ require "teaspoon/driver/base"
6
10
 
7
11
  module Teaspoon
8
- module Drivers
9
- class PhantomjsDriver < Base
12
+ module Driver
13
+ class Phantomjs < Base
10
14
  include Teaspoon::Utility
11
15
 
12
16
  def initialize(options = nil)
@@ -15,7 +19,7 @@ module Teaspoon
15
19
  when Array then @options = options
16
20
  when String then @options = options.split(" ")
17
21
  when Hash then @options = options.map { |k, v| "--#{k}=#{v}" }
18
- else raise Teaspoon::UnknownDriverOptions, "Unknown driver options -- supply a string, array or hash"
22
+ else raise Teaspoon::DriverOptionsError.new(types: "string, array or hash")
19
23
  end
20
24
  end
21
25
 
@@ -49,7 +53,7 @@ module Teaspoon
49
53
  @executable = which("phantomjs")
50
54
  @executable = Phantomjs.path if @executable.blank? && defined?(::Phantomjs)
51
55
  return @executable unless @executable.blank?
52
- raise Teaspoon::MissingDependency, "Could not find PhantomJS. Install phantomjs or try the phantomjs gem."
56
+ raise Teaspoon::MissingDependencyError.new("Unable to locate phantomjs. Install it or use the phantomjs gem.")
53
57
  end
54
58
 
55
59
  def script
@@ -1,30 +1,32 @@
1
+ # :nocov:
1
2
  begin
2
3
  require "selenium-webdriver"
3
4
  rescue LoadError
4
- STDOUT.print("Could not find Selenium Webdriver. Install the selenium-webdriver gem.\n")
5
- exit(1)
5
+ Teaspoon.abort("Could not find Selenium Webdriver. Install the selenium-webdriver gem.")
6
6
  end
7
+ # :nocov:
8
+
9
+ require "teaspoon/driver/base"
7
10
 
8
11
  module Teaspoon
9
- module Drivers
10
- class SeleniumDriver < Base
12
+ module Driver
13
+ class Selenium < Base
11
14
  def initialize(options = nil)
12
15
  options ||= {}
13
16
  case options
14
17
  when Hash then @options = options
15
18
  when String then @options = JSON.parse(options)
16
- else raise Teaspoon::UnknownDriverOptions, "Unknown driver options -- supply a hash or json string"
19
+ else raise Teaspoon::DriverOptionsError.new(types: "hash or json string")
17
20
  end
18
-
19
21
  rescue JSON::ParserError
20
- raise Teaspoon::UnknownDriverOptions, "Malformed driver options -- supply a hash or json string"
22
+ raise Teaspoon::DriverOptionsError.new(types: "hash or json string")
21
23
  end
22
24
 
23
25
  def run_specs(runner, url)
24
- driver = Selenium::WebDriver.for(driver_options[:client_driver])
26
+ driver = ::Selenium::WebDriver.for(driver_options[:client_driver])
25
27
  driver.navigate.to(url)
26
28
 
27
- Selenium::WebDriver::Wait.new(driver_options).until do
29
+ ::Selenium::WebDriver::Wait.new(driver_options).until do
28
30
  done = driver.execute_script("return window.Teaspoon && window.Teaspoon.finished")
29
31
  driver.execute_script("return window.Teaspoon && window.Teaspoon.getMessages() || []").each do |line|
30
32
  runner.process("#{line}\n")
@@ -6,34 +6,11 @@ module Teaspoon
6
6
  class Engine < ::Rails::Engine
7
7
  isolate_namespace Teaspoon
8
8
 
9
- ASSET_MANIFEST = [
10
- # core library
11
- 'teaspoon.css',
12
- 'teaspoon-teaspoon.js',
13
-
14
- # framework ties
15
- 'teaspoon/*.js',
16
- 'teaspoon-jasmine.js',
17
- 'teaspoon-mocha.js',
18
- 'teaspoon-qunit.js',
19
-
20
- # frameworks
21
- 'jasmine/1.3.1.js',
22
- 'jasmine/2.0.0.js',
23
- 'mocha/1.10.0.js',
24
- 'mocha/1.17.1.js',
25
- 'qunit/1.12.0.js',
26
- 'qunit/1.14.0.js',
27
-
28
- # all support libraries
29
- 'support/*.js'
30
- ]
31
-
32
9
  routes do
33
10
  root to: "suite#index"
34
11
  match "/fixtures/*filename", to: "suite#fixtures", via: :get, as: "fixture"
35
12
  match "/:suite", to: "suite#show", via: :get, as: "suite", defaults: { suite: "default" }
36
- match "/:suite/:hook", to: "suite#hook", via: :post, as: "suite_hook", defaults: { suite: "default", hook: "default" }
13
+ match "/:suite/:hook", to: "suite#hook", via: :post, defaults: { suite: "default", hook: "default" }
37
14
  end
38
15
 
39
16
  initializer :assets, group: :all do |app|
@@ -61,10 +38,15 @@ module Teaspoon
61
38
  Teaspoon.configuration.asset_paths.each do |path|
62
39
  assets.paths << Teaspoon.configuration.root.join(path).to_s
63
40
  end
41
+
42
+ # TODO: This breaks lazy loading of frameworks. Another way to avoid this?
43
+ Teaspoon::Framework.available.keys.each do |framework|
44
+ assets.paths += Teaspoon::Framework.fetch(framework).asset_paths
45
+ end
64
46
  end
65
47
 
66
48
  def self.add_precompiled_assets(assets)
67
- assets.precompile += ASSET_MANIFEST
49
+ assets.precompile += Teaspoon.configuration.asset_manifest
68
50
  end
69
51
 
70
52
  def self.inject_instrumentation
@@ -80,5 +62,36 @@ module Teaspoon
80
62
 
81
63
  app.routes.prepend { mount Teaspoon::Engine => mount_at, as: "teaspoon" }
82
64
  end
65
+
66
+ module ExceptionHandling
67
+ def self.add_rails_handling
68
+ return unless using_phantomjs?
69
+
70
+ # debugging should be off to display errors in the suite_controller
71
+ # Rails.application.config.assets.debug = false
72
+
73
+ # we want rails to display exceptions
74
+ Rails.application.config.action_dispatch.show_exceptions = true
75
+
76
+ # override the render exception method in ActionDispatch to raise a javascript exception
77
+ render_exceptions_with_javascript
78
+ end
79
+
80
+ private
81
+
82
+ def self.using_phantomjs?
83
+ Teaspoon::Driver.equal?(Teaspoon.configuration.driver, :phantomjs)
84
+ end
85
+
86
+ def self.render_exceptions_with_javascript
87
+ ActionDispatch::DebugExceptions.class_eval do
88
+ def render_exception(_env, exception)
89
+ message = "#{exception.class.name}: #{exception.message}"
90
+ body = "<script>throw Error(#{[message, exception.backtrace].join("\n").inspect})</script>"
91
+ [200, { "Content-Type" => "text/html;", "Content-Length" => body.bytesize.to_s }, [body]]
92
+ end
93
+ end
94
+ end
95
+ end
83
96
  end
84
97
  end
@@ -3,8 +3,8 @@ require "teaspoon/exceptions"
3
3
  module Teaspoon
4
4
  module Environment
5
5
  def self.load(options = {})
6
- require_environment(options[:environment])
7
- raise "Rails environment not found." unless rails_loaded?
6
+ load_rails
7
+ Teaspoon.abort("Rails environment not found.", 1) unless rails_loaded?
8
8
 
9
9
  require "teaspoon"
10
10
  require "teaspoon/server"
@@ -13,38 +13,47 @@ module Teaspoon
13
13
  require "teaspoon/exporter"
14
14
 
15
15
  Teaspoon.configuration.override_from_options(options)
16
- Teaspoon::ExceptionHandling.add_rails_handling
16
+ Teaspoon::Engine::ExceptionHandling.add_rails_handling
17
17
  end
18
18
 
19
19
  def self.require_environment(override = nil)
20
+ require_env(find_env(override))
21
+ end
22
+
23
+ def self.check_env!(override = nil)
24
+ find_env(override)
25
+ end
26
+
27
+ private
28
+
29
+ def self.find_env(override = nil)
20
30
  override ||= ENV["TEASPOON_ENV"]
21
- if override
22
- override = File.expand_path(override, Dir.pwd)
23
- ENV["TEASPOON_ENV"] = override
24
- return require_env(override)
25
- end
31
+ env_files = override ? [override] : standard_environments
26
32
 
27
- standard_environments.each do |filename|
33
+ env_files.each do |filename|
28
34
  file = File.expand_path(filename, Dir.pwd)
29
- return require_env(file) if File.exists?(file)
35
+ ENV["TEASPOON_ENV"] = file if override
36
+ return file if File.exists?(file)
30
37
  end
31
38
 
32
- raise Teaspoon::EnvironmentNotFound,
33
- "Unable to load Teaspoon environment in {#{standard_environments.join(', ')}}"
39
+ raise Teaspoon::EnvironmentNotFound.new(searched: env_files.join(", "))
34
40
  end
35
41
 
36
42
  def self.standard_environments
37
43
  ["spec/teaspoon_env.rb", "test/teaspoon_env.rb", "teaspoon_env.rb"]
38
44
  end
39
45
 
40
- private
41
-
42
46
  def self.require_env(file)
43
47
  ::Kernel.load(file)
44
48
  end
45
49
 
46
50
  def self.rails_loaded?
47
- defined?(Rails)
51
+ !!defined?(Rails)
52
+ end
53
+
54
+ def self.load_rails
55
+ rails_env = ENV["TEASPOON_RAILS_ENV"] || File.expand_path("config/environment", Dir.pwd)
56
+ require rails_env
48
57
  end
49
58
  end
50
59
  end