teabag 0.4.6 → 0.5.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 (163) hide show
  1. data/README.md +83 -92
  2. data/app/assets/javascripts/teabag-jasmine.js +5 -2
  3. data/app/assets/javascripts/teabag-mocha.js +5 -2
  4. data/app/assets/javascripts/teabag-qunit.js +5 -2
  5. data/app/assets/javascripts/teabag/base/reporters/console.coffee +2 -1
  6. data/app/assets/javascripts/teabag/base/reporters/html/progress_view.coffee +1 -1
  7. data/app/controllers/teabag/spec_controller.rb +2 -2
  8. data/app/helpers/teabag/spec_helper.rb +11 -2
  9. data/app/views/teabag/spec/index.html.erb +1 -1
  10. data/bin/teabag +6 -0
  11. data/config/routes.rb +2 -2
  12. data/lib/generators/teabag/install/POST_INSTALL +0 -2
  13. data/lib/generators/teabag/install/install_generator.rb +46 -5
  14. data/lib/generators/teabag/install/templates/env.rb +28 -0
  15. data/lib/generators/teabag/install/templates/{initializer.rb → jasmine/initializer.rb} +5 -13
  16. data/lib/generators/teabag/install/templates/jasmine/spec_helper.coffee +25 -0
  17. data/lib/generators/teabag/install/templates/jasmine/spec_helper.js +25 -0
  18. data/lib/generators/teabag/install/templates/mocha/initializer.rb +58 -0
  19. data/lib/generators/teabag/install/templates/mocha/spec_helper.coffee +25 -0
  20. data/lib/generators/teabag/install/templates/mocha/spec_helper.js +25 -0
  21. data/lib/generators/teabag/install/templates/qunit/initializer.rb +58 -0
  22. data/lib/generators/teabag/install/templates/qunit/test_helper.coffee +24 -0
  23. data/lib/generators/teabag/install/templates/qunit/test_helper.js +24 -0
  24. data/lib/tasks/teabag.rake +1 -1
  25. data/lib/teabag/command_line.rb +96 -0
  26. data/lib/teabag/configuration.rb +25 -35
  27. data/lib/teabag/console.rb +19 -7
  28. data/lib/teabag/drivers/phantomjs/runner.coffee +2 -2
  29. data/lib/teabag/drivers/selenium_driver.rb +2 -2
  30. data/lib/teabag/environment.rb +46 -0
  31. data/lib/teabag/exceptions.rb +1 -0
  32. data/lib/teabag/formatters/base_formatter.rb +5 -0
  33. data/lib/teabag/formatters/dot_formatter.rb +3 -2
  34. data/lib/teabag/formatters/junit_formatter.rb +19 -0
  35. data/lib/teabag/formatters/swayze_or_oprah_formatter.rb +7 -2
  36. data/lib/teabag/formatters/tap_y_formatter.rb +1 -0
  37. data/lib/teabag/runner.rb +1 -1
  38. data/lib/teabag/suite.rb +15 -6
  39. data/lib/teabag/version.rb +1 -1
  40. data/spec/dummy/log/development.log +62925 -0
  41. data/spec/dummy/log/test.log +614 -0
  42. data/spec/dummy/tmp/cache/assets/C35/A30/sprockets%2F29906bf540f7d2e081088494b2554989 +0 -0
  43. data/spec/dummy/tmp/cache/assets/C4E/9B0/sprockets%2Fa807397434c9262c3d62da3e91152184 +0 -0
  44. data/spec/dummy/tmp/cache/assets/C59/250/sprockets%2Fa80d3fe493d2476e58c4323996064512 +0 -0
  45. data/spec/dummy/tmp/cache/assets/C72/150/sprockets%2F4194031b4b51b6422c14ac697e3455e5 +0 -0
  46. data/spec/dummy/tmp/cache/assets/C75/D50/sprockets%2F5302968a40e08d2c011aa38666d273f6 +0 -0
  47. data/spec/dummy/tmp/cache/assets/C78/F80/sprockets%2F9161622ddd251097a4ab816b8220984c +0 -0
  48. data/spec/dummy/tmp/cache/assets/C7A/EC0/sprockets%2F5c16e4214f5662e1b27932a57c43491b +0 -0
  49. data/spec/dummy/tmp/cache/assets/C89/700/sprockets%2F259935a7704fef0069303ea63fa89408 +0 -0
  50. data/spec/dummy/tmp/cache/assets/C8A/460/sprockets%2F77bffd9959420103906722b404ae8d59 +0 -0
  51. data/spec/dummy/tmp/cache/assets/C91/FA0/sprockets%2F2eb81283f5789ae91a69344552db3856 +0 -0
  52. data/spec/dummy/tmp/cache/assets/C9D/E90/sprockets%2F3045c9533f179d3e1c805d163ed002a0 +0 -0
  53. data/spec/dummy/tmp/cache/assets/CA6/DF0/sprockets%2F7da83747ce56e49393b6b8726587f846 +0 -0
  54. data/spec/dummy/tmp/cache/assets/CA9/C40/sprockets%2F932b7e2cd1e067289ab51190800814df +0 -0
  55. data/spec/dummy/tmp/cache/assets/CAA/0C0/sprockets%2F057b0ce384f16d9202ae84473436cc35 +0 -0
  56. data/spec/dummy/tmp/cache/assets/CAD/410/sprockets%2F651414e5c7e86f05c5108dc71626b25c +0 -0
  57. data/spec/dummy/tmp/cache/assets/CAF/0F0/sprockets%2F6000e67cf3f2377f860c24da7c819701 +0 -0
  58. data/spec/dummy/tmp/cache/assets/CB7/2B0/sprockets%2Fdf3d317564a780186148134f2ddd59a9 +0 -0
  59. data/spec/dummy/tmp/cache/assets/CBB/FA0/sprockets%2F74922109263bdc965b2e9567eec6d154 +0 -0
  60. data/spec/dummy/tmp/cache/assets/CBD/AF0/sprockets%2Fd687ec33822256e9444e8cd04f1b4873 +0 -0
  61. data/spec/dummy/tmp/cache/assets/CBF/630/sprockets%2F707d2db81468088470d476abff35388d +0 -0
  62. data/spec/dummy/tmp/cache/assets/CC1/DB0/sprockets%2F95e6273223502af230a0dbaa25410de8 +0 -0
  63. data/spec/dummy/tmp/cache/assets/CC2/EC0/sprockets%2F76bf80cb571ca530357f78db78167866 +0 -0
  64. data/spec/dummy/tmp/cache/assets/CCE/C50/sprockets%2Fe12774c2fea852112414bb379a71f31a +0 -0
  65. data/spec/dummy/tmp/cache/assets/CD1/620/sprockets%2F06a3eb05fcb4175a679d6084a06026a6 +0 -0
  66. data/spec/dummy/tmp/cache/assets/CD3/460/sprockets%2F7f3f6802b0b309ed142d0b671c9640c4 +0 -0
  67. data/spec/dummy/tmp/cache/assets/CD9/DD0/sprockets%2Fe5774759168a731da1c1149ecf0e1b03 +0 -0
  68. data/spec/dummy/tmp/cache/assets/CE0/090/sprockets%2F48d5d35ae87d0723318b8bc257fa2237 +0 -0
  69. data/spec/dummy/tmp/cache/assets/CE3/1F0/sprockets%2Fe69a515d3a9d14c669be8871012a7d07 +0 -0
  70. data/spec/dummy/tmp/cache/assets/CE6/270/sprockets%2F2c98152560d18470fec8cf4c6829b4d0 +0 -0
  71. data/spec/dummy/tmp/cache/assets/CE6/7C0/sprockets%2Fa03a2c86ce6724be8542295e1cf24798 +0 -0
  72. data/spec/dummy/tmp/cache/assets/CE7/A60/sprockets%2Ff58eee249aa167d23f8220087bb46684 +0 -0
  73. data/spec/dummy/tmp/cache/assets/CE9/9E0/sprockets%2F135480d497ed7e4884462dc0ef0b80d7 +0 -0
  74. data/spec/dummy/tmp/cache/assets/CEB/680/sprockets%2F67f0794ef8c0576d5c7da34f4437305a +0 -0
  75. data/spec/dummy/tmp/cache/assets/CEB/B40/sprockets%2F1150bf8d912aa100a132251eefaf6045 +0 -0
  76. data/spec/dummy/tmp/cache/assets/CF4/6F0/sprockets%2Fed96f92571224b862b84d7078b86ded3 +0 -0
  77. data/spec/dummy/tmp/cache/assets/CF8/780/sprockets%2F8845b81ff27cdb57c835836c9f91a265 +0 -0
  78. data/spec/dummy/tmp/cache/assets/CFA/D20/sprockets%2Fb26796b39b3c5d6ed70be7989637a493 +0 -0
  79. data/spec/dummy/tmp/cache/assets/CFB/210/sprockets%2F9104695bfbf9a9d4b94382e6e90487a9 +0 -0
  80. data/spec/dummy/tmp/cache/assets/CFC/380/sprockets%2Fa7443cbd671446a589867dd5f4a4f989 +0 -0
  81. data/spec/dummy/tmp/cache/assets/D00/110/sprockets%2F6a6353b7723a8b21708e0fbfe04bd422 +0 -0
  82. data/spec/dummy/tmp/cache/assets/D00/F60/sprockets%2F42e279b52511c47d26c0adb125fd04e8 +0 -0
  83. data/spec/dummy/tmp/cache/assets/D03/630/sprockets%2F5d8da32dba6a7be70426a1d554773701 +0 -0
  84. data/spec/dummy/tmp/cache/assets/D04/170/sprockets%2F76ab1dc02e6c7618852708a1e05a2df3 +0 -0
  85. data/spec/dummy/tmp/cache/assets/D04/480/sprockets%2F8bd8f10500b21d2f9d94e4cd1401c936 +0 -0
  86. data/spec/dummy/tmp/cache/assets/D05/8D0/sprockets%2F319f8f235f452343f1ebf03cb262d23d +0 -0
  87. data/spec/dummy/tmp/cache/assets/D09/BF0/sprockets%2F9e6bca5d26f50d9484385d51ba04312c +0 -0
  88. data/spec/dummy/tmp/cache/assets/D0E/570/sprockets%2F90fe371bf8091e88a712124d9cdae260 +0 -0
  89. data/spec/dummy/tmp/cache/assets/D15/750/sprockets%2F8effdd3e668a4036260a3e370f3b6657 +0 -0
  90. data/spec/dummy/tmp/cache/assets/D17/710/sprockets%2Ffa49fb6823d466e79a195e0cd71340c5 +0 -0
  91. data/spec/dummy/tmp/cache/assets/D1A/D30/sprockets%2F815a5177e9edba0c5c996182ef1b3675 +0 -0
  92. data/spec/dummy/tmp/cache/assets/D1D/560/sprockets%2F1ca784ee7ba1922465147e7f8963eae5 +0 -0
  93. data/spec/dummy/tmp/cache/assets/D1E/AA0/sprockets%2F5c8741a556bc955cd36e61c88582b6dc +0 -0
  94. data/spec/dummy/tmp/cache/assets/D31/9C0/sprockets%2Fbd102a4f5a4985c3519dd6ab0295a1c6 +0 -0
  95. data/spec/dummy/tmp/cache/assets/D35/7C0/sprockets%2Ff536a2606eaf7d542c0985104cb62baf +0 -0
  96. data/spec/dummy/tmp/cache/assets/D37/FF0/sprockets%2F96841ca4cfae32c515077f3f5fc303b2 +0 -0
  97. data/spec/dummy/tmp/cache/assets/D3C/840/sprockets%2Fc6202ec91d567a85bd3d46dc43ea9108 +0 -0
  98. data/spec/dummy/tmp/cache/assets/D44/E90/sprockets%2F05cfc0bf7c9938963d1d1c63248db80d +0 -0
  99. data/spec/dummy/tmp/cache/assets/D45/C30/sprockets%2Fcc744877558178a3adb77c441cadce70 +0 -0
  100. data/spec/dummy/tmp/cache/assets/D47/A90/sprockets%2Fe7ca382b607c595ea6505853f7fb63da +0 -0
  101. data/spec/dummy/tmp/cache/assets/D49/1F0/sprockets%2F773b56f87127c6605e7d1d3faf2b6af6 +0 -0
  102. data/spec/dummy/tmp/cache/assets/D49/A10/sprockets%2Fc4656bd995a6f297c26d19b13aadb963 +0 -0
  103. data/spec/dummy/tmp/cache/assets/D50/D70/sprockets%2Fe2a3e6c95b11e0801a4eebae3a026026 +0 -0
  104. data/spec/dummy/tmp/cache/assets/D51/400/sprockets%2Ff5e433d8a31e80985b75ce598de236be +0 -0
  105. data/spec/dummy/tmp/cache/assets/D5C/710/sprockets%2F9427d05cee2caa721241a25a9af1d08f +0 -0
  106. data/spec/dummy/tmp/cache/assets/D5C/CC0/sprockets%2Faa8bf6de211f2765b0a26f112b971f0c +0 -0
  107. data/spec/dummy/tmp/cache/assets/D5E/FA0/sprockets%2Fc81c371ae2d61a6aa1708262fba79e0d +0 -0
  108. data/spec/dummy/tmp/cache/assets/D61/1F0/sprockets%2F0c7a6176d2fc4db00bb9a74d36380fe1 +0 -0
  109. data/spec/dummy/tmp/cache/assets/D67/BC0/sprockets%2F35d2c2b45981ade5a2db2a9c7f37a615 +0 -0
  110. data/spec/dummy/tmp/cache/assets/D69/F90/sprockets%2F6a0795b7b38bd7e6142cd1b88211dade +0 -0
  111. data/spec/dummy/tmp/cache/assets/D6A/950/sprockets%2F429b1806cb7580ebf29f9a12c33cbea6 +0 -0
  112. data/spec/dummy/tmp/cache/assets/D6B/6E0/sprockets%2F266d99da1afe084cac250a6ba864c565 +0 -0
  113. data/spec/dummy/tmp/cache/assets/D6D/DA0/sprockets%2Fac936bf40b42227a2bf9d474ae9ec149 +0 -0
  114. data/spec/dummy/tmp/cache/assets/D6F/5B0/sprockets%2F5dcc801a7a6c340c5baf525839f9b8b6 +0 -0
  115. data/spec/dummy/tmp/cache/assets/D77/B30/sprockets%2F946cf2f17c7eb41037f9ee08ad67ec40 +0 -0
  116. data/spec/dummy/tmp/cache/assets/D78/2F0/sprockets%2F3c61f8915b8f717b1de788e6ecad122c +0 -0
  117. data/spec/dummy/tmp/cache/assets/D7E/C10/sprockets%2F747c98c3cc7494a62dd882752adffb2b +0 -0
  118. data/spec/dummy/tmp/cache/assets/D8C/520/sprockets%2F221cd58a042baac534d27e4cfedc1188 +0 -0
  119. data/spec/dummy/tmp/cache/assets/D93/BD0/sprockets%2Ff5e1b60201e08e3ddf8d3de5211f3d5e +0 -0
  120. data/spec/dummy/tmp/cache/assets/DA0/330/sprockets%2Fcbbb4de706387d50f48a72ee6c9c1b80 +0 -0
  121. data/spec/dummy/tmp/cache/assets/DA5/0A0/sprockets%2F7a4b5928cec69ab65afff309a04d6b47 +0 -0
  122. data/spec/dummy/tmp/cache/assets/DA9/BF0/sprockets%2Fc59f8f7bf494fe030610bc86bb7cc5e5 +0 -0
  123. data/spec/dummy/tmp/cache/assets/DAC/9B0/sprockets%2F5e58701704fefbc8f88ae24c549fab6b +0 -0
  124. data/spec/dummy/tmp/cache/assets/DAE/6C0/sprockets%2F77c7a8676aeefa73156c55dfcf51cc46 +0 -0
  125. data/spec/dummy/tmp/cache/assets/DB3/5D0/sprockets%2Fce1d4d75832c9bdeafd869f6f7b61725 +0 -0
  126. data/spec/dummy/tmp/cache/assets/DB4/1F0/sprockets%2F69ad2749d7bfe831c0e74e7d7fc4dc57 +0 -0
  127. data/spec/dummy/tmp/cache/assets/DB5/040/sprockets%2F9a9da5df88713663b9fbc945facca891 +0 -0
  128. data/spec/dummy/tmp/cache/assets/DC3/230/sprockets%2Fdf52e72eb73be91eccc60182191aed0b +0 -0
  129. data/spec/dummy/tmp/cache/assets/DC7/A10/sprockets%2F84a8af0fcbf401864e1ae5bf092cba94 +0 -0
  130. data/spec/dummy/tmp/cache/assets/DCD/EB0/sprockets%2F4f77f509126ecbced7ea2a5ab290c8d4 +0 -0
  131. data/spec/dummy/tmp/cache/assets/DE4/140/sprockets%2F139e4ab85d1aacb22c115fa136afdc8a +0 -0
  132. data/spec/dummy/tmp/cache/assets/DEB/110/sprockets%2F2dbdab0ce5babca645cdb5780004f875 +0 -0
  133. data/spec/dummy/tmp/cache/assets/DF6/0E0/sprockets%2F85b10db6e1afe643aba6d396abdd77f0 +0 -0
  134. data/spec/dummy/tmp/cache/assets/DF7/E10/sprockets%2F25e4253aba9a9adcefb72552fb1ff0c8 +0 -0
  135. data/spec/dummy/tmp/cache/assets/DFC/C20/sprockets%2Fd9178ad7e3b401c9fceafd64ea2b50d6 +0 -0
  136. data/spec/dummy/tmp/cache/assets/DFC/C30/sprockets%2Fb50a07cb30b0bd0eec8e98e5de79d65d +0 -0
  137. data/spec/dummy/tmp/cache/assets/E02/6E0/sprockets%2F63d6a5cdb8cefa64ef76b5c6e0fd3720 +0 -0
  138. data/spec/dummy/tmp/cache/assets/E08/BB0/sprockets%2Fefac99af1af28543aef6fb607faa4973 +0 -0
  139. data/spec/dummy/tmp/cache/assets/E08/F20/sprockets%2F4fc5cdcd6974efe7adfe809b30bd6513 +0 -0
  140. data/spec/dummy/tmp/cache/assets/E16/D30/sprockets%2Fd69469e6e7439baacd8df989c0fdacc2 +0 -0
  141. data/spec/dummy/tmp/cache/assets/E17/EF0/sprockets%2Fa291ad64a26afd055dfadabbdf03f154 +0 -0
  142. data/spec/dummy/tmp/cache/assets/E2F/790/sprockets%2F7fac280deaa7ef20a77d5c9b5b9cfc34 +0 -0
  143. data/spec/dummy/tmp/cache/assets/E41/250/sprockets%2F97cf8fe3d7ffaff076f655aefb36da03 +0 -0
  144. data/spec/dummy/tmp/cache/assets/E64/1E0/sprockets%2F81ab4c863fbbdec8dd66afc97ebf034d +0 -0
  145. data/spec/dummy/tmp/cache/assets/E6E/260/sprockets%2Fd9f8ab8b91ef582cc6c99a3ba0dedfe6 +0 -0
  146. data/spec/dummy/tmp/cache/assets/F79/360/sprockets%2F0ce035fefee5ebdabc8efabfbdbd6ee4 +0 -0
  147. data/spec/javascripts/spec_helper.coffee +2 -0
  148. data/spec/javascripts/support/json2.js +486 -0
  149. data/spec/javascripts/teabag/base/reporters/console_spec.coffee +14 -2
  150. data/spec/javascripts/teabag/base/teabag_spec.coffee +1 -0
  151. data/spec/javascripts/teabag/mocha/mocha_mspec.coffee +1 -1
  152. data/spec/javascripts/teabag/phantomjs/runner_spec.coffee +1 -0
  153. data/spec/teabag/command_line_spec.rb +50 -0
  154. data/spec/teabag/console_spec.rb +32 -3
  155. data/spec/teabag/drivers/selenium_driver_spec.rb +2 -2
  156. data/spec/teabag/environment_spec.rb +88 -0
  157. data/spec/teabag/formatters/dot_formatter_spec.rb +2 -2
  158. data/spec/teabag/runner_spec.rb +4 -0
  159. data/spec/teabag/suite_spec.rb +8 -2
  160. data/spec/teabag_env.rb +27 -0
  161. metadata +40 -8
  162. data/app/assets/images/teabag/photo-white.jpg +0 -0
  163. data/lib/generators/teabag/install/templates/spec_helper.js +0 -31
