rspec 0.7.3 → 0.7.4

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 (44) hide show
  1. data/CHANGES +23 -1
  2. data/Rakefile +11 -9
  3. data/bin/spec +0 -1
  4. data/lib/spec.rb +1 -0
  5. data/lib/spec/callback.rb +3 -0
  6. data/lib/spec/callback/callback_container.rb +60 -0
  7. data/lib/spec/callback/extensions/module.rb +24 -0
  8. data/lib/spec/callback/extensions/object.rb +33 -0
  9. data/lib/spec/expectations/diff.rb +10 -14
  10. data/lib/spec/expectations/extensions.rb +1 -3
  11. data/lib/spec/expectations/extensions/numeric.rb +6 -1
  12. data/lib/spec/expectations/extensions/object.rb +72 -18
  13. data/lib/spec/expectations/should/base.rb +27 -5
  14. data/lib/spec/expectations/should/have.rb +2 -2
  15. data/lib/spec/expectations/should/should.rb +5 -4
  16. data/lib/spec/mocks/error_generator.rb +23 -12
  17. data/lib/spec/mocks/message_expectation.rb +4 -0
  18. data/lib/spec/mocks/mock_handler.rb +9 -8
  19. data/lib/spec/rake/spectask.rb +2 -1
  20. data/lib/spec/runner.rb +0 -1
  21. data/lib/spec/runner/backtrace_tweaker.rb +1 -0
  22. data/lib/spec/runner/context_eval.rb +1 -1
  23. data/lib/spec/runner/formatter/base_text_formatter.rb +1 -1
  24. data/lib/spec/runner/formatter/html_formatter.rb +94 -74
  25. data/lib/spec/runner/option_parser.rb +5 -1
  26. data/lib/spec/runner/specification.rb +64 -37
  27. data/lib/spec/version.rb +3 -3
  28. data/vendor/{selenium → web_spec/selenium}/README.txt +0 -0
  29. data/vendor/{selenium → web_spec/selenium}/find_rspecs_home_page.rb +0 -0
  30. data/vendor/{selenium → web_spec/selenium}/rspec_selenium.rb +0 -0
  31. data/vendor/{selenium → web_spec/selenium}/start_browser_once.patch +0 -0
  32. data/vendor/{watir → web_spec/watir}/README.txt +2 -2
  33. data/vendor/web_spec/watir/find_rspecs_home_page.rb +27 -0
  34. data/vendor/{watir → web_spec/watir}/find_rspecs_home_page.txt +0 -0
  35. data/vendor/{watir → web_spec/watir}/rspec_watir.rb +13 -12
  36. data/vendor/web_spec/web_test_html_formatter.rb +8 -0
  37. data/vendor/web_spec/web_test_html_formatter_helper.rb +26 -0
  38. data/vendor/web_spec/web_test_html_formatter_osx_helper.rb +19 -0
  39. data/vendor/web_spec/web_test_html_formatter_win_helper.rb +14 -0
  40. metadata +19 -14
  41. data/lib/spec/expectations/extensions/inspect_for_expectation_not_met_error.rb +0 -15
  42. data/lib/spec/expectations/extensions/symbol.rb +0 -5
  43. data/lib/spec/runner/extensions/object.rb +0 -21
  44. data/vendor/watir/find_rspecs_home_page.rb +0 -21
@@ -74,7 +74,11 @@ module Spec
74
74
  opts.on("-s", "--spec SPECIFICATION_NAME", "Execute context or specification with matching name") do |spec_name|
75
75
  options.spec_name = spec_name
76
76
  end
77
-
77
+
78
+ opts.on("-o", "--out OUTPUT_FILE", "Path to output file (defaults to STDOUT)") do |outfile|
79
+ options.out = File.new(outfile, 'w')
80
+ end
81
+
78
82
  opts.on("-l", "--line LINE_NUMBER", Integer, "Execute context or specification at given line") do |line_number|
79
83
  options.line_number = line_number.to_i
80
84
  end
@@ -1,68 +1,95 @@
1
1
  module Spec
2
2
  module Runner
3
3
  class Specification
4
-
5
- @@current_spec = nil
6
-
7
- def self.add_listener listener
8
- @@current_spec.add_listener listener unless @@current_spec.nil?
4
+ module ClassMethods
5
+ attr_accessor :current
6
+ protected :current=
7
+
8
+ callback_events :before_setup, :after_teardown
9
9
  end
