common_repository_model 0.0.8 → 0.0.9

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.
@@ -24,7 +24,6 @@ Gem::Specification.new do |gem|
24
24
  gem.add_dependency "activesupport", "~>3.2"
25
25
  gem.add_dependency "activemodel", "~>3.2"
26
26
  gem.add_dependency "builder", "~>3.0"
27
- gem.add_dependency "morphine"
28
27
  gem.add_dependency "active_model_serializers"
29
28
  gem.add_runtime_dependency "minitest"
30
29
  gem.add_runtime_dependency "minitest-matchers"
@@ -60,9 +60,26 @@ module CommonRepositoryModel
60
60
  has_and_belongs_to_many(method_name, options)
61
61
  end
62
62
 
63
- before_save :register_parent_and_collections
63
+ before_validation :assign_area!, on: :create
64
+ def assign_area!
65
+ self.__area =
66
+ if area
67
+ CommonRepositoryModel::Area.find(area.pid)
68
+ else
69
+ CommonRepositoryModel::Area.find_by_name!(name_of_area_to_assign)
70
+ end
71
+ rescue CommonRepositoryModel::ObjectNotFoundError
72
+ true
73
+ end
74
+ protected :assign_area!
75
+
76
+ def name_of_area_to_assign
77
+ 'NDLIB'
78
+ end
79
+
80
+ before_validation :register_parent_and_collections, on: :create
81
+ before_validation :register_parent_and_collections, on: :update
64
82
  def register_parent_and_collections
65
- self.__area = CommonRepositoryModel::Area.find(area.pid) if area
66
83
 
67
84
  collected_has_members = membership_registry.has_members.
68
85
  collect do |association_name|
@@ -74,7 +91,6 @@ module CommonRepositoryModel
74
91
  collect do |association_name|
75
92
  public_send(association_name)
76
93
  end.flatten
77
-
78
94
  self.parent_collections = collected_is_member_of
79
95
 
80
96
  true
@@ -89,31 +105,21 @@ module CommonRepositoryModel
89
105
  parent_collections.collect(&:__area).uniq
90
106
  end
91
107
 
92
- def area=(an_area)
93
- if is_root?
94
- self.__area = an_area
95
- else
96
- self.__area = parent_areas.first
97
- end
98
- end
99
-
100
108
  def area
101
109
  if is_root?
102
110
  __area
103
111
  else
104
112
  parent_areas.first
105
- end
113
+ end ||
114
+ CommonRepositoryModel::Area.find_by_name!(name_of_area_to_assign)
115
+ rescue CommonRepositoryModel::ObjectNotFoundError
116
+ nil
106
117
  end
107
118
 
108
119
  def area_name
109
120
  area.name
110
121
  end
111
122
 