@@ -0,0 +1,24 @@
1
+ // You can require javascript files here. A good place to start is by requiring your application.js.
2
+ // require application
3
+ //
4
+ // Teabag includes some support files, but you can use anything from your own support path too.
5
+ // require support/sinon
6
+ // require support/your-support-file
7
+ //
8
+ // Deferring execution
9
+ // If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call Teabag.execute()
10
+ // after everything has been loaded. Simple example of a timeout:
11
+ //
12
+ // Teabag.defer = true
13
+ // setTimeout(Teabag.execute, 1000)
14
+ //
15
+ // Matching files
16
+ // By default Teabag will look for files that match _test.{js,js.coffee,.coffee}. Add a filename_test.js file in your
17
+ // test path and it'll be included in the default suite automatically. If you want to customize suites, check out the
18
+ // configuration in config/initializers/teabag.rb
19
+ //
20
+ // Manifest
21
+ // If you'd rather require your test files manually (to control order for instance) you can disable the suite matcher in
22
+ // the configuration and use this file as a manifest.
23
+ //
24
+ // For more information: http://github.com/modeset/teabag
@@ -1,5 +1,5 @@
1
1
  desc "Run the javascript specs"
2
2
  task :teabag => :environment do
3
3
  require "teabag/console"
4
- fail if Teabag::Console.new(ENV["suite"]).execute
4
+ fail if Teabag::Console.new({suite: ENV["suite"]}).execute
5
5
  end
