r_spec 1.0.0.beta6 → 1.0.0.beta7
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
- data/README.md +19 -11
- data/lib/r_spec.rb +2 -2
- data/lib/r_spec/dsl.rb +38 -65
- data/lib/r_spec/error.rb +1 -0
- data/lib/r_spec/error/reserved_method.rb +11 -0
- data/lib/r_spec/expectation_helper.rb +1 -1
- data/lib/r_spec/expectation_helper/it.rb +3 -3
- data/lib/r_spec/expectation_helper/its.rb +3 -3
- data/lib/r_spec/expectation_helper/{base.rb → shared.rb} +1 -1
- metadata +8 -8
- data/lib/r_spec/sandbox.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46557ee64f6cc554942399aa9219e9102879b2b7b113e53dc4ba63d2c0c5c0af
|
4
|
+
data.tar.gz: a83b773e20cf2db46b28586be6836d7913a4c3b8f9bf2ce747110f2556737374
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7c89ce9b933e7adcfc26e03c2f4417ed44c423ca56932f173b2161572877967df37d99c9a560e8cf64c58458777842cb0db7eb1396c89a7f052d981b45f9864
|
7
|
+
data.tar.gz: 51c4b747116d8f1bb3bb2e593b00aa940ec463d1b9a03506984f2b445f3607febd455884051279f73cef2fc2edac7cfe6d9b4de210c1f1cef6402bd501729f6c
|
data/README.md
CHANGED
@@ -11,11 +11,12 @@ A minimalist __[RSpec](https://github.com/rspec/rspec) clone__ with all the esse
|
|
11
11
|
[](https://inch-ci.org/github/cyril/r_spec.rb)
|
12
12
|
[](https://rubydoc.info/gems/r_spec/frames)
|
13
13
|
|
14
|
-
##
|
14
|
+
## Project Goals
|
15
15
|
|
16
|
-
|
16
|
+
* Enforce the guidelines and best practices outlined in the community [RSpec style guide](https://rspec.rubystyle.guide/).
|
17
|
+
* Provide most of RSpec's DSL to express expected outcomes of a code example without magic power.
|
17
18
|
|
18
|
-
## Some
|
19
|
+
## Some Differences
|
19
20
|
|
20
21
|
* Less features and an implementation with much less code complexity.
|
21
22
|
* Spec files can also be executed directly with the `ruby` executable.
|
@@ -28,6 +29,10 @@ This clone attempts to provide most of RSpec's DSL to express expected outcomes
|
|
28
29
|
* [Arbitrary helper methods](https://relishapp.com/rspec/rspec-core/v/3-10/docs/helper-methods/arbitrary-helper-methods) are not exposed to examples.
|
29
30
|
* The `let` method defines a helper method rather than a memoized helper method.
|
30
31
|
* The one-liner `is_expected` syntax also works with block expectations.
|
32
|
+
* All `subject` definitions must come _before_ examples.
|
33
|
+
* All `before` definitions must come _before_ examples.
|
34
|
+
* All `after` definitions must come _before_ examples.
|
35
|
+
* All `let` definitions must come _before_ examples.
|
31
36
|
|
32
37
|
## Important ⚠️
|
33
38
|
|
@@ -46,7 +51,7 @@ Following [RubyGems naming conventions](https://guides.rubygems.org/name-your-ge
|
|
46
51
|
Add this line to your application's Gemfile:
|
47
52
|
|
48
53
|
```ruby
|
49
|
-
gem "r_spec", ">= 1.0.0.
|
54
|
+
gem "r_spec", ">= 1.0.0.beta7"
|
50
55
|
```
|
51
56
|
|
52
57
|
And then execute:
|
@@ -215,15 +220,18 @@ task default: :test
|
|
215
220
|
|
216
221
|
## Performance
|
217
222
|
|
218
|
-
|
223
|
+
### Runtime
|
224
|
+
|
225
|
+
Benchmark against [100 executions of a file containing one expectation](https://github.com/cyril/r_spec.rb/blob/main/benchmark/) (lower is better).
|
219
226
|
|
220
227
|
| Framework | Seconds to complete |
|
221
228
|
|-------------|---------------------|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
| minitest
|
229
|
+
| `r_spec` | 13.0 |
|
230
|
+
| `rspec` | 32.2 |
|
231
|
+
| `minitest` | 17.5 |
|
232
|
+
| `test-unit` | 20.5 |
|
225
233
|
|
226
|
-
## Test
|
234
|
+
## Test Suite
|
227
235
|
|
228
236
|
__RSpec clone__'s specifications are self-described here: [spec/](https://github.com/cyril/r_spec.rb/blob/main/spec/)
|
229
237
|
|
@@ -233,14 +241,14 @@ __RSpec clone__'s specifications are self-described here: [spec/](https://github
|
|
233
241
|
* Source code: https://github.com/cyril/r_spec.rb
|
234
242
|
* Twitter: [https://twitter.com/cyri\_](https://twitter.com/cyri\_)
|
235
243
|
|
236
|
-
## Special
|
244
|
+
## Special Thanks ❤️
|
237
245
|
|
238
246
|
I would like to thank the whole [RSpec team](https://rspec.info/about/) for all their work.
|
239
247
|
It's a great framework and it's a pleasure to work with every day.
|
240
248
|
|
241
249
|
Without RSpec, this clone would not have been possible.
|
242
250
|
|
243
|
-
## Buy me a
|
251
|
+
## Buy me a Coffee ☕
|
244
252
|
|
245
253
|
If you like this project please consider making a small donation.
|
246
254
|
|
data/lib/r_spec.rb
CHANGED
@@ -7,7 +7,7 @@ require_relative File.join("r_spec", "dsl")
|
|
7
7
|
# @example The true from the false
|
8
8
|
# require "r_spec"
|
9
9
|
#
|
10
|
-
# RSpec.describe do
|
10
|
+
# RSpec.describe "The true from the false" do
|
11
11
|
# it { expect(false).not_to be true }
|
12
12
|
# end
|
13
13
|
#
|
@@ -71,7 +71,7 @@ module RSpec
|
|
71
71
|
# @param block [Proc] The block to define the specs.
|
72
72
|
#
|
73
73
|
# @api public
|
74
|
-
def self.describe(const
|
74
|
+
def self.describe(const, &block)
|
75
75
|
Dsl.describe(const, &block)
|
76
76
|
end
|
77
77
|
end
|
data/lib/r_spec/dsl.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "securerandom"
|
4
|
-
|
5
3
|
require_relative "console"
|
6
4
|
require_relative "error"
|
7
5
|
require_relative "expectation_helper"
|
8
|
-
require_relative "sandbox"
|
9
6
|
|
10
7
|
module RSpec
|
11
8
|
# Abstract class for handling the domain-specific language.
|
12
9
|
class Dsl
|
10
|
+
BEFORE_METHOD = :initialize
|
11
|
+
AFTER_METHOD = :terminate
|
12
|
+
|
13
|
+
private_constant :BEFORE_METHOD, :AFTER_METHOD
|
14
|
+
|
13
15
|
# Executes the given block before each spec in the current context runs.
|
14
16
|
#
|
15
17
|
# @example
|
@@ -40,12 +42,12 @@ module RSpec
|
|
40
42
|
#
|
41
43
|
# @param block [Proc] The content to execute at the class initialization.
|
42
44
|
def self.before(&block)
|
43
|
-
define_method(
|
45
|
+
define_method(BEFORE_METHOD) do
|
44
46
|
super()
|
45
47
|
instance_eval(&block)
|
46
48
|
end
|
47
49
|
|
48
|
-
private
|
50
|
+
private BEFORE_METHOD
|
49
51
|
end
|
50
52
|
|
51
53
|
# Executes the given block after each spec in the current context runs.
|
@@ -67,12 +69,12 @@ module RSpec
|
|
67
69
|
#
|
68
70
|
# @param block [Proc] The content to execute at the class initialization.
|
69
71
|
def self.after(&block)
|
70
|
-
define_method(
|
72
|
+
define_method(AFTER_METHOD) do
|
71
73
|
instance_exec(&block)
|
72
74
|
super()
|
73
75
|
end
|
74
76
|
|
75
|
-
private
|
77
|
+
private AFTER_METHOD
|
76
78
|
end
|
77
79
|
|
78
80
|
# Sets a user-defined property.
|
@@ -80,7 +82,7 @@ module RSpec
|
|
80
82
|
# @example
|
81
83
|
# require "r_spec"
|
82
84
|
#
|
83
|
-
# RSpec.describe do
|
85
|
+
# RSpec.describe "Name stories" do
|
84
86
|
# let(:name) { "Bob" }
|
85
87
|
#
|
86
88
|
# it { expect(name).to eq "Bob" }
|
@@ -99,9 +101,11 @@ module RSpec
|
|
99
101
|
# @param name [String, Symbol] The name of the property.
|
100
102
|
# @param block [Proc] The content of the method to define.
|
101
103
|
#
|
102
|
-
# @return [Symbol] A
|
104
|
+
# @return [Symbol] A private method that define the block content.
|
103
105
|
def self.let(name, *args, **kwargs, &block)
|
104
|
-
|
106
|
+
raise Error::ReservedMethod if [BEFORE_METHOD, AFTER_METHOD].include?(name.to_sym)
|
107
|
+
|
108
|
+
private define_method(name, *args, **kwargs, &block)
|
105
109
|
end
|
106
110
|
|
107
111
|
# Sets a user-defined property named {#subject}.
|
@@ -140,16 +144,11 @@ module RSpec
|
|
140
144
|
# # Output to the console
|
141
145
|
# # Success: expected to eq "foobar".
|
142
146
|
#
|
143
|
-
# @param const [Module,
|
147
|
+
# @param const [Module, String] A module to include in block context.
|
144
148
|
# @param block [Proc] The block to define the specs.
|
145
|
-
def self.describe(const
|
146
|
-
desc =
|
147
|
-
|
148
|
-
if const.is_a?(::Module)
|
149
|
-
desc.define_method(:described_class) { const }
|
150
|
-
desc.send(:protected, :described_class)
|
151
|
-
end
|
152
|
-
|
149
|
+
def self.describe(const, &block)
|
150
|
+
desc = ::Class.new(self)
|
151
|
+
desc.let(:described_class) { const } if const.is_a?(::Module)
|
153
152
|
desc.instance_eval(&block)
|
154
153
|
end
|
155
154
|
|
@@ -161,7 +160,7 @@ module RSpec
|
|
161
160
|
# @example
|
162
161
|
# require "r_spec"
|
163
162
|
#
|
164
|
-
# RSpec.describe do
|
163
|
+
# RSpec.describe "web resource" do
|
165
164
|
# context "when resource is not found" do
|
166
165
|
# pending "responds with 404"
|
167
166
|
# end
|
@@ -179,7 +178,7 @@ module RSpec
|
|
179
178
|
# "when", "with" or "without".
|
180
179
|
# @param block [Proc] The block to define the specs.
|
181
180
|
def self.context(_description = nil, &block)
|
182
|
-
desc =
|
181
|
+
desc = ::Class.new(self)
|
183
182
|
desc.instance_eval(&block)
|
184
183
|
end
|
185
184
|
|
@@ -224,14 +223,14 @@ module RSpec
|
|
224
223
|
def self.it(_name = nil, &block)
|
225
224
|
raise ::ArgumentError, "Missing example block" unless block
|
226
225
|
|
227
|
-
|
228
|
-
|
226
|
+
example = ::Class.new(self) { include ExpectationHelper::It }.new
|
227
|
+
example.instance_eval(&block)
|
229
228
|
rescue ::SystemExit
|
230
229
|
Console.source(*block.source_location)
|
231
230
|
|
232
231
|
exit false
|
233
232
|
ensure
|
234
|
-
|
233
|
+
example.send(AFTER_METHOD)
|
235
234
|
end
|
236
235
|
|
237
236
|
# Use the {.its} method to define a single spec that specifies the actual
|
@@ -282,19 +281,21 @@ module RSpec
|
|
282
281
|
def self.its(attribute, *args, **kwargs, &block)
|
283
282
|
raise ::ArgumentError, "Missing example block" unless block
|
284
283
|
|
285
|
-
|
284
|
+
example = ::Class.new(self) do
|
285
|
+
include ExpectationHelper::Its
|
286
286
|
|
287
|
-
|
288
|
-
|
289
|
-
|
287
|
+
define_method(:actual) do
|
288
|
+
subject.public_send(attribute, *args, **kwargs)
|
289
|
+
end
|
290
|
+
end.new
|
290
291
|
|
291
|
-
|
292
|
+
example.instance_eval(&block)
|
292
293
|
rescue ::SystemExit
|
293
294
|
Console.source(*block.source_location)
|
294
295
|
|
295
296
|
exit false
|
296
297
|
ensure
|
297
|
-
|
298
|
+
example.send(AFTER_METHOD)
|
298
299
|
end
|
299
300
|
|
300
301
|
# Defines a pending test case.
|
@@ -305,23 +306,16 @@ module RSpec
|
|
305
306
|
# @example
|
306
307
|
# require "r_spec"
|
307
308
|
#
|
308
|
-
# RSpec.describe do
|
309
|
+
# RSpec.describe "an example" do
|
309
310
|
# pending "is implemented but waiting" do
|
310
|
-
# expect
|
311
|
+
# expect something to be finished
|
311
312
|
# end
|
312
|
-
# end
|
313
313
|
#
|
314
|
-
# # Output to the console
|
315
|
-
# # Warning: is implemented but waiting.
|
316
|
-
#
|
317
|
-
# @example
|
318
|
-
# require "r_spec"
|
319
|
-
#
|
320
|
-
# RSpec.describe do
|
321
314
|
# pending "is not yet implemented and waiting"
|
322
315
|
# end
|
323
316
|
#
|
324
317
|
# # Output to the console
|
318
|
+
# # Warning: is implemented but waiting.
|
325
319
|
# # Warning: is not yet implemented and waiting.
|
326
320
|
#
|
327
321
|
# @param message [String] The reason why the example is pending.
|
@@ -333,30 +327,7 @@ module RSpec
|
|
333
327
|
Console.passed_spec Error::PendingExpectation.result(message)
|
334
328
|
end
|
335
329
|
|
336
|
-
|
337
|
-
#
|
338
|
-
# @return [Class<Dsl>] The class of the example to be tested.
|
339
|
-
def self.it_example
|
340
|
-
::Class.new(self) { include ExpectationHelper::It }
|
341
|
-
end
|
342
|
-
|
343
|
-
# @private
|
344
|
-
#
|
345
|
-
# @return [Class<Dsl>] The class of the example to be tested.
|
346
|
-
def self.its_example
|
347
|
-
::Class.new(self) { include ExpectationHelper::Its }
|
348
|
-
end
|
349
|
-
|
350
|
-
# @private
|
351
|
-
#
|
352
|
-
# @return [String] A random constant name for a test class.
|
353
|
-
def self.random_context_const_name
|
354
|
-
"Context#{::SecureRandom.hex(4).to_i(16)}"
|
355
|
-
end
|
356
|
-
|
357
|
-
private_class_method :it_example, :its_example, :random_context_const_name
|
358
|
-
|
359
|
-
protected
|
330
|
+
private
|
360
331
|
|
361
332
|
def described_class
|
362
333
|
raise Error::UndefinedDescribedClass,
|
@@ -367,6 +338,8 @@ module RSpec
|
|
367
338
|
raise Error::UndefinedSubject, "subject not explicitly defined"
|
368
339
|
end
|
369
340
|
|
370
|
-
|
341
|
+
define_method(AFTER_METHOD) do
|
342
|
+
# do nothing by default
|
343
|
+
end
|
371
344
|
end
|
372
345
|
end
|
data/lib/r_spec/error.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative File.join("error", "pending_expectation")
|
4
|
+
require_relative File.join("error", "reserved_method")
|
4
5
|
require_relative File.join("error", "undefined_described_class")
|
5
6
|
require_relative File.join("error", "undefined_subject")
|
6
7
|
|
@@ -4,7 +4,7 @@ require_relative File.join("expectation_helper", "it")
|
|
4
4
|
require_relative File.join("expectation_helper", "its")
|
5
5
|
|
6
6
|
module RSpec
|
7
|
-
# Namespace for
|
7
|
+
# Namespace for {Dsl.it} and {Dsl.its}'s helper modules.
|
8
8
|
module ExpectationHelper
|
9
9
|
end
|
10
10
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
3
|
+
require_relative "shared"
|
4
4
|
require_relative File.join("..", "expectation_target")
|
5
5
|
|
6
6
|
module RSpec
|
7
7
|
module ExpectationHelper
|
8
|
-
# {RSpec::
|
8
|
+
# {RSpec::Dsl.it}'s expectation helper module.
|
9
9
|
module It
|
10
|
-
include
|
10
|
+
include Shared
|
11
11
|
|
12
12
|
# Create an expectation for a spec.
|
13
13
|
#
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
3
|
+
require_relative "shared"
|
4
4
|
require_relative File.join("..", "expectation_target", "block")
|
5
5
|
|
6
6
|
module RSpec
|
7
7
|
module ExpectationHelper
|
8
|
-
# {RSpec::
|
8
|
+
# {RSpec::Dsl.its}'s expectation helper module.
|
9
9
|
module Its
|
10
|
-
include
|
10
|
+
include Shared
|
11
11
|
|
12
12
|
# Wraps the target of an expectation with the actual value.
|
13
13
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r_spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta7
|
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-06-
|
11
|
+
date: 2021-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: expresenter
|
@@ -30,28 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.1.
|
33
|
+
version: 1.1.2
|
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: 1.1.
|
40
|
+
version: 1.1.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: spectus
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.3.
|
47
|
+
version: 3.3.4
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.3.
|
54
|
+
version: 3.3.4
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,17 +191,17 @@ files:
|
|
191
191
|
- lib/r_spec/dsl.rb
|
192
192
|
- lib/r_spec/error.rb
|
193
193
|
- lib/r_spec/error/pending_expectation.rb
|
194
|
+
- lib/r_spec/error/reserved_method.rb
|
194
195
|
- lib/r_spec/error/undefined_described_class.rb
|
195
196
|
- lib/r_spec/error/undefined_subject.rb
|
196
197
|
- lib/r_spec/expectation_helper.rb
|
197
|
-
- lib/r_spec/expectation_helper/base.rb
|
198
198
|
- lib/r_spec/expectation_helper/it.rb
|
199
199
|
- lib/r_spec/expectation_helper/its.rb
|
200
|
+
- lib/r_spec/expectation_helper/shared.rb
|
200
201
|
- lib/r_spec/expectation_target.rb
|
201
202
|
- lib/r_spec/expectation_target/base.rb
|
202
203
|
- lib/r_spec/expectation_target/block.rb
|
203
204
|
- lib/r_spec/expectation_target/value.rb
|
204
|
-
- lib/r_spec/sandbox.rb
|
205
205
|
homepage: https://r-spec.dev/
|
206
206
|
licenses:
|
207
207
|
- MIT
|