r_spec-clone 1.6.0 → 1.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2e7a16588ed11ac0ab9cd7eebcb01c3d6e914d351c5041cfbed6015c88128ea
4
- data.tar.gz: 96dfc31819a59b319c06c777a63aa09daf5630a3db7cf5860c59474b1809f94c
3
+ metadata.gz: bc9ae84dcef40b1d832122a6a7bec48cf1bceb8104680cc2de36a9be584fd09d
4
+ data.tar.gz: b3d8ad619c723b0b90e82f93791f1d8d927457518e91e8ab36e324e45328fb11
5
5
  SHA512:
6
- metadata.gz: f34d7820173f21ffdafe71d206314aee90904ab7b9a46c29511aed5e4191742e87a14ef2e9da512e48917c080c97d52b5618ce545519f49955fb3edc6b20022d
7
- data.tar.gz: d2ad326e9150e95b19f9f62994568e5a44474b6567727e15c38020ede970f1c20b4bd0ddc1d1ab450f968fedfd109ed795accda5724b0424ef666fe09e31e92c
6
+ metadata.gz: 5dabfdecc24dcb00bfc37a6c5f8afaa57520824ec9c8f08b86088c0f0e2fc3e3bcf9333dd0d3a21746127afa7c3bb072090145270f07c93cb318cc5dc7c9b806
7
+ data.tar.gz: 7998dfc059b0a80302ef5d123401ead7c7b2eec0bbfe64a551b8d53d3f8f1ab4f0f5624b787de685ddc1c355805a941bef3159cd2093e760c35ef9adff802ed5
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
- The MIT License (MIT)
1
+ # The MIT License
2
2
 
3
- Copyright (c) 2015-2022 Cyril Kato
3
+ Copyright (c) 2015-2024 Cyril Kato
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # RSpec clone
1
+ # RSpec clone <img src="https://github.com/cyril/r_spec-clone.rb/raw/main/img/logo.svg" style="height: 1em; width: 1em" />
2
2
 
3
3
  A minimalist __RSpec clone__ with all the essentials.
4
4
 
@@ -7,33 +7,35 @@ A minimalist __RSpec clone__ with all the essentials.
7
7
  ## Status
8
8
 