@@ -0,0 +1,96 @@
1
+ require "optparse"
2
+ require "teabag/version"
3
+
4
+ module Teabag
5
+ class CommandLine
6
+
7
+ def initialize
8
+ @options = {}
9
+ @files = opt_parser.parse!
10
+
11
+ begin
12
+ require_console
13
+ abort if Teabag::Console.new(@options, @files).execute
14
+ rescue Teabag::EnvironmentNotFound => e
15
+ STDOUT.print "Unable to load Teabag environment in {#{Teabag::Environment.standard_environments.join(', ')}}.\n"
16
+ STDOUT.print "Consider using -r path/to/teabag_env\n"
17
+ abort
18
+ end
19
+ end
20
+
21
+ def opt_parser
22
+ OptionParser.new do |parser|
23
+ parser.banner = "Usage: teabag [options] [files]\n\n"
24
+
25
+ parser.on("-r", "--require FILE", "Require Teabag environment file.") do |file|
26
+ @options[:environment] = file
27
+ end
28
+
29
+ #parser.on("-O", "--options PATH", "Specify the path to a custom options file.") do |path|
30
+ # @options[:custom_options_file] = path
31
+ #end
32
+
33
+ parser.on("-d", "--driver DRIVER", "Specify driver:",
34
+ " phantomjs (default)",
35
+ " selenium") do |driver|
36
+ @options[:driver] = driver
37
+ end
38
+
39
+ parser.on("--server-timeout SECONDS", "Sets the timeout for the server to start.") do |seconds|
40
+ @options[:server_timeout] = seconds
41
+ end
42
+
43
+ parser.on("--[no-]fail-fast", "Abort after the first failing suite.") do |o|
44
+ @options[:fail_fast] = o
45
+ end
46
+
47
+ parser.separator("\n **** Filtering ****\n\n")
48
+
49
+ parser.on("-s", "--suite SUITE", "Focus to a specific suite.") do |suite|
50
+ @options[:suite] = suite
51
+ end
52
+
53
+ parser.on("-g", "--filter FILTER", "Filter tests matching a specific filter.") do |filter|
54
+ @options[:filter] = filter
55
+ end
56
+
57
+ parser.separator("\n **** Output ****\n\n")
58
+
59
+ parser.on("-f", "--format FORMATTERS", "Specify formatters (comma separated)",
60
+ " dot (default)",
61
+ " tap_y",
62
+ " swayze_or_oprah") do |formatters|
63
+ @options[:formatters] = formatters
64
+ end
65
+
66
+ parser.on("-q", "--[no-]suppress-log", "Suppress logs coming from console[log/debug/error].") do |o|
67
+ @options[:suppress_log] = o
68
+ end
69
+
70
+ parser.on("-c", "--[no-]colour", "Enable/Disable color output.") do |o|
71
+ @options[:color] = o
72
+ end
73
+
74
+ parser.separator("\n **** Utility ****\n\n")
75
+
76
+ parser.on("-v", "--version", "Display the version.") do
77
+ puts Teabag::VERSION
78
+ exit
79
+ end
80
+
81
+ parser.on("-h", "--help", "You're looking at it.") do
82
+ puts parser
83
+ exit
84
+ end
85
+ end
86
+ end
87
+
88
+ def require_console
89
+ require "teabag/console"
90
+ end
91
+
92
+ def abort
93
+ exit(1)
94
+ end
95
+ end
96
+ end
@@ -5,41 +5,22 @@ module Teabag
5
5
 
