rspec 1.2.8 → 1.2.9
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/History.rdoc +41 -2
- data/Manifest.txt +11 -10
- data/Rakefile +47 -22
- data/Ruby1.9.rdoc +1 -2
- data/Upgrade.rdoc +56 -7
- data/bin/spec +2 -1
- data/cucumber.yml +3 -1
- data/examples/failing/README.txt +7 -3
- data/examples/failing/failing_implicit_docstrings_example.rb +0 -2
- data/examples/failing/mocking_example.rb +0 -2
- data/examples/failing/partial_mock_example.rb +0 -2
- data/examples/failing/pending_example.rb +0 -2
- data/examples/failing/predicate_example.rb +0 -2
- data/examples/failing/team_spec.rb +0 -3
- data/examples/failing/timeout_behaviour.rb +0 -2
- data/examples/passing/custom_formatter.rb +0 -1
- data/examples/passing/dynamic_spec.rb +0 -2
- data/examples/passing/file_accessor.rb +1 -2
- data/examples/passing/file_accessor_spec.rb +1 -2
- data/examples/passing/filtered_formatter.rb +0 -1
- data/examples/passing/greeter_spec.rb +0 -1
- data/examples/passing/helper_method_example.rb +0 -2
- data/examples/passing/implicit_docstrings_example.rb +0 -2
- data/examples/passing/io_processor_spec.rb +1 -2
- data/examples/passing/mocking_example.rb +0 -2
- data/examples/passing/nested_classes_example.rb +1 -2
- data/examples/passing/options_example.rb +0 -2
- data/examples/passing/partial_mock_example.rb +0 -2
- data/examples/passing/pending_example.rb +0 -2
- data/examples/passing/predicate_example.rb +0 -2
- data/examples/passing/shared_example_group_example.rb +0 -2
- data/examples/passing/simple_matcher_example.rb +0 -2
- data/examples/passing/stack_spec.rb +2 -3
- data/examples/passing/stack_spec_with_nested_example_groups.rb +2 -3
- data/examples/passing/stubbing_example.rb +0 -2
- data/examples/passing/yielding_example.rb +0 -2
- data/features/before_and_after_blocks/before_and_after_blocks.feature +4 -4
- data/features/command_line/line_number_option.feature +14 -14
- data/features/command_line/line_number_option_with_example_with_no_name.feature +2 -2
- data/features/example_groups/define_example_attribute.feature +41 -0
- data/features/example_groups/example_group_with_should_methods.feature +1 -1
- data/features/example_groups/implicit_docstrings.feature +7 -7
- data/features/example_groups/nested_groups.feature +2 -2
- data/features/expectations/customized_message.feature +4 -4
- data/features/expectations/expect_change.feature +4 -4
- data/features/expectations/expect_error.feature +4 -4
- data/features/extensions/custom_example_group.feature +10 -10
- data/features/formatters/custom_formatter.feature +3 -3
- data/features/interop/examples_and_tests_together.feature +10 -6
- data/features/interop/rspec_output.feature +1 -1
- data/features/interop/test_case_with_should_methods.feature +1 -1
- data/features/load_paths/add_lib_to_load_path.feature +20 -0
- data/features/load_paths/add_spec_to_load_path.feature +20 -0
- data/features/matchers/define_diffable_matcher.feature +2 -2
- data/features/matchers/define_matcher.feature +19 -19
- data/features/matchers/define_matcher_outside_rspec.feature +2 -3
- data/features/matchers/define_matcher_with_fluent_interface.feature +2 -2
- data/features/matchers/define_wrapped_matcher.feature +29 -0
- data/features/mock_framework_integration/use_flexmock.feature +1 -1
- data/features/mock_framework_integration/use_mocha.feature +1 -1
- data/features/mock_framework_integration/use_rr.feature +1 -1
- data/features/mocks/mix_stubs_and_mocks.feature +2 -2
- data/features/mocks/stub_implementation.feature +1 -1
- data/features/pending/pending_examples.feature +16 -16
- data/features/runner/specify_line_number.feature +4 -4
- data/features/spec_helper/spec_helper.feature +25 -0
- data/features/step_definitions/running_rspec_steps.rb +4 -2
- data/features/subject/explicit_subject.feature +2 -2
- data/features/subject/implicit_subject.feature +14 -2
- data/features/support/env.rb +6 -3
- data/lib/spec/adapters/mock_frameworks/mocha.rb +6 -1
- data/lib/spec/example/example_group_methods.rb +7 -0
- data/lib/spec/example/example_methods.rb +1 -1
- data/lib/spec/example/subject.rb +8 -0
- data/lib/spec/interop/test.rb +27 -1
- data/lib/spec/interop/test/unit/testcase.rb +1 -1
- data/lib/spec/matchers/exist.rb +2 -2
- data/lib/spec/matchers/extensions/instance_exec.rb +28 -20
- data/lib/spec/matchers/matcher.rb +21 -20
- data/lib/spec/mocks/argument_matchers.rb +17 -13
- data/lib/spec/mocks/error_generator.rb +14 -3
- data/lib/spec/mocks/{spec_methods.rb → example_methods.rb} +25 -11
- data/lib/spec/mocks/framework.rb +1 -1
- data/lib/spec/mocks/methods.rb +15 -0
- data/lib/spec/mocks/mock.rb +16 -10
- data/lib/spec/mocks/proxy.rb +1 -1
- data/lib/spec/rake/spectask.rb +3 -3
- data/lib/spec/runner/backtrace_tweaker.rb +41 -22
- data/lib/spec/runner/configuration.rb +18 -1
- data/lib/spec/runner/differs/default.rb +1 -1
- data/lib/spec/runner/drb_command_line.rb +5 -2
- data/lib/spec/runner/formatter/base_text_formatter.rb +8 -3
- data/lib/spec/runner/option_parser.rb +21 -15
- data/lib/spec/runner/options.rb +54 -23
- data/lib/spec/version.rb +3 -3
- data/resources/helpers/cmdline.rb +0 -1
- data/spec/autotest/autotest_helper.rb +4 -6
- data/spec/autotest/discover_spec.rb +2 -2
- data/spec/autotest/failed_results_re_spec.rb +1 -1
- data/spec/autotest/rspec_spec.rb +1 -1
- data/spec/spec/dsl/main_spec.rb +1 -1
- data/spec/spec/example/example_group_class_definition_spec.rb +1 -1
- data/spec/spec/example/example_group_factory_spec.rb +1 -1
- data/spec/spec/example/example_group_methods_spec.rb +21 -1
- data/spec/spec/example/example_group_proxy_spec.rb +1 -1
- data/spec/spec/example/example_group_spec.rb +1 -1
- data/spec/spec/example/example_matcher_spec.rb +1 -1
- data/spec/spec/example/example_methods_spec.rb +1 -1
- data/spec/spec/example/example_proxy_spec.rb +1 -1
- data/spec/spec/example/helper_method_spec.rb +1 -1
- data/spec/spec/example/nested_example_group_spec.rb +1 -1
- data/spec/spec/example/predicate_matcher_spec.rb +1 -1
- data/spec/spec/example/shared_example_group_spec.rb +1 -1
- data/spec/spec/example/subclassing_example_group_spec.rb +1 -1
- data/spec/spec/example/subject_spec.rb +17 -1
- data/spec/spec/expectations/differs/default_spec.rb +16 -3
- data/spec/spec/expectations/extensions/kernel_spec.rb +1 -1
- data/spec/spec/expectations/fail_with_spec.rb +1 -1
- data/spec/spec/expectations/handler_spec.rb +1 -1
- data/spec/spec/expectations/wrap_expectation_spec.rb +1 -1
- data/spec/spec/interop/test/unit/resources/test_case_with_various_names.rb +22 -0
- data/spec/spec/interop/test/unit/spec_spec.rb +1 -1
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +2 -2
- data/spec/spec/interop/test/unit/testcase_spec.rb +7 -2
- data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +1 -1
- data/spec/spec/matchers/be_close_spec.rb +1 -1
- data/spec/spec/matchers/be_instance_of_spec.rb +1 -1
- data/spec/spec/matchers/be_kind_of_spec.rb +1 -1
- data/spec/spec/matchers/be_spec.rb +13 -1
- data/spec/spec/matchers/change_spec.rb +1 -1
- data/spec/spec/matchers/compatibility_spec.rb +1 -1
- data/spec/spec/matchers/description_generation_spec.rb +1 -1
- data/spec/spec/matchers/dsl_spec.rb +1 -1
- data/spec/spec/matchers/eql_spec.rb +1 -1
- data/spec/spec/matchers/equal_spec.rb +1 -1
- data/spec/spec/matchers/exist_spec.rb +6 -2
- data/spec/spec/matchers/has_spec.rb +19 -1
- data/spec/spec/matchers/have_spec.rb +1 -1
- data/spec/spec/matchers/include_spec.rb +1 -1
- data/spec/spec/matchers/match_array_spec.rb +1 -1
- data/spec/spec/matchers/match_spec.rb +1 -1
- data/spec/spec/matchers/matcher_methods_spec.rb +1 -1
- data/spec/spec/matchers/matcher_spec.rb +55 -28
- data/spec/spec/matchers/matchers_spec.rb +1 -1
- data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
- data/spec/spec/matchers/raise_error_spec.rb +1 -1
- data/spec/spec/matchers/respond_to_spec.rb +1 -1
- data/spec/spec/matchers/satisfy_spec.rb +1 -1
- data/spec/spec/matchers/simple_matcher_spec.rb +1 -1
- data/spec/spec/matchers/throw_symbol_spec.rb +1 -1
- data/spec/spec/mocks/any_number_of_times_spec.rb +1 -1
- data/spec/spec/mocks/argument_expectation_spec.rb +1 -1
- data/spec/spec/mocks/argument_matchers_spec.rb +19 -0
- data/spec/spec/mocks/at_least_spec.rb +1 -1
- data/spec/spec/mocks/at_most_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_10260_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_10263_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_11545_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_15719_spec.rb +3 -3
- data/spec/spec/mocks/bug_report_496_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_600_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_7611_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_7805_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_8165_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_8302_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_830_spec.rb +1 -1
- data/spec/spec/mocks/double_spec.rb +12 -0
- data/spec/spec/mocks/failing_argument_matchers_spec.rb +6 -6
- data/spec/spec/mocks/hash_including_matcher_spec.rb +1 -1
- data/spec/spec/mocks/hash_not_including_matcher_spec.rb +1 -1
- data/spec/spec/mocks/mock_ordering_spec.rb +4 -4
- data/spec/spec/mocks/mock_space_spec.rb +1 -1
- data/spec/spec/mocks/mock_spec.rb +20 -24
- data/spec/spec/mocks/multiple_return_value_spec.rb +8 -8
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +1 -1
- data/spec/spec/mocks/null_object_mock_spec.rb +1 -1
- data/spec/spec/mocks/once_counts_spec.rb +1 -1
- data/spec/spec/mocks/options_hash_spec.rb +1 -1
- data/spec/spec/mocks/partial_mock_spec.rb +1 -1
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +1 -1
- data/spec/spec/mocks/passing_argument_matchers_spec.rb +1 -1
- data/spec/spec/mocks/precise_counts_spec.rb +1 -1
- data/spec/spec/mocks/record_messages_spec.rb +1 -1
- data/spec/spec/mocks/stub_chain_spec.rb +1 -1
- data/spec/spec/mocks/stub_implementation_spec.rb +1 -1
- data/spec/spec/mocks/stub_spec.rb +14 -9
- data/spec/spec/mocks/stubbed_message_expectations_spec.rb +2 -2
- data/spec/spec/mocks/twice_counts_spec.rb +1 -1
- data/spec/spec/mocks/unstub_spec.rb +1 -1
- data/spec/spec/package/bin_spec_spec.rb +4 -10
- data/spec/spec/rake/spectask_spec.rb +2 -2
- data/spec/spec/runner/class_and_argument_parser_spec.rb +1 -1
- data/spec/spec/runner/command_line_spec.rb +1 -1
- data/spec/spec/runner/configuration_spec.rb +15 -6
- data/spec/spec/runner/drb_command_line_spec.rb +1 -1
- data/spec/spec/runner/example_group_runner_spec.rb +1 -1
- data/spec/spec/runner/formatter/base_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/base_text_formatter_spec.rb +10 -1
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +72 -76
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +50 -50
- data/spec/spec/runner/formatter/html_formatted-1.8.7.html +50 -50
- data/spec/spec/runner/formatter/html_formatted-1.9.1.html +61 -69
- data/spec/spec/runner/formatter/html_formatter_spec.rb +26 -26
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +13 -9
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +1 -1
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/{text_mate_formatted-1.8.4.html → text_mate_formatted-1.8.6-jruby.html} +64 -59
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +46 -46
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +46 -46
- data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +55 -63
- data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +3 -3
- data/spec/spec/runner/heckle_runner_spec.rb +1 -1
- data/spec/spec/runner/heckler_spec.rb +1 -1
- data/spec/spec/runner/line_number_query/line_number_query_fixture.rb +1 -1
- data/spec/spec/runner/line_number_query_spec.rb +10 -1
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +22 -16
- data/spec/spec/runner/option_parser_spec.rb +48 -14
- data/spec/spec/runner/options_spec.rb +16 -2
- data/spec/spec/runner/output_one_time_fixture.rb +1 -1
- data/spec/spec/runner/output_one_time_fixture_runner.rb +2 -3
- data/spec/spec/runner/output_one_time_spec.rb +6 -7
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +65 -22
- data/spec/spec/runner/reporter_spec.rb +1 -1
- data/spec/spec/runner_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -7
- data/spec/{spec → support}/spec_classes.rb +0 -0
- metadata +58 -17
- data/examples/failing/spec_helper.rb +0 -3
- data/examples/passing/spec_helper.rb +0 -3
- data/features/heckle/heckle.feature +0 -56
- data/spec/rspec_suite.rb +0 -6
- data/spec/spec/runner/formatter/html_formatted-1.8.4.html +0 -366
- data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +0 -387
- data/spec/spec/runner/formatter/html_formatted-1.8.5.html +0 -372
data/lib/spec/mocks/framework.rb
CHANGED
data/lib/spec/mocks/methods.rb
CHANGED
|
@@ -25,6 +25,21 @@ module Spec
|
|
|
25
25
|
|
|
26
26
|
alias_method :unstub, :unstub!
|
|
27
27
|
|
|
28
|
+
# :call-seq:
|
|
29
|
+
# object.stub_chain(:first, :second, :third).and_return(:this)
|
|
30
|
+
#
|
|
31
|
+
# Supports stubbing a chain of methods. Each argument represents
|
|
32
|
+
# a method name to stub, and each one returns a proxy object that
|
|
33
|
+
# can accept more stubs, until the last, which returns whatever
|
|
34
|
+
# is passed to +and_return_.
|
|
35
|
+
#
|
|
36
|
+
# == Examples
|
|
37
|
+
#
|
|
38
|
+
# # with this in an example ...
|
|
39
|
+
# article = double('article')
|
|
40
|
+
# Article.stub_chain(:authored_by, :published, :recent).and_return([article])
|
|
41
|
+
# # then this will return an Array with the article double in it:
|
|
42
|
+
# Article.authored_by(params[:author_id]).published.recent
|
|
28
43
|
def stub_chain(*methods)
|
|
29
44
|
if methods.length > 1
|
|
30
45
|
if matching_stub = __mock_proxy.find_matching_method_stub(methods[0])
|
data/lib/spec/mocks/mock.rb
CHANGED
|
@@ -7,14 +7,14 @@ module Spec
|
|
|
7
7
|
# only) == Options:
|
|
8
8
|
# * <tt>:null_object</tt> - if true, the mock object acts as a forgiving
|
|
9
9
|
# null object allowing any message to be sent to it.
|
|
10
|
-
def initialize(name=
|
|
10
|
+
def initialize(name=nil, stubs_and_options={})
|
|
11
11
|
if name.is_a?(Hash) && stubs_and_options.empty?
|
|
12
12
|
stubs_and_options = name
|
|
13
|
-
|
|
13
|
+
@name = nil
|
|
14
14
|
else
|
|
15
15
|
@name = name
|
|
16
16
|
end
|
|
17
|
-
@options =
|
|
17
|
+
@options = extract_options(stubs_and_options)
|
|
18
18
|
assign_stubs(stubs_and_options)
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -46,8 +46,19 @@ module Spec
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
def
|
|
50
|
-
options
|
|
49
|
+
def extract_options(stubs_and_options)
|
|
50
|
+
options = {}
|
|
51
|
+
extract_option(stubs_and_options, options, :null_object)
|
|
52
|
+
extract_option(stubs_and_options, options, :__declared_as, 'Mock')
|
|
53
|
+
options
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def extract_option(source, target, key, default=nil)
|
|
57
|
+
if source[key]
|
|
58
|
+
target[key] = source.delete(key)
|
|
59
|
+
elsif default
|
|
60
|
+
target[key] = default
|
|
61
|
+
end
|
|
51
62
|
end
|
|
52
63
|
|
|
53
64
|
def assign_stubs(stubs)
|
|
@@ -55,11 +66,6 @@ module Spec
|
|
|
55
66
|
stub!(message).and_return(response)
|
|
56
67
|
end
|
|
57
68
|
end
|
|
58
|
-
|
|
59
|
-
def build_name_from_options(options)
|
|
60
|
-
vals = options.inject([]) {|coll, pair| coll << "#{pair.first}: #{pair.last.inspect}"}
|
|
61
|
-
@name = '{' + vals.join(', ') + '}'
|
|
62
|
-
end
|
|
63
69
|
end
|
|
64
70
|
end
|
|
65
71
|
end
|
data/lib/spec/mocks/proxy.rb
CHANGED
|
@@ -18,7 +18,7 @@ module Spec
|
|
|
18
18
|
def initialize(target, name=nil, options={})
|
|
19
19
|
@target = target
|
|
20
20
|
@name = name
|
|
21
|
-
@error_generator = ErrorGenerator.new target, name
|
|
21
|
+
@error_generator = ErrorGenerator.new target, name, options
|
|
22
22
|
@expectation_ordering = OrderGroup.new @error_generator
|
|
23
23
|
@expectations = []
|
|
24
24
|
@messages_received = []
|
data/lib/spec/rake/spectask.rb
CHANGED
|
@@ -118,14 +118,14 @@ module Spec
|
|
|
118
118
|
# Use verbose output. If this is set to true, the task will print
|
|
119
119
|
# the executed spec command to stdout. Defaults to false.
|
|
120
120
|
attr_accessor :verbose
|
|
121
|
-
|
|
121
|
+
|
|
122
122
|
# Explicitly define the path to the ruby binary, or its proxy (e.g. multiruby)
|
|
123
123
|
attr_accessor :ruby_cmd
|
|
124
124
|
|
|
125
125
|
# Defines a new task, using the name +name+.
|
|
126
126
|
def initialize(name=:spec)
|
|
127
127
|
@name = name
|
|
128
|
-
@libs = [
|
|
128
|
+
@libs = ['lib']
|
|
129
129
|
@pattern = nil
|
|
130
130
|
@spec_files = nil
|
|
131
131
|
@spec_opts = []
|
|
@@ -142,7 +142,7 @@ module Spec
|
|
|
142
142
|
end
|
|
143
143
|
|
|
144
144
|
def define # :nodoc:
|
|
145
|
-
spec_script = File.expand_path(File.dirname(__FILE__)
|
|
145
|
+
spec_script = File.expand_path(File.join(File.dirname(__FILE__),"..","..","..","bin","spec"))
|
|
146
146
|
|
|
147
147
|
lib_path = libs.join(File::PATH_SEPARATOR)
|
|
148
148
|
actual_name = Hash === name ? name.keys.first : name
|
|
@@ -1,33 +1,53 @@
|
|
|
1
1
|
module Spec
|
|
2
2
|
module Runner
|
|
3
3
|
class BacktraceTweaker
|
|
4
|
+
def initialize(*patterns)
|
|
5
|
+
@ignore_patterns = []
|
|
6
|
+
end
|
|
7
|
+
|
|
4
8
|
def clean_up_double_slashes(line)
|
|
5
9
|
line.gsub!('//','/')
|
|
6
10
|
end
|
|
7
|
-
end
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
def ignore_patterns(*patterns)
|
|
13
|
+
# do nothing. Only QuietBacktraceTweaker ignores patterns.
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def ignored_patterns
|
|
17
|
+
[]
|
|
18
|
+
end
|
|
19
|
+
|
|
10
20
|
def tweak_backtrace(error)
|
|
11
21
|
return if error.backtrace.nil?
|
|
12
|
-
tweaked = error.backtrace.collect do |
|
|
13
|
-
clean_up_double_slashes(
|
|
14
|
-
line
|
|
22
|
+
tweaked = error.backtrace.collect do |message|
|
|
23
|
+
clean_up_double_slashes(message)
|
|
24
|
+
kept_lines = message.split("\n").select do |line|
|
|
25
|
+
ignored_patterns.each do |ignore|
|
|
26
|
+
break if line =~ ignore
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
kept_lines.empty?? nil : kept_lines.join("\n")
|
|
15
30
|
end
|
|
16
|
-
error.set_backtrace(tweaked)
|
|
31
|
+
error.set_backtrace(tweaked.select {|line| line})
|
|
17
32
|
end
|
|
18
33
|
end
|
|
19
34
|
|
|
35
|
+
class NoisyBacktraceTweaker < BacktraceTweaker
|
|
36
|
+
end
|
|
37
|
+
|
|
20
38
|
# Tweaks raised Exceptions to mask noisy (unneeded) parts of the backtrace
|
|
21
39
|
class QuietBacktraceTweaker < BacktraceTweaker
|
|
22
40
|
unless defined?(IGNORE_PATTERNS)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
subpath = path[root_dir.length..-1]
|
|
41
|
+
spec_files = Dir["lib/*"].map do |path|
|
|
42
|
+
subpath = path[1..-1]
|
|
26
43
|
/#{subpath}/
|
|
27
44
|
end
|
|
28
45
|
IGNORE_PATTERNS = spec_files + [
|
|
46
|
+
/\/rspec-[^\/]*\/lib\/spec\//,
|
|
47
|
+
/\/spork-[^\/]*\/lib\/spork\//,
|
|
29
48
|
/\/lib\/ruby\//,
|
|
30
49
|
/bin\/spec:/,
|
|
50
|
+
/bin\/spork:/,
|
|
31
51
|
/bin\/rcov:/,
|
|
32
52
|
/lib\/rspec-rails/,
|
|
33
53
|
/vendor\/rails/,
|
|
@@ -39,19 +59,18 @@ module Spec
|
|
|
39
59
|
/spec_server/
|
|
40
60
|
]
|
|
41
61
|
end
|
|
42
|
-
|
|
43
|
-
def
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
error.set_backtrace(tweaked.select {|line| line})
|
|
62
|
+
|
|
63
|
+
def initialize(*patterns)
|
|
64
|
+
super
|
|
65
|
+
ignore_patterns(*patterns)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def ignore_patterns(*patterns)
|
|
69
|
+
@ignore_patterns += patterns.flatten.map { |pattern| Regexp.new(pattern) }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def ignored_patterns
|
|
73
|
+
IGNORE_PATTERNS + @ignore_patterns
|
|
55
74
|
end
|
|
56
75
|
end
|
|
57
76
|
end
|
|
@@ -137,6 +137,23 @@ module Spec
|
|
|
137
137
|
def predicate_matchers
|
|
138
138
|
@predicate_matchers ||= Spec::HashWithDeprecationNotice.new("predicate_matchers", "the new Matcher DSL")
|
|
139
139
|
end
|
|
140
|
+
|
|
141
|
+
# Adds patterns to the list of patterns ignored in the backtrace when a
|
|
142
|
+
# failure is output by rspec. Example:
|
|
143
|
+
#
|
|
144
|
+
# config.ignore_backtrace_patterns /spork/, /shoulda/, "/some/weird/path/"
|
|
145
|
+
#
|
|
146
|
+
# When quiet backtraces are turned on (default), this will exclude any
|
|
147
|
+
# lines that match any of the Regexps and Strings passed.
|
|
148
|
+
#
|
|
149
|
+
def ignore_backtrace_patterns(*patterns)
|
|
150
|
+
@ignored_backtrace_patterns ||= []
|
|
151
|
+
@ignored_backtrace_patterns += patterns
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def ignored_backtrace_patterns # :nodoc:
|
|
155
|
+
@ignored_backtrace_patterns ||= []
|
|
156
|
+
end
|
|
140
157
|
|
|
141
158
|
private
|
|
142
159
|
|
|
@@ -161,7 +178,7 @@ module Spec
|
|
|
161
178
|
end
|
|
162
179
|
|
|
163
180
|
def mock_framework_path(framework_name)
|
|
164
|
-
|
|
181
|
+
"spec/adapters/mock_frameworks/#{framework_name}"
|
|
165
182
|
end
|
|
166
183
|
|
|
167
184
|
def scope_and_options(*args) # :nodoc:
|
|
@@ -8,8 +8,11 @@ module Spec
|
|
|
8
8
|
# CommandLine - making it possible for clients to use both interchangeably.
|
|
9
9
|
def self.run(options)
|
|
10
10
|
begin
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
begin; \
|
|
12
|
+
DRb.start_service("druby://localhost:0"); \
|
|
13
|
+
rescue SocketError; \
|
|
14
|
+
DRb.start_service("druby://:0"); \
|
|
15
|
+
end
|
|
13
16
|
spec_server = DRbObject.new_with_uri("druby://127.0.0.1:8989")
|
|
14
17
|
spec_server.run(options.argv, options.error_stream, options.output_stream)
|
|
15
18
|
true
|
|
@@ -102,7 +102,7 @@ module Spec
|
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
def autospec?
|
|
105
|
-
!!@options.autospec
|
|
105
|
+
!!@options.autospec || ENV.has_key?("AUTOTEST")
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
def backtrace_line(line)
|
|
@@ -110,13 +110,18 @@ module Spec
|
|
|
110
110
|
end
|
|
111
111
|
|
|
112
112
|
def colour(text, colour_code)
|
|
113
|
-
return text
|
|
113
|
+
return text if output_to_file?
|
|
114
|
+
return text unless ENV['RSPEC_COLOR'] || (colour? & (autospec? || output_to_tty?))
|
|
114
115
|
"#{colour_code}#{text}\e[0m"
|
|
115
116
|
end
|
|
116
117
|
|
|
118
|
+
def output_to_file?
|
|
119
|
+
File === @output
|
|
120
|
+
end
|
|
121
|
+
|
|
117
122
|
def output_to_tty?
|
|
118
123
|
begin
|
|
119
|
-
@output.tty?
|
|
124
|
+
@output.tty?
|
|
120
125
|
rescue NoMethodError
|
|
121
126
|
false
|
|
122
127
|
end
|
|
@@ -117,18 +117,18 @@ module Spec
|
|
|
117
117
|
on("--autospec") {@options.autospec = true}
|
|
118
118
|
on_tail(*OPTIONS[:help]) {parse_help}
|
|
119
119
|
end
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
def order!(argv, &blk)
|
|
122
122
|
@argv = argv.dup
|
|
123
|
-
@argv = (@argv.empty? & self.class.spec_command?) ? ['--help'] : @argv
|
|
124
|
-
|
|
123
|
+
@argv = (@argv.empty? & self.class.spec_command?) ? ['--help'] : @argv
|
|
124
|
+
|
|
125
125
|
# Parse options file first
|
|
126
126
|
parse_file_options(:options_file, :parse_options_file)
|
|
127
|
-
|
|
127
|
+
|
|
128
128
|
@options.argv = @argv.dup
|
|
129
|
-
return if parse_file_options(:generate_options, :
|
|
129
|
+
return if parse_file_options(:generate_options, :write_options_file)
|
|
130
130
|
return if parse_drb
|
|
131
|
-
|
|
131
|
+
|
|
132
132
|
super(@argv) do |file|
|
|
133
133
|
if file =~ /^(.+):(\d+)$/
|
|
134
134
|
file = $1
|
|
@@ -141,7 +141,7 @@ module Spec
|
|
|
141
141
|
|
|
142
142
|
@options
|
|
143
143
|
end
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
protected
|
|
146
146
|
|
|
147
147
|
def invoke_requires(requires)
|
|
@@ -149,11 +149,6 @@ module Spec
|
|
|
149
149
|
require file
|
|
150
150
|
end
|
|
151
151
|
end
|
|
152
|
-
|
|
153
|
-
def parse_options_file(options_file)
|
|
154
|
-
option_file_args = IO.readlines(options_file).map {|l| l.chomp.split " "}.flatten
|
|
155
|
-
@argv.push(*option_file_args)
|
|
156
|
-
end
|
|
157
152
|
|
|
158
153
|
def parse_file_options(option_name, action)
|
|
159
154
|
# Remove the file option and the argument before handling the file
|
|
@@ -167,6 +162,12 @@ module Spec
|
|
|
167
162
|
end
|
|
168
163
|
end
|
|
169
164
|
|
|
165
|
+
if options_file.nil? &&
|
|
166
|
+
File.exist?('spec/spec.opts') &&
|
|
167
|
+
!@argv.any?{|a| a =~ /^\-/ }
|
|
168
|
+
options_file = 'spec/spec.opts'
|
|
169
|
+
end
|
|
170
|
+
|
|
170
171
|
if options_file
|
|
171
172
|
send(action, options_file)
|
|
172
173
|
return true
|
|
@@ -174,8 +175,13 @@ module Spec
|
|
|
174
175
|
return false
|
|
175
176
|
end
|
|
176
177
|
end
|
|
177
|
-
|
|
178
|
-
def
|
|
178
|
+
|
|
179
|
+
def parse_options_file(options_file)
|
|
180
|
+
option_file_args = File.readlines(options_file).map {|l| l.chomp.split " "}.flatten
|
|
181
|
+
@argv.push(*option_file_args)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def write_options_file(options_file)
|
|
179
185
|
File.open(options_file, 'w') do |io|
|
|
180
186
|
io.puts @argv.join("\n")
|
|
181
187
|
end
|
|
@@ -207,7 +213,7 @@ module Spec
|
|
|
207
213
|
def parse_help
|
|
208
214
|
@out_stream.puts self
|
|
209
215
|
exit if stdout?
|
|
210
|
-
end
|
|
216
|
+
end
|
|
211
217
|
|
|
212
218
|
def stdout?
|
|
213
219
|
@out_stream == $stdout
|
data/lib/spec/runner/options.rb
CHANGED
|
@@ -28,7 +28,7 @@ module Spec
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
attr_accessor(
|
|
31
|
-
:autospec, # hack to tell
|
|
31
|
+
:autospec, # hack to tell
|
|
32
32
|
:filename_pattern,
|
|
33
33
|
:backtrace_tweaker,
|
|
34
34
|
:context_lines,
|
|
@@ -50,7 +50,7 @@ module Spec
|
|
|
50
50
|
:argv
|
|
51
51
|
)
|
|
52
52
|
attr_reader :colour, :differ_class, :files, :examples, :example_groups
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
def initialize(error_stream, output_stream)
|
|
55
55
|
@error_stream = error_stream
|
|
56
56
|
@output_stream = output_stream
|
|
@@ -74,15 +74,15 @@ module Spec
|
|
|
74
74
|
@files_loaded = false
|
|
75
75
|
@out_used = nil
|
|
76
76
|
end
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
def add_example_group(example_group)
|
|
79
79
|
@example_groups << example_group
|
|
80
80
|
end
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
def line_number_requested?
|
|
83
83
|
!!line_number
|
|
84
84
|
end
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
def example_line
|
|
87
87
|
Spec::Runner::LineNumberQuery.new(self).example_line_for(files.first, line_number)
|
|
88
88
|
end
|
|
@@ -96,6 +96,28 @@ module Spec
|
|
|
96
96
|
require 'ruby-debug'
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
+
def project_root # :nodoc:
|
|
100
|
+
require 'pathname'
|
|
101
|
+
@project_root ||= determine_project_root
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def determine_project_root # :nodoc:
|
|
105
|
+
# This is borrowed (slightly modified) from Scott Taylors
|
|
106
|
+
# project_path project:
|
|
107
|
+
# http://github.com/smtlaissezfaire/project_path
|
|
108
|
+
Pathname(File.expand_path('.')).ascend do |path|
|
|
109
|
+
if File.exists?(File.join(path, "spec"))
|
|
110
|
+
return path
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def add_dir_from_project_root_to_load_path(dir, load_path=$LOAD_PATH) # :nodoc:
|
|
116
|
+
return if project_root.nil?
|
|
117
|
+
full_dir = File.join(project_root, dir)
|
|
118
|
+
load_path.unshift full_dir unless load_path.include?(full_dir)
|
|
119
|
+
end
|
|
120
|
+
|
|
99
121
|
def run_examples
|
|
100
122
|
require_ruby_debug if debug
|
|
101
123
|
return true unless examples_should_be_run?
|
|
@@ -104,21 +126,23 @@ module Spec
|
|
|
104
126
|
runner = custom_runner || ExampleGroupRunner.new(self)
|
|
105
127
|
|
|
106
128
|
unless @files_loaded
|
|
129
|
+
['spec','lib'].each do |dir|
|
|
130
|
+
add_dir_from_project_root_to_load_path(dir)
|
|
131
|
+
end
|
|
107
132
|
runner.load_files(files_to_load)
|
|
108
133
|
@files_loaded = true
|
|
109
134
|
end
|
|
110
|
-
|
|
135
|
+
|
|
111
136
|
define_predicate_matchers
|
|
112
137
|
plugin_mock_framework
|
|
138
|
+
ignore_backtrace_patterns
|
|
113
139
|
|
|
114
140
|
# TODO - this has to happen after the files get loaded,
|
|
115
141
|
# otherwise the before_suite_parts are not populated
|
|
116
142
|
# from the configuration. There is no spec for this
|
|
117
143
|
# directly, but features/before_and_after_blocks/before_and_after_blocks.story
|
|
118
144
|
# will fail if this happens before the files are loaded.
|
|
119
|
-
before_suite_parts.each
|
|
120
|
-
part.call
|
|
121
|
-
end
|
|
145
|
+
before_suite_parts.each { |part| part.call }
|
|
122
146
|
|
|
123
147
|
if example_groups.empty?
|
|
124
148
|
true
|
|
@@ -135,11 +159,11 @@ module Spec
|
|
|
135
159
|
end
|
|
136
160
|
end
|
|
137
161
|
end
|
|
138
|
-
|
|
162
|
+
|
|
139
163
|
def before_suite_parts
|
|
140
164
|
Spec::Example::BeforeAndAfterHooks.before_suite_parts
|
|
141
165
|
end
|
|
142
|
-
|
|
166
|
+
|
|
143
167
|
def after_suite_parts
|
|
144
168
|
Spec::Example::BeforeAndAfterHooks.after_suite_parts
|
|
145
169
|
end
|
|
@@ -151,7 +175,7 @@ module Spec
|
|
|
151
175
|
def examples_should_not_be_run
|
|
152
176
|
@examples_should_be_run = false
|
|
153
177
|
end
|
|
154
|
-
|
|
178
|
+
|
|
155
179
|
def mock_framework
|
|
156
180
|
# TODO - don't like this dependency - perhaps store this in here instead?
|
|
157
181
|
Spec::Runner.configuration.mock_framework
|
|
@@ -204,7 +228,7 @@ module Spec
|
|
|
204
228
|
@format_options ||= []
|
|
205
229
|
@format_options << [format, where]
|
|
206
230
|
end
|
|
207
|
-
|
|
231
|
+
|
|
208
232
|
def formatters
|
|
209
233
|
@format_options ||= [['progress', @output_stream]]
|
|
210
234
|
@formatters ||= load_formatters(@format_options, EXAMPLE_FORMATTERS)
|
|
@@ -221,7 +245,7 @@ module Spec
|
|
|
221
245
|
formatter_type.new(formatter_options, where)
|
|
222
246
|
end
|
|
223
247
|
end
|
|
224
|
-
|
|
248
|
+
|
|
225
249
|
def formatter_options
|
|
226
250
|
@formatter_options ||= OpenStruct.new(
|
|
227
251
|
:colour => colour,
|
|
@@ -230,10 +254,13 @@ module Spec
|
|
|
230
254
|
)
|
|
231
255
|
end
|
|
232
256
|
|
|
257
|
+
def which_heckle_runner
|
|
258
|
+
([/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} || Spec::Ruby.version.to_f == 1.9) ? "spec/runner/heckle_runner_unsupported" : "spec/runner/heckle_runner"
|
|
259
|
+
end
|
|
260
|
+
|
|
233
261
|
def load_heckle_runner(heckle)
|
|
234
262
|
@format_options ||= [['silent', @output_stream]]
|
|
235
|
-
|
|
236
|
-
require "spec/runner/heckle_runner#{suffix}"
|
|
263
|
+
require which_heckle_runner
|
|
237
264
|
@heckle_runner = ::Spec::Runner::HeckleRunner.new(heckle)
|
|
238
265
|
end
|
|
239
266
|
|
|
@@ -257,11 +284,11 @@ module Spec
|
|
|
257
284
|
end
|
|
258
285
|
result
|
|
259
286
|
end
|
|
260
|
-
|
|
287
|
+
|
|
261
288
|
def dry_run?
|
|
262
289
|
@dry_run == true
|
|
263
290
|
end
|
|
264
|
-
|
|
291
|
+
|
|
265
292
|
protected
|
|
266
293
|
|
|
267
294
|
def define_predicate_matchers
|
|
@@ -271,7 +298,7 @@ module Spec
|
|
|
271
298
|
end
|
|
272
299
|
end
|
|
273
300
|
end
|
|
274
|
-
|
|
301
|
+
|
|
275
302
|
def plugin_mock_framework
|
|
276
303
|
case mock_framework
|
|
277
304
|
when Module
|
|
@@ -282,11 +309,15 @@ module Spec
|
|
|
282
309
|
end
|
|
283
310
|
end
|
|
284
311
|
|
|
312
|
+
def ignore_backtrace_patterns
|
|
313
|
+
@backtrace_tweaker.ignore_patterns Spec::Runner.configuration.ignored_backtrace_patterns
|
|
314
|
+
end
|
|
315
|
+
|
|
285
316
|
def examples_should_be_run?
|
|
286
317
|
return @examples_should_be_run unless @examples_should_be_run.nil?
|
|
287
318
|
@examples_should_be_run = true
|
|
288
319
|
end
|
|
289
|
-
|
|
320
|
+
|
|
290
321
|
def differ_class=(klass)
|
|
291
322
|
return unless klass
|
|
292
323
|
@differ_class = klass
|
|
@@ -310,7 +341,7 @@ module Spec
|
|
|
310
341
|
if $_spec_spec ; raise e ; else exit(1) ; end
|
|
311
342
|
end
|
|
312
343
|
end
|
|
313
|
-
|
|
344
|
+
|
|
314
345
|
def custom_runner
|
|
315
346
|
return nil unless custom_runner?
|
|
316
347
|
klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner)
|
|
@@ -321,13 +352,13 @@ module Spec
|
|
|
321
352
|
def custom_runner?
|
|
322
353
|
return user_input_for_runner ? true : false
|
|
323
354
|
end
|
|
324
|
-
|
|
355
|
+
|
|
325
356
|
def heckle
|
|
326
357
|
heckle_runner = self.heckle_runner
|
|
327
358
|
self.heckle_runner = nil
|
|
328
359
|
heckle_runner.heckle_with
|
|
329
360
|
end
|
|
330
|
-
|
|
361
|
+
|
|
331
362
|
def sorted_files
|
|
332
363
|
return sorter ? files.sort(&sorter) : files
|
|
333
364
|
end
|