teaspoon 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/MIT.LICENSE +1 -1
  3. data/README.md +46 -377
  4. data/app/assets/javascripts/teaspoon-jasmine.js +200 -194
  5. data/app/assets/javascripts/teaspoon-mocha.js +183 -185
  6. data/app/assets/javascripts/teaspoon-qunit.js +201 -193
  7. data/app/assets/javascripts/teaspoon-teaspoon.js +10 -10
  8. data/app/assets/javascripts/teaspoon/base/fixture.coffee +0 -1
  9. data/app/assets/javascripts/teaspoon/base/hook.coffee +7 -6
  10. data/app/assets/javascripts/teaspoon/qunit.coffee +10 -0
  11. data/app/controllers/teaspoon/suite_controller.rb +3 -4
  12. data/app/views/teaspoon/suite/_boot.html.erb +1 -1
  13. data/app/views/teaspoon/suite/_boot_require_js.html.erb +1 -0
  14. data/bin/teaspoon +1 -1
  15. data/config/routes.rb +4 -14
  16. data/lib/generators/teaspoon/install/install_generator.rb +22 -11
  17. data/lib/generators/teaspoon/install/templates/jasmine/{env_comments.rb → env_comments.rb.tt} +10 -5
  18. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +5 -5
  19. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +5 -5
  20. data/lib/generators/teaspoon/install/templates/mocha/{env_comments.rb → env_comments.rb.tt} +10 -5
  21. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +6 -5
  22. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +6 -5
  23. data/lib/generators/teaspoon/install/templates/qunit/{env_comments.rb → env_comments.rb.tt} +10 -5
  24. data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +5 -5
  25. data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +5 -5
  26. data/lib/tasks/teaspoon.rake +1 -1
  27. data/lib/teaspoon/command_line.rb +37 -40
  28. data/lib/teaspoon/configuration.rb +27 -30
  29. data/lib/teaspoon/configuration.rb.orig +187 -0
  30. data/lib/teaspoon/console.rb +31 -17
  31. data/lib/teaspoon/coverage.rb +2 -3
  32. data/lib/teaspoon/deprecated.rb +13 -8
  33. data/lib/teaspoon/drivers/base.rb +2 -2
  34. data/lib/teaspoon/drivers/capybara_webkit_driver.rb +33 -0
  35. data/lib/teaspoon/drivers/phantomjs/runner.js +2 -2
  36. data/lib/teaspoon/drivers/phantomjs_driver.rb +13 -4
  37. data/lib/teaspoon/drivers/selenium_driver.rb +3 -5
  38. data/lib/teaspoon/engine.rb +33 -5
  39. data/lib/teaspoon/environment.rb +2 -4
  40. data/lib/teaspoon/exceptions.rb +8 -5
  41. data/lib/teaspoon/formatters/base.rb +39 -27
  42. data/lib/teaspoon/formatters/clean_formatter.rb +0 -1
  43. data/lib/teaspoon/formatters/description.rb +36 -0
  44. data/lib/teaspoon/formatters/documentation_formatter.rb +2 -2
  45. data/lib/teaspoon/formatters/json_formatter.rb +1 -2
  46. data/lib/teaspoon/formatters/junit_formatter.rb +20 -20
  47. data/lib/teaspoon/formatters/modules/report_module.rb +4 -4
  48. data/lib/teaspoon/formatters/pride_formatter.rb +0 -1
  49. data/lib/teaspoon/formatters/rspec_html_formatter.rb +463 -0
  50. data/lib/teaspoon/formatters/snowday_formatter.rb +0 -1
  51. data/lib/teaspoon/formatters/swayze_or_oprah_formatter.rb +5 -4
  52. data/lib/teaspoon/formatters/tap_formatter.rb +2 -3
  53. data/lib/teaspoon/formatters/tap_y_formatter.rb +20 -21
  54. data/lib/teaspoon/formatters/teamcity_formatter.rb +4 -5
  55. data/lib/teaspoon/instrumentation.rb +7 -7
  56. data/lib/teaspoon/result.rb +1 -3
  57. data/lib/teaspoon/runner.rb +1 -2
  58. data/lib/teaspoon/server.rb +2 -1
  59. data/lib/teaspoon/suite.rb +20 -17
  60. data/lib/teaspoon/utility.rb +1 -3
  61. data/lib/teaspoon/version.rb +1 -1
  62. data/spec/dummy/config/application.rb +14 -18
  63. data/spec/dummy/config/boot.rb +2 -6
  64. data/spec/dummy/config/environment.rb +3 -3
  65. data/spec/dummy/config/environments/development.rb +27 -13
  66. data/spec/dummy/config/environments/production.rb +79 -0
  67. data/spec/dummy/config/environments/test.rb +26 -13
  68. data/spec/dummy/config/routes.rb +1 -1
  69. data/spec/dummy/config/secrets.yml +22 -0
  70. data/spec/features/console_reporter_spec.rb +3 -8
  71. data/spec/features/hooks_spec.rb +17 -4
  72. data/spec/features/html_reporter_spec.rb +12 -1
  73. data/spec/features/install_generator_spec.rb +2 -3
  74. data/spec/features/instrumentation_spec.rb +11 -11
  75. data/spec/javascripts/teaspoon/base/teaspoon_spec.coffee +14 -1
  76. data/spec/spec_helper.rb +7 -4
  77. data/spec/teaspoon/command_line_spec.rb +19 -28
  78. data/spec/teaspoon/configuration_spec.rb +22 -14
  79. data/spec/teaspoon/console_spec.rb +79 -63
  80. data/spec/teaspoon/coverage_spec.rb +23 -23
  81. data/spec/teaspoon/drivers/capybara_webkit_driver_spec.rb +39 -0
  82. data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +10 -5
  83. data/spec/teaspoon/drivers/selenium_driver_spec.rb +10 -10
  84. data/spec/teaspoon/environment_spec.rb +28 -20
  85. data/spec/teaspoon/exceptions_spec.rb +4 -4
  86. data/spec/teaspoon/exporter_spec.rb +28 -28
  87. data/spec/teaspoon/formatters/base_spec.rb +29 -29
  88. data/spec/teaspoon/formatters/clean_formatter_spec.rb +1 -1
  89. data/spec/teaspoon/formatters/documentation_formatter_spec.rb +1 -1
  90. data/spec/teaspoon/formatters/dot_formatter_spec.rb +1 -1
  91. data/spec/teaspoon/formatters/json_formatter_spec.rb +7 -7
  92. data/spec/teaspoon/formatters/junit_formatter_spec.rb +10 -10
  93. data/spec/teaspoon/formatters/pride_formatter_spec.rb +1 -1
  94. data/spec/teaspoon/formatters/rspec_html_formatter_spec.rb +107 -0
  95. data/spec/teaspoon/formatters/snowday_formatter_spec.rb +1 -1
  96. data/spec/teaspoon/formatters/tap_formatter_spec.rb +1 -1
  97. data/spec/teaspoon/formatters/tap_y_formatter_spec.rb +1 -1
  98. data/spec/teaspoon/formatters/teamcity_formatter_spec.rb +27 -27
  99. data/spec/teaspoon/instrumentation_spec.rb +35 -29
  100. data/spec/teaspoon/result_spec.rb +40 -36
  101. data/spec/teaspoon/runner_spec.rb +23 -20
  102. data/spec/teaspoon/server_spec.rb +19 -16
  103. data/spec/teaspoon/suite_spec.rb +23 -9
  104. data/spec/teaspoon_env.rb +7 -12
  105. data/test/javascripts/teaspoon/qunit/models_test.coffee +6 -2
  106. data/vendor/assets/javascripts/support/chai-1.10.0.js +4800 -0
  107. data/vendor/assets/javascripts/support/chai-jq-0.0.7.js +524 -0
  108. data/vendor/assets/javascripts/support/chai.js +4435 -4349
  109. metadata +57 -54
  110. data/app/assets/javascripts/teaspoon-angular.js +0 -1299
  111. data/app/assets/javascripts/teaspoon/angular.coffee +0 -55
  112. data/app/assets/javascripts/teaspoon/angular/reporters/console.coffee +0 -11
  113. data/app/assets/javascripts/teaspoon/angular/reporters/html.coffee +0 -21
  114. data/spec/javascripts/angular_helper.coffee +0 -5
  115. data/spec/javascripts/teaspoon/angular/models_aspec.coffee +0 -95
  116. data/spec/javascripts/teaspoon/angular/reporters/html_aspec.coffee +0 -9
  117. data/vendor/assets/javascripts/angular/1.0.5.js +0 -26195
  118. data/vendor/assets/javascripts/angular/MIT-LICENSE +0 -22