6
6
  include Singleton
7
7
 
8
- cattr_accessor :root,
9
- :mount_at,
10
- :asset_paths,
11
- :fixture_path,
12
- :driver,
13
- :formatters,
14
- :server_timeout,
15
- :fail_fast,
16
- :suppress_log,
17
- :phantomjs_bin,
18
- :suites
19
-
20
- @@mount_at = "/teabag"
21
- @@root = nil # will default to Rails.root if left unset
22
- @@asset_paths = ["spec/javascripts", "spec/javascripts/stylesheets", "test/javascripts", "test/javascripts/stylesheets"]
23
- @@fixture_path = "spec/javascripts/fixtures"
24
- @@suites = {}
8
+ cattr_accessor :mount_at, :root, :asset_paths, :fixture_path, :suites
9
+ @@mount_at = "/teabag"
10
+ @@root = nil # will default to Rails.root if left unset
11
+ @@asset_paths = ["spec/javascripts", "spec/javascripts/stylesheets", "test/javascripts", "test/javascripts/stylesheets"]
12
+ @@fixture_path = "spec/javascripts/fixtures"
13
+ @@suites = {"default" => proc{}}
25
14
 
26
15
  # console runner specific
27
- @@driver = "phantomjs"
28
- @@formatters = "dot"
29
- @@server_timeout = 20
30
- @@fail_fast = true
31
- @@suppress_log = false
32
- @@phantomjs_bin = nil
33
-
34
- def self.root=(path)
35
- @@root = Pathname.new(path.to_s) if path.present?
36
- end
37
-
38
- def self.suite(name = :default, &block)
39
- @@suites[name.to_s] = block
40
- end
41
-
42
- self.suite(:default) {}
16
+ cattr_accessor :driver, :phantomjs_bin, :server_timeout, :fail_fast, :formatters, :suppress_log, :color
17
+ @@driver = "phantomjs"
18
+ @@phantomjs_bin = nil
19
+ @@server_timeout = 20
20
+ @@fail_fast = true
21
+ @@formatters = "dot"
22
+ @@suppress_log = false
23
+ @@color = true
43
24
 