10
-
10
+ extend ClassMethods
11
+
12
+ attr_reader :command
13
+ callback_events :before_setup, :after_teardown
14
+
11
15
  def initialize(name, opts={}, &block)
12
16
  @from = caller(0)[3]
13
17
  @name = name
14
18
  @options = opts
15
- @block = block
16
- @listeners = []
19
+ @command = block
17
20
  end
18
21
 
19
22
  def run(reporter, setup_block, teardown_block, dry_run, execution_context)
20
- reporter.spec_started(@name) unless reporter.nil?
23
+ reporter.spec_started(@name) if reporter
21
24
  return reporter.spec_finished(@name) if dry_run
22
- @@current_spec = self
23
- errors = []
24
- begin
25
- execution_context.instance_exec(&setup_block) unless setup_block.nil?
26
- setup_ok = true
27
- execution_context.instance_exec(&@block)
28
- spec_ok = true
29
- rescue => e
30
- errors << e
31
- end
32
25
 
26
+ errors = []
33
27
  begin
34
- execution_context.instance_exec(&teardown_block) unless teardown_block.nil?
35
- teardown_ok = true
36
- rescue => e
37
- errors << e
28
+ set_current
29
+ setup_ok = setup_spec(execution_context, errors, &setup_block)
30
+ spec_ok = execute_spec(execution_context, errors) if setup_ok
31
+ teardown_ok = teardown_spec(execution_context, errors, &teardown_block)
38
32
  ensure
39
- notify_after_teardown errors
40
- @@current_spec = nil
33
+ clear_current
41
34
  end
42
35
 
43
36
  SpecShouldRaiseHandler.new(@from, @options).handle(errors)
44
- reporter.spec_finished(@name, errors.first, failure_location(setup_ok, spec_ok, teardown_ok)) unless reporter.nil?
37
+ reporter.spec_finished(@name, errors.first, failure_location(setup_ok, spec_ok, teardown_ok)) if reporter
45
38
  end
46
39
 
47
40
  def matches_matcher?(matcher)
48
41
  matcher.matches? @name
49
42
  end
50
43
 
51
- def add_listener listener
52
- @listeners << listener
44
+ private
45
+ def setup_spec(execution_context, errors, &setup_block)
46
+ notify_before_setup(errors)
47
+ execution_context.instance_eval(&setup_block) if setup_block
48
+ return errors.empty?
49
+ rescue => e
50
+ errors << e
51
+ return false
53
52
  end
54
53
 
55
- def notify_after_teardown errors
56
- @listeners.each do |listener|
57
- begin
58
- listener.spec_finished(self) if listener.respond_to?(:spec_finished)
59
- rescue => e
60
- errors << e
61
- end
62
- end
54
+ def execute_spec(execution_context, errors)
55
+ execution_context.instance_eval(&command)
56
+ return true
57
+ rescue => e
58
+ errors << e
59
+ return false
60
+ end
61
+
62
+ def teardown_spec(execution_context, errors, &teardown_block)
63
+ execution_context.instance_eval(&teardown_block) if teardown_block
64
+ notify_after_teardown(errors)
65
+ return errors.empty?
66
+ rescue => e
67
+ errors << e
68
+ return false
69
+ end
70
+
71
+ def notify_before_setup(errors)
72
+ self.class.send(:notify_callbacks, :before_setup, self, &append_errors(errors))
73
+ notify_callbacks(:before_setup, self, &append_errors(errors))
74
+ end
75
+
76
+ def notify_after_teardown(errors)
77
+ notify_callbacks(:after_teardown, self, &append_errors(errors))
78
+ self.class.send(:notify_callbacks, :after_teardown, self, &append_errors(errors))
79
+ end
80
+
81
+ def append_errors(errors)
82
+ proc {|error| errors << error}
83
+ end
84
+
85
+ def set_current
86
+ self.class.send(:current=, self)
87
+ end
88
+
89
+ def clear_current
90
+ self.class.send(:current=, nil)
63
91
  end
64
92
 
65
- private
66
93
  def failure_location(setup_ok, spec_ok, teardown_ok)
67
94
  return 'setup' unless setup_ok
68
95
  return @name unless spec_ok