@@ -41,7 +41,7 @@ Teaspoon.configure do |config|
41
41
  # directives.
42
42
  # Note: If no version is specified, the latest is assumed.
43
43
  #
44
- # Available: jasmine[1.3.1, 2.0.0], mocha[1.10.0, 1.17.1] qunit[1.12.0, 1.14.0]
44
+ # Available: jasmine[1.3.1], mocha[1.10.0, 1.17.1] qunit[1.12.0, 1.14.0]
45
45
  suite.use_framework :qunit
46
46
 
47
47
  # Specify a file matcher as a regular expression and all matching files will be loaded when the suite is run. These
@@ -80,6 +80,11 @@ Teaspoon.configure do |config|
80
80
  # synchronous Ajax request to the server that will call all of the blocks you've defined for that hook name.
81
81
  #suite.hook :fixtures, proc{ }
82
82
 
83
+ # Determine whether specs loaded into the test harness should be embedded as individual script tags or concatenated
84
+ # into a single file. Similar to Rails' asset `debug: true` and `config.assets.debug = true` options. By default,
85
+ # Teaspoon expands all assets to provide more valuable stack traces that reference individual source files.
86
+ #suite.expand_assets = false
87
+
83
88
  end
84
89
 
85
90
  # Example suite. Since we're just filtering to files already within the root test/javascripts, these files will also