44
25
  class Suite
45
26
  attr_accessor :matcher, :helper, :stylesheets, :javascripts
@@ -53,6 +34,15 @@ module Teabag
53
34
  yield self if block_given?
54
35
  end
55
36
  end
37
+
38
+ def self.root=(path)
39
+ @@root = Pathname.new(path.to_s) if path.present?
40
+ end
41
+
42
+ def self.suite(name = :default, &block)
43
+ @@suites[name.to_s] = block
44
+ end
45
+
56
46
  end
57
47
 
58
48
  autoload :Formatters, "teabag/formatters/base_formatter"
@@ -69,11 +59,11 @@ module Teabag
69
59
  private
70
60
 
71
61
  def self.override_from_env
72
- %w(FAIL_FAST SUPPRESS_LOG).each do |directive|
62
+ %w(FAIL_FAST SUPPRESS_LOG COLOR).each do |directive|
73
63
  next unless ENV[directive].present?
74
64
  @@configuration.send("#{directive.downcase}=", ENV[directive] == "true")
75
65
  end
76
- %w(FORMATTERS DRIVER).each do |directive|
66
+ %w(DRIVER FORMATTERS SERVER_TIMEOUT PHANTOMJS_BIN).each do |directive|
77
67
  next unless ENV[directive].present?
