rspec-its 1.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +25 -87
- data/.gitignore +1 -0
- data/.rubocop.yml +46 -0
- data/Changelog.md +9 -0
- data/Gemfile +14 -25
- data/LICENSE.txt +1 -1
- data/README.md +12 -14
- data/Rakefile +3 -1
- data/features/its.feature +31 -59
- data/features/step_definitions/additional_cli_steps.rb +14 -12
- data/features/support/env.rb +9 -10
- data/lib/rspec/its/subject.rb +26 -0
- data/lib/rspec/its/version.rb +3 -1
- data/lib/rspec/its.rb +48 -59
- data/rspec-its.gemspec +16 -34
- data/script/test_all +6 -8
- data/script/update_rubygems_and_install_bundler +3 -31
- data/spec/rspec/its_spec.rb +333 -303
- data/spec/spec_helper.rb +8 -1
- metadata +17 -79
- data/script/legacy_setup.sh +0 -16
data/lib/rspec/its/version.rb
CHANGED
data/lib/rspec/its.rb
CHANGED
@@ -1,26 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rspec/its/subject'
|
1
4
|
require 'rspec/its/version'
|
2
5
|
require 'rspec/core'
|
3
6
|
|
4
7
|
RSpec::Core::ExampleGroup.define_example_method :__its_example
|
5
8
|
|
6
9
|
module RSpec
|
10
|
+
# Adds the `its` to RSpec Example Groups, included by default.
|
7
11
|
module Its
|
8
|
-
|
9
12
|
# Creates a nested example group named by the submitted `attribute`,
|
10
13
|
# and then generates an example using the submitted block.
|
11
14
|
#
|
12
15
|
# @example
|
13
16
|
#
|
14
17
|
# # This ...
|
15
|
-
# describe Array do
|
16
|
-
# its(:size) {
|
18
|
+
# RSpec.describe Array do
|
19
|
+
# its(:size) { is_expected.to eq(0) }
|
17
20
|
# end
|
18
21
|
#
|
19
22
|
# # ... generates the same runtime structure as this:
|
20
|
-
# describe Array do
|
23
|
+
# RSpec.describe Array do
|
21
24
|
# describe "size" do
|
22
|
-
# it "
|
23
|
-
# subject.size.
|
25
|
+
# it "is_expected.to eq(0)" do
|
26
|
+
# expect(subject.size).to eq(0)
|
24
27
|
# end
|
25
28
|
# end
|
26
29
|
# end
|
@@ -31,14 +34,14 @@ module RSpec
|
|
31
34
|
#
|
32
35
|
# @example
|
33
36
|
#
|
34
|
-
# describe Person do
|
35
|
-
# subject do
|
37
|
+
# RSpec.describe Person do
|
38
|
+
# subject(:person) do
|
36
39
|
# Person.new.tap do |person|
|
37
40
|
# person.phone_numbers << "555-1212"
|
38
41
|
# end
|
39
42
|
# end
|
40
43
|
#
|
41
|
-
# its("phone_numbers.first") {
|
44
|
+
# its("phone_numbers.first") { is_expected.to eq("555-1212") }
|
42
45
|
# end
|
43
46
|
#
|
44
47
|
# When the subject is a `Hash`, you can refer to the Hash keys by
|
@@ -46,30 +49,30 @@ module RSpec
|
|
46
49
|
#
|
47
50
|
# @example
|
48
51
|
#
|
49
|
-
# describe "a configuration Hash" do
|
52
|
+
# RSpec.describe "a configuration Hash" do
|
50
53
|
# subject do
|
51
54
|
# { :max_users => 3,
|
52
55
|
# 'admin' => :all_permissions.
|
53
56
|
# 'john_doe' => {:permissions => [:read, :write]}}
|
54
57
|
# end
|
55
58
|
#
|
56
|
-
# its([:max_users]) {
|
57
|
-
# its(['admin']) {
|
58
|
-
# its(['john_doe', :permissions]) {
|
59
|
+
# its([:max_users]) { is_expected.to eq(3) }
|
60
|
+
# its(['admin']) { is_expected.to eq(:all_permissions) }
|
61
|
+
# its(['john_doe', :permissions]) { are_expected.to eq([:read, :write]) }
|
59
62
|
#
|
60
63
|
# # You can still access its regular methods this way:
|
61
|
-
# its(:keys) {
|
62
|
-
# its(:count) {
|
64
|
+
# its(:keys) { is_expected.to include(:max_users) }
|
65
|
+
# its(:count) { is_expected.to eq(2) }
|
63
66
|
# end
|
64
67
|
#
|
65
|
-
# With an implicit subject, `
|
66
|
-
# to `
|
68
|
+
# With an implicit subject, `should` can be used as an alternative
|
69
|
+
# to `is_expected` (e.g. for one-liner use). An `are_expected` alias is also
|
67
70
|
# supplied.
|
68
71
|
#
|
69
72
|
# @example
|
70
73
|
#
|
71
|
-
# describe Array do
|
72
|
-
# its(:size) {
|
74
|
+
# RSpec.describe Array do
|
75
|
+
# its(:size) { should eq(0) }
|
73
76
|
# end
|
74
77
|
#
|
75
78
|
# With an implicit subject, `will` can be used as an alternative
|
@@ -77,7 +80,7 @@ module RSpec
|
|
77
80
|
#
|
78
81
|
# @example
|
79
82
|
#
|
80
|
-
# describe Array do
|
83
|
+
# RSpec.describe Array do
|
81
84
|
# its(:foo) { will raise_error(NoMethodError) }
|
82
85
|
# end
|
83
86
|
#
|
@@ -86,7 +89,7 @@ module RSpec
|
|
86
89
|
#
|
87
90
|
# @example
|
88
91
|
#
|
89
|
-
# describe Array do
|
92
|
+
# RSpec.describe Array do
|
90
93
|
# its(:size) { will_not raise_error }
|
91
94
|
# end
|
92
95
|
#
|
@@ -96,15 +99,15 @@ module RSpec
|
|
96
99
|
# @example
|
97
100
|
#
|
98
101
|
# # This ...
|
99
|
-
# describe Array do
|
100
|
-
# its(:size, :focus) {
|
102
|
+
# RSpec.describe Array do
|
103
|
+
# its(:size, :focus) { is_expected.to eq(0) }
|
101
104
|
# end
|
102
105
|
#
|
103
106
|
# # ... generates the same runtime structure as this:
|
104
|
-
# describe Array do
|
107
|
+
# RSpec.describe Array do
|
105
108
|
# describe "size" do
|
106
|
-
# it "
|
107
|
-
# subject.size.
|
109
|
+
# it "is expected to eq(0)", :focus do
|
110
|
+
# expect(subject.size).to eq(0)
|
108
111
|
# end
|
109
112
|
# end
|
110
113
|
# end
|
@@ -115,70 +118,56 @@ module RSpec
|
|
115
118
|
#
|
116
119
|
# @example
|
117
120
|
#
|
118
|
-
# describe Person do
|
121
|
+
# RSpec.describe Person do
|
119
122
|
# subject { Person.new }
|
123
|
+
#
|
120
124
|
# before { subject.age = 25 }
|
121
|
-
#
|
125
|
+
#
|
126
|
+
# its(:age) { is_expected.to eq(25) }
|
122
127
|
# end
|
123
128
|
def its(attribute, *options, &block)
|
124
|
-
its_caller = caller.
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
if Hash === subject
|
129
|
-
attribute.inject(subject) {|inner, attr| inner[attr] }
|
130
|
-
else
|
131
|
-
subject[*attribute]
|
132
|
-
end
|
133
|
-
else
|
134
|
-
attribute_chain = attribute.to_s.split('.')
|
135
|
-
attribute_chain.inject(subject) do |inner_subject, attr|
|
136
|
-
inner_subject.send(attr)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
129
|
+
its_caller = caller.grep_v(%r{/lib/rspec/its})
|
130
|
+
|
131
|
+
describe(attribute.to_s, caller: its_caller) do
|
132
|
+
let(:__its_subject) { RSpec::Its::Subject.for(attribute, subject) }
|
140
133
|
|
141
134
|
def is_expected
|
142
135
|
expect(__its_subject)
|
143
136
|
end
|
144
137
|
alias_method :are_expected, :is_expected
|
145
138
|
|
146
|
-
def will(matcher=nil, message=nil)
|
147
|
-
unless matcher.supports_block_expectations?
|
148
|
-
|
149
|
-
end
|
139
|
+
def will(matcher = nil, message = nil)
|
140
|
+
raise ArgumentError, "`will` only supports block expectations" unless matcher.supports_block_expectations?
|
141
|
+
|
150
142
|
expect { __its_subject }.to matcher, message
|
151
143
|
end
|
152
144
|
|
153
|
-
def will_not(matcher=nil, message=nil)
|
154
|
-
unless matcher.supports_block_expectations?
|
155
|
-
|
156
|
-
end
|
145
|
+
def will_not(matcher = nil, message = nil)
|
146
|
+
raise ArgumentError, "`will_not` only supports block expectations" unless matcher.supports_block_expectations?
|
147
|
+
|
157
148
|
expect { __its_subject }.to_not matcher, message
|
158
149
|
end
|
159
150
|
|
160
|
-
def should(matcher=nil, message=nil)
|
151
|
+
def should(matcher = nil, message = nil)
|
161
152
|
RSpec::Expectations::PositiveExpectationHandler.handle_matcher(__its_subject, matcher, message)
|
162
153
|
end
|
163
154
|
|
164
|
-
def should_not(matcher=nil, message=nil)
|
155
|
+
def should_not(matcher = nil, message = nil)
|
165
156
|
RSpec::Expectations::NegativeExpectationHandler.handle_matcher(__its_subject, matcher, message)
|
166
157
|
end
|
167
158
|
|
168
|
-
options << {} unless options.last.
|
169
|
-
options.last.merge!(:
|
159
|
+
options << {} unless options.last.is_a?(Hash)
|
160
|
+
options.last.merge!(caller: its_caller)
|
170
161
|
|
171
162
|
__its_example(nil, *options, &block)
|
172
|
-
|
173
163
|
end
|
174
164
|
end
|
175
|
-
|
176
165
|
end
|
177
166
|
end
|
178
167
|
|
179
168
|
RSpec.configure do |rspec|
|
180
169
|
rspec.extend RSpec::Its
|
181
|
-
rspec.backtrace_exclusion_patterns << %r
|
170
|
+
rspec.backtrace_exclusion_patterns << %r{/lib/rspec/its}
|
182
171
|
end
|
183
172
|
|
184
173
|
RSpec::SharedContext.send(:include, RSpec::Its)
|
data/rspec-its.gemspec
CHANGED
@@ -1,49 +1,31 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'rspec/its/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = "rspec-its"
|
8
9
|
spec.version = RSpec::Its::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
10
|
+
spec.authors = ["The RSpec Development Team"]
|
11
|
+
spec.email = ["maintainers@rspec.info"]
|
12
|
+
spec.description = 'RSpec extension gem for attribute matching'
|
13
|
+
spec.summary = 'Provides "its" method formerly part of rspec-core'
|
13
14
|
spec.homepage = "https://github.com/rspec/rspec-its"
|
14
15
|
spec.license = "MIT"
|
16
|
+
spec.required_ruby_version = '> 3.0.0'
|
15
17
|
|
16
|
-
spec.metadata =
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
}
|
18
|
+
spec.metadata['bug_tracker_uri'] = 'https://github.com/rspec/rspec-its/issues'
|
19
|
+
spec.metadata['changelog_uri'] = "https://github.com/rspec/rspec-its/blob/v#{spec.version}/Changelog.md"
|
20
|
+
spec.metadata['documentation_uri'] = "https://www.rubydoc.info/gems/rspec-its/#{spec.version}"
|
21
|
+
spec.metadata['mailing_list_uri'] = 'https://groups.google.com/forum/#!forum/rspec'
|
22
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
23
|
+
spec.metadata['source_code_uri'] = 'https://github.com/rspec/rspec-its'
|
23
24
|
|
24
25
|
spec.files = `git ls-files`.split($/) - %w[cucumber.yml]
|
25
26
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
26
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
27
27
|
spec.require_paths = ["lib"]
|
28
28
|
|
29
|
-
spec.
|
30
|
-
spec.
|
31
|
-
|
32
|
-
if RUBY_VERSION.to_f < 1.9 || RUBY_VERSION == '1.9.2'
|
33
|
-
spec.add_development_dependency "rake", "~> 10.0.0"
|
34
|
-
elsif RUBY_VERSION.to_f < 2
|
35
|
-
spec.add_development_dependency "rake", "~> 11.0.0"
|
36
|
-
elsif RUBY_VERSION.to_f < 2.3
|
37
|
-
spec.add_development_dependency "rake", "~> 12.3.2"
|
38
|
-
else
|
39
|
-
spec.add_development_dependency "rake", "~> 13.0.0"
|
40
|
-
end
|
41
|
-
|
42
|
-
spec.add_development_dependency 'bundler', '> 1.3.0'
|
43
|
-
if RUBY_VERSION.to_f < 2
|
44
|
-
spec.add_development_dependency 'cucumber', '< 3.0.0'
|
45
|
-
else
|
46
|
-
spec.add_development_dependency 'cucumber', '>= 1.3.8'
|
47
|
-
end
|
48
|
-
spec.add_development_dependency "aruba", "~> 0.14.12"
|
29
|
+
spec.add_dependency 'rspec-core', '>= 3.13.0'
|
30
|
+
spec.add_dependency 'rspec-expectations', '>= 3.13.0'
|
49
31
|
end
|
data/script/test_all
CHANGED
@@ -21,16 +21,14 @@ else
|
|
21
21
|
echo "Using $BRANCH"
|
22
22
|
fi
|
23
23
|
|
24
|
-
if ruby -e 'exit(ENV.fetch("BRANCH") =~ /3-[0-8]-maintenance/ ? 0 : 1)'; then
|
25
|
-
TAGS="--tags @pre-3-9"
|
26
|
-
else
|
27
|
-
TAGS="--tags @post-3-9"
|
28
|
-
fi;
|
29
|
-
|
30
24
|
if ruby -e "exit(defined?(RUBY_PLATFORM) && RUBY_PLATFORM == 'java')"; then
|
31
25
|
# This is JRUBY which requires this one weird path trick...
|
32
26
|
PATH="${PWD}/bin:$PATH" \
|
33
|
-
bundle exec cucumber --strict
|
27
|
+
bundle exec cucumber --strict
|
28
|
+
elif ruby -e "exit(RUBY_VERSION.to_f >= 3.4)"; then
|
29
|
+
# This is a monkey patch to fix an issue with cucumber using outdated hash syntax, remove when cucumber is updated or ruby 3.4 released
|
30
|
+
sed -i '$i\class Hash; alias :__initialize :initialize; def initialize(*args, **_kw, &block) = __initialize(*args, &block); end' bin/cucumber
|
31
|
+
bin/cucumber --strict
|
34
32
|
else
|
35
|
-
bundle exec cucumber --strict
|
33
|
+
bundle exec cucumber --strict
|
36
34
|
fi;
|
@@ -1,35 +1,7 @@
|
|
1
1
|
#!/bin/bash
|
2
|
-
# This file was generated on 2019-01-03T20:34:23+00:00 from the rspec-dev repo.
|
3
|
-
# DO NOT modify it by hand as your changes will get lost the next time it is generated.
|
4
2
|
|
5
3
|
set -e
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
else
|
11
|
-
return 1
|
12
|
-
fi
|
13
|
-
}
|
14
|
-
|
15
|
-
function is_ruby_23_plus {
|
16
|
-
if ruby -e "exit(RUBY_VERSION.to_f >= 2.3)"; then
|
17
|
-
return 0
|
18
|
-
else
|
19
|
-
return 1
|
20
|
-
fi
|
21
|
-
}
|
22
|
-
|
23
|
-
if is_ruby_31_plus; then
|
24
|
-
echo "Installing rubygems 3.3.6 / bundler 2.3.6"
|
25
|
-
yes | gem update --system '3.3.6'
|
26
|
-
yes | gem install bundler -v '2.3.6'
|
27
|
-
elif is_ruby_23_plus; then
|
28
|
-
echo "Installing rubygems 3.2.22 / bundler 2.2.22"
|
29
|
-
yes | gem update --system '3.2.22'
|
30
|
-
yes | gem install bundler -v '2.2.22'
|
31
|
-
else
|
32
|
-
echo "Warning installing older versions of Rubygems / Bundler"
|
33
|
-
gem update --system '2.7.8'
|
34
|
-
gem install bundler -v '1.17.3'
|
35
|
-
fi
|
5
|
+
echo "Installing latest rubygems / bundler"
|
6
|
+
yes | gem update --system
|
7
|
+
yes | gem install bundler
|