@@ -134,8 +139,8 @@ Teaspoon.configure do |config|
134
139
  # Specify the formatters to use when outputting the results.
135
140
  # Note: Output files can be specified by using `"junit>/path/to/output.xml"`.
136
141
  #
137
- # Available: dot, documentation, clean, json, junit, pride, snowday, swayze_or_oprah, tap, tap_y, teamcity
138
- #config.formatters = ["dot"]
142
+ # Available: <%= Teaspoon::Formatters.known_formatters.map(&:name).join ", " %>
143
+ #config.formatters = ["<%= Teaspoon::Formatters.known_formatters.select(&:default?).first.name %>"]
139
144
 
140
145
  # Specify if you want color output from the formatters.
141
146
  #config.color = true
@@ -161,14 +166,14 @@ Teaspoon.configure do |config|
161
166
 
162
167
  config.coverage do |coverage|
163
168
 
164
- # Which coverage reports Instanbul should generate. Correlates directly to what Istanbul supports.
169
+ # Which coverage reports Istanbul should generate. Correlates directly to what Istanbul supports.
165
170
  #
166
171
  # Available: text-summary, text, html, lcov, lcovonly, cobertura, teamcity
167
172
  #coverage.reports = ["text-summary", "html"]
168
173
 
169
174
  # The path that the coverage should be written to - when there's an artifact to write to disk.
170
175
  # Note: Relative to `config.root`.
171
- #coverage.output_dir = "coverage"
176
+ #coverage.output_path = "coverage"
172
177
 
173
178
  # Various thresholds requirements can be defined, and those thresholds will be checked at the end of a run. If any
174
179
  # aren't met the run will fail with a message. Thresholds can be defined as a percentage (0-100), or nil.
@@ -6,6 +6,10 @@
6
6
  # Use this polyfill to avoid the confusion.
7
7
  #= require support/bind-poly
8
8
  #
9
+ # You can require your own javascript files here. By default this will include everything in application, however you
10
+ # may get better load performance if you require the specific files that are being used in the test that tests them.
11
+ #= require application
12
+ #
9
13
  # Deferring execution
10
14
  # If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
11
15
  # Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
@@ -16,14 +20,10 @@
16
20
  # Matching files
17
21
  # By default Teaspoon will look for files that match _test.{js,js.coffee,.coffee}. Add a filename_test.js file in your
18
22
  # test path and it'll be included in the default suite automatically. If you want to customize suites, check out the
19
- # configuration in config/initializers/teaspoon.rb
23
+ # configuration in teaspoon_env.rb
20
24
  #
21
25
  # Manifest
22
26
  # If you'd rather require your test files manually (to control order for instance) you can disable the suite matcher in
23
27
  # the configuration and use this file as a manifest.
24
28
  #
25
29
  # For more information: http://github.com/modeset/teaspoon
26
- #
27
- # You can require your own javascript files here. By default this will include everything in application, however you
28
- # may get better load performance if you require the specific files that are being used in the test that tests them.
29
- #= require application
@@ -6,6 +6,10 @@
6
6
  // Use this polyfill to avoid the confusion.
7
7
  //= require support/bind-poly
8
8
  //