78
68
  @@configuration.send("#{directive.downcase}=", ENV[directive])
79
69
  end
@@ -1,14 +1,19 @@
1
- require "teabag/server"
1
+ require 'open-uri'
2
+ require 'teabag/environment'
2
3
 
3
4
  module Teabag
4
5
  class Console
5
6
 
6
- def initialize(suite_name = nil)
7
- # force asset debugging off -- gives us nicer errors on missing files, bad coffeescript, etc
8
- Rails.application.config.assets.debug = false
7
+ def initialize(options = nil, files = [])
8
+ @options = options || {}
9
+ @files = files
9
10
 
10
- if suite_name
11
- @suites = [suite_name]
11
+ Teabag::Environment.load(@options)
12
+ require "teabag/server"
13
+ Rails.application.config.assets.debug = false if Teabag.configuration.driver == 'phantomjs'
14
+
15
+ if @options[:suite].present?
16
+ @suites = [@options[:suite]]
12
17
  else
13
18
  @suites = Teabag.configuration.suites.keys
14
19
  end
@@ -44,8 +49,15 @@ module Teabag
44
49
  @driver ||= Teabag::Drivers.const_get("#{Teabag.configuration.driver.to_s.camelize}Driver").new
45
50
  end
46
51
 
52
+ def filter
53
+ parts = []
54
+ parts << "grep=#{URI::encode(@options[:filter])}" if @options[:filter].present?
55
+ @files.each { |file| parts << "file[]=#{URI::encode(file)}" }
56
+ "?#{parts.join('&')}"
57
+ end
58
+
47
59
  def url(suite)
