rspec-armour 0.1.0 → 0.3.0
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 +7 -1
- data/README.md +37 -9
- data/lib/rspec/armour/checker.rb +14 -0
- data/lib/rspec/armour/expect_and_call_original.rb +63 -0
- data/lib/rspec/armour/receive_patch.rb +18 -5
- data/lib/rspec/armour/version.rb +1 -1
- data/lib/rspec/armour.rb +3 -0
- data/quality.sh +0 -2
- data/rspec-armor/Gemfile +7 -0
- data/rspec-armor/Gemfile.lock +92 -0
- data/rspec-armor/Rakefile +3 -0
- data/rspec-armor/rspec-armor.gemspec +26 -0
- metadata +6 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '09dba2766e980d9fb6994b653dead73b873fa386c5d44355403ccda5b5eace45'
|
|
4
|
+
data.tar.gz: 53f1869be85a9eec42007ca4f4fb46e54dad828aeb1a168d8ccf5974a4e853f6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 17ad1f31e987f44686609094ccd8b0dfc67dcd9ede6883198bb0a679b25c4a9b5a67c04442ead64d211edf741a0e7ecdae318b2a54d654b569e99cea53ca4b45
|
|
7
|
+
data.tar.gz: cff695382727e9ba569a49d6f8573ab8bee7de883d676c045b38a0a04506516d0f99444edf36234e121995501f1d535c53eef5dc494ff09103660b9e1aee1d04
|
data/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
## [
|
|
1
|
+
## [0.3.0] - 2026-08-03
|
|
2
|
+
|
|
3
|
+
- Allow `not_to` [#2](https://github.com/hlascelles/rspec-armour/pull/2)
|
|
4
|
+
|
|
5
|
+
## [0.2.0] - 2026-07-31
|
|
6
|
+
|
|
7
|
+
- Add expect_receive_and_call_original [#1](https://github.com/hlascelles/rspec-armour/pull/1)
|
|
2
8
|
|
|
3
9
|
## [0.1.0] - 2026-06-04
|
|
4
10
|
|
data/README.md
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
# rspec-armour
|
|
2
2
|
|
|
3
|
-
`rspec-armour`
|
|
3
|
+
`rspec-armour` is the RSpec ActiveRecord MockUp Restrictor. It protects your ActiveRecord models
|
|
4
|
+
from being mocked or stubbed in RSpec tests. It forces you to use real database objects (or
|
|
5
|
+
factories) for your models, leading to more robust and reliable tests.
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
7
|
-
Add
|
|
9
|
+
Add `rspec-armour` to the **test group** in your application's `Gemfile`:
|
|
8
10
|
|
|
9
11
|
```ruby
|
|
10
|
-
|
|
12
|
+
group :test do
|
|
13
|
+
gem 'rspec-armour'
|
|
14
|
+
end
|
|
11
15
|
```
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
Then run:
|
|
14
18
|
|
|
15
19
|
$ bundle install
|
|
16
20
|
|
|
@@ -22,11 +26,29 @@ Or install it yourself as:
|
|
|
22
26
|
|
|
23
27
|
Once required, `rspec-armour` automatically prevents mocking of ActiveRecord finders, associations, and persistence methods.
|
|
24
28
|
|
|
25
|
-
### Examples of restricted methods
|
|
29
|
+
### Examples of restricted methods
|
|
30
|
+
|
|
31
|
+
| Category | Methods |
|
|
32
|
+
|--------------------------|----------------------------------------------------------------------------------------------------------------|
|
|
33
|
+
| **Class finders** | `.find`, `.find_by`, `.find_by!`, `.where`, `.all`, `.first`, `.last`, `.count`, `.pluck`, `.pick`, `.exists?` |
|
|
34
|
+
| **Class persistence** | `.create`, `.create!`, `.update`, `.update!`, `.destroy_all`, `.delete_all`, `.delete_by`, `.destroy_by` |
|
|
35
|
+
| **Instance persistence** | `#save`, `#save!`, `#update`, `#update!`, `#destroy`, `#destroy!`, `#delete`, `#touch`, `#reload` |
|
|
36
|
+
| **Associations** | `has_many`/`belongs_to` reader, writer, and `_ids` helpers (e.g. `user.posts`, `user.posts=`, `user.post_ids`) |
|
|
26
37
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
38
|
+
### What it looks like in practice
|
|
39
|
+
|
|
40
|
+
```ruby
|
|
41
|
+
# BAD — rspec-armour raises RSpec::Armour::MockError for these:
|
|
42
|
+
allow(User).to receive(:find).and_return(user) # class finder
|
|
43
|
+
allow(User).to receive(:where).and_return([user]) # class finder
|
|
44
|
+
allow(user).to receive(:save).and_return(true) # instance persistence
|
|
45
|
+
allow(user).to receive(:posts).and_return([post]) # association reader
|
|
46
|
+
|
|
47
|
+
# GOOD — use real database objects instead:
|
|
48
|
+
user = create(:user) # FactoryBot / fixtures
|
|
49
|
+
post = create(:post, user:) # real association in the DB
|
|
50
|
+
result = User.where(active: true) # real query against test DB
|
|
51
|
+
```
|
|
30
52
|
|
|
31
53
|
### Disabling restrictions
|
|
32
54
|
|
|
@@ -38,12 +60,18 @@ RSpec::Armour.without_restrictions do
|
|
|
38
60
|
end
|
|
39
61
|
```
|
|
40
62
|
|
|
41
|
-
Or by using RSpec metadata:
|
|
63
|
+
Or by using RSpec metadata on an individual example or context:
|
|
42
64
|
|
|
43
65
|
```ruby
|
|
44
66
|
it "does something specific", :without_rspec_armour do
|
|
45
67
|
allow(User).to receive(:where).and_return([])
|
|
46
68
|
end
|
|
69
|
+
|
|
70
|
+
context "legacy adapter", :without_rspec_armour do
|
|
71
|
+
it "stubs the finder" do
|
|
72
|
+
allow(User).to receive(:find).and_return(double)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
47
75
|
```
|
|
48
76
|
|
|
49
77
|
## Contributing
|
data/lib/rspec/armour/checker.rb
CHANGED
|
@@ -21,9 +21,11 @@ module RSpec
|
|
|
21
21
|
].freeze
|
|
22
22
|
|
|
23
23
|
DISABLED_KEY = :rspec_armour_disabled
|
|
24
|
+
NEGATIVE_EXPECTATION_KEY = :rspec_armour_negative_expectation
|
|
24
25
|
|
|
25
26
|
def self.restricted?(target, method_name)
|
|
26
27
|
return false if disabled?
|
|
28
|
+
return false if negative_expectation?
|
|
27
29
|
|
|
28
30
|
method_sym = method_name.to_sym
|
|
29
31
|
is_class, klass = resolve_target_info(target)
|
|
@@ -34,6 +36,18 @@ module RSpec
|
|
|
34
36
|
method_sym) || association_method_on_class?(klass, method_sym)
|
|
35
37
|
end
|
|
36
38
|
|
|
39
|
+
def self.negative_expectation?
|
|
40
|
+
Thread.current[NEGATIVE_EXPECTATION_KEY]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.as_negative_expectation!
|
|
44
|
+
previous = Thread.current[NEGATIVE_EXPECTATION_KEY]
|
|
45
|
+
Thread.current[NEGATIVE_EXPECTATION_KEY] = true
|
|
46
|
+
yield
|
|
47
|
+
ensure
|
|
48
|
+
Thread.current[NEGATIVE_EXPECTATION_KEY] = previous
|
|
49
|
+
end
|
|
50
|
+
|
|
37
51
|
def self.resolve_target_info(target)
|
|
38
52
|
if test_double?(target)
|
|
39
53
|
resolve_double_info(target)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RSpec
|
|
4
|
+
module Armour
|
|
5
|
+
class ExpectationProxy
|
|
6
|
+
def initialize(expectation, target)
|
|
7
|
+
@expectation = expectation
|
|
8
|
+
@target = target
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def and_call_original(...)
|
|
12
|
+
@expectation.and_call_original(...)
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def and_return(*)
|
|
17
|
+
cleanup
|
|
18
|
+
raise MockError, "Cannot call and_return when using expect_receive_and_call_original"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def and_raise(*)
|
|
22
|
+
cleanup
|
|
23
|
+
raise MockError, "Cannot call and_raise when using expect_receive_and_call_original"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def and_throw(*)
|
|
27
|
+
cleanup
|
|
28
|
+
raise MockError, "Cannot call and_throw when using expect_receive_and_call_original"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def and_yield(*)
|
|
32
|
+
cleanup
|
|
33
|
+
raise MockError, "Cannot call and_yield when using expect_receive_and_call_original"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def method_missing(name, ...)
|
|
37
|
+
if @expectation.respond_to?(name)
|
|
38
|
+
res = @expectation.public_send(name, ...)
|
|
39
|
+
res.equal?(@expectation) ? self : res
|
|
40
|
+
else
|
|
41
|
+
super
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def respond_to_missing?(name, include_private = false)
|
|
46
|
+
@expectation.respond_to?(name, include_private) || super
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private def cleanup
|
|
50
|
+
RSpec::Mocks.space.proxy_for(@target).reset if defined?(::RSpec::Mocks)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
module ExampleMethods
|
|
55
|
+
def expect_receive_and_call_original(target, method_name)
|
|
56
|
+
expectation = RSpec::Armour.without_restrictions do
|
|
57
|
+
expect(target).to receive(method_name).and_call_original
|
|
58
|
+
end
|
|
59
|
+
ExpectationProxy.new(expectation, target)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -5,6 +5,12 @@ module RSpec
|
|
|
5
5
|
module Matchers
|
|
6
6
|
# This class is patched to prevent mocking ActiveRecord associations and finders.
|
|
7
7
|
class Receive
|
|
8
|
+
NEGATIVE_EXPECTATION_METHODS = %i[
|
|
9
|
+
setup_negative_expectation
|
|
10
|
+
setup_any_instance_negative_expectation
|
|
11
|
+
does_not_match?
|
|
12
|
+
].freeze
|
|
13
|
+
|
|
8
14
|
def self.patch_for_armour!
|
|
9
15
|
# rubocop:disable ThreadSafety/ClassInstanceVariable
|
|
10
16
|
@armour_patched ||= false
|
|
@@ -31,16 +37,23 @@ module RSpec
|
|
|
31
37
|
|
|
32
38
|
def self.patch_method(method)
|
|
33
39
|
original_method = instance_method(method)
|
|
40
|
+
negative = NEGATIVE_EXPECTATION_METHODS.include?(method)
|
|
34
41
|
define_method(method) do |subject, &block|
|
|
35
42
|
if ENV["RSPEC_ARMOUR_DEBUG"] == "true"
|
|
36
43
|
puts "Checking RSpec::Armour '#{@message}' on #{subject}"
|
|
37
44
|
end
|
|
38
|
-
if
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
if negative
|
|
46
|
+
RSpec::Armour::Checker.as_negative_expectation! do
|
|
47
|
+
original_method.bind_call(self, subject, &block)
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
if RSpec::Armour::Checker.restricted?(subject, @message)
|
|
51
|
+
message = "Mocking/stubbing ActiveRecord association or finder `#{@message}` " \
|
|
52
|
+
"on `#{subject.inspect}` is restricted by rspec-armour."
|
|
53
|
+
raise RSpec::Armour::MockError, message
|
|
54
|
+
end
|
|
55
|
+
original_method.bind_call(self, subject, &block)
|
|
42
56
|
end
|
|
43
|
-
original_method.bind_call(self, subject, &block)
|
|
44
57
|
end
|
|
45
58
|
end
|
|
46
59
|
end
|
data/lib/rspec/armour/version.rb
CHANGED
data/lib/rspec/armour.rb
CHANGED
|
@@ -5,6 +5,7 @@ require "rspec/mocks"
|
|
|
5
5
|
require_relative "armour/version"
|
|
6
6
|
require_relative "armour/checker"
|
|
7
7
|
require_relative "armour/receive_patch"
|
|
8
|
+
require_relative "armour/expect_and_call_original"
|
|
8
9
|
|
|
9
10
|
module RSpec
|
|
10
11
|
module Armour
|
|
@@ -22,6 +23,8 @@ require "rspec/mocks/matchers/receive"
|
|
|
22
23
|
RSpec::Mocks::Matchers::Receive.patch_for_armour!
|
|
23
24
|
|
|
24
25
|
RSpec.configure do |config|
|
|
26
|
+
config.include RSpec::Armour::ExampleMethods
|
|
27
|
+
|
|
25
28
|
config.around(:each, without_rspec_armour: true) do |example|
|
|
26
29
|
RSpec::Armour.without_restrictions do
|
|
27
30
|
example.run
|
data/quality.sh
CHANGED
data/rspec-armor/Gemfile
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
rspec-armor (0.1.0)
|
|
5
|
+
rspec-armour
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: https://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
activemodel (8.1.3)
|
|
11
|
+
activesupport (= 8.1.3)
|
|
12
|
+
activerecord (8.1.3)
|
|
13
|
+
activemodel (= 8.1.3)
|
|
14
|
+
activesupport (= 8.1.3)
|
|
15
|
+
timeout (>= 0.4.0)
|
|
16
|
+
activesupport (8.1.3)
|
|
17
|
+
base64
|
|
18
|
+
bigdecimal
|
|
19
|
+
concurrent-ruby (~> 1.0, >= 1.3.1)
|
|
20
|
+
connection_pool (>= 2.2.5)
|
|
21
|
+
drb
|
|
22
|
+
i18n (>= 1.6, < 2)
|
|
23
|
+
json
|
|
24
|
+
logger (>= 1.4.2)
|
|
25
|
+
minitest (>= 5.1)
|
|
26
|
+
securerandom (>= 0.3)
|
|
27
|
+
tzinfo (~> 2.0, >= 2.0.5)
|
|
28
|
+
uri (>= 0.13.1)
|
|
29
|
+
base64 (0.3.0)
|
|
30
|
+
bigdecimal (4.1.2)
|
|
31
|
+
concurrent-ruby (1.3.7)
|
|
32
|
+
connection_pool (3.0.2)
|
|
33
|
+
diff-lcs (1.6.2)
|
|
34
|
+
drb (2.2.3)
|
|
35
|
+
i18n (1.15.2)
|
|
36
|
+
concurrent-ruby (~> 1.0)
|
|
37
|
+
json (2.21.1)
|
|
38
|
+
logger (1.7.0)
|
|
39
|
+
minitest (6.0.6)
|
|
40
|
+
drb (~> 2.0)
|
|
41
|
+
prism (~> 1.5)
|
|
42
|
+
prism (1.9.0)
|
|
43
|
+
rake (13.4.2)
|
|
44
|
+
rspec-armour (0.1.0)
|
|
45
|
+
activerecord
|
|
46
|
+
rspec-mocks
|
|
47
|
+
rspec-mocks (3.13.8)
|
|
48
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
49
|
+
rspec-support (~> 3.13.0)
|
|
50
|
+
rspec-support (3.13.7)
|
|
51
|
+
securerandom (0.4.1)
|
|
52
|
+
timeout (0.6.1)
|
|
53
|
+
tzinfo (2.0.6)
|
|
54
|
+
concurrent-ruby (~> 1.0)
|
|
55
|
+
uri (1.1.1)
|
|
56
|
+
|
|
57
|
+
PLATFORMS
|
|
58
|
+
ruby
|
|
59
|
+
x86_64-linux
|
|
60
|
+
|
|
61
|
+
DEPENDENCIES
|
|
62
|
+
rake (~> 13.0)
|
|
63
|
+
rspec-armor!
|
|
64
|
+
|
|
65
|
+
CHECKSUMS
|
|
66
|
+
activemodel (8.1.3) sha256=90c05cbe4cef3649b8f79f13016191ea94c4525ce4a5c0fb7ef909c4b91c8219
|
|
67
|
+
activerecord (8.1.3) sha256=8003be7b2466ba0a2a670e603eeb0a61dd66058fccecfc49901e775260ac70ab
|
|
68
|
+
activesupport (8.1.3) sha256=21a5e0dfbd4c3ddd9e1317ec6a4d782fa226e7867dc70b0743acda81a1dca20e
|
|
69
|
+
base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
|
|
70
|
+
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
|
|
71
|
+
bundler (4.0.12) sha256=7f8b757d28dfb636e7b24fba2344ac6dd13b5b24f4b46d62573d483f211825ac
|
|
72
|
+
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
|
|
73
|
+
connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
|
|
74
|
+
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
|
|
75
|
+
drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
|
|
76
|
+
i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
|
|
77
|
+
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
|
|
78
|
+
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
|
|
79
|
+
minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
|
|
80
|
+
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
|
|
81
|
+
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
|
|
82
|
+
rspec-armor (0.1.0)
|
|
83
|
+
rspec-armour (0.1.0) sha256=d03542ac9a6a9d61be9ca2be6f0a550ae19c2f56d2a40b65769cdcbd8cb3a31f
|
|
84
|
+
rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
|
|
85
|
+
rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
|
|
86
|
+
securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
|
|
87
|
+
timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb
|
|
88
|
+
tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
|
|
89
|
+
uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
|
|
90
|
+
|
|
91
|
+
BUNDLED WITH
|
|
92
|
+
4.0.12
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |spec|
|
|
4
|
+
spec.name = "rspec-armor"
|
|
5
|
+
spec.version = "0.1.0"
|
|
6
|
+
spec.authors = ["Harry Lascelles"]
|
|
7
|
+
spec.email = ["harry@harryl.com"]
|
|
8
|
+
|
|
9
|
+
spec.summary = "American-spelling alias for rspec-armour. Please use rspec-armour instead."
|
|
10
|
+
spec.description = <<~MSG
|
|
11
|
+
This gem exists solely to prevent typo-squatting on the American spelling of rspec-armour.
|
|
12
|
+
It installs rspec-armour (British spelling) and does nothing else.
|
|
13
|
+
Please depend on rspec-armour directly.
|
|
14
|
+
MSG
|
|
15
|
+
spec.homepage = "https://github.com/hlascelles/rspec-armour"
|
|
16
|
+
spec.license = "MIT"
|
|
17
|
+
spec.required_ruby_version = ">= 3.2.0"
|
|
18
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
|
19
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
|
20
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
|
21
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
|
22
|
+
|
|
23
|
+
spec.files = ["rspec-armor.gemspec"]
|
|
24
|
+
|
|
25
|
+
spec.add_dependency "rspec-armour"
|
|
26
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rspec-armour
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Harry Lascelles
|
|
@@ -151,9 +151,14 @@ files:
|
|
|
151
151
|
- Rakefile
|
|
152
152
|
- lib/rspec/armour.rb
|
|
153
153
|
- lib/rspec/armour/checker.rb
|
|
154
|
+
- lib/rspec/armour/expect_and_call_original.rb
|
|
154
155
|
- lib/rspec/armour/receive_patch.rb
|
|
155
156
|
- lib/rspec/armour/version.rb
|
|
156
157
|
- quality.sh
|
|
158
|
+
- rspec-armor/Gemfile
|
|
159
|
+
- rspec-armor/Gemfile.lock
|
|
160
|
+
- rspec-armor/Rakefile
|
|
161
|
+
- rspec-armor/rspec-armor.gemspec
|
|
157
162
|
homepage: https://github.com/hlascelles/rspec-armour
|
|
158
163
|
licenses:
|
|
159
164
|
- MIT
|