9
+ // You can require your own javascript files here. By default this will include everything in application, however you
10
+ // may get better load performance if you require the specific files that are being used in the test that tests them.
11
+ //= require application
12
+ //
9
13
  // Deferring execution
10
14
  // If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
11
15
  // Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
@@ -16,15 +20,11 @@
16
20
  // Matching files
17
21
  // By default Teaspoon will look for files that match _test.{js,js.coffee,.coffee}. Add a filename_test.js file in your
18
22
  // test path and it'll be included in the default suite automatically. If you want to customize suites, check out the
19
- // configuration in config/initializers/teaspoon.rb
23
+ // configuration in teaspoon_env.rb
20
24
  //
21
25
  // Manifest
22
26
  // If you'd rather require your test files manually (to control order for instance) you can disable the suite matcher in
23
27
  // the configuration and use this file as a manifest.
24
28
  //
25
29
  // For more information: http://github.com/modeset/teaspoon
26
- //
27
- // You can require your own javascript files here. By default this will include everything in application, however you
28
- // may get better load performance if you require the specific files that are being used in the test that tests them.
29
- //= require application
30
30
 
@@ -1,5 +1,5 @@
1
1
  desc "Run the javascript specs"
2
- task :teaspoon => :environment do |t, args|
2
+ task teaspoon: :environment do
3
3
  require "teaspoon/console"
4
4
 