48
- ["#{@server.url}#{Teabag.configuration.mount_at}", suite].join("/")
60
+ ["#{@server.url}#{Teabag.configuration.mount_at}", suite, filter].join("/")
49
61
  end
50
62
  end
51
63
  end
@@ -24,7 +24,7 @@ class @Runner
24
24
 
25
25
 
26
26
  waitForResults: =>
27
- @fail("Timed out") if (Date.now() - @start) >= @timeout
27
+ @fail("Timed out") if (new Date().getTime() - @start) >= @timeout
28
28
  finished = @page.evaluate(-> window.Teabag && window.Teabag.finished)
29
29
  if finished then @finish() else setTimeout(@waitForResults, 200)
30
30
 
@@ -50,7 +50,7 @@ class @Runner
50
50
 
51
51
 
52
52
  onLoadFinished: (status) =>
53
- @start = Date.now()
53
+ @start = new Date().getTime()
54
54
  defined = @page.evaluate(-> window.Teabag)
55
55
  unless status == "success" && defined
56
56
  @fail("Failed to load: #{@url}")
@@ -9,11 +9,11 @@ module Teabag
9
9
  runner = Teabag::Runner.new(suite)
10
10
 
11
11
  driver = Selenium::WebDriver.for(:firefox)
12
- driver.navigate.to("#{url}?reporter=Console")
12
+ driver.navigate.to("#{url}&reporter=Console")
13
13
 
14
14
  Selenium::WebDriver::Wait.new(timeout: 180, interval: 0.01, message: "Timed out").until do
15
15
  done = driver.execute_script("return window.Teabag && window.Teabag.finished")
16
- driver.execute_script("return Teabag.getMessages()").each do |line|
16
+ driver.execute_script("return window.Teabag && window.Teabag.getMessages() || []").each do |line|
17
17
  runner.process("#{line}\n")
18
18
  end
19
19
  done
