rspec-core 3.10.1 → 3.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Changelog.md +43 -2
- data/README.md +3 -3
- data/lib/rspec/core/bisect/utilities.rb +12 -1
- data/lib/rspec/core/configuration.rb +17 -4
- data/lib/rspec/core/example.rb +4 -1
- data/lib/rspec/core/example_group.rb +4 -0
- data/lib/rspec/core/example_status_persister.rb +2 -2
- data/lib/rspec/core/formatters/console_codes.rb +17 -9
- data/lib/rspec/core/formatters/exception_presenter.rb +7 -3
- data/lib/rspec/core/formatters/helpers.rb +9 -1
- data/lib/rspec/core/formatters/html_printer.rb +1 -3
- data/lib/rspec/core/formatters/html_snippet_extractor.rb +2 -2
- data/lib/rspec/core/formatters.rb +8 -2
- data/lib/rspec/core/memoized_helpers.rb +29 -3
- data/lib/rspec/core/metadata_filter.rb +1 -1
- data/lib/rspec/core/option_parser.rb +11 -12
- data/lib/rspec/core/ordering.rb +12 -1
- data/lib/rspec/core/pending.rb +8 -16
- data/lib/rspec/core/project_initializer/spec/spec_helper.rb +2 -4
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +14 -4
- data/lib/rspec/core.rb +26 -0
- data.tar.gz.sig +0 -0
- metadata +9 -9
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e01c33b1114655d8891136890c285805fe715c6167fdd8c00985064a179efa73
|
4
|
+
data.tar.gz: e11728db974b653edc413b7fdcfa4e63bb4946fbd3735513236e12ae3718916c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0efeeb10be27c4870f0ef68196bfef4aca0b1c13cb0b3453071ff29a08de0cedcfd0f56d80d90ff71fffee275f30b8089b65fdcdd99398bfe6a16673ba5aff6
|
7
|
+
data.tar.gz: 2f8d22e60bbb22e2de141c4cf6d92cd6cccd4ad90d61d862aa35049d5e2d0636a92655800e64577091496df787217eecf433a8138c147e60aa373e8777b0c9a8
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,7 +1,48 @@
|
|
1
|
+
### Development
|
2
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.12.1...3-12-maintenance)
|
3
|
+
|
4
|
+
### 3.12.1 / 2023-02-03
|
5
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.12.0...v3.12.1)
|
6
|
+
|
7
|
+
Bug fixes:
|
8
|
+
|
9
|
+
* Prevent multiple calls to `extra_failure_lines` from adding additional whitespace
|
10
|
+
around them when the lines already contain whitespace. (Jon Rowe, #3006)
|
11
|
+
|
12
|
+
### 3.12.0 / 2022-10-26
|
13
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.11.0...v3.12.0)
|
14
|
+
|
15
|
+
* No changes, released to support other gems.
|
16
|
+
|
17
|
+
### 3.11.0 / 2022-02-09
|
18
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.10.2...v3.11.0)
|
19
|
+
|
20
|
+
Enhancements:
|
21
|
+
|
22
|
+
* Improve pluralisation of words ending with `s` (like process). (Joshua Pinter, #2779)
|
23
|
+
* Add ordering by file modification time (most recent first). (Matheus Richard, #2778)
|
24
|
+
* Add `to_s` to reserved names for #let and #subject. (Nick Flückiger, #2886)
|
25
|
+
* Introduce `RSpec.current_scope` to expose the current scope in which
|
26
|
+
RSpec is executing. e.g. `:before_example_hook`, `:example` etc. (@odinhb, #2895)
|
27
|
+
* Add named bold colours as options for custom colours. (#2913, #2914)
|
28
|
+
* Warn when (but not prevent) a `SystemExit` occurs. (Jared Beck, #2926)
|
29
|
+
|
30
|
+
### 3.10.2 / 2022-01-27
|
31
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.10.1...v3.10.2)
|
32
|
+
|
33
|
+
Bug fixes:
|
34
|
+
|
35
|
+
* Ensure bisect communication uses consistent encoding. (Mike Jarema, #2852)
|
36
|
+
* Fix exception presenter when the root cause exception has nil backtrace.
|
37
|
+
(Zinovyev Ivan, #2903)
|
38
|
+
* Fix `inspect` output of `RSpec::Core::Example::Procsy` to namespace correctly.
|
39
|
+
(Keiko Kaneko, #2915)
|
40
|
+
* Ensure formatters not exposing `#output` will not crash duplicate check.
|
41
|
+
(@niceking, #2916)
|
42
|
+
|
1
43
|
### 3.10.1 / 2020-12-27
|
2
44
|
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.10.0...v3.10.1)
|
3
45
|
|
4
|
-
|
5
46
|
Bug fixes:
|
6
47
|
|
7
48
|
* RSpec warning output was missing deprecations from Ruby, these are now included.
|
@@ -17,7 +58,7 @@ Enhancements:
|
|
17
58
|
* Add configuration for an error exit code (to disambiguate errored builds from failed builds
|
18
59
|
by exit status). (Dana Sherson, #2749)
|
19
60
|
|
20
|
-
|
61
|
+
### 3.9.3 / 2020-09-30
|
21
62
|
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.9.2...v3.9.3)
|
22
63
|
|
23
64
|
Bug Fixes:
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# rspec-core [![Build Status](https://
|
1
|
+
# rspec-core [![Build Status](https://github.com/rspec/rspec-core/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-core/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-core.svg)](https://codeclimate.com/github/rspec/rspec-core)
|
2
2
|
|
3
3
|
rspec-core provides the structure for writing executable examples of how your
|
4
4
|
code should behave, and an `rspec` command with tools to constrain which
|
@@ -322,14 +322,14 @@ Failures:
|
|
322
322
|
got: nil
|
323
323
|
|
324
324
|
(compared using ==)
|
325
|
-
# ./spec/
|
325
|
+
# ./spec/calculator_spec.rb:6:in `block (3 levels) in <top (required)>'
|
326
326
|
|
327
327
|
Finished in 0.00131 seconds (files took 0.10968 seconds to load)
|
328
328
|
1 example, 1 failure
|
329
329
|
|
330
330
|
Failed examples:
|
331
331
|
|
332
|
-
rspec ./spec/
|
332
|
+
rspec ./spec/calculator_spec.rb:5 # Calculator#add returns the sum of its arguments
|
333
333
|
```
|
334
334
|
|
335
335
|
Implement the simplest solution, by changing the definition of `Calculator#add` to:
|
@@ -29,11 +29,22 @@ module RSpec
|
|
29
29
|
end
|
30
30
|
|
31
31
|
# Wraps a pipe to support sending objects between a child and
|
32
|
-
# parent process.
|
32
|
+
# parent process. Where supported, encoding is explicitly
|
33
|
+
# set to ensure binary data is able to pass from child to
|
34
|
+
# parent.
|
33
35
|
# @private
|
34
36
|
class Channel
|
37
|
+
if String.method_defined?(:encoding)
|
38
|
+
MARSHAL_DUMP_ENCODING = Marshal.dump("").encoding
|
39
|
+
end
|
40
|
+
|
35
41
|
def initialize
|
36
42
|
@read_io, @write_io = IO.pipe
|
43
|
+
|
44
|
+
if defined?(MARSHAL_DUMP_ENCODING) && IO.method_defined?(:set_encoding)
|
45
|
+
# Ensure the pipe can send any content produced by Marshal.dump
|
46
|
+
@write_io.set_encoding MARSHAL_DUMP_ENCODING
|
47
|
+
end
|
37
48
|
end
|
38
49
|
|
39
50
|
def send(message)
|
@@ -502,7 +502,8 @@ module RSpec
|
|
502
502
|
# @private
|
503
503
|
attr_reader :backtrace_formatter, :ordering_manager, :loaded_spec_files
|
504
504
|
|
505
|
-
# rubocop:disable Metrics/AbcSize
|
505
|
+
# rubocop:disable Metrics/AbcSize
|
506
|
+
# rubocop:disable Metrics/MethodLength
|
506
507
|
|
507
508
|
# Build an object to store runtime configuration options and set defaults
|
508
509
|
def initialize
|
@@ -561,7 +562,8 @@ module RSpec
|
|
561
562
|
|
562
563
|
define_built_in_hooks
|
563
564
|
end
|
564
|
-
# rubocop:enable Metrics/
|
565
|
+
# rubocop:enable Metrics/AbcSize
|
566
|
+
# rubocop:enable Metrics/MethodLength
|
565
567
|
|
566
568
|
# @private
|
567
569
|
#
|
@@ -676,7 +678,7 @@ module RSpec
|
|
676
678
|
end
|
677
679
|
|
678
680
|
# Set regular expressions used to exclude lines in backtrace.
|
679
|
-
# @param patterns [Array<Regexp>] set backtrace_formatter
|
681
|
+
# @param patterns [Array<Regexp>] set backtrace_formatter exclusion_patterns
|
680
682
|
def backtrace_exclusion_patterns=(patterns)
|
681
683
|
@backtrace_formatter.exclusion_patterns = patterns
|
682
684
|
end
|
@@ -1818,7 +1820,7 @@ module RSpec
|
|
1818
1820
|
# by not setting `mock_with` or `expect_with` to anything else).
|
1819
1821
|
#
|
1820
1822
|
# @note If the user uses this options with `mock_with :mocha`
|
1821
|
-
# (or
|
1823
|
+
# (or similar) they will still have monkey patching active
|
1822
1824
|
# in their test environment from mocha.
|
1823
1825
|
#
|
1824
1826
|
# @example
|
@@ -2063,10 +2065,13 @@ module RSpec
|
|
2063
2065
|
return yield if dry_run?
|
2064
2066
|
|
2065
2067
|
begin
|
2068
|
+
RSpec.current_scope = :before_suite_hook
|
2066
2069
|
run_suite_hooks("a `before(:suite)` hook", @before_suite_hooks)
|
2067
2070
|
yield
|
2068
2071
|
ensure
|
2072
|
+
RSpec.current_scope = :after_suite_hook
|
2069
2073
|
run_suite_hooks("an `after(:suite)` hook", @after_suite_hooks)
|
2074
|
+
RSpec.current_scope = :suite
|
2070
2075
|
end
|
2071
2076
|
end
|
2072
2077
|
|
@@ -2119,6 +2124,14 @@ module RSpec
|
|
2119
2124
|
relative_file = Metadata.relative_path(file)
|
2120
2125
|
reporter.notify_non_example_exception(ex, "An error occurred while loading #{relative_file}.")
|
2121
2126
|
RSpec.world.wants_to_quit = true
|
2127
|
+
rescue SystemExit => ex
|
2128
|
+
relative_file = Metadata.relative_path(file)
|
2129
|
+
reporter.notify_non_example_exception(
|
2130
|
+
ex,
|
2131
|
+
"While loading #{relative_file} an `exit` / `raise SystemExit` occurred, RSpec will now quit."
|
2132
|
+
)
|
2133
|
+
RSpec.world.rspec_is_quitting = true
|
2134
|
+
raise ex
|
2122
2135
|
end
|
2123
2136
|
|
2124
2137
|
def handle_suite_hook(scope, meta)
|
data/lib/rspec/core/example.rb
CHANGED
@@ -259,6 +259,7 @@ module RSpec
|
|
259
259
|
with_around_and_singleton_context_hooks do
|
260
260
|
begin
|
261
261
|
run_before_example
|
262
|
+
RSpec.current_scope = :example
|
262
263
|
@example_group_instance.instance_exec(self, &@example_block)
|
263
264
|
|
264
265
|
if pending?
|
@@ -278,6 +279,7 @@ module RSpec
|
|
278
279
|
rescue AllExceptionsExcludingDangerousOnesOnRubiesThatAllowIt => e
|
279
280
|
set_exception(e)
|
280
281
|
ensure
|
282
|
+
RSpec.current_scope = :after_example_hook
|
281
283
|
run_after_example
|
282
284
|
end
|
283
285
|
end
|
@@ -375,7 +377,7 @@ module RSpec
|
|
375
377
|
|
376
378
|
# @private
|
377
379
|
def inspect
|
378
|
-
@example.inspect.gsub('Example', '
|
380
|
+
@example.inspect.gsub('Example', 'Example::Procsy')
|
379
381
|
end
|
380
382
|
end
|
381
383
|
|
@@ -462,6 +464,7 @@ module RSpec
|
|
462
464
|
end
|
463
465
|
|
464
466
|
def with_around_example_hooks
|
467
|
+
RSpec.current_scope = :before_example_hook
|
465
468
|
hooks.run(:around, :example, self) { yield }
|
466
469
|
rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e
|
467
470
|
set_exception(e)
|
@@ -602,6 +602,7 @@ module RSpec
|
|
602
602
|
|
603
603
|
should_run_context_hooks = descendant_filtered_examples.any?
|
604
604
|
begin
|
605
|
+
RSpec.current_scope = :before_context_hook
|
605
606
|
run_before_context_hooks(new('before(:context) hook')) if should_run_context_hooks
|
606
607
|
result_for_this_group = run_examples(reporter)
|
607
608
|
results_for_descendants = ordering_strategy.order(children).map { |child| child.run(reporter) }.all?
|
@@ -614,6 +615,7 @@ module RSpec
|
|
614
615
|
RSpec.world.wants_to_quit = true if reporter.fail_fast_limit_met?
|
615
616
|
false
|
616
617
|
ensure
|
618
|
+
RSpec.current_scope = :after_context_hook
|
617
619
|
run_after_context_hooks(new('after(:context) hook')) if should_run_context_hooks
|
618
620
|
reporter.example_group_finished(self)
|
619
621
|
end
|
@@ -701,6 +703,7 @@ module RSpec
|
|
701
703
|
end
|
702
704
|
end
|
703
705
|
|
706
|
+
# @private
|
704
707
|
def initialize(inspect_output=nil)
|
705
708
|
@__inspect_output = inspect_output || '(no description provided)'
|
706
709
|
super() # no args get passed
|
@@ -782,6 +785,7 @@ module RSpec
|
|
782
785
|
# @return [String] the location where the shared example was included
|
783
786
|
attr_reader :inclusion_location
|
784
787
|
|
788
|
+
# @private
|
785
789
|
def initialize(shared_group_name, inclusion_location)
|
786
790
|
@shared_group_name = shared_group_name
|
787
791
|
@inclusion_location = inclusion_location
|
@@ -63,7 +63,7 @@ module RSpec
|
|
63
63
|
# were loaded but not executed (due to filtering, `--fail-fast`
|
64
64
|
# or whatever) should have a `:status` of `UNKNOWN_STATUS`.
|
65
65
|
#
|
66
|
-
# This
|
66
|
+
# This will produce a new list that:
|
67
67
|
# - Will be missing examples from previous runs that we know for sure
|
68
68
|
# no longer exist.
|
69
69
|
# - Will have the latest known status for any examples that either
|
@@ -164,7 +164,7 @@ module RSpec
|
|
164
164
|
end
|
165
165
|
|
166
166
|
def formatted_value_rows
|
167
|
-
@
|
167
|
+
@formatted_value_rows ||= rows.map do |row|
|
168
168
|
formatted_row_from(row)
|
169
169
|
end
|
170
170
|
end
|
@@ -7,15 +7,23 @@ module RSpec
|
|
7
7
|
# @private
|
8
8
|
VT100_CODES =
|
9
9
|
{
|
10
|
-
:black
|
11
|
-
:red
|
12
|
-
:green
|
13
|
-
:yellow
|
14
|
-
:blue
|
15
|
-
:magenta
|
16
|
-
:cyan
|
17
|
-
:white
|
18
|
-
:
|
10
|
+
:black => 30,
|
11
|
+
:red => 31,
|
12
|
+
:green => 32,
|
13
|
+
:yellow => 33,
|
14
|
+
:blue => 34,
|
15
|
+
:magenta => 35,
|
16
|
+
:cyan => 36,
|
17
|
+
:white => 37,
|
18
|
+
:bold_black => '1;30',
|
19
|
+
:bold_red => '1;31',
|
20
|
+
:bold_green => '1;32',
|
21
|
+
:bold_yellow => '1;33',
|
22
|
+
:bold_blue => '1;34',
|
23
|
+
:bold_magenta => '1;35',
|
24
|
+
:bold_cyan => '1;36',
|
25
|
+
:bold_white => '1;37',
|
26
|
+
:bold => 1,
|
19
27
|
}
|
20
28
|
# @private
|
21
29
|
VT100_CODE_VALUES = VT100_CODES.invert
|
@@ -55,7 +55,7 @@ module RSpec
|
|
55
55
|
cause << " #{line}"
|
56
56
|
end
|
57
57
|
|
58
|
-
unless last_cause.backtrace.empty?
|
58
|
+
unless last_cause.backtrace.nil? || last_cause.backtrace.empty?
|
59
59
|
cause << (" #{backtrace_formatter.format_backtrace(last_cause.backtrace, example.metadata).first}")
|
60
60
|
end
|
61
61
|
end
|
@@ -197,8 +197,8 @@ module RSpec
|
|
197
197
|
@extra_failure_lines ||= begin
|
198
198
|
lines = Array(example.metadata[:extra_failure_lines])
|
199
199
|
unless lines.empty?
|
200
|
-
lines.unshift('')
|
201
|
-
lines.push('')
|
200
|
+
lines.unshift('') unless lines.first == ''
|
201
|
+
lines.push('') unless lines.last == ''
|
202
202
|
end
|
203
203
|
lines
|
204
204
|
end
|
@@ -242,6 +242,10 @@ module RSpec
|
|
242
242
|
line_regex = RSpec.configuration.in_project_source_dir_regex
|
243
243
|
loaded_spec_files = RSpec.configuration.loaded_spec_files
|
244
244
|
|
245
|
+
exception_backtrace.reject! do |line|
|
246
|
+
line.start_with?("<internal:")
|
247
|
+
end
|
248
|
+
|
245
249
|
exception_backtrace.find do |line|
|
246
250
|
next unless (line_path = line[/(.+?):(\d+)(|:\d+)/, 1])
|
247
251
|
path = File.expand_path(line_path)
|
@@ -86,7 +86,15 @@ module RSpec
|
|
86
86
|
# @param string [String] word to be pluralized
|
87
87
|
# @return [String] pluralized word
|
88
88
|
def self.pluralize(count, string)
|
89
|
-
|
89
|
+
pluralized_string = if count.to_f == 1
|
90
|
+
string
|
91
|
+
elsif string.end_with?('s') # e.g. "process"
|
92
|
+
"#{string}es" # e.g. "processes"
|
93
|
+
else
|
94
|
+
"#{string}s"
|
95
|
+
end
|
96
|
+
|
97
|
+
"#{count} #{pluralized_string}"
|
90
98
|
end
|
91
99
|
|
92
100
|
# @api private
|
@@ -33,10 +33,8 @@ module RSpec
|
|
33
33
|
"<span class='duration'>#{formatted_run_time}s</span></dd>"
|
34
34
|
end
|
35
35
|
|
36
|
-
# rubocop:disable Metrics/ParameterLists
|
37
36
|
def print_example_failed(pending_fixed, description, run_time, failure_id,
|
38
37
|
exception, extra_content)
|
39
|
-
# rubocop:enable Metrics/ParameterLists
|
40
38
|
formatted_run_time = "%.5f" % run_time
|
41
39
|
|
42
40
|
@output.puts " <dd class=\"example #{pending_fixed ? 'pending_fixed' : 'failed'}\">"
|
@@ -215,7 +213,7 @@ function assign_display_style_for_group(classname, display_flag, subgroup_flag)
|
|
215
213
|
}
|
216
214
|
}
|
217
215
|
EOF
|
218
|
-
# rubocop:enable LineLength
|
216
|
+
# rubocop:enable Layout/LineLength
|
219
217
|
|
220
218
|
GLOBAL_STYLES = <<-EOF
|
221
219
|
#rspec-header {
|
@@ -43,7 +43,7 @@ module RSpec
|
|
43
43
|
#
|
44
44
|
# @param backtrace [String] the backtrace from a test failure
|
45
45
|
# @return [String] highlighted code snippet indicating where the test
|
46
|
-
# failure
|
46
|
+
# failure occurred
|
47
47
|
#
|
48
48
|
# @see #post_process
|
49
49
|
def snippet(backtrace)
|
@@ -103,7 +103,7 @@ module RSpec
|
|
103
103
|
#
|
104
104
|
# @param highlighted [String] syntax-highlighted snippet surrounding the
|
105
105
|
# offending line of code
|
106
|
-
# @param offending_line [Fixnum] line where failure
|
106
|
+
# @param offending_line [Fixnum] line where failure occurred
|
107
107
|
# @return [String] completed snippet
|
108
108
|
def post_process(highlighted, offending_line)
|
109
109
|
new_lines = []
|
@@ -79,7 +79,7 @@ module RSpec::Core::Formatters
|
|
79
79
|
|
80
80
|
# Register the formatter class
|
81
81
|
# @param formatter_class [Class] formatter class to register
|
82
|
-
# @param notifications [Symbol
|
82
|
+
# @param notifications [Array<Symbol>] one or more notifications to be
|
83
83
|
# registered to the specified formatter
|
84
84
|
#
|
85
85
|
# @see RSpec::Core::Formatters::BaseFormatter
|
@@ -194,10 +194,16 @@ module RSpec::Core::Formatters
|
|
194
194
|
|
195
195
|
def duplicate_formatter_exists?(new_formatter)
|
196
196
|
@formatters.any? do |formatter|
|
197
|
-
formatter.class == new_formatter.class &&
|
197
|
+
formatter.class == new_formatter.class &&
|
198
|
+
has_matching_output?(formatter, new_formatter)
|
198
199
|
end
|
199
200
|
end
|
200
201
|
|
202
|
+
def has_matching_output?(formatter, new_formatter)
|
203
|
+
return true unless formatter.respond_to?(:output) && new_formatter.respond_to?(:output)
|
204
|
+
formatter.output == new_formatter.output
|
205
|
+
end
|
206
|
+
|
201
207
|
def existing_formatter_implements?(notification)
|
202
208
|
@reporter.registered_listeners(notification).any?
|
203
209
|
end
|
@@ -78,6 +78,7 @@ module RSpec
|
|
78
78
|
# @note If you are using RSpec's newer expect-based syntax you may
|
79
79
|
# want to use `is_expected.to` instead of `should`.
|
80
80
|
def should(matcher=nil, message=nil)
|
81
|
+
enforce_value_expectation(matcher, 'should')
|
81
82
|
RSpec::Expectations::PositiveExpectationHandler.handle_matcher(subject, matcher, message)
|
82
83
|
end
|
83
84
|
|
@@ -97,6 +98,7 @@ module RSpec
|
|
97
98
|
# @note If you are using RSpec's newer expect-based syntax you may
|
98
99
|
# want to use `is_expected.to_not` instead of `should_not`.
|
99
100
|
def should_not(matcher=nil, message=nil)
|
101
|
+
enforce_value_expectation(matcher, 'should_not')
|
100
102
|
RSpec::Expectations::NegativeExpectationHandler.handle_matcher(subject, matcher, message)
|
101
103
|
end
|
102
104
|
|
@@ -144,6 +146,26 @@ module RSpec
|
|
144
146
|
end
|
145
147
|
end
|
146
148
|
|
149
|
+
# @private
|
150
|
+
def enforce_value_expectation(matcher, method_name)
|
151
|
+
return if matcher_supports_value_expectations?(matcher)
|
152
|
+
|
153
|
+
RSpec.deprecate(
|
154
|
+
"#{method_name} #{RSpec::Support::ObjectFormatter.format(matcher)}",
|
155
|
+
:message =>
|
156
|
+
"The implicit block expectation syntax is deprecated, you should pass " \
|
157
|
+
"a block to `expect` to use the provided block expectation matcher " \
|
158
|
+
"(#{RSpec::Support::ObjectFormatter.format(matcher)}), " \
|
159
|
+
"or the matcher must implement `supports_value_expectations?`."
|
160
|
+
)
|
161
|
+
end
|
162
|
+
|
163
|
+
def matcher_supports_value_expectations?(matcher)
|
164
|
+
matcher.supports_value_expectations?
|
165
|
+
rescue
|
166
|
+
true
|
167
|
+
end
|
168
|
+
|
147
169
|
# @private
|
148
170
|
class ThreadsafeMemoized
|
149
171
|
def initialize
|
@@ -285,9 +307,13 @@ EOS
|
|
285
307
|
# We have to pass the block directly to `define_method` to
|
286
308
|
# allow it to use method constructs like `super` and `return`.
|
287
309
|
raise "#let or #subject called without a block" if block.nil?
|
288
|
-
|
289
|
-
|
290
|
-
|
310
|
+
|
311
|
+
# A list of reserved words that can't be used as a name for a memoized helper
|
312
|
+
# Matches for both symbols and passed strings
|
313
|
+
if [:initialize, :to_s].include?(name.to_sym)
|
314
|
+
raise ArgumentError, "#let or #subject called with reserved name `#{name}`"
|
315
|
+
end
|
316
|
+
|
291
317
|
our_module = MemoizedHelpers.module_for(self)
|
292
318
|
|
293
319
|
# If we have a module clash in our helper module
|
@@ -92,7 +92,7 @@ module RSpec
|
|
92
92
|
#
|
93
93
|
# This is ideal for use by a example or example group, which may
|
94
94
|
# be updated multiple times with globally configured hooks, etc,
|
95
|
-
# but will not be queried frequently by other examples or
|
95
|
+
# but will not be queried frequently by other examples or example
|
96
96
|
# groups.
|
97
97
|
# @private
|
98
98
|
class UpdateOptimized
|
@@ -32,11 +32,10 @@ module RSpec::Core
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
# rubocop:disable MethodLength
|
36
35
|
# rubocop:disable Metrics/AbcSize
|
37
|
-
# rubocop:disable
|
38
|
-
# rubocop:disable
|
39
|
-
# rubocop:disable Metrics/
|
36
|
+
# rubocop:disable Metrics/MethodLength
|
37
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
38
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
40
39
|
def parser(options)
|
41
40
|
OptionParser.new do |parser|
|
42
41
|
parser.summary_width = 34
|
@@ -58,10 +57,11 @@ module RSpec::Core
|
|
58
57
|
end
|
59
58
|
|
60
59
|
parser.on('--order TYPE[:SEED]', 'Run examples by the specified order type.',
|
61
|
-
' [defined]
|
62
|
-
' [rand]
|
63
|
-
' [random]
|
64
|
-
' [random:SEED]
|
60
|
+
' [defined] examples and groups are run in the order they are defined',
|
61
|
+
' [rand] randomize the order of groups and examples',
|
62
|
+
' [random] alias for rand',
|
63
|
+
' [random:SEED] e.g. --order random:123',
|
64
|
+
' [recently-modified] run the most recently modified files first') do |o|
|
65
65
|
options[:order] = o
|
66
66
|
end
|
67
67
|
|
@@ -302,11 +302,10 @@ FILTERING
|
|
302
302
|
end
|
303
303
|
end
|
304
304
|
end
|
305
|
-
# rubocop:enable Metrics/BlockLength
|
306
305
|
# rubocop:enable Metrics/AbcSize
|
307
|
-
# rubocop:enable MethodLength
|
308
|
-
# rubocop:enable CyclomaticComplexity
|
309
|
-
# rubocop:enable PerceivedComplexity
|
306
|
+
# rubocop:enable Metrics/MethodLength
|
307
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
308
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
310
309
|
|
311
310
|
def add_tag_filter(options, filter_type, tag_name, value=true)
|
312
311
|
(options[filter_type] ||= {})[tag_name] = value
|
data/lib/rspec/core/ordering.rb
CHANGED
@@ -58,6 +58,14 @@ module RSpec
|
|
58
58
|
MAX_32_BIT = 4_294_967_295
|
59
59
|
end
|
60
60
|
|
61
|
+
# @private
|
62
|
+
# Orders items by modification time (most recent modified first).
|
63
|
+
class RecentlyModified
|
64
|
+
def order(list)
|
65
|
+
list.sort_by { |item| -File.mtime(item.metadata[:absolute_file_path]).to_i }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
61
69
|
# @private
|
62
70
|
# Orders items based on a custom block.
|
63
71
|
class Custom
|
@@ -77,7 +85,8 @@ module RSpec
|
|
77
85
|
@configuration = configuration
|
78
86
|
@strategies = {}
|
79
87
|
|
80
|
-
register(:random,
|
88
|
+
register(:random, Random.new(configuration))
|
89
|
+
register(:recently_modified, RecentlyModified.new)
|
81
90
|
|
82
91
|
identity = Identity.new
|
83
92
|
register(:defined, identity)
|
@@ -132,6 +141,8 @@ module RSpec
|
|
132
141
|
:random
|
133
142
|
elsif order == 'defined'
|
134
143
|
:defined
|
144
|
+
elsif order == 'recently-modified'
|
145
|
+
:recently_modified
|
135
146
|
end
|
136
147
|
|
137
148
|
register_ordering(:global, ordering_registry.fetch(ordering_name)) if ordering_name
|
data/lib/rspec/core/pending.rb
CHANGED
@@ -38,7 +38,7 @@ module RSpec
|
|
38
38
|
# @param message [String] optional message to add to the summary report.
|
39
39
|
#
|
40
40
|
# @example
|
41
|
-
# describe "
|
41
|
+
# describe "some behaviour" do
|
42
42
|
# # reported as "Pending: no reason given"
|
43
43
|
# it "is pending with no message" do
|
44
44
|
# pending
|
@@ -52,21 +52,13 @@ module RSpec
|
|
52
52
|
# end
|
53
53
|
# end
|
54
54
|
#
|
55
|
-
# @note `
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
# end
|
63
|
-
#
|
64
|
-
# or pass `:pending => "something else getting finished"` to add a
|
65
|
-
# message to the summary report:
|
66
|
-
#
|
67
|
-
# it "does something", :pending => "something else getting finished" do
|
68
|
-
# # ...
|
69
|
-
# end
|
55
|
+
# @note When using `pending` inside an example body using this method
|
56
|
+
# hooks, such as `before(:example)`, have already be run. This means that
|
57
|
+
# a failure from the code in the `before` hook will prevent the example
|
58
|
+
# from being considered pending, as the example body would not be
|
59
|
+
# executed. If you need to consider hooks as pending as well you can use
|
60
|
+
# the pending metadata as an alternative, e.g.
|
61
|
+
# `it "does something", pending: "message"`.
|
70
62
|
def pending(message=nil)
|
71
63
|
current_example = RSpec.current_example
|
72
64
|
|
@@ -12,7 +12,7 @@
|
|
12
12
|
# the additional setup, and require it from the spec files that actually need
|
13
13
|
# it.
|
14
14
|
#
|
15
|
-
# See
|
15
|
+
# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
16
16
|
RSpec.configure do |config|
|
17
17
|
# rspec-expectations config goes here. You can use an alternate
|
18
18
|
# assertion/expectation library such as wrong or the stdlib/minitest
|
@@ -61,9 +61,7 @@ RSpec.configure do |config|
|
|
61
61
|
|
62
62
|
# Limits the available syntax to the non-monkey patched syntax that is
|
63
63
|
# recommended. For more details, see:
|
64
|
-
#
|
65
|
-
# - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
66
|
-
# - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
|
64
|
+
# https://relishapp.com/rspec/rspec-core/docs/configuration/zero-monkey-patching-mode
|
67
65
|
config.disable_monkey_patching!
|
68
66
|
|
69
67
|
# This setting enables warnings. It's recommended, but in some cases may
|
data/lib/rspec/core/version.rb
CHANGED
data/lib/rspec/core/world.rb
CHANGED
@@ -10,6 +10,13 @@ module RSpec
|
|
10
10
|
# Used internally to determine what to do when a SIGINT is received.
|
11
11
|
attr_accessor :wants_to_quit
|
12
12
|
|
13
|
+
# Used internally to signify that a SystemExit occurred in
|
14
|
+
# `Configuration#load_file_handling_errors`, and thus examples cannot
|
15
|
+
# be counted accurately. Specifically, we cannot accurately report
|
16
|
+
# "No examples found".
|
17
|
+
# @private
|
18
|
+
attr_accessor :rspec_is_quitting
|
19
|
+
|
13
20
|
# Used internally to signal that a failure outside of an example
|
14
21
|
# has occurred, and that therefore the exit status should indicate
|
15
22
|
# the run failed.
|
@@ -18,6 +25,7 @@ module RSpec
|
|
18
25
|
|
19
26
|
def initialize(configuration=RSpec.configuration)
|
20
27
|
@wants_to_quit = false
|
28
|
+
@rspec_is_quitting = false
|
21
29
|
@configuration = configuration
|
22
30
|
configuration.world = self
|
23
31
|
@example_groups = []
|
@@ -184,10 +192,12 @@ module RSpec
|
|
184
192
|
return unless example_count.zero?
|
185
193
|
|
186
194
|
example_groups.clear
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
195
|
+
unless rspec_is_quitting
|
196
|
+
if filter_manager.empty?
|
197
|
+
report_filter_message("No examples found.")
|
198
|
+
elsif exclusion_filter.empty? || inclusion_filter.empty?
|
199
|
+
report_filter_message(everything_filtered_message)
|
200
|
+
end
|
191
201
|
end
|
192
202
|
end
|
193
203
|
|
data/lib/rspec/core.rb
CHANGED
@@ -129,6 +129,32 @@ module RSpec
|
|
129
129
|
RSpec::Support.thread_local_data[:current_example] = example
|
130
130
|
end
|
131
131
|
|
132
|
+
# Set the current scope rspec is executing in
|
133
|
+
# @api private
|
134
|
+
def self.current_scope=(scope)
|
135
|
+
RSpec::Support.thread_local_data[:current_scope] = scope
|
136
|
+
end
|
137
|
+
RSpec.current_scope = :suite
|
138
|
+
|
139
|
+
# Get the current RSpec execution scope
|
140
|
+
#
|
141
|
+
# Returns (in order of lifecycle):
|
142
|
+
# * `:suite` as an initial value, this is outside of the test lifecycle.
|
143
|
+
# * `:before_suite_hook` during `before(:suite)` hooks.
|
144
|
+
# * `:before_context_hook` during `before(:context)` hooks.
|
145
|
+
# * `:before_example_hook` during `before(:example)` hooks and `around(:example)` before `example.run`.
|
146
|
+
# * `:example` within the example run.
|
147
|
+
# * `:after_example_hook` during `after(:example)` hooks and `around(:example)` after `example.run`.
|
148
|
+
# * `:after_context_hook` during `after(:context)` hooks.
|
149
|
+
# * `:after_suite_hook` during `after(:suite)` hooks.
|
150
|
+
# * `:suite` as a final value, again this is outside of the test lifecycle.
|
151
|
+
#
|
152
|
+
# Reminder, `:context` hooks have `:all` alias and `:example` hooks have `:each` alias.
|
153
|
+
# @return [Symbol]
|
154
|
+
def self.current_scope
|
155
|
+
RSpec::Support.thread_local_data[:current_scope]
|
156
|
+
end
|
157
|
+
|
132
158
|
# @private
|
133
159
|
# Internal container for global non-configuration data.
|
134
160
|
def self.world
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.12.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Baker
|
@@ -46,7 +46,7 @@ cert_chain:
|
|
46
46
|
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
47
47
|
F3MdtaDehhjC
|
48
48
|
-----END CERTIFICATE-----
|
49
|
-
date:
|
49
|
+
date: 2023-02-03 00:00:00.000000000 Z
|
50
50
|
dependencies:
|
51
51
|
- !ruby/object:Gem::Dependency
|
52
52
|
name: rspec-support
|
@@ -54,26 +54,26 @@ dependencies:
|
|
54
54
|
requirements:
|
55
55
|
- - "~>"
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version: 3.
|
57
|
+
version: 3.12.0
|
58
58
|
type: :runtime
|
59
59
|
prerelease: false
|
60
60
|
version_requirements: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
62
|
- - "~>"
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version: 3.
|
64
|
+
version: 3.12.0
|
65
65
|
- !ruby/object:Gem::Dependency
|
66
66
|
name: cucumber
|
67
67
|
requirement: !ruby/object:Gem::Requirement
|
68
68
|
requirements:
|
69
|
-
- - "
|
69
|
+
- - ">="
|
70
70
|
- !ruby/object:Gem::Version
|
71
71
|
version: '1.3'
|
72
72
|
type: :development
|
73
73
|
prerelease: false
|
74
74
|
version_requirements: !ruby/object:Gem::Requirement
|
75
75
|
requirements:
|
76
|
-
- - "
|
76
|
+
- - ">="
|
77
77
|
- !ruby/object:Gem::Version
|
78
78
|
version: '1.3'
|
79
79
|
- !ruby/object:Gem::Dependency
|
@@ -267,7 +267,7 @@ licenses:
|
|
267
267
|
- MIT
|
268
268
|
metadata:
|
269
269
|
bug_tracker_uri: https://github.com/rspec/rspec-core/issues
|
270
|
-
changelog_uri: https://github.com/rspec/rspec-core/blob/v3.
|
270
|
+
changelog_uri: https://github.com/rspec/rspec-core/blob/v3.12.1/Changelog.md
|
271
271
|
documentation_uri: https://rspec.info/documentation/
|
272
272
|
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
273
273
|
source_code_uri: https://github.com/rspec/rspec-core
|
@@ -287,8 +287,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
287
287
|
- !ruby/object:Gem::Version
|
288
288
|
version: '0'
|
289
289
|
requirements: []
|
290
|
-
rubygems_version: 3.
|
290
|
+
rubygems_version: 3.3.26
|
291
291
|
signing_key:
|
292
292
|
specification_version: 4
|
293
|
-
summary: rspec-core-3.
|
293
|
+
summary: rspec-core-3.12.1
|
294
294
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|