hydra-pcdm 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/hydra-pcdm.gemspec +1 -2
- data/lib/hydra/pcdm.rb +2 -3
- data/lib/hydra/pcdm/ancestor_checker.rb +12 -11
- data/lib/hydra/pcdm/collection_indexer.rb +4 -4
- data/lib/hydra/pcdm/config.rb +21 -0
- data/lib/hydra/pcdm/models/concerns/collection_behavior.rb +1 -0
- data/lib/hydra/pcdm/models/concerns/object_behavior.rb +1 -1
- data/lib/hydra/pcdm/models/concerns/pcdm_behavior.rb +4 -8
- data/lib/hydra/pcdm/object_indexer.rb +4 -4
- data/lib/hydra/pcdm/services/file/add_type.rb +1 -1
- data/lib/hydra/pcdm/services/file/get_mime_type.rb +1 -1
- data/lib/hydra/pcdm/validators.rb +1 -0
- data/lib/hydra/pcdm/validators/pcdm_collection_validator.rb +7 -0
- data/lib/hydra/pcdm/version.rb +1 -1
- data/solr/config/schema.xml +1 -1
- data/spec/hydra/pcdm/ancestor_checker_spec.rb +26 -19
- data/spec/hydra/pcdm/collection_indexer_spec.rb +3 -3
- data/spec/hydra/pcdm/config_spec.rb +18 -0
- data/spec/hydra/pcdm/object_indexer_spec.rb +1 -1
- metadata +8 -21
- data/lib/hydra/pcdm/deep_member_iterator.rb +0 -31
- data/spec/hydra/pcdm/deep_member_iterator_spec.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f1369bfcb692088efb9def0d8c89c0a1a44b753
|
4
|
+
data.tar.gz: 67ab9ffbc703f41d52cacd272adf6800e624e2f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61992b4c2732a5f06985514380caf52787e8ebdeeeebb9bc9d1bfabc3771649b34fc0d945ea97f13f129e3a4564f6a970589cce9c161fa19f4966fe90f8a0646
|
7
|
+
data.tar.gz: fab13605bffea616cbe355a4f4619769dfd8a7d8abeff9c26b380bea74b3f6ed968d6cf328fcfd67177dc1ab7b2955b6b1ca396d81c3248b0463053866b4b093
|
data/Gemfile
CHANGED
data/hydra-pcdm.gemspec
CHANGED
@@ -19,8 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_dependency 'active-fedora', '~> 9.
|
23
|
-
spec.add_dependency 'activefedora-aggregation', '~> 0.10'
|
22
|
+
spec.add_dependency 'active-fedora', '~> 9.11'
|
24
23
|
spec.add_dependency 'mime-types', '>= 1'
|
25
24
|
|
26
25
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
data/lib/hydra/pcdm.rb
CHANGED
@@ -14,6 +14,8 @@ module Hydra
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
autoload :Config
|
18
|
+
|
17
19
|
# models
|
18
20
|
autoload_under 'models' do
|
19
21
|
autoload :Collection
|
@@ -35,9 +37,6 @@ module Hydra
|
|
35
37
|
autoload :AddTypeToFile, 'hydra/pcdm/services/file/add_type'
|
36
38
|
autoload :GetMimeTypeForFile, 'hydra/pcdm/services/file/get_mime_type'
|
37
39
|
|
38
|
-
# Iterators
|
39
|
-
autoload :DeepMemberIterator, 'hydra/pcdm/deep_member_iterator'
|
40
|
-
|
41
40
|
# Associations
|
42
41
|
autoload :AncestorChecker, 'hydra/pcdm/ancestor_checker'
|
43
42
|
autoload :Validators, 'hydra/pcdm/validators'
|
@@ -1,18 +1,19 @@
|
|
1
1
|
module Hydra::PCDM
|
2
2
|
##
|
3
3
|
# Checks whether or not one object is an ancestor of another.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# @
|
8
|
-
|
9
|
-
|
4
|
+
module AncestorChecker
|
5
|
+
# @param options [Hash]
|
6
|
+
# @option record [#pcdm_behavior?]
|
7
|
+
# @option potential_ancestor [#pcdm_behavior?]
|
8
|
+
# @return Boolean
|
9
|
+
def self.former_is_ancestor_of_latter?(potential_ancestor, record)
|
10
|
+
return true if record == potential_ancestor
|
11
|
+
return false unless potential_ancestor.respond_to?(:members)
|
12
|
+
return true if Array.wrap(potential_ancestor.members).detect { |member| former_is_ancestor_of_latter?(member, record) }
|
13
|
+
false
|
10
14
|
end
|
11
|
-
|
12
|
-
|
13
|
-
# the initialized record.
|
14
|
-
def ancestor?(potential_ancestor)
|
15
|
-
record == potential_ancestor || Hydra::PCDM::DeepMemberIterator.new(potential_ancestor).include?(record)
|
15
|
+
class << self
|
16
|
+
alias call former_is_ancestor_of_latter?
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
@@ -2,10 +2,10 @@ module Hydra::PCDM
|
|
2
2
|
class CollectionIndexer < ObjectIndexer
|
3
3
|
def generate_solr_document
|
4
4
|
super.tap do |solr_doc|
|
5
|
-
solr_doc[
|
6
|
-
solr_doc[
|
7
|
-
solr_doc[
|
8
|
-
solr_doc[
|
5
|
+
solr_doc[Config.indexing_member_ids_key] ||= []
|
6
|
+
solr_doc[Config.indexing_member_ids_key] += object.member_ids
|
7
|
+
solr_doc[Config.indexing_member_ids_key].uniq!
|
8
|
+
solr_doc[Config.indexing_collection_ids_key] = object.ordered_collection_ids
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Hydra
|
2
|
+
module PCDM
|
3
|
+
# A container for configuration options (note configuration is not yet determined).
|
4
|
+
module Config
|
5
|
+
INDEXING_MEMBER_IDS_KEY = 'member_ids_ssim'.freeze
|
6
|
+
def self.indexing_member_ids_key
|
7
|
+
INDEXING_MEMBER_IDS_KEY
|
8
|
+
end
|
9
|
+
|
10
|
+
INDEXING_COLLECTION_IDS_KEY = 'collection_ids_ssim'.freeze
|
11
|
+
def self.indexing_collection_ids_key
|
12
|
+
INDEXING_COLLECTION_IDS_KEY
|
13
|
+
end
|
14
|
+
|
15
|
+
INDEXING_OBJECT_IDS_KEY = 'object_ids_ssim'.freeze
|
16
|
+
def self.indexing_object_ids_key
|
17
|
+
INDEXING_OBJECT_IDS_KEY
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -25,7 +25,7 @@ module Hydra::PCDM
|
|
25
25
|
|
26
26
|
def member_of
|
27
27
|
return [] if id.nil?
|
28
|
-
ActiveFedora::Base.where(
|
28
|
+
ActiveFedora::Base.where(Config.indexing_member_ids_key => id)
|
29
29
|
end
|
30
30
|
|
31
31
|
def ordered_member_ids
|
@@ -37,7 +37,7 @@ module Hydra::PCDM
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def object_ids
|
40
|
-
|
40
|
+
objects.map(&:id)
|
41
41
|
end
|
42
42
|
|
43
43
|
def ordered_objects
|
@@ -56,12 +56,8 @@ module Hydra::PCDM
|
|
56
56
|
in_collections.map(&:id)
|
57
57
|
end
|
58
58
|
|
59
|
-
def ancestor?(
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
def ancestor_checker
|
64
|
-
@ancestor_checker ||= ::Hydra::PCDM::AncestorChecker.new(self)
|
59
|
+
def ancestor?(potential_ancestor)
|
60
|
+
::Hydra::PCDM::AncestorChecker.former_is_ancestor_of_latter?(potential_ancestor, self)
|
65
61
|
end
|
66
62
|
end
|
67
63
|
end
|
@@ -2,10 +2,10 @@ module Hydra::PCDM
|
|
2
2
|
class ObjectIndexer < ActiveFedora::IndexingService
|
3
3
|
def generate_solr_document
|
4
4
|
super.tap do |solr_doc|
|
5
|
-
solr_doc[
|
6
|
-
solr_doc[
|
7
|
-
solr_doc[
|
8
|
-
solr_doc[
|
5
|
+
solr_doc[Config.indexing_member_ids_key] ||= []
|
6
|
+
solr_doc[Config.indexing_member_ids_key] += object.member_ids
|
7
|
+
solr_doc[Config.indexing_member_ids_key].uniq!
|
8
|
+
solr_doc[Config.indexing_object_ids_key] = object.ordered_object_ids
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -3,6 +3,7 @@ module Hydra::PCDM
|
|
3
3
|
autoload :AncestorValidator, 'hydra/pcdm/validators/ancestor_validator'
|
4
4
|
autoload :PCDMValidator, 'hydra/pcdm/validators/pcdm_validator'
|
5
5
|
autoload :CompositeValidator, 'hydra/pcdm/validators/composite_validator'
|
6
|
+
autoload :PCDMCollectionValidator, 'hydra/pcdm/validators/pcdm_collection_validator'
|
6
7
|
autoload :PCDMObjectValidator, 'hydra/pcdm/validators/pcdm_object_validator'
|
7
8
|
end
|
8
9
|
end
|
data/lib/hydra/pcdm/version.rb
CHANGED
data/solr/config/schema.xml
CHANGED
@@ -103,7 +103,7 @@
|
|
103
103
|
http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
|
104
104
|
-->
|
105
105
|
<fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
|
106
|
-
geo="true" distErrPct="0.025" maxDistErr="0.000009"
|
106
|
+
geo="true" distErrPct="0.025" maxDistErr="0.000009" distanceUnits="degrees" />
|
107
107
|
|
108
108
|
<fieldType name="text" class="solr.TextField" omitNorms="false">
|
109
109
|
<analyzer>
|
@@ -1,29 +1,36 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe Hydra::PCDM::AncestorChecker do
|
4
|
-
|
5
|
-
|
6
|
-
describe '#ancestor?' do
|
4
|
+
context '.former_is_ancestor_of_latter?' do
|
5
|
+
subject { described_class.former_is_ancestor_of_latter?(potential_ancestor, record) }
|
7
6
|
let(:record) { instance_double(Hydra::PCDM::Object) }
|
8
|
-
let(:
|
9
|
-
|
7
|
+
let(:potential_ancestor) { nil }
|
8
|
+
|
9
|
+
context 'when the potential_ancestor is the record itself' do
|
10
|
+
let(:potential_ancestor) { record }
|
11
|
+
it { is_expected.to eq(true) }
|
12
|
+
end
|
10
13
|
|
11
|
-
context 'when the
|
12
|
-
|
13
|
-
|
14
|
-
end
|
14
|
+
context 'when the potential_ancestor has no members' do
|
15
|
+
let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: []) }
|
16
|
+
it { is_expected.to eq(false) }
|
15
17
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
18
|
+
|
19
|
+
context 'when the potential_ancestor includes the given record' do
|
20
|
+
let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: [record]) }
|
21
|
+
it { is_expected.to eq(true) }
|
21
22
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
|
24
|
+
context 'when the potential_ancestor includes a descendant that includes the given record' do
|
25
|
+
let(:descendant) { instance_double(Hydra::PCDM::Object, members: [record]) }
|
26
|
+
let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: [descendant]) }
|
27
|
+
it { is_expected.to eq(true) }
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when the potential_ancestor only includes descendants that do not include the given record' do
|
31
|
+
let(:descendant) { instance_double(Hydra::PCDM::Object, members: [:another]) }
|
32
|
+
let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: [descendant]) }
|
33
|
+
it { is_expected.to eq(false) }
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|
@@ -17,9 +17,9 @@ describe Hydra::PCDM::CollectionIndexer do
|
|
17
17
|
subject { indexer.generate_solr_document }
|
18
18
|
|
19
19
|
it 'has fields' do
|
20
|
-
expect(subject[
|
21
|
-
expect(subject[
|
22
|
-
expect(subject[
|
20
|
+
expect(subject[Hydra::PCDM::Config.indexing_collection_ids_key]).to eq %w(123 456)
|
21
|
+
expect(subject[Hydra::PCDM::Config.indexing_object_ids_key]).to eq ['789']
|
22
|
+
expect(subject[Hydra::PCDM::Config.indexing_member_ids_key]).to eq %w(123 456 789)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hydra::PCDM::Config do
|
4
|
+
context '.indexing_member_ids_key' do
|
5
|
+
subject { described_class.indexing_member_ids_key }
|
6
|
+
it { is_expected.to eq(described_class::INDEXING_MEMBER_IDS_KEY) }
|
7
|
+
end
|
8
|
+
|
9
|
+
context '.indexing_collection_ids_key' do
|
10
|
+
subject { described_class.indexing_collection_ids_key }
|
11
|
+
it { is_expected.to eq(described_class::INDEXING_COLLECTION_IDS_KEY) }
|
12
|
+
end
|
13
|
+
|
14
|
+
context '.indexing_object_ids_key' do
|
15
|
+
subject { described_class.indexing_object_ids_key }
|
16
|
+
it { is_expected.to eq(described_class::INDEXING_OBJECT_IDS_KEY) }
|
17
|
+
end
|
18
|
+
end
|
@@ -14,7 +14,7 @@ describe Hydra::PCDM::ObjectIndexer do
|
|
14
14
|
subject { indexer.generate_solr_document }
|
15
15
|
|
16
16
|
it 'has fields' do
|
17
|
-
expect(subject[
|
17
|
+
expect(subject[Hydra::PCDM::Config.indexing_object_ids_key]).to eq %w(123 456)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hydra-pcdm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- E. Lynette Rayle
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active-fedora
|
@@ -16,28 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '9.
|
19
|
+
version: '9.11'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '9.
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activefedora-aggregation
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.10'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.10'
|
26
|
+
version: '9.11'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: mime-types
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,7 +143,7 @@ files:
|
|
157
143
|
- lib/hydra/pcdm.rb
|
158
144
|
- lib/hydra/pcdm/ancestor_checker.rb
|
159
145
|
- lib/hydra/pcdm/collection_indexer.rb
|
160
|
-
- lib/hydra/pcdm/
|
146
|
+
- lib/hydra/pcdm/config.rb
|
161
147
|
- lib/hydra/pcdm/models/collection.rb
|
162
148
|
- lib/hydra/pcdm/models/concerns/collection_behavior.rb
|
163
149
|
- lib/hydra/pcdm/models/concerns/object_behavior.rb
|
@@ -170,6 +156,7 @@ files:
|
|
170
156
|
- lib/hydra/pcdm/validators.rb
|
171
157
|
- lib/hydra/pcdm/validators/ancestor_validator.rb
|
172
158
|
- lib/hydra/pcdm/validators/composite_validator.rb
|
159
|
+
- lib/hydra/pcdm/validators/pcdm_collection_validator.rb
|
173
160
|
- lib/hydra/pcdm/validators/pcdm_object_validator.rb
|
174
161
|
- lib/hydra/pcdm/validators/pcdm_validator.rb
|
175
162
|
- lib/hydra/pcdm/version.rb
|
@@ -193,7 +180,7 @@ files:
|
|
193
180
|
- solr/config/xslt/luke.xsl
|
194
181
|
- spec/hydra/pcdm/ancestor_checker_spec.rb
|
195
182
|
- spec/hydra/pcdm/collection_indexer_spec.rb
|
196
|
-
- spec/hydra/pcdm/
|
183
|
+
- spec/hydra/pcdm/config_spec.rb
|
197
184
|
- spec/hydra/pcdm/models/collection_spec.rb
|
198
185
|
- spec/hydra/pcdm/models/file_spec.rb
|
199
186
|
- spec/hydra/pcdm/models/object_spec.rb
|
@@ -228,7 +215,7 @@ summary: Portland Common Data Model (PCDM)
|
|
228
215
|
test_files:
|
229
216
|
- spec/hydra/pcdm/ancestor_checker_spec.rb
|
230
217
|
- spec/hydra/pcdm/collection_indexer_spec.rb
|
231
|
-
- spec/hydra/pcdm/
|
218
|
+
- spec/hydra/pcdm/config_spec.rb
|
232
219
|
- spec/hydra/pcdm/models/collection_spec.rb
|
233
220
|
- spec/hydra/pcdm/models/file_spec.rb
|
234
221
|
- spec/hydra/pcdm/models/object_spec.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Hydra::PCDM
|
2
|
-
##
|
3
|
-
# Iterates over a record's members and all of their members in a breadth-first
|
4
|
-
# search.
|
5
|
-
class DeepMemberIterator
|
6
|
-
include Enumerable
|
7
|
-
attr_reader :record
|
8
|
-
# @param [#members] record The object whose members are iterated across.
|
9
|
-
def initialize(record)
|
10
|
-
@record = HasMembers.new(record)
|
11
|
-
end
|
12
|
-
|
13
|
-
def each
|
14
|
-
record.members.each do |member|
|
15
|
-
yield member
|
16
|
-
end
|
17
|
-
record.members.each do |member|
|
18
|
-
DeepMemberIterator.new(member).each do |deep_member|
|
19
|
-
yield deep_member
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
##
|
25
|
-
# Small decorator to ensure that #members isn't undefined.
|
26
|
-
class HasMembers < SimpleDelegator
|
27
|
-
def members
|
28
|
-
__getobj__.try(:members) || []
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Hydra::PCDM::DeepMemberIterator do
|
4
|
-
subject { described_class.new(record) }
|
5
|
-
let(:record) { instance_double(Hydra::PCDM::Object, members: members) }
|
6
|
-
let(:members) { [] }
|
7
|
-
describe '#each' do
|
8
|
-
context 'with no members' do
|
9
|
-
it 'returns an empty array' do
|
10
|
-
expect(subject.to_a).to eq []
|
11
|
-
end
|
12
|
-
end
|
13
|
-
context 'with a member' do
|
14
|
-
let(:members) { [instance_double(Hydra::PCDM::Object, members: [])] }
|
15
|
-
it 'returns that member' do
|
16
|
-
expect(subject.to_a).to eq members
|
17
|
-
end
|
18
|
-
end
|
19
|
-
context 'with deep members' do
|
20
|
-
let(:member_1) { instance_double(Hydra::PCDM::Object, members: [member_3]) }
|
21
|
-
let(:member_2) { instance_double(Hydra::PCDM::Object, members: [member_4]) }
|
22
|
-
let(:member_3) { instance_double(Hydra::PCDM::Object, members: []) }
|
23
|
-
let(:member_4) { instance_double(Hydra::PCDM::Object, members: []) }
|
24
|
-
let(:members) { [member_1, member_2] }
|
25
|
-
it 'does a breadth first iteration of members' do
|
26
|
-
expect(subject.to_a).to eq [member_1, member_2, member_3, member_4]
|
27
|
-
end
|
28
|
-
end
|
29
|
-
context 'with n levels deep' do
|
30
|
-
let(:member_1) { instance_double(Hydra::PCDM::Object, members: [member_2]) }
|
31
|
-
let(:member_2) { instance_double(Hydra::PCDM::Object, members: [member_3]) }
|
32
|
-
let(:member_3) { instance_double(Hydra::PCDM::Object, members: []) }
|
33
|
-
let(:members) { [member_1] }
|
34
|
-
it 'traverses it' do
|
35
|
-
expect(subject.to_a).to eq [member_1, member_2, member_3]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
describe '.include?' do
|
40
|
-
context 'with n levels deep' do
|
41
|
-
let(:member_1) { instance_double(Hydra::PCDM::Object, members: [member_2]) }
|
42
|
-
let(:member_2) { instance_double(Hydra::PCDM::Object, members: [member_3]) }
|
43
|
-
let(:member_3) { instance_double(Hydra::PCDM::Object, members: []) }
|
44
|
-
let(:members) { [member_1] }
|
45
|
-
it 'does not go any deeper than necessary' do
|
46
|
-
expect(subject).to include(member_2)
|
47
|
-
expect(member_2).not_to have_received(:members)
|
48
|
-
expect(member_3).not_to have_received(:members)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|