@@ -3,9 +3,9 @@ module Spec
3
3
  unless defined? MAJOR
4
4
  MAJOR = 0
5
5
  MINOR = 7
6
- TINY = 3
7
- # RANDOM_TOKEN: 0.690694587701409
8
- REV = "$LastChangedRevision: 1137 $".match(/LastChangedRevision: (\d+)/)[1]
6
+ TINY = 4
7
+ # RANDOM_TOKEN: 0.644898830762263
8
+ REV = "$LastChangedRevision: 1201 $".match(/LastChangedRevision: (\d+)/)[1]
9
9
 
10
10
  STRING = [MAJOR, MINOR, TINY].join('.')
11
11
  FULL_VERSION = "#{STRING} (r#{REV})"
@@ -22,9 +22,9 @@ and type:
22
22
 
23
23
  ruby find_rspecs_home_page.rb --format specdoc
24
24
 
25
- Or better:
25
+ Or better - if you want to generate a super-hot HTML report with screenshots:
26
26
 
27
- ruby find_rspecs_home_page.rb --format html > find_rspecs_home_page.html
27
+ spec find_rspecs_home_page.rb --require ../web_test_html_formatter.rb --format WebTestHtmlFormatter > report/report.html
28
28
 
29
29
  And upload find_rspecs_home_page.html to your project's web page or intranet.
30
30
  This will give immediate visibility to the intended behaviour of your web app,
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/rspec_watir'
2
+
3
+ context "Google's search page" do
4
+
5
+ setup do
6
+ @browser.goto('http://www.google.com')
7
+ end
8
+
9
+ specify "should find rspec's home page when I search for rspec" do
10
+ @browser.text_field(:name, "q").set("rspec")
11
+ @browser.button(:name, "btnG").click
12
+ @browser.contains_text("rspec.rubyforge.org").should_not_be nil # should_contain_text is RSpec sugar
13
+ end
14
+
15
+ specify "should find rspec's home page when I search for 'better than fudge' (will probably fail)" do
16
+ @browser.text_field(:name, "q").set("better than fudge")
17
+ @browser.button(:name, "btnG").click
18
+ @browser.contains_text("rspec.rubyforge.org").should_not_be nil
19
+ end
20
+
21
+ specify "should not find Ali G when I search for respec" do
22
+ @browser.text_field(:name, "q").set("respec")
23
+ @browser.button(:name, "btnG").click
24
+ @browser.contains_text("Ali G").should_be nil
25
+ end
26
+
27
+ end
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'spec'
3
- require 'watir'
3
+ require 'fileutils'
4
+ require File.dirname(__FILE__) + '/../web_test_html_formatter_helper'
4
5
 
5
6
  # Comment out to enable ActiveRecord fixtures
6
7
  #require 'active_record'
@@ -11,13 +12,22 @@ require 'watir'
11
12
  #ActiveRecord::Base.establish_connection(config['db'])
12
13
 
13
14
  class RSpecWatir
15
+ include WebTestHtmlFormatterHelper
16
+
17
+ @@img_dir = File.dirname(__FILE__) + '/report/images'
18
+ FileUtils.mkdir_p(@@img_dir) unless File.exist?(@@img_dir)
19
+ @@n = 1
20
+
14
21
  def setup
15
22
  #Fixtures.create_fixtures($fixture_path, @@fixtures)
16
- @browser = Watir::IE.new
23
+ @browser = Watir::Browser.new
17
24
  end
18
25
 
19
26
  def teardown
20
- @browser.close
27
+ save_screenshots(@@img_dir, @@n)
28
+ save_source(@@img_dir, @@n, @browser.html)
29
+ @@n += 1
30
+ @browser.close unless RUBY_PLATFORM =~ /darwin/
21
31
  end
22
32
 
23
33
  #def self.fixtures(*testdata)
@@ -34,12 +44,3 @@ module Spec
34
44
  end
35
45
  end
36
46
  end