112
- include Morphine
113
- register :named_area_finder do
114
- CommonRepositoryModel::Area.method(:find_by_name!)
115
- end
116
-
117
123
  belongs_to(
118
124
  :__area,
119
125
  class_name:'CommonRepositoryModel::Area',
@@ -21,11 +21,17 @@ module CommonRepositoryModel
21
21
  end
22
22
  end
23
23
 
24
- def with_persisted_area(name = nil)
24
+ def with_persisted_area(name = nil, &block)
25
25
  options = {}
26
26
  options[:name] = name if name
27
- area = FactoryGirl.create(:common_repository_model_area, options)
28
- yield(area)
27
+ area = nil
28
+ area = CommonRepositoryModel::Area.find_by_name(name) if name
29
+ area ||= FactoryGirl.create(:common_repository_model_area, options)
30
+ if block.arity == 1
31
+ block.call(area)
32
+ else
33
+ block.call
34
+ end
29
35
  ensure
30
36
  area.delete if area
31
37
  end
@@ -1,3 +1,3 @@
1
1
  module CommonRepositoryModel
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -2,6 +2,9 @@
2
2
  # `rails generate common_repository_model::collection <%= class_name %>`
3
3
  require 'common_repository_model/collection'
4
4
  class <%= class_name %> < CommonRepositoryModel::Collection
5
+ # Write the logic for assigning the area
6
+ def name_of_area_to_assign
7
+ end
5
8
 
6
9
  # ***************************************************************************
7
10
  # ***************************************************************************
@@ -29,7 +32,7 @@ class <%= class_name %> < CommonRepositoryModel::Collection
29
32
  # is_member_of :containers, type: "Container", property: "is_contained_in"
30
33
  #
31
34
  # For Examples Specs:
32
- # https://github.com/ndlib/common_respository_model/blob/master/spec/common_respository_model/integration_spec.rb
35
+ # https://github.com/ndlib/common_repository_model/blob/master/spec/common_repository_model/integration_spec.rb
33
36
  #
34
37
 
35
38
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  require 'common_repository_model/test_support'
7
7
  FactoryGirl.define do
8
- factory :<%= singular_table_name %>, class: <%= class_name %> do
8
+ factory :<%= singular_table_name %>, class: <%= class_name %>, parent: :common_repository_model_collection do
9
9
  <% for attribute in attributes -%>
10
10
  <%= attribute.name %> <%= attribute.default.inspect %>
11
11
  <% end -%>
@@ -30,9 +30,9 @@ describe CommonRepositoryModel::Area do
30
30
  end
31
31
 
32
32
  describe 'integration (with persistence)' do
33
- let(:collection) { FactoryGirl.build(:common_repository_model_collection, area: nil) }
33
+ let(:collection) { FactoryGirl.build(:common_repository_model_collection) }
34
34
  it 'should .find_by_name and .find_by_name!' do
35
- with_persisted_area do |area|
35
+ with_persisted_area(collection.name_of_area_to_assign) do |area|
36
36
  CommonRepositoryModel::Area.find_by_name(area.name).must_equal area
37
37
  CommonRepositoryModel::Area.
38
38
  find_by_name("#{area.name}-tmp").must_equal nil
@@ -44,7 +44,7 @@ describe CommonRepositoryModel::Area do
44
44
  end
45
45
  end
46
46
  it 'should save' do
47
- with_persisted_area do |area|
47
+ with_persisted_area(collection.name_of_area_to_assign) do |area|
48
48
  # Before we can add a collection, the containing object
49
49
  # must be saved
50
50
  area.collections << collection
@@ -9,7 +9,9 @@ describe CommonRepositoryModel::CollectionSerializer do
9
9
  let(:json) { JSON.parse(subject.to_json) }
10
10
  let(:root) { json.fetch('collection') }
11
11
  it 'should be JSON' do
12
- root.fetch('pid')
13
- root.fetch('area').must_equal collection.area.pid
12
+ with_persisted_area(collection.name_of_area_to_assign) do
13
+ root.fetch('pid')
14
+ root.fetch('area').must_equal collection.area.pid
15
+ end
14
16
  end
15
17
  end
@@ -8,22 +8,18 @@ describe CommonRepositoryModel::Collection do
8
8
  subject.respond_to?(:area_name)
9
9
  end
10
10
 
11
- it 'should have #named_area_finder' do
12
- lambda {
13
- subject.named_area_finder.call('NEVER-GONNA_EXIST')
14
- }.must_raise CommonRepositoryModel::ObjectNotFoundError
11
+ it 'should have an #name_of_area_to_assign' do
12
+ subject.respond_to?(:name_of_area_to_assign)
15
13
  end
16
14
 
17
15
  it 'should require an area' do
18
- with_persisted_area do |area|
19
- subject.named_area_finder.call(area.name)
20
-
21
- subject.area = area
22
- subject.area.must_be_kind_of(CommonRepositoryModel::Area)
16
+ subject.valid?.must_equal false
17
+ subject.errors[:area].size.wont_equal 0
18
+ with_persisted_area(subject.name_of_area_to_assign) do |area|
19
+ subject.area.must_equal area
23
20
  subject.valid?.must_equal true
24
- subject.area = nil
25
- subject.valid?.must_equal false
26
21
  end
22
+
27
23
  end
28
24
 
29
25
  describe '#find_or_build_data_for_given_slot_names' do
@@ -61,34 +57,19 @@ describe CommonRepositoryModel::Collection do
61
57
 
62
58
  describe 'integration' do
63
59
  let(:child_collection) {
64
- FactoryGirl.build(:common_repository_model_collection, area: nil)
60
+ FactoryGirl.build(:common_repository_model_collection)
65
61
  }
66
62
  it 'should keep a child collection in the parent collection' do
67
- with_persisted_area do |area_1|
68
- with_persisted_area do |area_2|
69
- area_1.wont_equal area_2
70
-
71
- subject.area = area_1
72
- subject.save!
73
-
74
- child_collection.area = area_2
75
-
76
- child_collection.parent_collections += [subject]
77
-
78
- child_collection.area.must_equal subject.area
79
-
80
- child_collection.save!
81
-
82
- child_collection.area.must_equal subject.area
83
- end
63
+ with_persisted_area(subject.name_of_area_to_assign) do
64
+ subject.save!
65
+ child_collection.parent_collections += [subject]
66
+ child_collection.area.must_equal subject.area
84
67
  end
85
68
  end
86
69
  it 'should handle parent/child collection' do
87
70
  # Before we can add a collection, the containing object
88
71
  # must be saved
89
- with_persisted_area do |area|
90
- subject.area = area
91
- child_collection.area = area
72
+ with_persisted_area(subject.name_of_area_to_assign) do
92
73
  subject.save!
93
74
  subject.child_collections << child_collection
94
75
  subject.save!
@@ -32,8 +32,8 @@ describe CommonRepositoryModel::Data do
32
32
  end
33
33
 
34
34
  it 'should save' do
35
- with_persisted_area do |area|
36
- collection.area = area
35
+ with_persisted_area(collection.name_of_area_to_assign) do |area|
36
+
37
37
  # Before we can add a collection, the containing object
38
38
  # must be saved
39
39
  collection.save!
@@ -1,258 +1,223 @@
1
1
  require_relative '../spec_helper'
2
- require 'common_repository_model/collection'
3
-
4
-
5
- class Clothing < CommonRepositoryModel::Data
6
- end
7
-
8
- class Job < CommonRepositoryModel::Collection
9
- has_and_belongs_to_many(
10
- :people,
11
- class_name: 'Person',
12
- property: :has_workers,
13
- inverse_of: :is_working_as
14
- )
15
- end
16
-
17
- class Family < CommonRepositoryModel::Collection
18
- has_members(
19
- :family_members,
20
- class_name: 'Person',
21
- property: :is_family_member_of
22
- )
23
- end
24
-
25
- class Person < CommonRepositoryModel::Collection
26
-
27
- is_member_of(
28
- :parents,
29
- class_name: 'Person',
30
- property: :is_child_of
31
- )
32
-
33
- has_members(
34
- :children,
35
- class_name: 'Person',
36
- property: :is_child_of
37
- )
38
-
39
- # People can be part of multiple families
40
- is_member_of(
41
- :families,
42
- class_name: 'Family',
43
- property: :is_family_member_of
44
- )
45
-
46
- has_and_belongs_to_many(
47
- :jobs,
48
- class_name: 'Job',
49
- property: :is_working_as,
50
- inverse_of: :has_workers
51
- )
52
-
53
- end
2
+ require_relative '../support/spec_models'
54
3
 
55
4
  describe CommonRepositoryModel::Collection do
56
- after(:each) do
57
- area.delete if area.persisted?
58
- end
59
- let(:area) { FactoryGirl.create(:common_repository_model_area) }
60
- let(:family) { Family.new(area: area) }
61
- let(:lawyer) { Job.new(area: area) }
62
- let(:doctor) { Job.new(area: area) }
63
- let(:heathcliff) { Person.new(area: area) }
64
- let(:claire) { Person.new(area: area) }
65
- let(:theo) { Person.new(area: area) }
66
- let(:vanessa) { Person.new(area: area) }
67
- let(:rudy) { Person.new(area: area) }
68
- let(:dress) { Clothing.new(slot_name: 'outerwear') }
69
-
70
- before(:all) do
71
- family.save
72
-
73
- lawyer.save
74
- doctor.save
75
-
76
- heathcliff.save
77
- claire.save
78
- theo.save
79
- vanessa.save
80
- rudy.save
81
-
82
- dress.save
83
-
84
- claire.children = [theo,vanessa,rudy]
85
- claire.jobs << lawyer
86
- claire.families << family
87
- claire.data << dress
88
- claire.save
89
-
90
- heathcliff.children = [theo,vanessa,rudy]
91
- heathcliff.jobs << doctor
92
- heathcliff.families << family
93
- heathcliff.save
94
-
95
- theo.families << family
96
- theo.save
97
- vanessa.families << family
98
- vanessa.save
99
- rudy.families << family
100
- rudy.save
101
-
102
- family.family_members = [claire,heathcliff,theo,vanessa,rudy]
103
- family.save.must_equal true
104
-
105
- @dress = dress.class.find(dress.pid)
106
- @theo = theo.class.find(theo.pid)
107
- @family = family.class.find(family.pid)
108
- @claire = claire.class.find(claire.pid)
109
- @rudy = rudy.class.find(rudy.pid)
110
- end
111
-
112
- it 'verifies complicated relationships' do
113
- verify_initial_relations_for_family
114
- verify_initial_relations_for_theo
115
- verify_initial_relations_for_claire
116
- verify_initial_relations_for_dress
117
-
118
- verify_claire_adding_a_child
119
-
120
- verify_claire_losing_a_child
121
-
122
- verify_rudy_losing_a_parent
123
- end
124
-
125
- protected
126
- def verify_initial_relations_for_family
127
- # We are not storing the RELS-EXT entry on the "container" collection
128
- assert_rels_ext(
129
- @family,
130
- :has_family_members,
131
- []
132
- )
133
- assert_rels_ext(
134
- @family,
135
- :has_members,
136
- []
137
- )
138
-
139
- # However, we do have access to Family#family_members
140
- assert_active_fedora_has_many(
141
- @family,
142
- :family_members,
143
- [@theo,@claire, heathcliff,rudy, vanessa]
144
- )
145
-
146
- assert_active_fedora_has_many(
147
- @family,
148
- :child_collections,
149
- [@theo,@claire, heathcliff,rudy, vanessa]
150
- )
151
- end
152
-
153
- def verify_initial_relations_for_theo
154
- assert_rels_ext @theo, :is_child_of, [@claire, heathcliff]
155
- assert_rels_ext @theo, :is_member_of, [@claire, family, heathcliff]
156
-
157
- assert_active_fedora_has_many(@theo, :jobs, [])
158
- assert_active_fedora_has_many(@theo, :families, [family])
159
- assert_active_fedora_has_many(@theo, :parents, [heathcliff,claire])
160
- assert_active_fedora_has_many(@theo, :child_collections, [])
161
- assert_active_fedora_has_many(
162
- @theo, :parent_collections, [heathcliff,claire,family]
163
- )
5
+ describe 'with journal / volume' do
6
+ it 'should have volumes' do
7
+ journal = Journal.new
8
+ with_persisted_area(journal.name_of_area_to_assign) do |area|
9
+ journal.save!
10
+ volume = JournalVolume.new
11
+ volume.save!
12
+ volume.journals << journal
13
+ volume.save!
14
+
15
+ @journal = journal.class.find(journal.pid)
16
+ @volume = volume.class.find(volume.pid)
17
+
18
+ assert_rels_ext(@volume, :is_volume_of, [@journal])
19
+ assert_rels_ext(@volume, :is_member_of, [@journal])
20
+ assert_active_fedora_has_many(@volume, :journals, [@journal])
21
+
22
+ assert_rels_ext(@journal, :is_volume_of, [])
23
+ assert_rels_ext(@journal, :is_member_of, [])
24
+ assert_active_fedora_has_many(@journal, :volumes, [@volume])
25
+
26
+ end
27
+ end
164
28
  end
165
-
166
- def verify_initial_relations_for_dress
167
- assert_rels_ext(@dress, :is_part_of, [@claire])
168
- assert_active_fedora_belongs_to(@dress, :collection, @claire)
169
- end
170
-
171
- def verify_initial_relations_for_claire
172
- assert_rels_ext @claire, :is_parent_of, []
173
- assert_rels_ext @claire, :is_child_of, []
174
- assert_rels_ext @claire, :is_family_member_of, [family]
175
- assert_rels_ext @claire, :is_member_of, [family]
176
-
177
- assert_active_fedora_has_many(@claire,:data,[@dress])
178
- assert_active_fedora_has_many(@claire,:jobs,[lawyer])
179
- assert_active_fedora_has_many(@claire,:families,[family])
180
- assert_active_fedora_has_many(@claire,:children,[theo, rudy, vanessa])
181
- assert_active_fedora_has_many(
182
- @claire,:child_collections,[theo, rudy, vanessa]
183
- )
184
- assert_active_fedora_has_many(@claire,:parent_collections,[family])
185
- end
186
-
187
- def verify_claire_adding_a_child
188
- sandra = Person.new(area: area)
189
- sandra.save
190
- @claire.children << sandra
191
- @claire.save
192
- @claire = @claire.class.find(@claire.pid)
193
-
194
- assert_rels_ext @claire, :is_parent_of, []
195
- assert_rels_ext @claire, :is_child_of, []
196
-
197
- assert_active_fedora_has_many(@claire,:parents,[])
198
- assert_active_fedora_has_many(@claire,:children,[theo, rudy, vanessa,sandra])
199
- assert_active_fedora_has_many(
200
- @claire,:child_collections,[theo, rudy, vanessa, sandra]
201
- )
202
- assert_active_fedora_has_many(
203
- @claire,:parent_collections,[family]
204
- )
205
- end
206
-
207
- def verify_claire_losing_a_child
208
- @claire.children = [theo,rudy]
209
- @claire.save
210
-
211
- assert_active_fedora_has_many(@claire,:children,[theo, rudy])
212
- assert_active_fedora_has_many(
213
- @claire,:child_collections,[theo, rudy]
214
- )
215
-
216
- reloaded_vanessa = vanessa.class.find(vanessa.pid)
217
-
218
- # Note, just because we said Claire was not Vanessa's parent, Vanessa did
219
- # not update
220
- assert_rels_ext reloaded_vanessa, :is_child_of, [claire, heathcliff]
221
- assert_rels_ext(
222
- reloaded_vanessa, :is_member_of, [claire, heathcliff, family]
223
- )
224
-
225
- assert_active_fedora_has_many(
226
- reloaded_vanessa, :parents, [claire, heathcliff]
227
- )
228
- assert_active_fedora_has_many(
229
- reloaded_vanessa, :parent_collections, [claire,heathcliff, family]
230
- )
231
-
232
- end
233
-
234
- def verify_rudy_losing_a_parent
235
- assert_rels_ext @rudy, :is_child_of, [heathcliff,claire]
236
- assert_rels_ext @rudy, :is_member_of, [heathcliff,claire,family]
237
- assert_active_fedora_has_many @rudy, :parents, [heathcliff,claire]
238
- assert_active_fedora_has_many(
239
- @rudy, :parent_collections, [heathcliff,claire,family]
240
- )
241
-
242
- @rudy.break_relation_with_parents(heathcliff)
243
- @rudy.save.must_equal true
244
-
245
- assert_active_fedora_has_many(@rudy, :parents, [claire])
246
- assert_active_fedora_has_many(@rudy, :parent_collections, [claire, family])
247
- assert_rels_ext @rudy, :is_child_of, [claire]
248
- assert_rels_ext @rudy, :is_member_of, [claire, family]
249
-
250
- @rudy = @rudy.class.find(@rudy.pid)
251
-
252
- assert_rels_ext @rudy, :is_child_of, [claire]
253
- assert_rels_ext @rudy, :is_member_of, [claire, family]
254
-
255
- assert_active_fedora_has_many(@rudy, :parents, [claire])
256
- assert_active_fedora_has_many(@rudy, :parent_collections, [claire, family])
29
+ describe 'with family' do
30
+ let(:family) { Family.new }
31
+ let(:lawyer) { Job.new }
32
+ let(:doctor) { Job.new }
33
+ let(:heathcliff) { Person.new }
34
+ let(:claire) { Person.new }
35
+ let(:theo) { Person.new }
36
+ let(:vanessa) { Person.new }
37
+ let(:rudy) { Person.new }
38
+ let(:dress) { Clothing.new(slot_name: 'outerwear') }
39
+
40
+ it 'verifies complicated relationships' do
41
+ with_persisted_area(Family.new.name_of_area_to_assign) do |area|
42
+ setup_variables
43
+ verify_initial_relations_for_family
44
+ verify_initial_relations_for_theo
45
+ verify_initial_relations_for_claire
46
+ verify_initial_relations_for_dress
47
+ verify_claire_adding_a_child
48
+ verify_claire_losing_a_child
49
+ verify_rudy_losing_a_parent
50
+ end
51
+ end
52
+
53
+ protected
54
+ def setup_variables
55
+ family.save!
56
+
57
+ lawyer.save!
58
+ doctor.save!
59
+
60
+ heathcliff.save!
61
+ claire.save!
62
+ theo.save!
63
+ vanessa.save!
64
+ rudy.save!
65
+
66
+ dress.save!
67
+
68
+ claire.children = [theo,vanessa,rudy]
69
+ claire.jobs << lawyer
70
+ claire.families << family
71
+ claire.data << dress
72
+ claire.save!
73
+
74
+ heathcliff.children = [theo,vanessa,rudy]
75
+ heathcliff.jobs << doctor
76
+ heathcliff.families << family
77
+ heathcliff.save!
78
+
79
+ theo.families << family
80
+ theo.save!
81
+ vanessa.families << family
82
+ vanessa.save!
83
+ rudy.families << family
84
+ rudy.save!
85
+
86
+ family.family_members = [claire,heathcliff,theo,vanessa,rudy]
87
+ family.save!
88
+
89
+ @dress = dress.class.find(dress.pid)
90
+ @theo = theo.class.find(theo.pid)
91
+ @family = family.class.find(family.pid)
92
+ @claire = claire.class.find(claire.pid)
93
+ @rudy = rudy.class.find(rudy.pid)
94
+ @vanessa = vanessa.class.find(vanessa.pid)
95
+ end
96
+ def verify_initial_relations_for_family
97
+ # We are not storing the RELS-EXT entry on the "container" collection
98
+ assert_rels_ext(@family,:has_family_members,[])
99
+ assert_rels_ext(@family,:has_members,[])
100
+
101
+ # However, we do have access to Family#family_members
102
+ assert_active_fedora_has_many(
103
+ @family,
104
+ :family_members,
105
+ [@theo,@claire, heathcliff,rudy, @vanessa]
106
+ )
107
+
108
+ assert_active_fedora_has_many(
109
+ @family,
110
+ :child_collections,
111
+ [@theo,@claire, heathcliff,rudy, @vanessa]
112
+ )
113
+ end
114
+
115
+ def verify_initial_relations_for_theo
116
+ assert_rels_ext @theo, :is_child_of, [@claire, heathcliff]
117
+ assert_rels_ext @theo, :is_member_of, [@claire, family, heathcliff]
118
+
119
+ assert_active_fedora_has_many(@theo, :jobs, [])
120
+ assert_active_fedora_has_many(@theo, :families, [family])
121
+ assert_active_fedora_has_many(@theo, :parents, [heathcliff,claire])
122
+ assert_active_fedora_has_many(@theo, :child_collections, [])
123
+ assert_active_fedora_has_many(
124
+ @theo, :parent_collections, [heathcliff,claire,family]
125
+ )
126
+ end
127
+
128
+ def verify_initial_relations_for_dress
129
+ assert_rels_ext(@dress, :is_part_of, [@claire])
130
+ assert_active_fedora_belongs_to(@dress, :collection, @claire)
131
+ end
132
+
133
+ def verify_initial_relations_for_claire
134
+ assert_rels_ext @claire, :is_parent_of, []
135
+ assert_rels_ext @claire, :is_child_of, []
136
+ assert_rels_ext @claire, :is_family_member_of, [family]
137
+ assert_rels_ext @claire, :is_member_of, [family]
138
+
139
+ assert_active_fedora_has_many(@claire,:data,[@dress])
140
+ assert_active_fedora_has_many(@claire,:jobs,[lawyer])
141
+ assert_active_fedora_has_many(@claire,:families,[family])
142
+ assert_active_fedora_has_many(@claire,:children,[theo, rudy, @vanessa])
143
+ assert_active_fedora_has_many(
144
+ @claire,:child_collections,[theo, rudy, @vanessa]
145
+ )
146
+ assert_active_fedora_has_many(@claire,:parent_collections,[family])
147
+ end
148
+
149
+ def verify_claire_adding_a_child
150
+ @sandra = Person.new
151
+ @sandra.save!
152
+ @claire.children << @sandra
153
+ @claire.save!
154
+ @claire = @claire.class.find(@claire.pid)
155
+ @sandra = @sandra.class.find(@sandra.pid)
156
+
157
+ assert_rels_ext @claire, :is_parent_of, []
158
+ assert_rels_ext @claire, :is_child_of, []
159
+
160
+ assert_active_fedora_has_many(@claire,:parents,[])
161
+ assert_active_fedora_has_many(@claire,:children,[theo, rudy, @vanessa,@sandra])
162
+ assert_active_fedora_has_many(
163
+ @claire,:child_collections,[theo, rudy, @vanessa, @sandra]
164
+ )
165
+ assert_active_fedora_has_many(
166
+ @claire,:parent_collections,[family]
167
+ )
168
+ end
169
+
170
+ def verify_claire_losing_a_child
171
+ @vanessa.break_relation_with_parents(@claire)
172
+ @vanessa.save!
173
+ @sandra.break_relation_with_parents(@claire)
174
+ @sandra.save!
175
+
176
+ @claire.save!
177
+ @claire = @claire.class.find(@claire.pid)
178
+
179
+ assert_active_fedora_has_many(@claire,:children,[theo, rudy])
180
+ assert_active_fedora_has_many(
181
+ @claire,:child_collections,[theo, rudy]
182
+ )
183
+
184
+ @vanessa = @vanessa.class.find(@vanessa.pid)
185
+
186
+ # Note, just because we said Claire was not Vanessa's parent, Vanessa did
187
+ # not update
188
+ assert_rels_ext(@vanessa, :is_child_of, [heathcliff])
189
+ assert_rels_ext(@vanessa, :is_member_of, [heathcliff, family])
190
+
191
+ assert_active_fedora_has_many(@vanessa, :parents, [heathcliff])
192
+ assert_active_fedora_has_many(
193
+ @vanessa, :parent_collections, [heathcliff, family]
194
+ )
195
+
196
+ end
197
+
198
+ def verify_rudy_losing_a_parent
199
+ assert_rels_ext @rudy, :is_child_of, [heathcliff,@claire]
200
+ assert_rels_ext @rudy, :is_member_of, [heathcliff,@claire,family]
201
+ assert_active_fedora_has_many @rudy, :parents, [heathcliff,@claire]
202
+ assert_active_fedora_has_many(
203
+ @rudy, :parent_collections, [heathcliff,@claire,family]
204
+ )
205
+
206
+ @rudy.break_relation_with_parents(heathcliff)
207
+ @rudy.save!
208
+
209
+ assert_active_fedora_has_many(@rudy, :parents, [@claire])
210
+ assert_active_fedora_has_many(@rudy, :parent_collections, [@claire, family])
211
+ assert_rels_ext @rudy, :is_child_of, [@claire]
212
+ assert_rels_ext @rudy, :is_member_of, [@claire, family]
213
+
214
+ @rudy = @rudy.class.find(@rudy.pid)
215
+
216
+ assert_rels_ext @rudy, :is_child_of, [@claire]
217
+ assert_rels_ext @rudy, :is_member_of, [@claire, family]
218
+
219
+ assert_active_fedora_has_many(@rudy, :parents, [@claire])
220
+ assert_active_fedora_has_many(@rudy, :parent_collections, [@claire, family])
221
+ end
257
222
  end
258
223
  end
@@ -23,6 +23,7 @@
23
23
  :has_family_members: hasFamilyMembers
24
24
  :is_working_as: isWorkingAs
25
25
  :has_workers: hasWorkers
26
+ :is_volume_of: isVolumeOf
26
27
  info:fedora/fedora-system:def/relations-external#:
27
28
  :conforms_to: conformsTo
28
29
  :has_annotation: hasAnnotation
@@ -2,6 +2,10 @@ require_relative '../../../lib/common_repository_model/data'
2
2
 
3
3
  FactoryGirl.define do
4
4
  factory :common_repository_model_collection, class: CommonRepositoryModel::Collection do
5
- area { CommonRepositoryModel::Area.all.first }
5
+ before(:create) { |collection|
6
+ area_name = collection.name_of_area_to_assign
7
+ CommonRepositoryModel::Area.find_by_name(area_name) ||
8
+ FactoryGirl.create(:common_repository_model_area, name: area_name)
9
+ }
6
10
  end
7
11
  end
@@ -0,0 +1,68 @@
1
+ require 'common_repository_model/collection'
2
+
3
+ class JournalVolume < CommonRepositoryModel::Collection
4
+ def name_of_area_to_assign
5
+ Journal::AREA_NAME.freeze
6
+ end
7
+
8
+ is_member_of :journals, class_name: "Journal", property: :is_volume_of
9
+ end
10
+
11
+ class Journal < CommonRepositoryModel::Collection
12
+ AREA_NAME ='NDLIB-LAW'.freeze
13
+ def name_of_area_to_assign
14
+ AREA_NAME
15
+ end
16
+
17
+ has_members :volumes, class_name: "JournalVolume", property: :is_volume_of
18
+ end
19
+
20
+ class Clothing < CommonRepositoryModel::Data
21
+ end
22
+
23
+ class Job < CommonRepositoryModel::Collection
24
+ has_and_belongs_to_many(
25
+ :people,
26
+ class_name: 'Person',
27
+ property: :has_workers,
28
+ inverse_of: :is_working_as
29
+ )
30
+ end
31
+
32
+ class Family < CommonRepositoryModel::Collection
33
+ has_members(
34
+ :family_members,
35
+ class_name: 'Person',
36
+ property: :is_family_member_of
37
+ )
38
+ end
39
+
40
+ class Person < CommonRepositoryModel::Collection
41
+
42
+ is_member_of(
43
+ :parents,
44
+ class_name: 'Person',
45
+ property: :is_child_of
46
+ )
47
+
48
+ has_members(
49
+ :children,
50
+ class_name: 'Person',
51
+ property: :is_child_of
52
+ )
53
+
54
+ # People can be part of multiple families
55
+ is_member_of(
56
+ :families,
57
+ class_name: 'Family',
58
+ property: :is_family_member_of
59
+ )
60
+
61
+ has_and_belongs_to_many(
62
+ :jobs,
63
+ class_name: 'Job',
64
+ property: :is_working_as,
65
+ inverse_of: :has_workers
66
+ )
67
+
68
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: common_repository_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-28 00:00:00.000000000 Z
12
+ date: 2012-11-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -59,22 +59,6 @@ dependencies:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.0'
62
- - !ruby/object:Gem::Dependency
63
- name: morphine
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
- type: :runtime
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
78
62
  - !ruby/object:Gem::Dependency
79
63
  name: active_model_serializers
80
64
  requirement: !ruby/object:Gem::Requirement
@@ -210,6 +194,7 @@ files:
210
194
  - spec/factories/common_repository_model/collection_factory.rb
211
195
  - spec/factories/common_repository_model/data_factory.rb
212
196
  - spec/spec_helper.rb
197
+ - spec/support/spec_models.rb
213
198
  homepage: https://github.com/ndlib/common_repository_model
214
199
  licenses: []
215
200
  post_install_message:
@@ -253,3 +238,4 @@ test_files:
253
238
  - spec/factories/common_repository_model/collection_factory.rb
254
239
  - spec/factories/common_repository_model/data_factory.rb
255
240
  - spec/spec_helper.rb
241
+ - spec/support/spec_models.rb