rspec-support 3.0.4 → 3.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/Changelog.md +322 -0
- data/{LICENSE.txt → LICENSE.md} +3 -2
- data/README.md +29 -6
- data/lib/rspec/support/caller_filter.rb +35 -16
- data/lib/rspec/support/comparable_version.rb +46 -0
- data/lib/rspec/support/differ.rb +51 -41
- data/lib/rspec/support/directory_maker.rb +63 -0
- data/lib/rspec/support/encoded_string.rb +110 -15
- data/lib/rspec/support/fuzzy_matcher.rb +5 -6
- data/lib/rspec/support/hunk_generator.rb +0 -1
- data/lib/rspec/support/matcher_definition.rb +42 -0
- data/lib/rspec/support/method_signature_verifier.rb +287 -54
- data/lib/rspec/support/mutex.rb +73 -0
- data/lib/rspec/support/object_formatter.rb +275 -0
- data/lib/rspec/support/recursive_const_methods.rb +76 -0
- data/lib/rspec/support/reentrant_mutex.rb +78 -0
- data/lib/rspec/support/ruby_features.rb +177 -14
- data/lib/rspec/support/source/location.rb +21 -0
- data/lib/rspec/support/source/node.rb +110 -0
- data/lib/rspec/support/source/token.rb +94 -0
- data/lib/rspec/support/source.rb +85 -0
- data/lib/rspec/support/spec/deprecation_helpers.rb +19 -32
- data/lib/rspec/support/spec/diff_helpers.rb +31 -0
- data/lib/rspec/support/spec/in_sub_process.rb +43 -16
- data/lib/rspec/support/spec/library_wide_checks.rb +150 -0
- data/lib/rspec/support/spec/shell_out.rb +108 -0
- data/lib/rspec/support/spec/stderr_splitter.rb +31 -9
- data/lib/rspec/support/spec/string_matcher.rb +45 -0
- data/lib/rspec/support/spec/with_isolated_directory.rb +13 -0
- data/lib/rspec/support/spec/with_isolated_stderr.rb +0 -2
- data/lib/rspec/support/spec.rb +46 -26
- data/lib/rspec/support/version.rb +1 -1
- data/lib/rspec/support/warnings.rb +6 -6
- data/lib/rspec/support/with_keywords_when_needed.rb +33 -0
- data/lib/rspec/support.rb +87 -3
- data.tar.gz.sig +0 -0
- metadata +70 -52
- metadata.gz.sig +0 -0
- data/lib/rspec/support/version_checker.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cd43ff0da6f307b7e9ccc56ceb9e3fdd972f27b7d160b8ba860c6625bb62f39b
|
4
|
+
data.tar.gz: a0c09feee171d7a1b02793888c995d9dd42f20660b6449db9c79eeed4a297b3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 247e3e818ef3c367c1ecbc4938dca5a0ca7c9b185c1b608900461e146ea1f8c5053e0d97adc692cd0871debeb764407a3403682ce425aebf1de6511f17f366fc
|
7
|
+
data.tar.gz: b3b600ca9061f37b529af60308df73b4c9724de1d173ee01eda44c0f61404396d8f2af7a52b071db93299bb607905e8b1aa3ddac29cc364ef41136a1815735d1
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,3 +1,325 @@
|
|
1
|
+
### Development
|
2
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.1...3-12-maintenance)
|
3
|
+
|
4
|
+
### 3.12.1 / 2023-06-26
|
5
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.0...v3.12.1)
|
6
|
+
|
7
|
+
Bug Fixes:
|
8
|
+
|
9
|
+
* Fix `RSpec::Support.thread_local_data` to be Thread local but not Fiber local.
|
10
|
+
(Jon Rowe, #581)
|
11
|
+
|
12
|
+
### 3.12.0 / 2022-10-26
|
13
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.11.1...v3.12.0)
|
14
|
+
Enhancements:
|
15
|
+
|
16
|
+
* Add `RSpec::Support::RubyFeatures.distincts_kw_args_from_positional_hash?`
|
17
|
+
(Jean byroot Boussier, #535)
|
18
|
+
|
19
|
+
### 3.11.1 / 2022-09-12
|
20
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.11.0...v3.11.1)
|
21
|
+
|
22
|
+
Bug Fixes:
|
23
|
+
|
24
|
+
* Fix ripper detection on TruffleRuby. (Brandon Fish, #541)
|
25
|
+
|
26
|
+
### 3.11.0 / 2022-02-09
|
27
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.3...v3.11.0)
|
28
|
+
|
29
|
+
No changes. Released to support other RSpec releases.
|
30
|
+
|
31
|
+
### 3.10.3 / 2021-11-03
|
32
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.2...v3.10.3)
|
33
|
+
|
34
|
+
Bug Fixes:
|
35
|
+
|
36
|
+
* Use `Mutex#owned?` to allow `RSpec::Support::ReentrantMutex` to work in
|
37
|
+
nested Fibers on Ruby 3.0 and later. (Benoit Daloze, #503, #504)
|
38
|
+
* Support `end`-less methods in `RSpec::Support::Source::Token`
|
39
|
+
so that RSpec won't hang when an `end`-less method raises an error. (Yuji Nakayama, #505)
|
40
|
+
|
41
|
+
### 3.10.2 / 2021-01-28
|
42
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.1...v3.10.2)
|
43
|
+
|
44
|
+
Bug Fixes:
|
45
|
+
|
46
|
+
* Fix issue with `RSpec::Support.define_optimized_require_for_rspec` on JRuby
|
47
|
+
9.1.17.0 (Jon Rowe, #492)
|
48
|
+
|
49
|
+
### 3.10.1 / 2020-12-27
|
50
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.0...v3.10.1)
|
51
|
+
|
52
|
+
Bug Fixes:
|
53
|
+
|
54
|
+
* Fix deprecation expectations to fail correctly when
|
55
|
+
asserting on messages. (Phil Pirozhkov, #453)
|
56
|
+
|
57
|
+
### 3.10.0 / 2020-10-30
|
58
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.4...v3.10.0)
|
59
|
+
|
60
|
+
No changes. Released to support other RSpec releases.
|
61
|
+
|
62
|
+
### 3.9.4 / 2020-10-23
|
63
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.3...v3.9.4)
|
64
|
+
|
65
|
+
Bug Fixes:
|
66
|
+
|
67
|
+
* Flag ripper as supported on Truffle Ruby. (Brandon Fish, #427)
|
68
|
+
* Prevent stubbing `File.read` from breaking source extraction.
|
69
|
+
(Jon Rowe, #431)
|
70
|
+
|
71
|
+
### 3.9.3 / 2020-05-02
|
72
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.2...v3.9.3)
|
73
|
+
|
74
|
+
Bug Fixes:
|
75
|
+
|
76
|
+
* Mark ripper as unsupported on Truffle Ruby. (Brandon Fish, #395)
|
77
|
+
* Mark ripper as unsupported on JRuby 9.2.0.0. (Brian Hawley, #400)
|
78
|
+
* Capture `Mutex.new` for our `RSpec::Support:Mutex` in order to
|
79
|
+
allow stubbing `Mutex.new`. (Jon Rowe, #411)
|
80
|
+
|
81
|
+
### 3.9.2 / 2019-12-30
|
82
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.1...v3.9.2)
|
83
|
+
|
84
|
+
Bug Fixes:
|
85
|
+
|
86
|
+
* Remove unneeded eval. (Matijs van Zuijlen, #394)
|
87
|
+
|
88
|
+
### 3.9.1 / 2019-12-28
|
89
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.0...v3.9.1)
|
90
|
+
|
91
|
+
Bug Fixes:
|
92
|
+
|
93
|
+
* Remove warning caused by keyword arguments on Ruby 2.7.0.
|
94
|
+
(Jon Rowe, #392)
|
95
|
+
|
96
|
+
### 3.9.0 / 2019-10-07
|
97
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.3...v3.9.0)
|
98
|
+
|
99
|
+
*NO CHANGES*
|
100
|
+
|
101
|
+
Version 3.9.0 was released to allow other RSpec gems to release 3.9.0.
|
102
|
+
|
103
|
+
### 3.8.3 / 2019-10-02
|
104
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.2...v3.8.3)
|
105
|
+
|
106
|
+
Bug Fixes:
|
107
|
+
|
108
|
+
* Escape \r when outputting strings inside arrays.
|
109
|
+
(Tomita Masahiro, Jon Rowe, #378)
|
110
|
+
* Ensure that optional hash arguments are recognised correctly vs keyword
|
111
|
+
arguments. (Evgeni Dzhelyov, #366)
|
112
|
+
|
113
|
+
### 3.8.2 / 2019-06-10
|
114
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.1...v3.8.2)
|
115
|
+
|
116
|
+
Bug Fixes:
|
117
|
+
|
118
|
+
* Ensure that an empty hash is recognised as empty keyword arguments when
|
119
|
+
applicable. (Thomas Walpole, #375)
|
120
|
+
* Ensure that diffing truthy values produce diffs consistently.
|
121
|
+
(Lucas Nestor, #377)
|
122
|
+
|
123
|
+
### 3.8.1 / 2019-03-03
|
124
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.0...v3.8.1)
|
125
|
+
|
126
|
+
Bug Fixes:
|
127
|
+
|
128
|
+
* Ensure that inspecting a `SimpleDelegator` based object works regardless of
|
129
|
+
visibilty of the `__getobj__` method. (Jon Rowe, #369)
|
130
|
+
|
131
|
+
### 3.8.0 / 2018-08-04
|
132
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.1...v3.8.0)
|
133
|
+
|
134
|
+
Bug Fixes:
|
135
|
+
|
136
|
+
* Order hash keys before diffing to improve diff accuracy when using mocked calls.
|
137
|
+
(James Crisp, #334)
|
138
|
+
|
139
|
+
### 3.7.1 / 2018-01-29
|
140
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.0...v3.7.1)
|
141
|
+
|
142
|
+
Bug Fixes:
|
143
|
+
|
144
|
+
* Fix source extraction logic so that it does not trigger a `SystemStackError`
|
145
|
+
when processing deeply nested example groups. (Craig Bass, #343)
|
146
|
+
|
147
|
+
### 3.7.0 / 2017-10-17
|
148
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0...v3.7.0)
|
149
|
+
|
150
|
+
Enhancements:
|
151
|
+
|
152
|
+
* Improve compatibility with `--enable-frozen-string-literal` option
|
153
|
+
on Ruby 2.3+. (Pat Allan, #320)
|
154
|
+
* Add `Support.class_of` for extracting class of any object.
|
155
|
+
(Yuji Nakayama, #325)
|
156
|
+
|
157
|
+
Bug Fixes:
|
158
|
+
|
159
|
+
* Fix recursive const support to not blow up when given buggy classes
|
160
|
+
that raise odd errors from `#to_str`. (Myron Marston, #317)
|
161
|
+
|
162
|
+
### 3.6.0 / 2017-05-04
|
163
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta2...3.6.0)
|
164
|
+
|
165
|
+
Enhancements:
|
166
|
+
|
167
|
+
* Import `Source` classes from rspec-core. (Yuji Nakayama, #315)
|
168
|
+
|
169
|
+
### 3.6.0.beta2 / 2016-12-12
|
170
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta1...v3.6.0.beta2)
|
171
|
+
|
172
|
+
No user-facing changes.
|
173
|
+
|
174
|
+
### 3.6.0.beta1 / 2016-10-09
|
175
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0...v3.6.0.beta1)
|
176
|
+
|
177
|
+
Bug Fixes:
|
178
|
+
|
179
|
+
* Prevent truncated formatted object output from mangling console codes. (#294, Anson Kelly)
|
180
|
+
|
181
|
+
### 3.5.0 / 2016-07-01
|
182
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta4...v3.5.0)
|
183
|
+
|
184
|
+
**No user facing changes since beta4**
|
185
|
+
|
186
|
+
### 3.5.0.beta4 / 2016-06-05
|
187
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta3...v3.5.0.beta4)
|
188
|
+
|
189
|
+
Enhancements:
|
190
|
+
* Improve `MethodSignature` to better support keyword arguments. (#250, Rob Smith).
|
191
|
+
|
192
|
+
### 3.5.0.beta3 / 2016-04-02
|
193
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta2...v3.5.0.beta3)
|
194
|
+
|
195
|
+
Bug Fixes:
|
196
|
+
|
197
|
+
* Fix `EncodedString` to properly handle the behavior of `String#split`
|
198
|
+
on JRuby when the string contains invalid bytes. (Jon Rowe, #268)
|
199
|
+
* Fix `ObjectFormatter` so that formatting objects that don't respond to
|
200
|
+
`#inspect` (such as `BasicObject`) does not cause `NoMethodError`.
|
201
|
+
(Yuji Nakayama, #269)
|
202
|
+
* Fix `ObjectFormatter` so that formatting recursive array or hash does not
|
203
|
+
cause `SystemStackError`. (Yuji Nakayama, #270, #272)
|
204
|
+
|
205
|
+
### 3.5.0.beta2 / 2016-03-10
|
206
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta1...v3.5.0.beta2)
|
207
|
+
|
208
|
+
No user-facing changes.
|
209
|
+
|
210
|
+
### 3.5.0.beta1 / 2016-02-06
|
211
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.1...v3.5.0.beta1)
|
212
|
+
|
213
|
+
Enhancements:
|
214
|
+
|
215
|
+
* Improve formatting of objects by allowing truncation to a pre-configured length.
|
216
|
+
(Liam M, #256)
|
217
|
+
|
218
|
+
### 3.4.1 / 2015-11-20
|
219
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.0...v3.4.1)
|
220
|
+
|
221
|
+
Bug Fixes:
|
222
|
+
|
223
|
+
* Fix `RSpec::Support::RubyFeature.ripper_supported?` so it returns
|
224
|
+
`false` on Rubinius since the Rubinius team has no plans to support
|
225
|
+
it. This prevents rspec-core from trying to load and use ripper to
|
226
|
+
extract failure snippets. (Aaron Stone, #251)
|
227
|
+
|
228
|
+
Changes:
|
229
|
+
|
230
|
+
* Remove `VersionChecker` in favor of `ComparableVersion`. (Yuji Nakayama, #266)
|
231
|
+
|
232
|
+
### 3.4.0 / 2015-11-11
|
233
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.3.0...v3.4.0)
|
234
|
+
|
235
|
+
Enhancements:
|
236
|
+
|
237
|
+
* Improve formatting of `Delegator` based objects (e.g. `SimpleDelgator`) in
|
238
|
+
failure messages and diffs. (Andrew Horner, #215)
|
239
|
+
* Add `ComparableVersion`. (Yuji Nakayama, #245)
|
240
|
+
* Add `Ripper` support detection. (Yuji Nakayama, #245)
|
241
|
+
|
242
|
+
Bug Fixes:
|
243
|
+
|
244
|
+
* Work around bug in JRuby that reports that `attr_writer` methods
|
245
|
+
have no parameters, causing RSpec's verifying doubles to wrongly
|
246
|
+
fail when mocking or stubbing a writer method on JRuby. (Myron Marston, #225)
|
247
|
+
|
248
|
+
### 3.3.0 / 2015-06-12
|
249
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.2...v3.3.0)
|
250
|
+
|
251
|
+
Enhancements:
|
252
|
+
|
253
|
+
* Improve formatting of arrays and hashes in failure messages so they
|
254
|
+
use our custom formatting of matchers, time objects, etc.
|
255
|
+
(Myron Marston, Nicholas Chmielewski, #205)
|
256
|
+
* Use improved formatting for diffs as well. (Nicholas Chmielewski, #205)
|
257
|
+
|
258
|
+
Bug Fixes:
|
259
|
+
|
260
|
+
* Fix `FuzzyMatcher` so that it checks `expected == actual` rather than
|
261
|
+
`actual == expected`, which avoids errors in situations where the
|
262
|
+
`actual` object's `==` is improperly implemented to assume that only
|
263
|
+
objects of the same type will be given. This allows rspec-mocks'
|
264
|
+
`anything` to match against objects with buggy `==` definitions.
|
265
|
+
(Myron Marston, #193)
|
266
|
+
|
267
|
+
### 3.2.2 / 2015-02-23
|
268
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.1...v3.2.2)
|
269
|
+
|
270
|
+
Bug Fixes:
|
271
|
+
|
272
|
+
* Fix an encoding issue with `EncodedString#split` when encountering an
|
273
|
+
invalid byte string. (Benjamin Fleischer, #1760)
|
274
|
+
|
275
|
+
### 3.2.1 / 2015-02-04
|
276
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.0...v3.2.1)
|
277
|
+
|
278
|
+
Bug Fixes:
|
279
|
+
|
280
|
+
* Fix `RSpec::CallerFilter` to work on Rubinius 2.2.
|
281
|
+
(Myron Marston, #169)
|
282
|
+
|
283
|
+
### 3.2.0 / 2015-02-03
|
284
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.2...v3.2.0)
|
285
|
+
|
286
|
+
Enhancements:
|
287
|
+
|
288
|
+
* Add extra Ruby type detection. (Jon Rowe, #133)
|
289
|
+
* Make differ instance re-usable. (Alexey Fedorov, #160)
|
290
|
+
|
291
|
+
Bug Fixes:
|
292
|
+
|
293
|
+
* Do not consider `[]` and `{}` to match when performing fuzzy matching.
|
294
|
+
(Myron Marston, #157)
|
295
|
+
|
296
|
+
### 3.1.2 / 2014-10-08
|
297
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.1...v3.1.2)
|
298
|
+
|
299
|
+
Bug Fixes:
|
300
|
+
|
301
|
+
* Fix method signature to not blow up with a `NoMethodError` on 1.8.7 when
|
302
|
+
verifying against an RSpec matcher. (Myron Marston, #116)
|
303
|
+
|
304
|
+
### 3.1.1 / 2014-09-26
|
305
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.0...v3.1.1)
|
306
|
+
|
307
|
+
Bug Fixes:
|
308
|
+
|
309
|
+
* Fix `RSpec::Support::DirectoryMaker` (used by `rspec --init` and
|
310
|
+
`rails generate rspec:install`) so that it detects absolute paths
|
311
|
+
on Windows properly. (Scott Archer, #107, #108, #109) (Jon Rowe, #110)
|
312
|
+
|
313
|
+
### 3.1.0 / 2014-09-04
|
314
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.4...v3.1.0)
|
315
|
+
|
316
|
+
Bug Fixes:
|
317
|
+
|
318
|
+
* Fix `FuzzyMatcher` so that it does not wrongly match a struct against
|
319
|
+
an array. (Myron Marston, #97)
|
320
|
+
* Prevent infinitely recursing `#flatten` methods from causing the differ
|
321
|
+
to hang. (Jon Rowe, #101)
|
322
|
+
|
1
323
|
### 3.0.4 / 2014-08-14
|
2
324
|
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.3...v3.0.4)
|
3
325
|
|
data/{LICENSE.txt → LICENSE.md}
RENAMED
@@ -1,6 +1,7 @@
|
|
1
|
-
|
1
|
+
The MIT License (MIT)
|
2
|
+
====================
|
2
3
|
|
3
|
-
|
4
|
+
* Copyright © 2013 David Chelimsky, Myron Marston, Jon Rowe, Sam Phippen, Xavier Shay, Bradley Schaefer
|
4
5
|
|
5
6
|
Permission is hereby granted, free of charge, to any person obtaining
|
6
7
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# RSpec::Support
|
1
|
+
# RSpec::Support [![Build Status](https://github.com/rspec/rspec-support/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-support/actions)
|
2
2
|
|
3
3
|
`RSpec::Support` provides common functionality to `RSpec::Core`,
|
4
4
|
`RSpec::Expectations` and `RSpec::Mocks`. It is considered
|
@@ -8,10 +8,33 @@ suitable for internal use only at this time.
|
|
8
8
|
|
9
9
|
Install one or more of the `RSpec` gems.
|
10
10
|
|
11
|
+
Want to run against the `main` branch? You'll need to include the dependent
|
12
|
+
RSpec repos as well. Add the following to your `Gemfile`:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib|
|
16
|
+
gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main'
|
17
|
+
end
|
18
|
+
```
|
19
|
+
|
11
20
|
## Contributing
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
Once you've set up the environment, you'll need to cd into the working
|
23
|
+
directory of whichever repo you want to work in. From there you can run the
|
24
|
+
specs and cucumber features, and make patches.
|
25
|
+
|
26
|
+
NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You
|
27
|
+
can treat each RSpec repo as an independent project.
|
28
|
+
|
29
|
+
- [Build details](BUILD_DETAIL.md)
|
30
|
+
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
31
|
+
- [Detailed contributing guide](CONTRIBUTING.md)
|
32
|
+
- [Development setup guide](DEVELOPMENT.md)
|
33
|
+
|
34
|
+
## Patches
|
35
|
+
|
36
|
+
Please submit a pull request or a github issue. If you submit an issue, please
|
37
|
+
include a link to either of:
|
38
|
+
|
39
|
+
* a gist (or equivalent) of the patch
|
40
|
+
* a branch or commit in your github fork of the repo
|
@@ -1,10 +1,11 @@
|
|
1
|
+
RSpec::Support.require_rspec_support "ruby_features"
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
# Consistent implementation for "cleaning" the caller method to strip out
|
3
5
|
# non-rspec lines. This enables errors to be reported at the call site in
|
4
6
|
# the code using the library, which is far more useful than the particular
|
5
7
|
# internal method that raised an error.
|
6
8
|
class CallerFilter
|
7
|
-
|
8
9
|
RSPEC_LIBS = %w[
|
9
10
|
core
|
10
11
|
mocks
|
@@ -24,10 +25,32 @@ module RSpec
|
|
24
25
|
# when `CallerFilter.first_non_rspec_line` is called from the top level of a required
|
25
26
|
# file, but it depends on if rubygems is loaded or not. We don't want to have to deal
|
26
27
|
# with this complexity in our `RSpec.deprecate` calls, so we ignore it here.
|
27
|
-
IGNORE_REGEX = Regexp.union(LIB_REGEX, "rubygems/core_ext/kernel_require.rb")
|
28
|
+
IGNORE_REGEX = Regexp.union(LIB_REGEX, "rubygems/core_ext/kernel_require.rb", "<internal:")
|
29
|
+
|
30
|
+
if RSpec::Support::RubyFeatures.caller_locations_supported?
|
31
|
+
# This supports args because it's more efficient when the caller specifies
|
32
|
+
# these. It allows us to skip frames the caller knows are part of RSpec,
|
33
|
+
# and to decrease the increment size if the caller is confident the line will
|
34
|
+
# be found in a small number of stack frames from `skip_frames`.
|
35
|
+
#
|
36
|
+
# Note that there is a risk to passing a `skip_frames` value that is too high:
|
37
|
+
# If it skipped the first non-rspec line, then this method would return the
|
38
|
+
# 2nd or 3rd (or whatever) non-rspec line. Thus, you generally shouldn't pass
|
39
|
+
# values for these parameters, particularly since most places that use this are
|
40
|
+
# not hot spots (generally it gets used for deprecation warnings). However,
|
41
|
+
# if you do have a hot spot that calls this, passing `skip_frames` can make
|
42
|
+
# a significant difference. Just make sure that that particular use is tested
|
43
|
+
# so that if the provided `skip_frames` changes to no longer be accurate in
|
44
|
+
# such a way that would return the wrong stack frame, a test will fail to tell you.
|
45
|
+
#
|
46
|
+
# See benchmarks/skip_frames_for_caller_filter.rb for measurements.
|
47
|
+
def self.first_non_rspec_line(skip_frames=3, increment=5)
|
48
|
+
# Why a default `skip_frames` of 3?
|
49
|
+
# By the time `caller_locations` is called below, the first 3 frames are:
|
50
|
+
# lib/rspec/support/caller_filter.rb:63:in `block in first_non_rspec_line'
|
51
|
+
# lib/rspec/support/caller_filter.rb:62:in `loop'
|
52
|
+
# lib/rspec/support/caller_filter.rb:62:in `first_non_rspec_line'
|
28
53
|
|
29
|
-
if RUBY_VERSION >= '2.0.0'
|
30
|
-
def self.first_non_rspec_line
|
31
54
|
# `caller` is an expensive method that scales linearly with the size of
|
32
55
|
# the stack. The performance hit for fetching it in chunks is small,
|
33
56
|
# and since the target line is probably near the top of the stack, the
|
@@ -35,28 +58,24 @@ module RSpec
|
|
35
58
|
#
|
36
59
|
# See benchmarks/caller.rb for measurements.
|
37
60
|
|
38
|
-
#
|
39
|
-
# performance on the common case of creating a double.
|
40
|
-
increment = 5
|
41
|
-
i = 1
|
42
|
-
line = nil
|
61
|
+
# The default increment of 5 for this method are mostly arbitrary, but
|
62
|
+
# is chosen to give good performance on the common case of creating a double.
|
43
63
|
|
44
|
-
|
45
|
-
stack =
|
64
|
+
loop do
|
65
|
+
stack = caller_locations(skip_frames, increment)
|
46
66
|
raise "No non-lib lines in stack" unless stack
|
47
67
|
|
48
|
-
line = stack.find { |l| l !~ IGNORE_REGEX }
|
68
|
+
line = stack.find { |l| l.path !~ IGNORE_REGEX }
|
69
|
+
return line.to_s if line
|
49
70
|
|
50
|
-
|
71
|
+
skip_frames += increment
|
51
72
|
increment *= 2 # The choice of two here is arbitrary.
|
52
73
|
end
|
53
|
-
|
54
|
-
line
|
55
74
|
end
|
56
75
|
else
|
57
76
|
# Earlier rubies do not support the two argument form of `caller`. This
|
58
77
|
# fallback is logically the same, but slower.
|
59
|
-
def self.first_non_rspec_line
|
78
|
+
def self.first_non_rspec_line(*)
|
60
79
|
caller.find { |line| line !~ IGNORE_REGEX }
|
61
80
|
end
|
62
81
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Support
|
3
|
+
# @private
|
4
|
+
class ComparableVersion
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_reader :string
|
8
|
+
|
9
|
+
def initialize(string)
|
10
|
+
@string = string
|
11
|
+
end
|
12
|
+
|
13
|
+
def <=>(other)
|
14
|
+
other = self.class.new(other) unless other.is_a?(self.class)
|
15
|
+
|
16
|
+
return 0 if string == other.string
|
17
|
+
|
18
|
+
longer_segment_count = [self, other].map { |version| version.segments.count }.max
|
19
|
+
|
20
|
+
longer_segment_count.times do |index|
|
21
|
+
self_segment = segments[index] || 0
|
22
|
+
other_segment = other.segments[index] || 0
|
23
|
+
|
24
|
+
if self_segment.class == other_segment.class
|
25
|
+
result = self_segment <=> other_segment
|
26
|
+
return result unless result == 0
|
27
|
+
else
|
28
|
+
return self_segment.is_a?(String) ? -1 : 1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
0
|
33
|
+
end
|
34
|
+
|
35
|
+
def segments
|
36
|
+
@segments ||= string.scan(/[a-z]+|\d+/i).map do |segment|
|
37
|
+
if segment =~ /\A\d+\z/
|
38
|
+
segment.to_i
|
39
|
+
else
|
40
|
+
segment
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|