37
-
38
- # Extensions to Watir to make it play nicer with RSpec
39
- module Watir
40
- class IE
41
- # @browser.should_contain("bla bla")
42
- # @browser.should_not_contain("bla bla")
43
- alias_method :contain?, :contains_text
44
- end
45
- end
@@ -0,0 +1,8 @@
1
+ # Customizes the HTML report to include screenshots and browser source, which
2
+ # are saved in teardown defined in rspec_watir.rb
3
+ class WebTestHtmlFormatter < Spec::Runner::Formatter::HtmlFormatter
4
+ def extra_failure_content
5
+ @output.puts " <div><a href=\"images/#{@current_count}.png\"><img src=\"images/#{@current_count}_thumb.png\"></a></div>"
6
+ @output.puts " <div><a href=\"images/#{@current_count}.html\">HTML source</a></div>"
7
+ end
8
+ end
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'RMagick'
3
+
4
+ # include this module in your spec and call +save_screenshot+ and +save_source+ from
5
+ # teardown.
6
+ module WebTestHtmlFormatterHelper
7
+ if RUBY_PLATFORM =~ /darwin/
8
+ require File.dirname(__FILE__) + '/web_test_html_formatter_osx_helper'
9
+ include WebTestHtmlFormatterOsxHelper
10
+ Watir::Browser = Watir::Safari
11
+ else
12
+ require File.dirname(__FILE__) + '/web_test_html_formatter_win_helper'
13
+ include WebTestHtmlFormatterWinHelper
14
+ Watir::Browser = Watir::IE
15
+ end
16
+
17
+ def save_thumb(img, dir, spec_number)
18
+ thumb = img.scale(0.25)
19
+ thumb_file = "#{dir}/#{spec_number}_thumb.png"
20
+ thumb.write(thumb_file)
21
+ end
22
+
23
+ def save_source(dir, spec_number, html)
24
+ File.open("#{dir}/#{spec_number}.html", "w") {|io| io.write(html)}
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'safariwatir'
3
+
4
+ module WebTestHtmlFormatterOsxHelper
5
+ def save_screenshots(dir, spec_number)
6
+ img_path = "#{dir}/#{spec_number}.png"
7
+ # How do we capture the current window??
8
+ `screencapture #{img_path}`
9
+
10
+ img = Magick::Image.read(img_path)[0]
11
+ save_thumb(img, dir, spec_number)
12
+ end
13
+ end
14
+
15
+ class Watir::AppleScripter
16
+ def document_html
17
+ execute(%|document.documentElement.innerHTML;|)
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'win32screenshot'
3
+ require 'watir'
4
+
5
+ module WebTestHtmlFormatterWinHelper
6
+ def save_screenshots(dir, spec_number)
7
+ width, height, bmp = Win32::Screenshot.foreground
8
+
9
+ img = Magick::Image.from_blob(bmp)[0]
10
+ img_path = "#{dir}/#{spec_number}.png"
11
+ img.write(img_path)
12
+ save_thumb(img, dir, spec_number)
13
+ end
14
+ end
metadata CHANGED
@@ -3,9 +3,9 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: rspec
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.7.3
7
- date: 2006-11-25 00:00:00 +00:00
8
- summary: RSpec-0.7.3 (r1137) - BDD for Ruby http://rspec.rubyforge.org/
6
+ version: 0.7.4
7
+ date: 2006-12-02 00:00:00 +01:00
8
+ summary: RSpec-0.7.4 (r1201) - BDD for Ruby http://rspec.rubyforge.org/
9
9
  require_paths:
10
10
  - lib
11
11
  email: rspec-devel@rubyforge.org
@@ -39,20 +39,22 @@ files:
39
39
  - Rakefile
40
40
  - README
41
41
  - lib/spec.rb
42
+ - lib/spec/callback.rb
42
43
  - lib/spec/expectations.rb
43
44
  - lib/spec/mocks.rb
44
45
  - lib/spec/runner.rb
45
46
  - lib/spec/version.rb
47
+ - lib/spec/callback/callback_container.rb
48
+ - lib/spec/callback/extensions/module.rb
49
+ - lib/spec/callback/extensions/object.rb
46
50
  - lib/spec/expectations/diff.rb
47
51
  - lib/spec/expectations/errors.rb
48
52
  - lib/spec/expectations/extensions.rb
49
53
  - lib/spec/expectations/should.rb
50
54
  - lib/spec/expectations/sugar.rb
51
55
  - lib/spec/expectations/differs/default.rb
52
- - lib/spec/expectations/extensions/inspect_for_expectation_not_met_error.rb
53
56
  - lib/spec/expectations/extensions/numeric.rb