5
5
  options = {
@@ -1,10 +1,10 @@
1
1
  require "optparse"
2
2
  require "teaspoon/version"
3
3
  require "teaspoon/exceptions"
4
+ require "teaspoon/formatters/base"
4
5
 
5
6
  module Teaspoon
6
7
  class CommandLine
7
-
8
8
  def initialize
9
9
  @options = {}
10
10
  @options[:files] = opt_parser.parse!
@@ -31,90 +31,87 @@ module Teaspoon
31
31
  protected
32
32
 
33
33
  def opts_for_general
34
- opt :environment,
35
- "-r", "--require FILE",
36
- "Require Teaspoon environment file."
34
+ opt :environment, "-r", "--require FILE",
35
+ "Require Teaspoon environment file."
37
36
 
38
- #opt :custom_options_file,
39
- # "-O", "--options PATH",
40
- # "Specify the path to a custom options file."
37
+ # opt :custom_options_file,
38
+ # "-O", "--options PATH",
39
+ # "Specify the path to a custom options file."
41
40
 
42
41
  opt :driver, "-d", "--driver DRIVER",
43
- "Specify driver:",
44
- " phantomjs (default)",
45
- " selenium"
42
+ "Specify driver:",
43
+ " phantomjs (default)",
44
+ " selenium",
45
+ " capybara_webkit"
46
46
 
47
47
  opt :driver_options, "--driver-options OPTIONS",
48
- "Specify driver-specific options to pass into the driver.",
49
- " e.g. \"--ssl-protocol=any --ssl-certificates-path=/path/to/certs\".",
50
- " Driver options are only supported with phantomjs."
48
+ "Specify driver-specific options to pass into the driver.",
49
+ " e.g. \"--ssl-protocol=any --ssl-certificates-path=/path/to/certs\".",
50
+ " Driver options are only supported with phantomjs."
51
51
 
52
52
  opt :driver_timeout, "--driver-timeout SECONDS",
53
- "Sets the timeout for the driver to wait before exiting."
53
+ "Sets the timeout for the driver to wait before exiting."
54
54
 
55
55
  opt :server, "--server SERVER",
56
- "Sets server to use with Rack.",
57
- " e.g. webrick, thin"
56
+ "Sets server to use with Rack.",
57
+ " e.g. webrick, thin"
58
58
 
59
59
  opt :server_port, "--server-port PORT",
60
- "Sets the server to use a specific port."
60
+ "Sets the server to use a specific port."
61
61
 
62
62
  opt :server_timeout, "--server-timeout SECONDS",
63
- "Sets the timeout that the server must start within."
63
+ "Sets the timeout that the server must start within."
64
64
 
65
65
  opt :fail_fast, "-F", "--[no-]fail-fast",
66
- "Abort after the first failing suite."
66
+ "Abort after the first failing suite."
67
67
  end
68
68
 
69
69
  def opts_for_filtering
70
70
  separator("Filtering")
71
71
 
72
72
  opt :suite, "-s", "--suite SUITE",
73
- "Focus to a specific suite."
73
+ "Focus to a specific suite."
74
74
 
75
75
  opt :filter, "-g", "--filter FILTER",
76
- "Filter tests matching a specific filter."
76
+ "Filter tests matching a specific filter."
77
77
  end
78
78
 
79
79
  def opts_for_output
80
80
  separator("Output")
81
81
 
82
82
  opt :suppress_log, "-q", "--[no-]suppress-log",
83
- "Suppress logs coming from console[log/debug/error]."
83
+ "Suppress logs coming from console[log/debug/error]."
84
84
 
85
85
  opt :color, "-c", "--[no-]color",
86
- "Enable/Disable color output."
86
+ "Enable/Disable color output."
87
87
 
88
88
  opt :export, "-e", "--export [OUTPUT_PATH]",
89
- "Exports the test suite as the full HTML (requires wget)."
89
+ "Exports the test suite as the full HTML (requires wget)."
90
90
 
91
91
  opt :formatters, "-f", "--format FORMATTERS",
92
- "Specify formatters (comma separated)",
93
- " dot (default) - dots",
94
- " documentation - descriptive documentation",
95
- " clean - like dots but doesn't log re-run commands",
96
- " json - json formatter (raw teaspoon)",
97
- " junit - junit compatible formatter",
98
- " pride - yay rainbows!",
99
- " snowday - makes you feel warm inside",
100
- " swayze_or_oprah - quote from either Patrick Swayze or Oprah Winfrey",
101
- " tap - test anything protocol formatter",
102
- " tap_y - tap_yaml, format used by tapout",
103
- " teamcity - teamcity compatible formatter"
92
+ "Specify formatters (comma separated)",
93
+ *Teaspoon::Formatters.known_formatters.map(&:cli_help)
104
94
  end
105
95
 
106
96
  def opts_for_coverage
107
97
  separator("Coverage")
108
98
 
109
99
  opt :use_coverage, "-C", "--coverage CONFIG_NAME",
110
- "Generate coverage reports using a pre-defined coverage configuration."
100
+ "Generate coverage reports using a pre-defined coverage configuration."
111
101
  end
112
102
 
113
103
  def opts_for_utility
114
104
  separator("Utility")
115
105
 
116
- @parser.on "-v", "--version", "Display the version.", proc{ STDOUT.print("#{Teaspoon::VERSION}\n"); exit }
117
- @parser.on "-h", "--help", "You're looking at it.", proc { STDOUT.print("#{@parser}\n"); exit }
106
+ @parser.on "-v", "--version", "Display the version." do
107
+ STDOUT.print("#{Teaspoon::VERSION}\n")
108
+ exit
109
+ end
110
+
111
+ @parser.on "-h", "--help", "You're looking at it." do
112
+ STDOUT.print("#{@parser}\n")
113
+ exit
114
+ end
118
115
  end
119
116
 
120
117
  private
@@ -124,7 +121,7 @@ module Teaspoon
124
121
  end
125
122
 
126
123
  def opt(config, *args)
127
- @parser.on(*args, proc{ |value| @options[config] = value })
124
+ @parser.on(*args, proc { |value| @options[config] = value })
128
125
  end
129
126
 
130
127
  def require_console
@@ -1,7 +1,6 @@
1
1
  require "singleton"
2
2
 
3
3
  module Teaspoon
4
-
5
4
  autoload :Formatters, "teaspoon/formatters/base"
6
5
  autoload :Drivers, "teaspoon/drivers/base"
7
6
 
@@ -17,7 +16,7 @@ module Teaspoon
17
16
  # - add it to ENV_OVERRIDES if it can be overridden from ENV
18
17
  # - add it to the initializers in /lib/generators/install/templates so it's documented there as well
19
18
 
20
- cattr_accessor :mount_at, :root, :asset_paths, :fixture_paths
19
+ cattr_accessor :mount_at, :root, :asset_paths, :fixture_paths
21
20
  @@mount_at = "/teaspoon"
22
21
  @@root = nil # will default to Rails.root
23
22
  @@asset_paths = ["spec/javascripts", "spec/javascripts/stylesheets", "test/javascripts", "test/javascripts/stylesheets"]
@@ -25,9 +24,9 @@ module Teaspoon
25
24
 
26
25
  # console runner specific
27
26
 
28
- cattr_accessor :driver, :driver_options, :driver_timeout, :server, :server_port, :server_timeout, :fail_fast,
29
- :formatters, :color, :suppress_log,
30
- :use_coverage
27
+ cattr_accessor :driver, :driver_options, :driver_timeout, :server, :server_port, :server_timeout, :fail_fast,
28
+ :formatters, :color, :suppress_log,
29
+ :use_coverage
31
30
  @@driver = "phantomjs"
32
31
  @@driver_options = nil
33
32
  @@driver_timeout = 180
@@ -53,41 +52,38 @@ module Teaspoon
53
52
  # suite configurations
54
53
 
55
54
  cattr_accessor :suite_configs
56
- @@suite_configs = {"default" => {block: proc{}}}
55
+ @@suite_configs = { "default" => { block: proc {} } }
57
56
 
58
57
  def self.suite(name = :default, &block)
59
- @@suite_configs[name.to_s] = {block: block, instance: Suite.new(&block)}
58
+ @@suite_configs[name.to_s] = { block: block, instance: Suite.new(&block) }
60
59
  end
61
60
 
62
61
  class Suite
63
-
64
62
  FRAMEWORKS = {
65
63
  jasmine: ["1.3.1", "2.0.0"],
66
64
  mocha: ["1.10.0", "1.17.1"],
67
65
  qunit: ["1.12.0", "1.14.0"],
68
- angular: ["1.0.5"],
69
66
  }
70
67
 
71
- attr_accessor :matcher, :helper, :javascripts, :stylesheets,
72
- :boot_partial, :body_partial,
73
- :no_coverage,
74
- :hooks
68
+ attr_accessor :matcher, :helper, :javascripts, :stylesheets,
69
+ :boot_partial, :body_partial,
70
+ :no_coverage, :hooks, :expand_assets
75
71
 
76
72
  def initialize
77
- @matcher = "{spec/javascripts,app/assets}/**/*_spec.{js,js.coffee,coffee}"
78
- @helper = "spec_helper"
79
- @javascripts = ["jasmine/1.3.1", "teaspoon-jasmine"]
80
- @stylesheets = ["teaspoon"]
81
-
82
- @boot_partial = "boot"
83
- @body_partial = "body"
73
+ @matcher = "{spec/javascripts,app/assets}/**/*_spec.{js,js.coffee,coffee}"
74
+ @helper = "spec_helper"
75
+ @javascripts = ["jasmine/1.3.1", "teaspoon-jasmine"]
76
+ @stylesheets = ["teaspoon"]
84
77
 
85
- @no_coverage = [%r{/lib/ruby/gems/}, %r{/vendor/assets/}, %r{/support/}, %r{/(.+)_helper.}]
78
+ @boot_partial = "boot"
79
+ @body_partial = "body"
86
80
 
87
- @hooks = Hash.new{ |h, k| h[k] = [] }
81
+ @no_coverage = [%r{/lib/ruby/gems/}, %r{/vendor/assets/}, %r{/support/}, %r{/(.+)_helper.}]
82
+ @hooks = Hash.new { |h, k| h[k] = [] }
83
+ @expand_assets = true
88
84
 
89
85
  default = Teaspoon.configuration.suite_configs["default"]
90
- self.instance_eval(&default[:block]) if default
86
+ instance_eval(&default[:block]) if default
91
87
  yield self if block_given?
92
88
  end
93
89
 
@@ -96,7 +92,9 @@ module Teaspoon
96
92
  version ||= FRAMEWORKS[name].last if FRAMEWORKS[name]
97
93
  unless FRAMEWORKS[name] && FRAMEWORKS[name].include?(version)
98
94
  message = "Unknown framework \"#{name}\""
99
- message += " with version #{version} -- available versions #{FRAMEWORKS[name].join(", ")}" if FRAMEWORKS[name] && version
95
+ if FRAMEWORKS[name] && version
96
+ message += " with version #{version} -- available versions #{FRAMEWORKS[name].join(', ')}"
97
+ end
100
98
  raise Teaspoon::UnknownFramework, message
101
99
  end
102
100
 
@@ -105,7 +103,6 @@ module Teaspoon
105
103
  when :qunit
106
104
  @matcher = "{test/javascripts,app/assets}/**/*_test.{js,js.coffee,coffee}"
107
105
  @helper = "test_helper"
108
- else
109
106
  end
110
107
  end
111
108
  alias_method :use_framework=, :use_framework
@@ -118,15 +115,15 @@ module Teaspoon
118
115
  # coverage configurations
119
116
 
120
117
  cattr_accessor :coverage_configs
121
- @@coverage_configs = {"default" => {block: proc{}}}
118
+ @@coverage_configs = { "default" => { block: proc {} } }
122
119
 
123
120
  def self.coverage(name = :default, &block)
124
- @@coverage_configs[name.to_s] = {block: block, instance: Coverage.new(&block)}
121
+ @@coverage_configs[name.to_s] = { block: block, instance: Coverage.new(&block) }
125
122
  end
126
123
 
127
124
  class Coverage
128
- attr_accessor :reports, :output_path,
129
- :statements, :functions, :branches, :lines
125
+ attr_accessor :reports, :output_path,
126
+ :statements, :functions, :branches, :lines
130
127
 
131
128
  def initialize
132
129
  @reports = ["text-summary"]
@@ -138,7 +135,7 @@ module Teaspoon
138
135
  @lines = nil
139
136
 
140
137
  default = Teaspoon.configuration.coverage_configs["default"]
141
- self.instance_eval(&default[:block]) if default
138
+ instance_eval(&default[:block]) if default
142
139
  yield self if block_given?
143
140
  end
144
141
  end
@@ -0,0 +1,187 @@
1
+ require "singleton"
2
+
3
+ module Teaspoon
4
+ autoload :Formatters, "teaspoon/formatters/base"
5
+ autoload :Drivers, "teaspoon/drivers/base"
6
+
7
+ class Configuration
8
+ include Singleton
9
+
10
+ # CONTRIBUTORS:
11
+ # If you add a configuration option you should do the following before it will be considered for merging.
12
+ # - think about if it should be a suite, coverage, or global configuration
13
+ # - write specs for it, and add it to existing specs in spec/teaspoon/configuration_spec.rb
14
+ # - add it to the readme so it's documented
15
+ # - add it to the command_line.rb if appropriate (_only_ if it's appropriate)
16
+ # - add it to ENV_OVERRIDES if it can be overridden from ENV
17
+ # - add it to the initializers in /lib/generators/install/templates so it's documented there as well
18
+
19
+ cattr_accessor :mount_at, :root, :asset_paths, :fixture_paths
20
+ @@mount_at = "/teaspoon"
21
+ @@root = nil # will default to Rails.root
22
+ @@asset_paths = ["spec/javascripts", "spec/javascripts/stylesheets", "test/javascripts", "test/javascripts/stylesheets"]
23
+ @@fixture_paths = ["spec/javascripts/fixtures", "test/javascripts/fixtures"]
24
+
25
+ # console runner specific
26
+
27
+ cattr_accessor :driver, :driver_options, :driver_timeout, :server, :server_port, :server_timeout, :fail_fast,
28
+ :formatters, :color, :suppress_log,
29
+ :use_coverage
30
+ @@driver = "phantomjs"
31
+ @@driver_options = nil
32
+ @@driver_timeout = 180
33
+ @@server = nil
34
+ @@server_port = nil
35
+ @@server_timeout = 20
36
+ @@fail_fast = true
37
+
38
+ @@formatters = ["dot"]
39
+ @@color = true
40
+ @@suppress_log = false
41
+
42
+ @@use_coverage = nil
43
+
44
+ # options that can be specified in the ENV
45
+
46
+ ENV_OVERRIDES = {
47
+ boolean: %w(FAIL_FAST SUPPRESS_LOG COLOR),
48
+ integer: %w(DRIVER_TIMEOUT SERVER_TIMEOUT),
49
+ string: %w(DRIVER DRIVER_OPTIONS SERVER SERVER_PORT FORMATTERS USE_COVERAGE)
50
+ }
51
+
52
+ # suite configurations
53
+
54
+ cattr_accessor :suite_configs
55
+ @@suite_configs = { "default" => { block: proc {} } }
56
+
57
+ def self.suite(name = :default, &block)
58
+ @@suite_configs[name.to_s] = { block: block, instance: Suite.new(&block) }
59
+ end
60
+
61
+ class Suite
62
+ FRAMEWORKS = {
63
+ jasmine: ["1.3.1", "2.0.0"],
64
+ mocha: ["1.10.0", "1.17.1"],
65
+ qunit: ["1.12.0", "1.14.0"],
66
+ }
67
+
68
+ attr_accessor :matcher, :helper, :javascripts, :stylesheets,
69
+ :boot_partial, :body_partial, :no_coverage, :hooks,
70
+ :expand_assets
71
+
72
+ def initialize
73
+ @matcher = "{spec/javascripts,app/assets}/**/*_spec.{js,js.coffee,coffee}"
74
+ @helper = "spec_helper"
75
+ @javascripts = ["jasmine/1.3.1", "teaspoon-jasmine"]
76
+ @stylesheets = ["teaspoon"]
77
+
78
+ @boot_partial = "boot"
79
+ @body_partial = "body"
80
+
81
+ @no_coverage = [%r{/lib/ruby/gems/}, %r{/vendor/assets/}, %r{/support/}, %r{/(.+)_helper.}]
82
+
83
+ <<<<<<< Updated upstream
84
+ @hooks = Hash.new { |h, k| h[k] = [] }
85
+ =======
86
+ @hooks = Hash.new{ |h, k| h[k] = [] }
87
+ @expand_assets = true
88
+ >>>>>>> Stashed changes
89
+
90
+ default = Teaspoon.configuration.suite_configs["default"]
91
+ instance_eval(&default[:block]) if default
92
+ yield self if block_given?
93
+ end
94
+
95
+ def use_framework(name, version = nil)
96
+ name = name.to_sym
97
+ version ||= FRAMEWORKS[name].last if FRAMEWORKS[name]
98
+ unless FRAMEWORKS[name] && FRAMEWORKS[name].include?(version)
99
+ message = "Unknown framework \"#{name}\""
100
+ if FRAMEWORKS[name] && version
101
+ message += " with version #{version} -- available versions #{FRAMEWORKS[name].join(', ')}"
102
+ end
103
+ raise Teaspoon::UnknownFramework, message
104
+ end
105
+
106
+ @javascripts = [[name, version].join("/"), "teaspoon-#{name}"]
107
+ case name.to_sym
108
+ when :qunit
109
+ @matcher = "{test/javascripts,app/assets}/**/*_test.{js,js.coffee,coffee}"
110
+ @helper = "test_helper"
111
+ end
112
+ end
113
+ alias_method :use_framework=, :use_framework
114
+
115
+ def hook(group = :default, &block)
116
+ @hooks[group.to_s] << block
117
+ end
118
+ end
119
+
120
+ # coverage configurations
121
+
122
+ cattr_accessor :coverage_configs
123
+ @@coverage_configs = { "default" => { block: proc {} } }
124
+
125
+ def self.coverage(name = :default, &block)
126
+ @@coverage_configs[name.to_s] = { block: block, instance: Coverage.new(&block) }
127
+ end
128
+
129
+ class Coverage
130
+ attr_accessor :reports, :output_path,
131
+ :statements, :functions, :branches, :lines
132
+
133
+ def initialize
134
+ @reports = ["text-summary"]
135
+ @output_path = "coverage"
136
+
137
+ @statements = nil
138
+ @functions = nil
139
+ @branches = nil
140
+ @lines = nil
141
+
142
+ default = Teaspoon.configuration.coverage_configs["default"]
143
+ instance_eval(&default[:block]) if default
144
+ yield self if block_given?
145
+ end
146
+ end
147
+
148
+ # custom getters / setters
149
+
150
+ def self.root=(path)
151
+ @@root = Pathname.new(path.to_s) if path.present?
152
+ end
153
+
154
+ def self.formatters
155
+ return ["dot"] if @@formatters.blank?
156
+ return @@formatters if @@formatters.is_a?(Array)
157
+ @@formatters.to_s.split(/,\s?/)
158
+ end
159
+
160
+ # override from env or options
161
+
162
+ def self.override_from_options(options)
163
+ options.each { |k, v| override(k, v) }
164
+ end
165
+
166
+ def self.override_from_env(env)
167
+ ENV_OVERRIDES[:boolean].each { |o| override(o, env[o] == "true") if env[o].present? }
168
+ ENV_OVERRIDES[:integer].each { |o| override(o, env[o].to_i) if env[o].present? }
169
+ ENV_OVERRIDES[:string].each { |o| override(o, env[o]) if env[o].present? }
170
+ end
171
+
172
+ def self.override(config, value)
173
+ setter = "#{config.to_s.downcase}="
174
+ send(setter, value) if respond_to?(setter)
175
+ end
176
+ end
177
+
178
+ mattr_accessor :configured, :configuration
179
+ @@configured = false
180
+ @@configuration = Configuration
181
+
182
+ def self.configure
183
+ yield @@configuration
184
+ @@configured = true
185
+ @@configuration.override_from_env(ENV)
186
+ end
187
+ end