9
9
  [![Home](https://img.shields.io/badge/Home-r--spec.dev-00af8b)](https://r-spec.dev/)
10
- [![Version](https://img.shields.io/github/v/tag/cyril/r_spec-clone.rb?label=Version&logo=github)](https://github.com/cyril/r_spec-clone.rb/releases)
10
+ [![Version](https://img.shields.io/github/v/tag/cyril/r_spec-clone.rb?label=Version&logo=github)](https://github.com/cyril/r_spec-clone.rb/tags)
11
11
  [![Yard documentation](https://img.shields.io/badge/Yard-documentation-blue.svg?logo=github)](https://rubydoc.info/github/cyril/r_spec-clone.rb/main)
12
- [![CI](https://github.com/cyril/r_spec-clone.rb/workflows/CI/badge.svg?branch=main)](https://github.com/cyril/r_spec-clone.rb/actions?query=workflow%3Aci+branch%3Amain)
12
+ [![Ruby](https://github.com/cyril/r_spec-clone.rb/workflows/Ruby/badge.svg?branch=main)](https://github.com/cyril/r_spec-clone.rb/actions?query=workflow%3Aruby+branch%3Amain)
13
13
  [![RuboCop](https://github.com/cyril/r_spec-clone.rb/workflows/RuboCop/badge.svg?branch=main)](https://github.com/cyril/r_spec-clone.rb/actions?query=workflow%3Arubocop+branch%3Amain)
14
14
  [![License](https://img.shields.io/github/license/cyril/r_spec-clone.rb?label=License&logo=github)](https://github.com/cyril/r_spec-clone.rb/raw/main/LICENSE.md)
15
15
 
16
- ## Project goals
16
+ ## Project Goals
17
17
 
18
- 1. Keep a low level of code complexity, avoid false negatives and false positives.
19
- 2. Translate specification documents into atomic and thread safe Ruby objects.
20
- 3. Avoid overloading the interface with additional alternative syntaxes.
21
- 4. Provide most of RSpec's DSL to express expected outcomes of a code example.
18
+ 1. Maintain low code complexity to avoid false negatives and false positives.
19
+ 2. Implement the loading of specifications using simple, atomic, and thread-safe Ruby primitives.
20
+ 3. Avoid cluttering the interface with unnecessary alternative syntaxes.
21
+ 4. Provide the basics of the RSpec DSL for writing tests.
22
22
 
23
- ## Some differences
23
+ ## Some Differences
24
24
 
25
- * There is no option to activate monkey-patching.
26
- * It does not rely on [hacks such as `at_exit` hook](https://blog.arkency.com/2013/06/are-we-abusing-at-exit/) to trigger the tests.
27
- * Malicious _actual values_ cannot [hack results](https://asciinema.org/a/423547?autoplay=1&speed=2).
28
- * If no `subject` has been explicitly determined, none is defined.
29
- * If no described class is set, `described_class` is undefined instead of `nil`.
25
+ * Monkey-patching is not an available option.
26
+ * The framework does not use [hacks such as the `at_exit` hook](https://blog.arkency.com/2013/06/are-we-abusing-at-exit/) to trigger tests.
27
+ * Malicious _actual values_ cannot [compromise results](https://asciinema.org/a/423547?autoplay=1&speed=2).
28
+ * If no `subject` is explicitly determined, it remains undefined.
29
+ * If no described class is set, `described_class` is undefined rather than `nil`.
30
30
  * Expectations cannot be added inside a `before` block.
31
- * [Arbitrary helper methods](https://relishapp.com/rspec/rspec-core/v/3-10/docs/helper-methods/arbitrary-helper-methods) are not exposed to examples.
31
+ * [Arbitrary helper methods](https://relishapp.com/rspec/rspec-core/v/3-10/docs/helper-methods/arbitrary-helper-methods) are not accessible within examples.
32
32
  * The `let` method defines a helper method rather than a memoized helper method.
33
- * The one-liner `is_expected` syntax also works with block expectations.
34
- * `subject`, `before`, `after` and `let` definitions must come before examples.
35
- * The execution of the test suite stops as soon as an error is detected.
36
- * The order of the unit tests does not matter because they are executed in isolation.
33
+ * The one-liner `is_expected` syntax is compatible with block expectations.
34
+ * Definitions of `subject`, `before`, and `let` must precede examples.
35
+ * The `after` hook is unsupported.
36
+ * The execution of the test suite halts immediately when an error is detected.
37
+ * Each `context` block isolates its tests and any potential side effects.
38
+ * The `its` method is available without the need for external dependencies.
37
39
 
38
40
  ## Installation
39
41
 
@@ -46,7 +48,7 @@ gem "r_spec-clone"
46
48
  And then execute:
47
49
 
48
50
  ```sh
49
- bundle
51
+ bundle install
50
52
  ```
51
53
 
52
54
  Or install it yourself as:
@@ -59,7 +61,7 @@ gem install r_spec-clone
59
61
 
60
62
  __RSpec clone__ provides a structure for writing executable examples of how your code should behave.
61
63
 
62
- Inspired by RSpec, it includes a domain specific language (DSL) that allows you to write examples in a way similar to plain english.
64
+ Inspired by RSpec, it includes a domain-specific language (DSL) that allows you to write examples in a way similar to plain english.
63
65
 
64
66
  A basic spec looks something like this:
65
67
 
@@ -67,10 +69,10 @@ A basic spec looks something like this:
67
69
 
68
70
  ## Usage
69
71
 
70
- ### Anatomy of a spec file
72
+ ### Anatomy of a Spec File
71
73
 
72
- To use the `RSpec` module and its DSL, you need to add `require "r_spec"` to your spec files.
73
- Many projects use a custom spec helper which organizes these includes.
74
+ To utilize the `RSpec` module and its DSL, include `require "r_spec"` in your spec files.
75
+ Many projects organize these includes through a custom spec helper.
74
76
 
75
77
  Concrete test cases are defined in `it` blocks.
76
78
  An optional (but recommended) descriptive string or module indicates the purpose of the test and a block contains the main logic of the test.
@@ -87,7 +89,7 @@ To express an expectation, wrap an object or block in `expect`, call `to` (or `n
87
89
  If the expectation is met, code execution continues.
88
90
  Otherwise the example has _failed_ and other code will not be executed.
89
91
 
90
- In test files, specs are structured by example groups which are defined by `describe` and `context` sections.
92
+ In test files, specs can be structured by example groups which are defined by `describe` and `context` sections.
91
93
  Typically a top level `describe` defines the outer unit (such as a class) to be tested by the spec.
92
94
  Further `describe` sections can be nested within the outer unit to specify smaller units under test (such as individual methods).
93
95
 
@@ -98,6 +100,9 @@ For unit tests, it is recommended to follow the conventions for method names:
98
100
 
99
101
  To establish certain contexts — think _empty array_ versus _array with elements_ — the `context` method may be used to communicate this to the reader.
100
102
 
103
+ Unlike a `describe` block, all specifications executed within a `context` are isolated in a subprocess.
104
+ This prevents possible side effects on the Ruby object environment from being propagated outside their context, which could alter the result of the unit test suite.
105
+
101
106
  Note: if you are wondering what kind of code might be generated by the DSL, an article that shows the dynamic transcription of the main methods with simple examples is available in [Chinese](https://ruby-china.org/topics/41441), in [English](https://dev.to/cyri_/what-ruby-code-to-expect-from-a-testing-dsl-4oe1) and in [Japanese](https://qiita.com/cyril/items/17ee758e162bae144a07).
102
107
 
103
108
  ### Expectations
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "console"
3
+ require_relative "logger"
4
4
  require_relative "error"
5
5
  require_relative "expectation_helper"
6
6
 
@@ -9,9 +9,8 @@ module RSpec
9
9
  # Abstract class for handling the domain-specific language.
10
10
  class Dsl
11
11
  BEFORE_METHOD = :initialize
12
- AFTER_METHOD = :terminate
13
12
 
14
- private_constant :BEFORE_METHOD, :AFTER_METHOD
13
+ private_constant :BEFORE_METHOD
15
14
 
16
15
  # Executes the given block before each spec in the current context runs.
17
16
  #
@@ -53,35 +52,6 @@ module RSpec
53
52
  private BEFORE_METHOD
54
53
  end
55
54
 
56
- # Executes the given block after each spec in the current context runs.
57
- #
58
- # @example
59
- # require "r_spec"
60
- #
61
- # RSpec.describe Integer do
62
- # after do
63
- # puts "That is the answer to everything."
64
- # end
65
- #
66
- # it { expect(42).to be 42 }
67
- # end
68
- #
69
- # # Output to the console
70
- # # Success: expected to be 42.
71
- # # That is the answer to everything.
72
- #
73
- # @param block [Proc] The content to execute at the class initialization.
74
- #
75
- # @api public
76
- def self.after(&block)
77
- define_method(AFTER_METHOD) do
78
- instance_exec(&block)
79
- super()
80
- end
81
-
82
- private AFTER_METHOD
83
- end
84
-
85
55
  # Sets a user-defined property.
86
56
  #
87
57
  # @example
@@ -109,10 +79,10 @@ module RSpec
109
79
  # @return [Symbol] A private method that define the block content.
110
80
  #
111
81
  # @api public
112
- def self.let(name, *args, **kwargs, &block)
113
- raise Error::ReservedMethod if [BEFORE_METHOD, AFTER_METHOD].include?(name.to_sym)
82
+ def self.let(name, ...)
83
+ raise Error::ReservedMethod if BEFORE_METHOD.equal?(name.to_sym)
114
84
 
115
- private define_method(name, *args, **kwargs, &block)
85
+ private define_method(name, ...)
116
86
  end
117
87
 
118
88
  # Sets a user-defined property named {#subject}.
@@ -143,8 +113,8 @@ module RSpec
143
113
  # @return [Symbol] A {#subject} method that define the block content.
144
114
  #
145
115
  # @api public
146
- def self.subject(&block)
147
- let(__method__, &block)
116
+ def self.subject(&)
117
+ let(__method__, &)
148
118
  end
149
119
 
150
120
  # Defines an example group that describes a unit to be tested.
@@ -165,10 +135,10 @@ module RSpec
165
135
  # @param block [Proc] The block to define the specs.
166
136
  #
167
137
  # @api public
168
- def self.describe(const, &block)
138
+ def self.describe(const, &)
169
139
  desc = ::Class.new(self)
170
140
  desc.let(:described_class) { const } if const.is_a?(::Module)
171
- desc.instance_eval(&block)
141
+ desc.instance_eval(&)
172
142
  end
173
143
 
174
144
  # :nocov:
@@ -176,6 +146,11 @@ module RSpec
176
146
  # Defines an example group that establishes a specific context, like
177
147
  # _empty array_ versus _array with elements_.
178
148
  #
149
+ # Unlike a `describe` block, all specifications executed within a
150
+ # `context` are isolated in a subprocess. This prevents possible side
151
+ # effects on the Ruby object environment from being propagated outside
152
+ # their context, which could alter the result of the unit test suite.
153
+ #
179
154
  # @example
180
155
  # require "r_spec"
181
156
  #
@@ -199,8 +174,8 @@ module RSpec
199
174
  #
200
175
  # @api public
201
176
  def self.context(_description, &block)
202
- desc = ::Class.new(self)
203
- desc.instance_eval(&block)
177
+ pid = ::Process.fork { ::Class.new(self).instance_eval(&block) }
178
+ exit false unless ::Process::Status.wait(pid).exitstatus.zero?
204
179
  end
205
180
 
206
181
  # :nocov:
@@ -246,7 +221,8 @@ module RSpec
246
221
  #
247
222
  # @api public
248
223
  def self.it(_name = nil, &block)
249
- exit false unless ::Aw.fork? { run(example_without_attribute.new, &block) }
224
+ Logger.source(*block.source_location)
225
+ example_without_attribute.new.instance_eval(&block)
250
226
  end
251
227
 
252
228
  # :nocov:
@@ -297,8 +273,10 @@ module RSpec
297
273
  # @return (see ExpectationTarget::Base#result)
298
274
  #
299
275
  # @api public
300
- def self.its(attribute, *args, **kwargs, &block)
301
- exit false unless ::Aw.fork? { run(example_with_attribute(attribute, *args, **kwargs).new, &block) }
276
+ def self.its(attribute, *, **, &block)
277
+ Logger.source(*block.source_location)
278
+ example_with_attribute(attribute, *, **).new
279
+ .instance_eval(&block)
302
280
  end
303
281
 
304
282
  # :nocov:
@@ -329,7 +307,7 @@ module RSpec
329
307
  #
330
308
  # @api public
331
309
  def self.pending(message)
332
- Console.passed_spec Error::PendingExpectation.result(message)
310
+ Logger.passed_spec Error::PendingExpectation.result(message)
333
311
  end
334
312
 
335
313
  # Example class for concrete test case.
@@ -351,15 +329,7 @@ module RSpec
351
329
  end
352
330
  end
353
331
 
354
- # Execution of specifications.
355
- def self.run(example, &block)
356
- Console.source(*block.source_location)
357
- exit false unless ::Aw.fork? { example.instance_eval(&block) }
358
- ensure
359
- example&.send(AFTER_METHOD)
360
- end
361
-
362
- private_class_method :example_without_attribute, :example_with_attribute, :run
332
+ private_class_method :example_without_attribute, :example_with_attribute
363
333
 
364
334
  private
365
335
 
@@ -374,10 +344,6 @@ module RSpec
374
344
  def subject
375
345
  raise Error::UndefinedSubject, "subject not explicitly defined"
376
346
  end
377
-
378
- define_method(AFTER_METHOD) do
379
- # do nothing by default
380
- end
381
347
  end
382
348
  end
383
349
  end
@@ -194,8 +194,8 @@ module RSpec
194
194
  # @return [#matches?] A change matcher.
195
195
  #
196
196
  # @api public
197
- def change(object, method, *args, **kwargs, &block)
198
- ::Matchi::Change.new(object, method, *args, **kwargs, &block)
197
+ def change(object, method, ...)
198
+ ::Matchi::Change.new(object, method, ...)
199
199
  end
200
200
 
201
201
  # Satisfy matcher
@@ -209,8 +209,8 @@ module RSpec
209
209
  # @return [#matches?] A satisfy matcher.
210
210
  #
211
211
  # @api public
212
- def satisfy(&expected)
213
- ::Matchi::Satisfy.new(&expected)
212
+ def satisfy(&)
213
+ ::Matchi::Satisfy.new(&)
214
214
  end
215
215
 
216
216
  private
@@ -221,10 +221,10 @@ module RSpec
221
221
  # matcher = be_empty
222
222
  # matcher.matches? { [] } # => true
223
223
  # matcher.matches? { [4] } # => false
224
- def method_missing(name, *args, **kwargs, &block)
224
+ def method_missing(name, ...)
225
225
  return super unless predicate_matcher_name?(name)
226
226
 
227
- ::Matchi::Predicate.new(name, *args, **kwargs, &block)
227
+ ::Matchi::Predicate.new(name, ...)
228
228
  end
229
229
 
230
230
  # :nocov:
@@ -3,7 +3,7 @@
3
3
  require "expresenter"
4
4
  require "test_tube"
5
5
 
6
- require_relative File.join("..", "console")
6
+ require_relative File.join("..", "logger")
7
7
 
8
8
  module RSpec
9
9
  module Clone
@@ -32,7 +32,7 @@ module RSpec
32
32
  #
33
33
  # @api public
34
34
  def to(matcher)
35
- absolute_requirement(matcher: matcher, negate: false)
35
+ absolute_requirement(matcher:, negate: false)
36
36
  end
37
37
 
38
38
  # Runs the given expectation, passing if `matcher` returns false.
@@ -47,7 +47,7 @@ module RSpec
47
47
  #
48
48
  # @api public
49
49
  def not_to(matcher)
50
- absolute_requirement(matcher: matcher, negate: true)
50
+ absolute_requirement(matcher:, negate: true)
51
51
  end
52
52
 
53
53
  protected
@@ -66,8 +66,8 @@ module RSpec
66
66
  actual: test.actual,
67
67
  error: test.error,
68
68
  got: test.got,
69
- matcher: matcher,
70
- negate: negate
69
+ matcher:,
70
+ negate:
71
71
  )
72
72
  end
73
73
 
@@ -82,6 +82,8 @@ module RSpec
82
82
  test.got.equal?(true)
83
83
  end
84
84
 
85
+ # :nocov:
86
+
85
87
  # @param passed [Boolean] The high expectation passed or failed.
86
88
  # @param actual [#object_id] The actual value.
87
89
  # @param error [Exception, nil] Any raised exception.
@@ -94,18 +96,20 @@ module RSpec
94
96
  # @raise [SystemExit] Terminate execution immediately by calling
95
97
  # `Kernel.exit(false)` with a failure message written to STDERR.
96
98
  def result(passed, actual:, error:, got:, matcher:, negate:)
97
- Console.passed_spec ::Expresenter.call(passed).with(
98
- actual: actual,
99
+ Logger.passed_spec ::Expresenter.call(passed).with(
100
+ actual:,
99
101
  definition: matcher.to_s,
100
- error: error,
102
+ error:,
101
103
  expected: matcher.expected,
102
- got: got,
103
- negate: negate,
104
+ got:,
105
+ negate:,
104
106
  level: :MUST
105
107
  )
106
108
  rescue ::Expresenter::Fail => e
107
- Console.failed_spec(e)
109
+ Logger.failed_spec(e)
108
110
  end
111
+
112
+ # :nocov:
109
113
  end
110
114
  end
111
115
  end
@@ -29,9 +29,9 @@ module RSpec
29
29
  # @raise (see Base#absolute_requirement)
30
30
  def absolute_requirement(matcher:, negate:)
31
31
  super(
32
- ::TestTube.invoke(isolate: false, matcher: matcher, negate: negate, &@input),
33
- matcher: matcher,
34
- negate: negate
32
+ ::TestTube.invoke(matcher:, negate:, &@input),
33
+ matcher:,
34
+ negate:
35
35
  )
36
36
  end
37
37
  end
@@ -29,9 +29,9 @@ module RSpec
29
29
  # @raise (see Base#absolute_requirement)
30
30
  def absolute_requirement(matcher:, negate:)
31
31
  super(
32
- ::TestTube.pass(@input, matcher: matcher, negate: negate),
33
- matcher: matcher,
34
- negate: negate
32
+ ::TestTube.pass(@input, matcher:, negate:),
33
+ matcher:,
34
+ negate:
35
35
  )
36
36
  end
37
37
  end
@@ -3,7 +3,7 @@
3
3
  module RSpec
4
4
  module Clone
5
5
  # Send log messages to the console.
6
- module Console
6
+ module Logger
7
7
  # @param report [::Expresenter::Pass] Passed expectation result presenter.
8
8
  #
9
9
  # @see https://github.com/fixrb/expresenter
@@ -13,17 +13,21 @@ module RSpec
13
13
  puts report.colored_string
14
14
  end
15
15
 
16
+ # :nocov:
17
+
16
18
  # @param report [::Expresenter::Fail] Failed expectation result presenter.
17
19
  #
18
20
  # @see https://github.com/fixrb/expresenter
19
21
  #
20
- # @raise [SystemExit] Terminate execution immediately with colored message.
22
+ # @raise [SystemExit] Terminate execution immediately with message.
21
23
  def self.failed_spec(report)
22
24
  abort report.colored_string
23
25
  end
24
26
 
25
- # The Ruby source filename and line number containing this method or nil if
26
- # this method was not defined in Ruby (i.e. native).
27
+ # :nocov:
28
+
29
+ # The Ruby source filename and line number containing this method or nil
30
+ # if this method was not defined in Ruby (i.e. native).
27
31
  #
28
32
  # @param filename [String, nil] The Ruby source filename.
29
33
  # @param line [Integer, nil] The Ruby source line number.
data/lib/r_spec.rb CHANGED
@@ -83,8 +83,8 @@ module RSpec
83
83
  # @param description [String] A description that usually begins with "when",
84
84
  # "with" or "without".
85
85
  # @param block [Proc] The block to define the specs.
86
- def self.context(description, &block)
87
- Clone::Dsl.context(description, &block)
86
+ def self.context(description, &)
87
+ Clone::Dsl.context(description, &)
88
88
  end
89
89
 
90
90
  # :nocov:
@@ -117,8 +117,8 @@ module RSpec
117
117
  #
118
118
  # @param const [Module, String] A module to include in block context.
119
119
  # @param block [Proc] The block to define the specs.
120
- def self.describe(const, &block)
121
- Clone::Dsl.describe(const, &block)
120
+ def self.describe(const, &)
121
+ Clone::Dsl.describe(const, &)
122
122
  end
123
123
 
124
124
  # :nocov:
@@ -143,8 +143,8 @@ module RSpec
143
143
  #
144
144
  # @raise (see RSpec::Clone::ExpectationTarget::Base#result)
145
145
  # @return (see RSpec::Clone::ExpectationTarget::Base#result)
146
- def self.it(name = nil, &block)
147
- Clone::Dsl.it(name, &block)
146
+ def self.it(name = nil, &)
147
+ Clone::Dsl.it(name, &)
148
148
  end
149
149
 
150
150
  # :nocov:
metadata CHANGED
@@ -1,197 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: r_spec-clone
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Kato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-02 00:00:00.000000000 Z
11
+ date: 2024-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: aw
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 0.2.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 0.2.0
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: expresenter
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: 1.4.0
19
+ version: 1.4.1
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: 1.4.0
26
+ version: 1.4.1
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: matchi
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: 3.3.0
33
+ version: 3.3.2
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: 3.3.0
40
+ version: 3.3.2
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: test_tube
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: 2.1.3
47
+ version: 3.0.0
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: 2.1.3
69
- - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-md
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-performance
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: rubocop-rake
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: rubocop-rspec
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: rubocop-thread_safety
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: simplecov
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
- - !ruby/object:Gem::Dependency
182
- name: yard
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
54
+ version: 3.0.0
195
55
  description: A minimalist RSpec clone with all the essentials.
196
56
  email: contact@cyril.email
197
57
  executables: []
@@ -202,7 +62,6 @@ files:
202
62
  - README.md
203
63
  - lib/r_spec.rb
204
64
  - lib/r_spec/clone.rb
205
- - lib/r_spec/clone/console.rb
206
65
  - lib/r_spec/clone/dsl.rb
207
66
  - lib/r_spec/clone/error.rb
208
67
  - lib/r_spec/clone/error/pending_expectation.rb
@@ -217,6 +76,7 @@ files:
217
76
  - lib/r_spec/clone/expectation_target/base.rb
218
77
  - lib/r_spec/clone/expectation_target/block.rb
219
78
  - lib/r_spec/clone/expectation_target/value.rb
79
+ - lib/r_spec/clone/logger.rb
220
80
  homepage: https://r-spec.dev/
221
81
  licenses:
222
82
  - MIT
@@ -234,14 +94,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
94
  requirements:
235
95
  - - ">="
236
96
  - !ruby/object:Gem::Version
237
- version: 2.7.5
97
+ version: 3.2.4
238
98
  required_rubygems_version: !ruby/object:Gem::Requirement
239
99
  requirements:
240
100
  - - ">="
241
101
  - !ruby/object:Gem::Version
242
102
  version: '0'
243
103
  requirements: []
244
- rubygems_version: 3.1.6
104
+ rubygems_version: 3.4.19
245
105
  signing_key:
246
106
  specification_version: 4
247
107
  summary: A minimalist RSpec clone