r_spec-clone 1.4.0 → 1.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c388fa8f14bc48ea1cd253f46695e15a1f7e96192cc04143d6bc5d363dfa0669
4
- data.tar.gz: fae27e21e625015f5e3dfaf9ae4f1fc2454632a13f8ed100e8519b080eb61b9d
3
+ metadata.gz: ef1c79c6783a2aace9f035ef5935bb556828731501ce7b92f86dcedf58e18d90
4
+ data.tar.gz: 615131453af20ba74f436f0569db9f429af2bd18589de5ee132ef69af8cd09d8
5
5
  SHA512:
6
- metadata.gz: 694679d560726f4f0a23c5ee2c5fbbe8fa75744fe8fc480ba907dad64e92036967cfe6ce129a64cb93292025256ba9427cf3723ad7a893dccd430749fd6c0ada
7
- data.tar.gz: 0aa55bcf1f8aee5ab72adf4cbaef3fa2a6a9228cbf8b7afbf38f80caca54f84285af99d6aeb8dc6e39629cba090c35657988e1c44f3c2c788dabfc444249e0f2
6
+ metadata.gz: bbaa63b25dc7a3d98810d686d5fb4a5cacec5a74ac04d1aab01f86dfc886ef57cf9b9ae20201aaf3a43e95bb626ce363bfe62190142904ceef8526d1d34ef9ab
7
+ data.tar.gz: e6b4d19ef401aa923f31739ab5ee5289929309d762113f82d361f52859c17f24739e18f8236e93db6d47f428e1f09a6aa4c6beabfb5ea938f0fa1f6769cf4835
data/README.md CHANGED
@@ -180,9 +180,24 @@ expect(actual).to be_instance_of(expected) # passes if expected.equal?(actual
180
180
  expect(actual).to be_an_instance_of(expected) # passes if expected.equal?(actual.class)
181
181
  ```
182
182
 
183
+ #### Predicate
184
+
185
+ ```ruby
186
+ expect(actual).to be_xxx # passes if actual.xxx?
187
+ expect(actual).to be_have_xxx(:yyy) # passes if actual.has_xxx?(:yyy)
188
+ ```
189
+
190
+ ##### Examples
191
+
192
+ ```ruby
193
+ expect([]).to be_empty
194
+ expect(foo: 1).to have_key(:foo)
195
+ ```
196
+
183
197
  #### Change
184
198
 
185
199
  ```ruby
200
+ expect { object.action }.to change(object, :value).to(new)
186
201
  expect { object.action }.to change(object, :value).from(old).to(new)
187
202
  expect { object.action }.to change(object, :value).by(delta)
188
203
  expect { object.action }.to change(object, :value).by_at_least(minimum_delta)
@@ -269,7 +284,7 @@ Benchmark against [100 executions of a file containing 1 expectation](https://gi
269
284
 
270
285
  ### Runtime
271
286
 
272
- Benchmark against [1 execution of a file containing 1,000,000 expectations](https://github.com/cyril/r_spec-clone.rb/blob/main/benchmark/run_time/) (lower is better).
287
+ Benchmark against [1 execution of a file containing 100,000 expectations](https://github.com/cyril/r_spec-clone.rb/blob/main/benchmark/run_time/) (lower is better).
273
288
 
274
289
  ![Runtime benchmark](https://r-spec.dev/benchmark-run-time.svg)
275
290
 
@@ -19,7 +19,7 @@ module RSpec
19
19
  #
20
20
  # @example
21
21
  # expect("foo") # => #<RSpec::Clone::ExpectationTarget::Value:0x00007f @actual="foo">
22
- # expect { Boom } # => #<RSpec::Clone::ExpectationTarget::Block:0x00007f @callable=#<Proc:0x00007f>>
22
+ # expect { RSpec::Clone::Boom! } # => #<RSpec::Clone::ExpectationTarget::Block:0x... @callable=#<Proc:0x...>>
23
23
  #
24
24
  # @api public
25
25
  def expect(value = self.class.superclass, &block)
@@ -87,7 +87,7 @@ module RSpec
87
87
  #
88
88
  # @example
89
89
  # matcher = raise_exception(NameError)
90
- # matcher.matches? { Boom } # => true
90
+ # matcher.matches? { RSpec::Clone::Boom! } # => true
91
91
  # matcher.matches? { true } # => false
92
92
  #
93
93
  # @param expected [Exception, #to_s] The expected exception name.
@@ -212,6 +212,38 @@ module RSpec
212
212
  def satisfy(&expected)
213
213
  ::Matchi::Satisfy.new(&expected)
214
214
  end
215
+
216
+ private
217
+
218
+ # Predicate matcher, or default method missing behavior.
219
+ #
220
+ # @example Empty predicate matcher
221
+ # matcher = be_empty
222
+ # matcher.matches? { [] } # => true
223
+ # matcher.matches? { [4] } # => false
224
+ def method_missing(name, *args, **kwargs, &block)
225
+ return super unless predicate_matcher_name?(name)
226
+
227
+ ::Matchi::Predicate.new(name, *args, **kwargs, &block)
228
+ end
229
+
230
+ # :nocov:
231
+
232
+ # Hook method to return whether the obj can respond to id method or not.
233
+ def respond_to_missing?(name, include_private = false)
234
+ predicate_matcher_name?(name) || super
235
+ end
236
+
237
+ # :nocov:
238
+
239
+ # Predicate matcher name detector.
240
+ #
241
+ # @param name [Array, Symbol] The name of a potential predicate matcher.
242
+ #
243
+ # @return [Boolean] Indicates if it is a predicate matcher name or not.
244
+ def predicate_matcher_name?(name)
245
+ name.start_with?("be_", "have_") && !name.end_with?("!", "?")
246
+ end
215
247
  end
216
248
  end
217
249
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: r_spec-clone
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Kato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-25 00:00:00.000000000 Z
11
+ date: 2021-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: expresenter
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.2.0
33
+ version: 3.3.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.2.0
40
+ version: 3.3.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: test_tube
43
43
  requirement: !ruby/object:Gem::Requirement