r_spec-clone 1.6.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
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