saharspec 0.0.8 → 0.0.10
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/CHANGELOG.md +11 -0
- data/README.md +59 -6
- data/config/rubocop-rspec.yml +13 -0
- data/lib/saharspec/its/block.rb +4 -3
- data/lib/saharspec/its/call.rb +2 -2
- data/lib/saharspec/its/map.rb +1 -1
- data/lib/saharspec/metadata/lets.rb +56 -0
- data/lib/saharspec/metadata.rb +30 -0
- data/lib/saharspec/version.rb +1 -1
- data/lib/saharspec.rb +5 -1
- data/saharspec.gemspec +3 -5
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9409e96bf31ffafcb98955b97ab75e2b78547b5d5bf5dc405f22f21fd62ff77c
|
4
|
+
data.tar.gz: b9d1cda3cd2796576612b4e888cf8fd97a9b39357c56417c293628958722bdb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e10c863c94b4099cd6322029eda5129aec7cb12ddfae032c71a37436731f86189c8f1494a5f71d29e6eb17764ba4f6ad06e7f9a9ada6486d123aac0036d1d32a
|
7
|
+
data.tar.gz: d229e1aa4ecfa492f15b57b4249e51ae7cdf0805895f4a465a1ade675949a13526d3052e719b4abed0b98c858461aa5b30115642425883df0c66f0039728c766
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Saharspec history
|
2
2
|
|
3
|
+
## 0.0.10 -- 2023-02-18
|
4
|
+
|
5
|
+
* Add `lets:` metadata helper for DRYer defining of simple `let`s in multiple contexts;
|
6
|
+
* Minimum supported Ruby version is 2.7
|
7
|
+
* Add a handler for when `saharspec` is called before/without `rspec`, to provide an informative error message ([@Vagab](https://github.com/Vagab))
|
8
|
+
|
9
|
+
## 0.0.9 -- 2022-05-17
|
10
|
+
|
11
|
+
* Properly lint RSpec specs using `its_block`/`its_call`/`its_map` with `rubocop-rspec` >= 2.0 ([@ka8725](https://github.com/ka8725))
|
12
|
+
* Fix `its_block` and `its_call` to support RSpec 3.11
|
13
|
+
|
3
14
|
## 0.0.8 -- 2020-10-10
|
4
15
|
|
5
16
|
* Better `dont` failure message (just use underlying matchers `failure_message_when_negated`)
|
data/README.md
CHANGED
@@ -73,18 +73,18 @@ context 'when incompatible' do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
# option 2. subject is block
|
76
|
-
subject { -> {2 + x } }
|
77
|
-
|
78
|
-
context 'when incompatible' do
|
79
|
-
let(:x) { '3' }
|
80
|
-
it { is_expected.to raise_error } # DRY
|
81
|
-
end
|
76
|
+
subject { -> { 2 + x } }
|
82
77
|
|
83
78
|
context 'when numeric' do
|
84
79
|
let(:x) { 3 }
|
85
80
|
it { expect(subject.call).to eq 5 } # not DRY
|
86
81
|
end
|
87
82
|
|
83
|
+
context 'when incompatible' do
|
84
|
+
let(:x) { '3' }
|
85
|
+
it { is_expected.to raise_error } # DRY
|
86
|
+
end
|
87
|
+
|
88
88
|
# after
|
89
89
|
require 'saharspec/matchers/ret'
|
90
90
|
|
@@ -250,6 +250,59 @@ describe '#delete_at' do
|
|
250
250
|
end
|
251
251
|
```
|
252
252
|
|
253
|
+
### Metadata handlers
|
254
|
+
|
255
|
+
(Experimental.) Those aren't required by default, or by `require 'saharspec/metadata'`, you need to require each by its own. This is done to lessen the confusion if metadata processing isn't expected.
|
256
|
+
|
257
|
+
#### `lets:`
|
258
|
+
|
259
|
+
A shortcut for defining simple `let`s in the description
|
260
|
+
|
261
|
+
```ruby
|
262
|
+
let(:user) { create(:user, role: role) }
|
263
|
+
|
264
|
+
# before: a lot of code to say simple things:
|
265
|
+
|
266
|
+
context 'when admin' do
|
267
|
+
let(:role) { :admin }
|
268
|
+
|
269
|
+
it { is_expected.to be_allowed }
|
270
|
+
end
|
271
|
+
|
272
|
+
context 'when user' do
|
273
|
+
let(:role) { :user }
|
274
|
+
|
275
|
+
it { is_expected.to be_denied }
|
276
|
+
end
|
277
|
+
|
278
|
+
# after
|
279
|
+
|
280
|
+
context 'when admin', lets: {role: :admin} do
|
281
|
+
it { is_expected.to be_allowed }
|
282
|
+
end
|
283
|
+
|
284
|
+
context 'when user', lets: {role: :user} do
|
285
|
+
it { is_expected.to be_denied }
|
286
|
+
end
|
287
|
+
|
288
|
+
# you can also give empty descriptions, then they would be auto-generated
|
289
|
+
|
290
|
+
# generates a context with description "with role=:admin"
|
291
|
+
context '', lets: {role: :admin} do
|
292
|
+
it { is_expected.to be_allowed }
|
293
|
+
end
|
294
|
+
```
|
295
|
+
|
296
|
+
### Linting with RuboCop RSpec
|
297
|
+
|
298
|
+
`rubocop-rspec` fails to properly detect RSpec constructs that Saharspec defines (`its_call`, `its_block`, `its_map`).
|
299
|
+
Make sure to use `rubocop-rspec` 2.0 or newer and add the following to your `.rubocop.yml`:
|
300
|
+
|
301
|
+
```yaml
|
302
|
+
inherit_gem:
|
303
|
+
saharspec: config/rubocop-rspec.yml
|
304
|
+
```
|
305
|
+
|
253
306
|
## State & future
|
254
307
|
|
255
308
|
I use all of the components of the library on daily basis. Probably, I will extend it with other
|
data/lib/saharspec/its/block.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module Saharspec
|
4
4
|
module Its
|
5
5
|
module Block
|
6
|
-
# Creates nested example
|
6
|
+
# Creates nested example that redefines implicit `is_expected` to use subject as a block.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
#
|
@@ -34,12 +34,13 @@ module Saharspec
|
|
34
34
|
def its_block(*options, &block)
|
35
35
|
# rubocop:disable Lint/NestedMethodDefinition
|
36
36
|
describe('as block') do
|
37
|
+
# FIXME: Not necessary? (Previously, wrapped the subject in lambda, now just repeats it)
|
37
38
|
let(:__call_subject) do
|
38
|
-
|
39
|
+
subject
|
39
40
|
end
|
40
41
|
|
41
42
|
def is_expected
|
42
|
-
expect
|
43
|
+
expect { __call_subject }
|
43
44
|
end
|
44
45
|
|
45
46
|
example(nil, *options, &block)
|
data/lib/saharspec/its/call.rb
CHANGED
@@ -31,11 +31,11 @@ module Saharspec
|
|
31
31
|
# rubocop:disable Lint/NestedMethodDefinition
|
32
32
|
describe("(#{args.map(&:inspect).join(', ')})") do
|
33
33
|
let(:__call_subject) do
|
34
|
-
|
34
|
+
subject.call(*args)
|
35
35
|
end
|
36
36
|
|
37
37
|
def is_expected
|
38
|
-
expect
|
38
|
+
expect { __call_subject }
|
39
39
|
end
|
40
40
|
|
41
41
|
example(nil, &block)
|
data/lib/saharspec/its/map.rb
CHANGED
@@ -32,7 +32,7 @@ module Saharspec
|
|
32
32
|
# @param block [Proc] The test itself. Inside it, `is_expected` (or `are_expected`) is related to result
|
33
33
|
# of `map`ping the subject.
|
34
34
|
#
|
35
|
-
def its_map(attribute, *options, &block) # rubocop:disable Metrics/
|
35
|
+
def its_map(attribute, *options, &block) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
36
36
|
# rubocop:disable Lint/NestedMethodDefinition
|
37
37
|
# TODO: better desciption for different cases
|
38
38
|
describe("map(&:#{attribute})") do
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Saharspec
|
4
|
+
module Metadata
|
5
|
+
# Is included in `context`s and `describe`s that have `lets: Hash` defined, as a shortcut to
|
6
|
+
# define simple `let`s in a simple one-line way:
|
7
|
+
#
|
8
|
+
# ```ruby
|
9
|
+
# let(:user) { create(:user, role: role) }
|
10
|
+
#
|
11
|
+
# # before: a lot of code to say simple things:
|
12
|
+
# context 'when admin' do
|
13
|
+
# let(:role) { :admin }
|
14
|
+
#
|
15
|
+
# it { is_expected.to be_allowed }
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# context 'when user' do
|
19
|
+
# let(:role) { :user }
|
20
|
+
#
|
21
|
+
# it { is_expected.to be_denied }
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# # after
|
25
|
+
# context 'when admin', lets: {role: :admin} do
|
26
|
+
# it { is_expected.to be_allowed }
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# context 'when user', lets: {role: :user} do
|
30
|
+
# it { is_expected.to be_denied }
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # you can also give empty descriptions, then they would be auto-generated
|
34
|
+
#
|
35
|
+
# # generates a context with description "with role=:admin"
|
36
|
+
# context '', lets: {role: :admin} do
|
37
|
+
# it { is_expected.to be_allowed }
|
38
|
+
# end
|
39
|
+
# ```
|
40
|
+
#
|
41
|
+
module Lets
|
42
|
+
def self.included(ctx)
|
43
|
+
lets = ctx.metadata[:lets]
|
44
|
+
.tap { _1.is_a?(Hash) or fail ArgumentError, "lets: is expected to be a Hash, got #{_1.class}" }
|
45
|
+
|
46
|
+
lets.each { |name, val| ctx.let(name) { val } }
|
47
|
+
ctx.metadata[:description].to_s.empty? and
|
48
|
+
ctx.metadata[:description] = lets.map { "#{_1}=#{_2.inspect}" }.join(', ').prepend('with ')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
RSpec.configure do |config|
|
55
|
+
config.include Saharspec::Metadata::Lets, :lets
|
56
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Saharspec
|
4
|
+
# Wrapper module for all RSpec additions available via example or context metadata.
|
5
|
+
#
|
6
|
+
# Note: because including some functionality by context metadata is not obvious,
|
7
|
+
# saharspec doesn't require them by default when you `require 'saharspec'` or
|
8
|
+
# `require 'saharspec/metadata'`, you need to require specifically the functionality
|
9
|
+
# you are planning to use.
|
10
|
+
#
|
11
|
+
# See:
|
12
|
+
#
|
13
|
+
# ## {Lets}
|
14
|
+
#
|
15
|
+
# ```ruby
|
16
|
+
# context 'with admin', lets: {role: :admin} do
|
17
|
+
# it { is_expected.to be_allowed }
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # this is the same as
|
21
|
+
# context 'with admin' do
|
22
|
+
# let(:role) { :admin }
|
23
|
+
#
|
24
|
+
# it { is_expected.to be_allowed }
|
25
|
+
# end
|
26
|
+
# ```
|
27
|
+
#
|
28
|
+
module Metadata
|
29
|
+
end
|
30
|
+
end
|
data/lib/saharspec/version.rb
CHANGED
data/lib/saharspec.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
defined?(RSpec) or
|
4
|
+
fail 'RSpec is not present in the current environment, check that `rspec` ' \
|
5
|
+
'is present in your Gemfile and is in the same group as `saharspec`' \
|
6
|
+
|
3
7
|
# Umbrella module for all Saharspec RSpec DRY-ing features.
|
4
8
|
#
|
5
|
-
# See {file:README.md} or {Its} and {
|
9
|
+
# See {file:README.md} or {Its}, {Matchers}, and {Metadata} separately.
|
6
10
|
#
|
7
11
|
module Saharspec
|
8
12
|
end
|
data/saharspec.gemspec
CHANGED
@@ -23,14 +23,12 @@ Gem::Specification.new do |s|
|
|
23
23
|
end
|
24
24
|
s.require_paths = ["lib"]
|
25
25
|
|
26
|
-
s.required_ruby_version = '>= 2.
|
26
|
+
s.required_ruby_version = '>= 2.7.0'
|
27
27
|
|
28
28
|
s.add_runtime_dependency 'ruby2_keywords'
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
s.add_development_dependency 'rspec', '~> 3.7.0'
|
30
|
+
s.add_development_dependency 'rubocop', '~> 0.93'
|
31
|
+
s.add_development_dependency 'rspec', '>= 3.7.0'
|
34
32
|
s.add_development_dependency 'rspec-its'
|
35
33
|
s.add_development_dependency 'simplecov', '~> 0.9'
|
36
34
|
s.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saharspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Shepelev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby2_keywords
|
@@ -42,14 +42,14 @@ dependencies:
|
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 3.7.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 3.7.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
@@ -133,6 +133,7 @@ files:
|
|
133
133
|
- CHANGELOG.md
|
134
134
|
- LICENSE.txt
|
135
135
|
- README.md
|
136
|
+
- config/rubocop-rspec.yml
|
136
137
|
- lib/saharspec.rb
|
137
138
|
- lib/saharspec/its.rb
|
138
139
|
- lib/saharspec/its/block.rb
|
@@ -145,6 +146,8 @@ files:
|
|
145
146
|
- lib/saharspec/matchers/request_webmock.rb
|
146
147
|
- lib/saharspec/matchers/ret.rb
|
147
148
|
- lib/saharspec/matchers/send_message.rb
|
149
|
+
- lib/saharspec/metadata.rb
|
150
|
+
- lib/saharspec/metadata/lets.rb
|
148
151
|
- lib/saharspec/util.rb
|
149
152
|
- lib/saharspec/version.rb
|
150
153
|
- saharspec.gemspec
|
@@ -160,14 +163,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
163
|
requirements:
|
161
164
|
- - ">="
|
162
165
|
- !ruby/object:Gem::Version
|
163
|
-
version: 2.
|
166
|
+
version: 2.7.0
|
164
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
168
|
requirements:
|
166
169
|
- - ">="
|
167
170
|
- !ruby/object:Gem::Version
|
168
171
|
version: '0'
|
169
172
|
requirements: []
|
170
|
-
rubygems_version: 3.
|
173
|
+
rubygems_version: 3.1.6
|
171
174
|
signing_key:
|
172
175
|
specification_version: 4
|
173
176
|
summary: Several additions for DRYer RSpec code
|