@@ -0,0 +1,46 @@
1
+ require "teabag/exceptions"
2
+
3
+ module Teabag
4
+ module Environment
5
+
6
+ def self.load(options = {})
7
+ unless rails_loaded?
8
+ require_environment(options[:environment])
9
+ raise "Rails environment not found." unless rails_loaded?
10
+ end
11
+
12
+ require "teabag"
13
+
14
+ configure_from_options(options)
15
+ end
16
+
17
+ def self.require_environment(override = nil)
18
+ return require_env(File.expand_path(override, Dir.pwd)) if override
19
+
20
+ standard_environments.each do |filename|
21
+ file = File.expand_path(filename, Dir.pwd)
22
+ return require_env(file) if File.exists?(file)
23
+ end
24
+
25
+ raise Teabag::EnvironmentNotFound
26
+ end
27
+
28
+ def self.standard_environments
29
+ ["spec/teabag_env.rb", "test/teabag_env.rb", "teabag_env.rb"]
30
+ end
31
+
32
+ def self.configure_from_options(options)
33
+ options.each do |key, value|
34
+ Teabag.configuration.send("#{key.downcase}=", value) if Teabag.configuration.respond_to?("#{key.downcase}=")
35
+ end
36
+ end
37
+
38
+ def self.require_env(file)
39
+ require(file)
40
+ end
41
+
42
+ def self.rails_loaded?
43
+ defined?(Rails)
44
+ end
45
+ end
46
+ end
@@ -3,4 +3,5 @@ module Teabag
3
3
  class UnknownSuite < Exception; end
4
4
  class RunnerException < Exception; end
5
5
  class AssetNotServable < Exception; end
6
+ class EnvironmentNotFound < Exception; end
6
7
  end
@@ -29,6 +29,11 @@ module Teabag
29
29
  end
30
30
  end
31
31
 
32
+ def result(results)
33
+ return if failures.size == 0
34
+ raise Teabag::Failure if Teabag.configuration.fail_fast
35
+ end
36
+
32
37
  # Exceptions come from startup errors in the server
33
38
  def exception(exception = {})
34
39
  raise Teabag::RunnerException
@@ -34,6 +34,7 @@ module Teabag
34
34
  log_information
35
35
  log_stats(results)
36
36
  log_failed_examples
37
+ super
37
38
  end
38
39
 
39
40
  protected
@@ -72,10 +73,9 @@ module Teabag
72
73
  return if failures.size == 0
73
74
  log "\nFailed examples:\n"
74
75
  failures.each do |failure|
75
- log "\n#{Teabag.configuration.mount_at}/#{@suite_name}#{failure.link}", RED
76
+ log "\nteabag -s #{@suite_name} --filter=\"#{failure.link}\"", RED
76
77
  end
77
78
  log "\n\n"
78
- raise Teabag::Failure if Teabag.configuration.fail_fast
79
79
  end
80
80
 
81
81
  private
@@ -85,6 +85,7 @@ module Teabag
85
85
  end
86
86
 
87
87
  def colorize(str, color_code)
88
+ return str unless Teabag.configuration.color
88
89
  "\e[#{color_code}m#{str}\e[0m"
89
90
  end
90
91
 
@@ -0,0 +1,19 @@
1
+ require 'teabag/formatters/base_formatter'
2
+
3
+ module Teabag
4
+ module Formatters
5
+ class JunitFormatter < BaseFormatter
6
+
7
+ def initialize
8
+ super
9
+ @builder = Builder::XmlMarkup.new
10
+ @builder.instruct! :xml, version: "1.0", :encoding=>"UTF-8"
11
+ end
12
+
13
+ def spec
14
+ @builder.person { |b| b.name("Jim"); b.phone("555-1234") }
15
+ puts @builder
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,8 +3,13 @@ module Teabag
3
3
  class SwayzeOrOprahFormatter < BaseFormatter
4
4
 
5
5
  def result(results)
6
- quote = QUOTES[Random.rand(QUOTES.size)]
7
- STDOUT.print("\n#{quote.inspect} -- Oprah Winfrey or Patrick Swayze?\n")
6
+ if failures.size == 0
7
+ quote = QUOTES[Random.rand(QUOTES.size)]
8
+ STDOUT.print("\n#{quote.inspect} -- Oprah Winfrey or Patrick Swayze?\n")
9
+ else
10
+ STDOUT.print("\nNo quote for you.\n")
11
+ end
12
+ super
8
13
  end
9
14
 
10
15
  QUOTES = [
@@ -38,6 +38,7 @@ module Teabag
38
38
  "omit" => 0,
39
39
  "todo" => @pendings.size
40
40
  }
41
+ super
41
42
  end
42
43
 
43
44
  def error(error)
data/lib/teabag/runner.rb CHANGED
@@ -9,7 +9,7 @@ module Teabag
9
9
 
10
10
  def initialize(suite_name = :default)
11
11
  @suite_name = suite_name
12
- @formatters = Teabag.configuration.formatters.split(/,\s+/).map{ |f| resolve_formatter(f).new(suite_name) }
12
+ @formatters = Teabag.configuration.formatters.split(/,\s?/).map{ |f| resolve_formatter(f).new(suite_name) }
13
13
  @failure_count = 0
14
14
  end
15
15