rspec 0.5.11 → 0.5.12
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 +12 -0
- data/README +4 -2
- data/Rakefile +14 -4
- data/bin/spec +7 -7
- data/bin/test2spec +13 -8
- data/lib/spec/api/helper/diff.rb +53 -0
- data/lib/spec/api/helper/instance_helper.rb +11 -11
- data/lib/spec/api/helper/instance_negator.rb +11 -11
- data/lib/spec/api/helper/kind_helper.rb +11 -11
- data/lib/spec/api/helper/kind_negator.rb +11 -11
- data/lib/spec/api/helper/respond_helper.rb +11 -11
- data/lib/spec/api/helper/respond_negator.rb +11 -11
- data/lib/spec/api/helper/should_base.rb +6 -6
- data/lib/spec/api/helper/should_helper.rb +35 -35
- data/lib/spec/api/helper/should_negator.rb +20 -20
- data/lib/spec/rake/spectask.rb +15 -6
- data/lib/spec/runner.rb +1 -0
- data/lib/spec/runner/backtrace_tweaker.rb +2 -0
- data/lib/spec/runner/base_text_formatter.rb +3 -1
- data/lib/spec/runner/html_formatter.rb +153 -0
- data/lib/spec/runner/option_parser.rb +9 -2
- data/lib/spec/runner/progress_bar_formatter.rb +4 -0
- data/lib/spec/runner/rdoc_formatter.rb +3 -0
- data/lib/spec/runner/reporter.rb +5 -5
- data/lib/spec/runner/specdoc_formatter.rb +3 -0
- data/lib/spec/test_to_spec/sexp_transformer.rb +1 -0
- data/lib/spec/test_to_spec/translation_test_runner.rb +10 -2
- data/lib/spec/version.rb +1 -1
- data/test/spec/api/helper/arbitrary_predicate_test.rb +49 -73
- data/test/spec/api/helper/diff_test.rb +60 -0
- data/test/spec/api/helper/equality_test.rb +14 -0
- data/test/spec/api/helper/should_have_test.rb +0 -29
- data/test/spec/api/helper/typing_test.rb +87 -87
- data/test/spec/api/sugar_test.rb +0 -6
- data/test/spec/runner/backtrace_tweaker_test.rb +8 -2
- data/test/spec/runner/html_formatter_test.rb +47 -0
- data/test/spec/runner/option_parser_test.rb +0 -5
- data/test/test_classes.rb +73 -0
- data/test/test_helper.rb +3 -0
- metadata +8 -49
- data/doc/README +0 -3
- data/doc/config.yaml +0 -2
- data/doc/plugin/syntax.rb +0 -60
- data/doc/plugin/version.rb +0 -19
- data/doc/src/core_team.page +0 -31
- data/doc/src/default.css +0 -199
- data/doc/src/default.template +0 -31
- data/doc/src/documentation/index.page +0 -188
- data/doc/src/documentation/meta.info +0 -22
- data/doc/src/documentation/mocks.page +0 -287
- data/doc/src/documentation/underscores.page +0 -21
- data/doc/src/examples.page +0 -9
- data/doc/src/images/David_and_Aslak.jpg +0 -0
- data/doc/src/images/Whats_That_Dude.jpg +0 -0
- data/doc/src/images/ducks1.png +0 -0
- data/doc/src/images/ul.gif +0 -0
- data/doc/src/index.page +0 -74
- data/doc/src/meta.info +0 -33
- data/doc/src/tools/index.page +0 -49
- data/doc/src/tools/meta.info +0 -18
- data/doc/src/tools/rails.page +0 -132
- data/doc/src/tools/rake.page +0 -21
- data/doc/src/tools/rcov.page +0 -28
- data/doc/src/tools/spec.page +0 -129
- data/doc/src/tools/test2spec.page +0 -103
- data/doc/src/tutorials/index.page +0 -52
- data/doc/src/tutorials/meta.info +0 -36
- data/doc/src/tutorials/notes.txt +0 -263
- data/doc/src/tutorials/stack.rb +0 -11
- data/doc/src/tutorials/stack_01.page +0 -226
- data/doc/src/tutorials/stack_02.page +0 -182
- data/doc/src/tutorials/stack_03.page +0 -283
- data/doc/src/tutorials/stack_04.page +0 -164
- data/doc/src/tutorials/stack_04.page.orig +0 -123
- data/doc/src/tutorials/stack_05.page +0 -90
- data/doc/src/tutorials/stack_05.page.orig +0 -124
- data/doc/src/tutorials/stack_06.page +0 -359
- data/doc/src/tutorials/stack_06.page.orig +0 -359
- data/doc/src/tutorials/stack_spec.rb +0 -25
- data/doc/src/ul.gif +0 -0
data/CHANGES
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
= RSpec Changelog
|
2
2
|
|
3
|
+
== Version 0.5.12
|
4
|
+
This release adds diff support for failure messages, a HTML formatter plus some other
|
5
|
+
minor enhancements.
|
6
|
+
|
7
|
+
* Added HTML formatter.
|
8
|
+
* Added fail_on_error option to spectask.
|
9
|
+
* Added support for diffing, using the lcs-diff Rubygem (#2648).
|
10
|
+
* Remove RSpec on Rails files from backtrace (#4694).
|
11
|
+
* All of RSpec's own tests run successfully after translation with test2spec.
|
12
|
+
* Added --verbose mode for test2spec - useful for debugging when classes fail to translate.
|
13
|
+
* Output of various formatters is now flushed - to get more continuous output.
|
14
|
+
|
3
15
|
== Version 0.5.11
|
4
16
|
This release makes test2spec usable with Rails (with some manual steps).
|
5
17
|
See http://rspec.rubyforge.org/tools/rails.html for more details
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
In order to run RSpec's tests and generate the website, you must have RubyGems.
|
1
|
+
In order to run RSpec's tests and generate the gem and the website, you must have RubyGems.
|
2
2
|
Then you must install the following gems:
|
3
3
|
|
4
4
|
* rake
|
@@ -8,11 +8,13 @@ Then you must install the following gems:
|
|
8
8
|
* webgen
|
9
9
|
* RedCloth
|
10
10
|
* syntax
|
11
|
+
* lcs-diff
|
11
12
|
|
12
13
|
Note that RSpec itself - once built - doesn't have any dependencies outside the Ruby core
|
13
14
|
and stdlib - with a few exceptions:
|
14
15
|
|
15
|
-
* The
|
16
|
+
* The spec command line uses lcs-diff when --diff is specified.
|
17
|
+
* The test2spec command line uses ParseTree and RubyInline.
|
16
18
|
* The Spec::Rake::SpecTask needs RCov if RCov is enabled in the task.
|
17
19
|
|
18
20
|
See http://rspec.rubyforge.org for further documentation.
|
data/Rakefile
CHANGED
@@ -12,6 +12,7 @@ require 'rcov/rcovtask'
|
|
12
12
|
load File.dirname(__FILE__) + '/test/tasks/examples.rake'
|
13
13
|
load File.dirname(__FILE__) + '/test/tasks/examples_specdoc.rake'
|
14
14
|
load File.dirname(__FILE__) + '/test/tasks/examples_with_rcov.rake'
|
15
|
+
load File.dirname(__FILE__) + '/test/tasks/failing_examples_with_html.rake'
|
15
16
|
load File.dirname(__FILE__) + '/test/tasks/rcov_verify.rake'
|
16
17
|
|
17
18
|
PKG_NAME = "rspec"
|
@@ -21,8 +22,7 @@ PKG_FILES = FileList[
|
|
21
22
|
'[A-Z]*',
|
22
23
|
'lib/**/*.rb',
|
23
24
|
'test/**/*.rb',
|
24
|
-
'examples
|
25
|
-
'doc/**/*'
|
25
|
+
'examples/**/*'
|
26
26
|
]
|
27
27
|
|
28
28
|
task :default => :test
|
@@ -45,7 +45,17 @@ end
|
|
45
45
|
|
46
46
|
desc 'Translate our own tests to specs'
|
47
47
|
task :test2spec do
|
48
|
+
rm_rf 'spec/translated'
|
48
49
|
`bin/test2spec --force --template spec/test2spec.erb --specdir spec/translated test`
|
50
|
+
# Remove the spec translations that we don't care about.
|
51
|
+
rm 'spec/translated/spec/test_to_spec/sexp_transformer_assertion_spec.rb'
|
52
|
+
rm 'spec/translated/spec/test_to_spec/sexp_transformer_spec.rb'
|
53
|
+
end
|
54
|
+
|
55
|
+
desc 'Runs all RSpec specs - translated with test2spec from our own tests'
|
56
|
+
Spec::Rake::SpecTask.new('test2spec_test' => :test2spec) do |t|
|
57
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
58
|
+
t.options = ['--diff']
|
49
59
|
end
|
50
60
|
|
51
61
|
desc 'Generate HTML documentation'
|
@@ -126,7 +136,7 @@ task :clobber do
|
|
126
136
|
rm_rf 'spec/translated'
|
127
137
|
end
|
128
138
|
|
129
|
-
task :release => [:clobber, :verify_committed, :verify_user, :verify_password, :test, :publish_packages, :tag, :publish_website, :publish_news]
|
139
|
+
task :release => [:clobber, :test2spec_test, :verify_committed, :verify_user, :verify_password, :test, :publish_packages, :tag, :publish_website, :publish_news]
|
130
140
|
|
131
141
|
desc "Verifies that there is no uncommitted code"
|
132
142
|
task :verify_committed do
|
@@ -145,7 +155,7 @@ task :tag do
|
|
145
155
|
end
|
146
156
|
|
147
157
|
desc "Build the website with rdoc and rcov, but do not publish it"
|
148
|
-
task :website => [:clobber, :rcov_verify, :webgen, :examples_specdoc, :rdoc]
|
158
|
+
task :website => [:clobber, :rcov_verify, :webgen, :failing_examples_with_html, :examples_specdoc, :rdoc]
|
149
159
|
|
150
160
|
task :verify_user do
|
151
161
|
raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
|
data/bin/spec
CHANGED
@@ -5,13 +5,13 @@ $context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV, false
|
|
5
5
|
|
6
6
|
# If ARGV is a glob, it will actually each over each one of the matching files.
|
7
7
|
ARGV.each do |file_or_dir|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
if File.directory?(file_or_dir)
|
9
|
+
Dir["#{file_or_dir}/**/*.rb"].each do |file|
|
10
|
+
require "#{file}"
|
11
|
+
end
|
12
|
+
else
|
13
|
+
require file_or_dir
|
14
|
+
end
|
15
15
|
end
|
16
16
|
|
17
17
|
$context_runner.run(true)
|
data/bin/test2spec
CHANGED
@@ -14,7 +14,8 @@ require 'spec/test_to_spec/translation_test_runner'
|
|
14
14
|
require 'spec/version'
|
15
15
|
|
16
16
|
$test2spec_options = {
|
17
|
-
:collision => :ask
|
17
|
+
:collision => :ask,
|
18
|
+
:verbose => false
|
18
19
|
}
|
19
20
|
|
20
21
|
opts = OptionParser.new do |opts|
|
@@ -51,6 +52,10 @@ opts = OptionParser.new do |opts|
|
|
51
52
|
$test2spec_options[:quiet] = true
|
52
53
|
end
|
53
54
|
|
55
|
+
opts.on("--verbose", "Be extra verbose (printing backtraces when classes can't be translated)") do
|
56
|
+
$test2spec_options[:verbose] = true
|
57
|
+
end
|
58
|
+
|
54
59
|
opts.on("-v", "--version", "Show version") do
|
55
60
|
puts "test2spec #{Spec::VERSION::DESCRIPTION}"
|
56
61
|
exit
|
@@ -97,11 +102,11 @@ end
|
|
97
102
|
|
98
103
|
# If ARGV is a glob, it will actually each over each one of the matching files.
|
99
104
|
ARGV.each do |arg|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
105
|
+
if File.directory?(arg)
|
106
|
+
Dir["#{arg}/**/*.rb"].each do |file|
|
107
|
+
require "#{file}"
|
108
|
+
end
|
109
|
+
else
|
110
|
+
require arg
|
111
|
+
end
|
107
112
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
begin
|
2
|
+
require 'rubygems'
|
3
|
+
require 'diff/lcs/hunk'
|
4
|
+
rescue LoadError
|
5
|
+
raise "You must gem install diff-lcs to use this feature"
|
6
|
+
end
|
7
|
+
|
8
|
+
module Spec
|
9
|
+
class ShouldBase
|
10
|
+
unless defined?(RSPEC_TESTING)
|
11
|
+
alias old_default_message default_message
|
12
|
+
def default_message(expectation, expected=:no_expectation_specified)
|
13
|
+
result = old_default_message(expectation, expected)
|
14
|
+
if expected.is_a?(String)
|
15
|
+
result << "\nDiff:" << diff_as_string(@target.to_s, expected)
|
16
|
+
end
|
17
|
+
result
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
|
22
|
+
def diff_as_string(data_old, data_new, format=:unified, context_lines=3)
|
23
|
+
data_old = data_old.split(/\n/).map! { |e| e.chomp }
|
24
|
+
data_new = data_new.split(/\n/).map! { |e| e.chomp }
|
25
|
+
output = ""
|
26
|
+
diffs = Diff::LCS.diff(data_old, data_new)
|
27
|
+
return output if diffs.empty?
|
28
|
+
oldhunk = hunk = nil
|
29
|
+
file_length_difference = 0
|
30
|
+
diffs.each do |piece|
|
31
|
+
begin
|
32
|
+
hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines,
|
33
|
+
file_length_difference)
|
34
|
+
file_length_difference = hunk.file_length_difference
|
35
|
+
next unless oldhunk
|
36
|
+
# Hunks may overlap, which is why we need to be careful when our
|
37
|
+
# diff includes lines of context. Otherwise, we might print
|
38
|
+
# redundant lines.
|
39
|
+
if (context_lines > 0) and hunk.overlaps?(oldhunk)
|
40
|
+
hunk.unshift(oldhunk)
|
41
|
+
else
|
42
|
+
output << oldhunk.diff(format)
|
43
|
+
end
|
44
|
+
ensure
|
45
|
+
oldhunk = hunk
|
46
|
+
output << "\n"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
#Handle the last remaining hunk
|
50
|
+
output << oldhunk.diff(format) << "\n"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spec
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
class InstanceHelper < ShouldBase
|
4
|
+
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
end
|
8
|
+
|
9
|
+
def of(expected_class)
|
10
|
+
fail_with_message(default_message("should be an instance of", expected_class)) unless @target.instance_of? expected_class
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
14
|
|
15
15
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spec
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
class InstanceNegator < ShouldBase
|
4
|
+
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
end
|
8
|
+
|
9
|
+
def of(expected_class)
|
10
|
+
fail_with_message(default_message("should not be an instance of", expected_class)) if @target.instance_of? expected_class
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
14
|
|
15
15
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spec
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
class KindHelper < ShouldBase
|
4
|
+
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
end
|
8
|
+
|
9
|
+
def of(expected_class)
|
10
|
+
fail_with_message(default_message("should be a kind of", expected_class)) unless @target.kind_of? expected_class
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
14
|
|
15
15
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spec
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
class KindNegator < ShouldBase
|
4
|
+
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
end
|
8
|
+
|
9
|
+
def of(expected_class)
|
10
|
+
fail_with_message(default_message("should not be a kind of", expected_class)) if @target.kind_of? expected_class
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
14
|
|
15
15
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spec
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
class RespondHelper < ShouldBase
|
4
|
+
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
end
|
8
|
+
|
9
|
+
def to(expected)
|
10
|
+
fail_with_message(default_message("should respond to", expected)) unless @target.respond_to? expected
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
14
|
|
15
15
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spec
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
class RespondNegator < ShouldBase
|
4
|
+
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
end
|
8
|
+
|
9
|
+
def to(expected)
|
10
|
+
fail_with_message(default_message("should not respond to", expected)) if @target.respond_to? expected
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
14
|
|
15
15
|
end
|
@@ -16,18 +16,18 @@ module Spec
|
|
16
16
|
|
17
17
|
class ShouldBase
|
18
18
|
|
19
|
-
|
19
|
+
def default_message(expectation, expected=:no_expectation_specified)
|
20
20
|
message = "#{@target.inspect_for_expectation_not_met_error} #{expectation}"
|
21
21
|
if (expected != :no_expectation_specified)
|
22
22
|
message << " " << expected.inspect_for_expectation_not_met_error
|
23
23
|
end
|
24
24
|
message
|
25
|
-
|
25
|
+
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
def fail_with_message(message)
|
28
|
+
Kernel::raise(Spec::Api::ExpectationNotMetError.new(message))
|
29
|
+
end
|
30
|
+
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
@@ -2,63 +2,63 @@ module Spec
|
|
2
2
|
|
3
3
|
class ShouldHelper < ShouldBase
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
end
|
8
|
+
|
9
|
+
def not
|
10
|
+
ShouldNegator.new(@target)
|
11
|
+
end
|
12
12
|
|
13
13
|
def have(expected_number=nil)
|
14
14
|
HaveHelper.new(@target, expected_number)
|
15
15
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
|
17
|
+
def satisfy(&block)
|
18
|
+
return if block.call(@target)
|
19
19
|
fail_with_message "Supplied expectation was not satisfied"
|
20
20
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
|
22
|
+
def equal(expected)
|
23
|
+
fail_with_message(default_message("should equal", expected)) unless (@target == expected)
|
24
24
|
end
|
25
25
|
|
26
26
|
def be(expected = :___no_arg)
|
27
27
|
return self if (expected == :___no_arg)
|
28
28
|
return if (expected == false and @target.nil?)
|
29
|
-
|
30
|
-
|
29
|
+
return if (expected == true and (!@target.nil?) and (@target != false))
|
30
|
+
fail_with_message(default_message("should be", expected)) unless (@target.equal?(expected))
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
33
|
+
def a
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
alias an a
|
38
|
+
|
39
|
+
def instance
|
40
|
+
InstanceHelper.new(@target)
|
41
|
+
end
|
42
|
+
|
43
|
+
def kind
|
44
|
+
KindHelper.new(@target)
|
45
|
+
end
|
46
|
+
|
47
|
+
def respond
|
48
|
+
RespondHelper.new(@target)
|
49
|
+
end
|
50
|
+
|
51
51
|
def method_missing(sym, *args)
|
52
52
|
return if @target.send("#{sym}?", *args)
|
53
53
|
fail_with_message(default_message("should be #{sym}" + (args.empty? ? '' : (' ' + args.join(', ')))))
|
54
54
|
end
|
55
55
|
|
56
56
|
def match(expected)
|
57
|
-
|
57
|
+
fail_with_message(default_message("should match", expected)) unless (@target =~ expected)
|
58
58
|
end
|
59
59
|
|
60
60
|
def include(sub)
|
61
|
-
|
61
|
+
fail_with_message(default_message("should include", sub)) unless (@target.include? sub)
|
62
62
|
end
|
63
63
|
|
64
64
|
def raise(exception=Exception)
|