54
57
  - lib/spec/expectations/extensions/object.rb
55
- - lib/spec/expectations/extensions/symbol.rb
56
58
  - lib/spec/expectations/should/base.rb
57
59
  - lib/spec/expectations/should/change.rb
58
60
  - lib/spec/expectations/should/have.rb
@@ -84,7 +86,6 @@ files:
84
86
  - lib/spec/runner/spec_should_raise_handler.rb
85
87
  - lib/spec/runner/specification.rb
86
88
  - lib/spec/runner/extensions/kernel.rb
87
- - lib/spec/runner/extensions/object.rb
88
89
  - lib/spec/runner/formatter/base_text_formatter.rb
89
90
  - lib/spec/runner/formatter/html_formatter.rb
90
91
  - lib/spec/runner/formatter/progress_bar_formatter.rb
@@ -103,14 +104,18 @@ files:
103
104
  - examples/stack_spec.rb
104
105
  - examples/stubbing_example.rb
105
106
  - examples/test_case_spec.rb
106
- - vendor/watir/find_rspecs_home_page.rb
107
- - vendor/watir/rspec_watir.rb
108
- - vendor/watir/find_rspecs_home_page.txt
109
- - vendor/watir/README.txt
110
- - vendor/selenium/find_rspecs_home_page.rb
111
- - vendor/selenium/rspec_selenium.rb
112
- - vendor/selenium/start_browser_once.patch
113
- - vendor/selenium/README.txt
107
+ - vendor/web_spec/web_test_html_formatter.rb
108
+ - vendor/web_spec/web_test_html_formatter_helper.rb
109
+ - vendor/web_spec/web_test_html_formatter_osx_helper.rb
110
+ - vendor/web_spec/web_test_html_formatter_win_helper.rb
111
+ - vendor/web_spec/selenium/find_rspecs_home_page.rb
112
+ - vendor/web_spec/selenium/rspec_selenium.rb
113
+ - vendor/web_spec/watir/find_rspecs_home_page.rb
114
+ - vendor/web_spec/watir/rspec_watir.rb
115
+ - vendor/web_spec/selenium/README.txt
116
+ - vendor/web_spec/watir/find_rspecs_home_page.txt
117
+ - vendor/web_spec/watir/README.txt
118
+ - vendor/web_spec/selenium/start_browser_once.patch
114
119
  test_files: []
115
120
 
116
121
  rdoc_options:
@@ -1,15 +0,0 @@
1
- class Object
2
- def inspect_for_expectation_not_met_error
3
- return "#{inspect}" if inspect.include? "<"
4
- return "<#{inspect}>" unless inspect.include? "<"
5
- end
6
- end
7
- class TrueClass; def inspect_for_expectation_not_met_error; "true" end end
8
- class FalseClass; def inspect_for_expectation_not_met_error; "false" end end
9
- class NilClass; def inspect_for_expectation_not_met_error; "nil" end end
10
- class Class; def inspect_for_expectation_not_met_error; "<#{name}>" end end
11
- class Proc; def inspect_for_expectation_not_met_error; "<Proc>" end end
12
- class Array; def inspect_for_expectation_not_met_error; inspect end end
13
- class String; def inspect_for_expectation_not_met_error; inspect end end
14
- class Numeric; def inspect_for_expectation_not_met_error; inspect end end
15
- class Hash; def inspect_for_expectation_not_met_error; inspect end end
@@ -1,5 +0,0 @@
1
- class Symbol
2
- def supported_by_rspec?
3
- return ["<","<=",">=",">","==","=~"].include?(to_s)
4
- end
5
- end
@@ -1,21 +0,0 @@
1
- # http://eigenclass.org/hiki.rb?bounded+space+instance_exec
2
- class Object
3
- module InstanceExecHelper; end
4
- include InstanceExecHelper
5
- def instance_exec(*args, &block)
6
- begin
7
- old_critical, Thread.critical = Thread.critical, true
8
- n = 0
9
- n += 1 while respond_to?(mname="__instance_exec#{n}")
10
- InstanceExecHelper.module_eval{ define_method(mname, &block) }
11
- ensure
12
- Thread.critical = old_critical
13
- end
14
- begin
15
- ret = send(mname, *args)
16
- ensure
17
- InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
18
- end
19
- ret
20
- end
21
- end