rspec-core 3.10.1 → 3.12.1
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.
- 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 [](https://github.com/rspec/rspec-core/actions) [](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
|