rspec 0.7.1 → 0.7.2

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.
data/CHANGES CHANGED
@@ -1,5 +1,17 @@
1
1
  = RSpec Changelog
2
2
 
3
+ == Version 0.7.2 (in SVN)
4
+
5
+ This release introduces a brand new RSpec bundle for TextMate, plus some small bugfixes.
6
+
7
+ * Packaged RSpec.tmbundle.tgz as part of the distro
8
+ * Fixed [#6593] Add moving progress bar to HtmlFormatter using Javascript
9
+ * Applied [#6265] should_raise should accept an Exception object
10
+ * Fixed [#6616] Can't run Rails specs with RSpec.tmbundle
11
+ * Fixed [#6411] Can't run Rails specs with ruby
12
+ * Added [#6589] New -l --line option. This is useful for IDE/editor runners/extensions.
13
+ * Fixed [#6615] controller.should_render_rjs should support :partial => 'path/to/template'
14
+
3
15
  == Version 0.7.1
4
16
 
5
17
  Bug fixes and a couple o' new features.
data/Rakefile CHANGED
@@ -32,7 +32,7 @@ task :default => [:spec, :verify_rcov]
32
32
 
33
33
  desc "Run all specs"
34
34
  Spec::Rake::SpecTask.new do |t|
35
- t.spec_files = FileList['spec/**/*_spec.rb']
35
+ t.spec_files = FileList['spec/**/*_spec.rb', 'vendor/RSpec.tmbundle/Support/spec/*_spec.rb']
36
36
  t.spec_opts = ['--diff','--color','--backtrace']
37
37
  t.rcov = true
38
38
  t.rcov_dir = 'doc/output/coverage'
@@ -224,6 +224,16 @@ task :publish_website => [:verify_user, :website] do
224
224
  publisher.upload
225
225
  end
226
226
 
227
+ desc "Package the RSpec.tmbundle"
228
+ task :package_tmbundle => :pkg do
229
+ rm_rf 'pkg/RSpec.tmbundle'
230
+ `svn export vendor/RSpec.tmbundle pkg/RSpec.tmbundle`
231
+ Dir.chdir 'pkg' do
232
+ `tar cvzf RSpec-#{PKG_VERSION}.tmbundle.tgz RSpec.tmbundle`
233
+ end
234
+ end
235
+ task :package => :package_tmbundle
236
+
227
237
  desc "Publish gem+tgz+zip on RubyForge. You must make sure lib/version.rb is aligned with the CHANGELOG file"
228
238
  task :publish_packages => [:verify_user, :verify_password, :package] do
229
239
  require 'meta_project'
@@ -231,7 +241,8 @@ task :publish_packages => [:verify_user, :verify_password, :package] do
231
241
  release_files = FileList[
232
242
  "pkg/#{PKG_FILE_NAME}.gem",
233
243
  "pkg/#{PKG_FILE_NAME}.tgz",
234
- "pkg/#{PKG_FILE_NAME}.zip"
244
+ "pkg/#{PKG_FILE_NAME}.zip",
245
+ "pkg/RSpec-#{PKG_VERSION}.tmbundle.tgz"
235
246
  ]
236
247
 
237
248
  Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |xf|
@@ -1,22 +1,11 @@
1
- require 'spec/runner/formatter/base_text_formatter'
1
+ require 'spec/runner/formatter/progress_bar_formatter'
2
2
 
3
- # Example of a custom formatter. Run me with:
4
- # bin/spec examples -r examples/custom_formatter.rb -f CustomFormatter
5
- # bin/spec failing_examples -r examples/custom_formatter.rb -f CustomFormatter
6
- class CustomFormatter < Spec::Runner::Formatter::BaseTextFormatter
7
- def add_context(name, first)
8
- @output.print "\n" if first
9
- end
10
-
11
- def spec_failed(name, counter, failure)
12
- @output.print 'X'
13
- end
14
-
15
- def spec_passed(name)
16
- @output.print '_'
17
- end
18
-
19
- def start_dump
20
- @output.print "\n"
3
+ # Example of a formatter with custom bactrace printing. Run me with:
4
+ # ruby bin/spec failing_examples -r examples/custom_formatter.rb -f CustomFormatter
5
+ class CustomFormatter < Spec::Runner::Formatter::ProgressBarFormatter
6
+ def backtrace_line(line)
7
+ line.gsub(/([^:]*\.rb):(\d*)/) do
8
+ "<a href=\"file://#{File.expand_path($1)}\">#{$1}:#{$2}</a> "
9
+ end
21
10
  end
22
11
  end
@@ -25,4 +25,3 @@ context "a mock" do
25
25
  mock.msg(:arg1).should_eql(:val1)
26
26
  end
27
27
  end
28
-
@@ -49,7 +49,12 @@ module Spec
49
49
  @order_group.handle_order_constraint self
50
50
 
51
51
  begin
52
- Kernel::raise @exception_to_raise.new unless @exception_to_raise.nil?
52
+ if @exception_to_raise.class == Class
53
+ @exception_instance_to_raise = @exception_to_raise.new
54
+ else
55
+ @exception_instance_to_raise = @exception_to_raise
56
+ end
57
+ Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
53
58
  Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
54
59
 
55
60
  if !@method_block.nil?
@@ -12,3 +12,4 @@ require 'spec/runner/spec_matcher'
12
12
  require 'spec/runner/extensions/kernel'
13
13
  require 'spec/runner/extensions/object'
14
14
  require 'spec/runner/spec_should_raise_handler'
15
+ require 'spec/runner/spec_parser'
@@ -7,9 +7,9 @@ module Spec
7
7
  # not a system exit should be called after the specs are run and
8
8
  # +warn_if_no_files+ tells whether or not a warning (the help message)
9
9
  # should be printed to +stderr+ in case no files are specified.
10
- def self.run(argv, stderr, stdout, exit, warn_if_no_files)
10
+ def self.run(argv, stderr, stdout, exit=false, warn_if_no_files=true)
11
11
  old_context_runner = defined?($context_runner) ? $context_runner : nil
12
- $context_runner = OptionParser.create_context_runner(argv, stderr, stdout, warn_if_no_files)
12
+ $context_runner = OptionParser.new.create_context_runner(argv, stderr, stdout, warn_if_no_files)
13
13
 
14
14
  # If ARGV is a glob, it will actually each over each one of the matching files.
15
15
  argv.each do |file_or_dir|
@@ -7,7 +7,7 @@ module Kernel
7
7
  private
8
8
 
9
9
  def context_runner
10
- if $context_runner.nil?; $context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV.dup, STDERR, STDOUT, false); at_exit { $context_runner.run(false) }; end
10
+ if $context_runner.nil?; $context_runner = ::Spec::Runner::OptionParser.new.create_context_runner(ARGV.dup, STDERR, STDOUT, false); at_exit { $context_runner.run(false) }; end
11
11
  $context_runner
12
12
  end
13
13
  end
@@ -66,7 +66,7 @@ module Spec
66
66
  @output.puts magenta(failure.header)
67
67
  @output.puts magenta(failure.exception.message)
68
68
  end
69
- @output.puts failure.exception.backtrace.join("\n")
69
+ @output.puts format_backtrace(failure.exception.backtrace)
70
70
  STDOUT.flush
71
71
  end
72
72
 
@@ -84,8 +84,17 @@ module Spec
84
84
  end
85
85
  end
86
86
 
87
+ def format_backtrace(backtrace)
88
+ return "" if backtrace.nil?
89
+ backtrace.map { |line| backtrace_line(line) }.join("\n")
90
+ end
91
+
87
92
  protected
88
93
 
94
+ def backtrace_line(line)
95
+ line
96
+ end
97
+
89
98
  def colour(text, colour_code)
90
99
  return text unless @colour && @output == Kernel
91
100
  "#{colour_code}#{text}\e[0m"
@@ -95,10 +104,6 @@ module Spec
95
104
  def green(text); colour(text, "\e[32m"); end
96
105
  def magenta(text); colour(text, "\e[35m"); end
97
106
 
98
- def format_backtrace(backtrace)
99
- backtrace.nil? ? "" : backtrace.join("\n")
100
- end
101
-
102
107
  end
103
108
  end
104
109
  end
@@ -5,6 +5,7 @@ module Spec
5
5
  def initialize(output, dry_run=false, colour=false)
6
6
  super
7
7
  @current_count = 0
8
+ @spec_count = 0
8
9
  end
9
10
 
10
11
  def start(spec_count)
@@ -22,6 +23,7 @@ module Spec
22
23
  @output.puts "<div class=\"context\">"
23
24
  @output.puts " <ul>"
24
25
  @output.puts " <li class=\"context_name\">#{name}</li>"
26
+ STDOUT.flush
25
27
  end
26
28
 
27
29
  def start_dump
@@ -33,13 +35,18 @@ module Spec
33
35
  def spec_started(name)
34
36
  @current_spec = name
35
37
  @current_count += 1
38
+ STDOUT.flush
36
39
  end
37
40
 
38
41
  def spec_passed(name)
42
+ move_progress
39
43
  @output.puts " <li class=\"spec passed\"><div class=\"passed_spec_name\">#{escape(@current_spec)}</div></li>"
44
+ STDOUT.flush
40
45
  end
41
46
 
42
47
  def spec_failed(name, counter, failure)
48
+ @output.puts " <script type=\"text/javascript\">makeProgressbarRed();</script>"
49
+ move_progress
43
50
  @output.puts " <li class=\"spec failed\">"
44
51
  @output.puts " <div class=\"failed_spec_name\">#{escape(@current_spec)}</div>"
45
52
  @output.puts " <div class=\"failure\" id=\"failure_#{counter}\">"
@@ -50,6 +57,11 @@ module Spec
50
57
  STDOUT.flush
51
58
  end
52
59
 
60
+ def move_progress
61
+ percent_done = @spec_count == 0 ? 100.0 : (@current_count.to_f / @spec_count.to_f * 1000).to_i / 10.0
62
+ @output.puts " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
63
+ end
64
+
53
65
  def escape(string)
54
66
  string.gsub(/&/n, '&amp;').gsub(/\"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;')
55
67
  end
@@ -63,6 +75,9 @@ module Spec
63
75
  STDOUT.flush
64
76
  end
65
77
 
78
+ RED_BACKGROUND = '#CD0000'
79
+ GREEN_BACKGROUND = '#659D32'
80
+
66
81
  HEADER = <<-HEADER
67
82
  <?xml version="1.0" encoding="iso-8859-1"?>
68
83
  <!DOCTYPE html
@@ -74,6 +89,14 @@ module Spec
74
89
  <title>RSpec results</title>
75
90
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
76
91
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
92
+ <script type="text/javascript">
93
+ function moveProgressBar(percentDone) {
94
+ document.getElementById("progress-bar").style.width = percentDone +"%";
95
+ }
96
+ function makeProgressbarRed() {
97
+ document.getElementById('progress-bar').style.background = '#{RED_BACKGROUND}';
98
+ }
99
+ </script>
77
100
  <style type="text/css">
78
101
  body {
79
102
  font-size: 9pt;
@@ -81,6 +104,17 @@ module Spec
81
104
  width: 85%;
82
105
  }
83
106
 
107
+ #progress-bar-bg {
108
+ background-color: #C9C9C9;
109
+ border-bottom: 1px solid gray;
110
+ border-right: 1px solid gray;
111
+ }
112
+
113
+ #progress-bar {
114
+ background-color: #{GREEN_BACKGROUND};
115
+ width: 0px;
116
+ }
117
+
84
118
  div.context {
85
119
  padding: 0px;
86
120
  background: #fff;
@@ -132,12 +166,21 @@ module Spec
132
166
  }
133
167
 
134
168
  div.backtrace {
135
- color: #000;
169
+ color: #fff;
170
+ }
171
+
172
+ div.backtrace a {
173
+ color: #fff;
136
174
  }
137
175
 
138
176
  </style>
139
177
  </head>
140
178
  <body>
179
+
180
+ <div id="progress-bar-bg">
181
+ <div id="progress-bar">&nbsp;</div>
182
+ </div>
183
+
141
184
  HEADER
142
185
  end
143
186
  end
@@ -4,8 +4,12 @@ require 'optparse'
4
4
  module Spec
5
5
  module Runner
6
6
  class OptionParser
7
+ def initialize
8
+ @spec_parser = SpecParser.new
9
+ @file_factory = File
10
+ end
7
11
 
8
- def self.create_context_runner(args, err, out, warn_if_no_files)
12
+ def create_context_runner(args, err, out, warn_if_no_files)
9
13
  options = parse(args, err, out, warn_if_no_files)
10
14
 
11
15
  formatter = options.formatter_type.new(options.out, options.dry_run, options.colour)
@@ -20,7 +24,7 @@ module Spec
20
24
  ContextRunner.new(reporter, options.dry_run, options.spec_name)
21
25
  end
22
26
 
23
- def self.parse(args, err, out, warn_if_no_files)
27
+ def parse(args, err, out, warn_if_no_files)
24
28
  options = OpenStruct.new
25
29
  options.out = out == STDOUT ? Kernel : out
26
30
  options.formatter_type = Formatter::ProgressBarFormatter
@@ -67,10 +71,14 @@ module Spec
67
71
  options.colour = true
68
72
  end
69
73
 
70
- opts.on("-s", "--spec SPECIFICATION_NAME", "Execute a single specification") do |spec_name|
74
+ opts.on("-s", "--spec SPECIFICATION_NAME", "Execute context or specification with matching name") do |spec_name|
71
75
  options.spec_name = spec_name
72
76
  end
73
77
 
78
+ opts.on("-l", "--line LINE_NUMBER", Integer, "Execute context or specification at given line") do |line_number|
79
+ options.line_number = line_number.to_i
80
+ end
81
+
74
82
  opts.on("-f", "--format FORMAT", "Builtin formats: specdoc|s|rdoc|r|html|h",
75
83
  "You can also specify a custom formatter class",
76
84
  "(in which case you should also specify --require)") do |format|
@@ -122,11 +130,38 @@ module Spec
122
130
 
123
131
  if args.empty? && warn_if_no_files
124
132
  err.puts opts
125
- exit if err == $stderr
133
+ exit(1) if err == $stderr
134
+ end
135
+
136
+ if options.line_number
137
+ set_spec_from_line_number(options, args, err)
126
138
  end
127
139
 
128
140
  options
129
141
  end
142
+
143
+ def set_spec_from_line_number(options, args, err)
144
+ unless options.spec_name
145
+ if args.length == 1
146
+ if @file_factory.file?(args[0])
147
+ source = @file_factory.open(args[0])
148
+ options.spec_name = @spec_parser.spec_name_for(source, options.line_number)
149
+ elsif @file_factory.directory?(args[0])
150
+ err.puts "You must specify one file, not a directory when using the --line option"
151
+ exit(1) if err == $stderr
152
+ else
153
+ err.puts "#{args[0]} does not exist"
154
+ exit(1) if err == $stderr
155
+ end
156
+ else
157
+ err.puts "Only one file can be specified when using the --line option"
158
+ exit(1) if err == $stderr
159
+ end
160
+ else
161
+ err.puts "You cannot use both --line and --spec"
162
+ exit(1) if err == $stderr
163
+ end
164
+ end
130
165
  end
131
166
  end
132
167
  end
@@ -0,0 +1,40 @@
1
+ module Spec
2
+ module Runner
3
+ class SpecParser
4
+ def spec_name_for(io, line_number)
5
+ source = io.read
6
+ context = context_at_line(source, line_number)
7
+ spec = spec_at_line(source, line_number)
8
+ if context && spec
9
+ "#{context} #{spec}"
10
+ elsif context
11
+ context
12
+ else
13
+ nil
14
+ end
15
+ end
16
+
17
+ protected
18
+
19
+ def context_at_line(source, line_number)
20
+ find_above(source, line_number, /^\s*context\s+['|"](.*)['|"]/)
21
+ end
22
+
23
+ def spec_at_line(source, line_number)
24
+ find_above(source, line_number, /^\s*specify\s+['|"](.*)['|"]/)
25
+ end
26
+
27
+ def find_above(source, line_number, pattern)
28
+ lines_above_reversed(source, line_number).each do |line|
29
+ return $1 if line =~ pattern
30
+ end
31
+ nil
32
+ end
33
+
34
+ def lines_above_reversed(source, line_number)
35
+ lines = source.split("\n")
36
+ lines[0...line_number].reverse
37
+ end
38
+ end
39
+ end
40
+ end
@@ -3,9 +3,9 @@ module Spec
3
3
  unless defined? MAJOR
4
4
  MAJOR = 0
5
5
  MINOR = 7
6
- TINY = 1
7
- # RANDOM_TOKEN: 0.75692472177863
8
- REV = "$LastChangedRevision: 1080 $".match(/LastChangedRevision: (\d+)/)[1]
6
+ TINY = 2
7
+ # RANDOM_TOKEN: 0.868668446220024
8
+ REV = "$LastChangedRevision: 1095 $".match(/LastChangedRevision: (\d+)/)[1]
9
9
 
10
10
  STRING = [MAJOR, MINOR, TINY].join('.')
11
11
  FULL_VERSION = "#{STRING} (r#{REV})"
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.1
7
- date: 2006-11-10 00:00:00 -06:00
8
- summary: RSpec-0.7.1 (r1080) - BDD for Ruby http://rspec.rubyforge.org/
6
+ version: 0.7.2
7
+ date: 2006-11-12 00:00:00 +01:00
8
+ summary: RSpec-0.7.2 (r1095) - BDD for Ruby http://rspec.rubyforge.org/
9
9
  require_paths:
10
10
  - lib
11
11
  email: rspec-devel@rubyforge.org
@@ -78,6 +78,7 @@ files:
78
78
  - lib/spec/runner/option_parser.rb
79
79
  - lib/spec/runner/reporter.rb
80
80
  - lib/spec/runner/spec_matcher.rb
81
+ - lib/spec/runner/spec_parser.rb
81
82
  - lib/spec/runner/spec_should_raise_handler.rb
82
83
  - lib/spec/runner/specification.rb
83
84
  - lib/spec/runner/extensions/kernel.rb