active-fedora 9.12.0 → 9.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/active-fedora.gemspec +1 -0
  4. data/lib/active_fedora.rb +1 -0
  5. data/lib/active_fedora/associations.rb +38 -3
  6. data/lib/active_fedora/associations/basic_contains_association.rb +12 -51
  7. data/lib/active_fedora/associations/builder/aggregation.rb +1 -1
  8. data/lib/active_fedora/associations/builder/basic_contains.rb +7 -0
  9. data/lib/active_fedora/associations/builder/{contains.rb → has_subresource.rb} +2 -2
  10. data/lib/active_fedora/associations/contains_association.rb +19 -1
  11. data/lib/active_fedora/associations/directly_contains_association.rb +1 -15
  12. data/lib/active_fedora/associations/has_subresource_association.rb +61 -0
  13. data/lib/active_fedora/attached_files.rb +6 -9
  14. data/lib/active_fedora/autosave_association.rb +1 -1
  15. data/lib/active_fedora/base.rb +0 -1
  16. data/lib/active_fedora/common.rb +1 -0
  17. data/lib/active_fedora/fedora.rb +14 -19
  18. data/lib/active_fedora/file.rb +1 -1
  19. data/lib/active_fedora/file/attributes.rb +4 -0
  20. data/lib/active_fedora/file_persistence.rb +9 -1
  21. data/lib/active_fedora/initializing_connection.rb +64 -0
  22. data/lib/active_fedora/ldp_cache.rb +1 -2
  23. data/lib/active_fedora/ldp_resource_service.rb +7 -1
  24. data/lib/active_fedora/persistence.rb +12 -1
  25. data/lib/active_fedora/reflection.rb +22 -6
  26. data/lib/active_fedora/simple_datastream.rb +2 -0
  27. data/lib/active_fedora/version.rb +1 -1
  28. data/lib/generators/active_fedora/config/fedora/fedora_generator.rb +1 -0
  29. data/lib/generators/active_fedora/config/fedora/templates/.fcrepo_wrapper +1 -0
  30. data/lib/generators/active_fedora/config/fedora/templates/fcrepo_wrapper_test.yml +4 -0
  31. data/lib/generators/active_fedora/config/solr/solr_generator.rb +1 -0
  32. data/lib/generators/active_fedora/config/solr/templates/.solr_wrapper +3 -0
  33. data/lib/generators/active_fedora/config/solr/templates/solr_wrapper_test.yml +8 -0
  34. data/spec/integration/attached_files_spec.rb +77 -18
  35. data/spec/integration/attributes_spec.rb +3 -4
  36. data/spec/integration/autosave_association_spec.rb +0 -1
  37. data/spec/integration/base_spec.rb +19 -66
  38. data/spec/integration/basic_contains_association_spec.rb +108 -0
  39. data/spec/integration/complex_rdf_datastream_spec.rb +1 -1
  40. data/spec/integration/field_to_solr_name_spec.rb +12 -11
  41. data/spec/integration/file_fixity_spec.rb +1 -1
  42. data/spec/integration/file_spec.rb +4 -1
  43. data/spec/integration/generators/fedora_generator_spec.rb +26 -0
  44. data/spec/integration/generators/solr_generator_spec.rb +26 -0
  45. data/spec/integration/has_and_belongs_to_many_associations_spec.rb +6 -16
  46. data/spec/integration/has_many_associations_spec.rb +6 -16
  47. data/spec/integration/{contains_association_spec.rb → has_subresource_spec.rb} +1 -1
  48. data/spec/integration/json_serialization_spec.rb +11 -5
  49. data/spec/integration/model_spec.rb +7 -13
  50. data/spec/integration/ntriples_datastream_spec.rb +2 -2
  51. data/spec/integration/om_datastream_spec.rb +1 -1
  52. data/spec/integration/persistence_spec.rb +0 -3
  53. data/spec/integration/query_result_builder_spec.rb +1 -1
  54. data/spec/integration/relation_delegation_spec.rb +3 -8
  55. data/spec/integration/scoped_query_spec.rb +5 -7
  56. data/spec/integration/solr_hit_spec.rb +10 -4
  57. data/spec/integration/solr_instance_loader_spec.rb +11 -4
  58. data/spec/integration/versionable_spec.rb +3 -3
  59. data/spec/spec_helper.rb +5 -1
  60. data/spec/unit/active_fedora_spec.rb +1 -1
  61. data/spec/unit/attached_files_spec.rb +32 -21
  62. data/spec/unit/attributes_spec.rb +21 -23
  63. data/spec/unit/base_active_model_spec.rb +13 -10
  64. data/spec/unit/base_spec.rb +2 -24
  65. data/spec/unit/callback_spec.rb +0 -8
  66. data/spec/unit/core_spec.rb +3 -5
  67. data/spec/unit/inheritance_spec.rb +15 -9
  68. data/spec/unit/ntriples_datastream_spec.rb +1 -1
  69. data/spec/unit/om_datastream_spec.rb +1 -1
  70. data/spec/unit/persistence_spec.rb +21 -0
  71. data/spec/unit/query_spec.rb +8 -0
  72. data/spec/unit/rdf_datastream_spec.rb +1 -1
  73. data/spec/unit/rdf_resource_datastream_spec.rb +1 -1
  74. data/spec/unit/simple_datastream_spec.rb +8 -2
  75. data/spec/unit/solr_config_options_spec.rb +1 -1
  76. data/spec/unit/validations_spec.rb +2 -8
  77. metadata +27 -6
  78. data/spec/integration/bug_spec.rb +0 -40
  79. data/spec/integration/full_featured_model_spec.rb +0 -160
@@ -3,7 +3,6 @@ require 'spec_helper'
3
3
  describe ActiveFedora::Base do
4
4
  before :all do
5
5
  class MockAFBaseRelationship < ActiveFedora::Base
6
- has_metadata name: 'foo', type: Hydra::ModsArticleDatastream
7
6
  end
8
7
  end
9
8
  after :all do
@@ -1,79 +1,32 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveFedora::Base do
4
- describe "A base object with metadata" do
5
- before :each do
6
- class MockAFBaseRelationship < ActiveFedora::Base
7
- has_metadata 'foo', type: Hydra::ModsArticleDatastream
4
+ describe '#reload' do
5
+ before do
6
+ class Foo < ActiveFedora::Base
7
+ property :person, predicate: ::RDF::Vocab::DC.creator
8
8
  end
9
9
  end
10
- after :each do
11
- Object.send(:remove_const, :MockAFBaseRelationship)
10
+ after do
11
+ Object.send(:remove_const, :Foo)
12
12
  end
13
- describe "a new document" do
13
+ context "when persisted" do
14
+ let(:object) { Foo.create(person: ['bob']) }
15
+ let(:object2) { Foo.find(object.id) }
14
16
  before do
15
- @obj = MockAFBaseRelationship.new
16
-
17
- @obj.foo.person = "bob"
18
- @obj.save
19
- end
20
-
21
- it "saves the datastream." do
22
- obj = described_class.find(@obj.id)
23
- expect(obj.foo).to_not be_new_record
24
- expect(obj.foo.person).to eq ['bob']
25
- person_field = ActiveFedora.index_field_mapper.solr_name('foo__person', type: :string)
26
- solr_result = ActiveFedora::SolrService.query("{!field f=id}#{@obj.id}", fl: "id #{person_field}").first
27
- expect(solr_result).to eq("id" => @obj.id, person_field => ['bob'])
17
+ object2.update(person: ['dave'])
28
18
  end
29
- end
30
19
 
31
- describe "that already exists in the repo" do
32
- before do
33
- @release = MockAFBaseRelationship.create
34
- @release.foo.person = "test foo content"
35
- @release.save
36
- end
37
- describe "and has been changed" do
38
- before do
39
- @release.foo.person = 'frank'
40
- @release.save!
41
- end
42
- it "saves the datastream." do
43
- expect(MockAFBaseRelationship.find(@release.id).foo.person).to eq ['frank']
44
- person_field = ActiveFedora.index_field_mapper.solr_name('foo__person', type: :string)
45
- expect(ActiveFedora::SolrService.query("id:\"#{@release.id}\"", fl: "id #{person_field}").first).to eq("id" => @release.id, person_field => ['frank'])
46
- end
47
- end
48
- describe "when trying to create it again" do
49
- it "raises an error" do
50
- expect { MockAFBaseRelationship.create(id: @release.id) }.to raise_error(ActiveFedora::IllegalOperation, "Attempting to recreate existing ldp_source: `#{@release.uri}'")
51
- @release.reload
52
- expect(@release.foo.person).to include('test foo content')
53
- end
20
+ it 're-queries Fedora' do
21
+ object.reload
22
+ expect(object.person).to eq ['dave']
54
23
  end
55
24
  end
56
25
 
57
- describe '#reload' do
58
- before do
59
- @object = MockAFBaseRelationship.new
60
- @object.foo.person = 'bob'
61
- @object.save
62
-
63
- @object2 = @object.class.find(@object.id)
64
-
65
- @object2.foo.person = 'dave'
66
- @object2.save
67
- end
68
-
69
- it 'requeries Fedora' do
70
- @object.reload
71
- expect(@object.foo.person).to eq ['dave']
72
- end
73
-
74
- it 'raises an error if not persisted' do
75
- @object = MockAFBaseRelationship.new
76
- expect { @object.reload }.to raise_error(ActiveFedora::ObjectNotFoundError)
26
+ context "when not persisted" do
27
+ let(:object) { Foo.new }
28
+ it 'raises an error' do
29
+ expect { object.reload }.to raise_error(ActiveFedora::ObjectNotFoundError)
77
30
  end
78
31
  end
79
32
  end
@@ -93,12 +46,12 @@ describe ActiveFedora::Base do
93
46
 
94
47
  after { obj.destroy unless obj.destroyed? }
95
48
 
96
- describe "errors" do
49
+ describe "#errors" do
97
50
  subject { obj.errors }
98
51
  it { should be_empty }
99
52
  end
100
53
 
101
- describe "id" do
54
+ describe "#id" do
102
55
  subject { obj.id }
103
56
  it { should_not be_nil }
104
57
  end
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveFedora::Base do
4
+ let(:model) { Source.new }
5
+
6
+ context "with a file" do
7
+ before do
8
+ class Source < ActiveFedora::Base
9
+ is_a_container
10
+ end
11
+ end
12
+
13
+ after do
14
+ Object.send(:remove_const, :Source)
15
+ end
16
+
17
+ it 'is empty' do
18
+ expect(model.contains).to eq []
19
+ end
20
+
21
+ it 'can build a child' do
22
+ child = model.contains.build
23
+ expect(child).to be_kind_of ActiveFedora::File
24
+ child.content = "hello"
25
+ model.save!
26
+ expect(child).to be_persisted
27
+ expect(child.uri.to_s).to include model.uri.to_s
28
+ end
29
+
30
+ it 'can create a child on a persisted parent' do
31
+ model.save!
32
+ child = model.contains.build
33
+ expect(child).to be_kind_of ActiveFedora::File
34
+ child.content = "hello"
35
+ model.save!
36
+ expect(child).to be_persisted
37
+ expect(child.uri.to_s).to include model.uri.to_s
38
+ end
39
+ end
40
+
41
+ context "with an AF::Base object" do
42
+ before do
43
+ class Thing < ActiveFedora::Base
44
+ property :title, predicate: ::RDF::Vocab::DC.title
45
+ end
46
+ class Source < ActiveFedora::Base
47
+ is_a_container class_name: 'Thing'
48
+ end
49
+ end
50
+ after do
51
+ Object.send(:remove_const, :Source)
52
+ Object.send(:remove_const, :Thing)
53
+ end
54
+
55
+ let(:model) { Source.new }
56
+
57
+ it 'is empty' do
58
+ expect(model.contains).to eq []
59
+ end
60
+
61
+ describe "creating" do
62
+ it 'can build a child' do
63
+ child = model.contains.build
64
+ expect(model.contains.build(title: ['my title'])).to be_kind_of Thing
65
+ model.save!
66
+ expect(child).to be_persisted
67
+ expect(child.uri.to_s).to include model.uri.to_s
68
+ end
69
+
70
+ it 'can create a child on a persisted parent' do
71
+ model.save!
72
+ child = model.contains.create(title: ['my title'])
73
+ expect(child).to be_kind_of Thing
74
+ expect(child).to be_persisted
75
+ expect(child.uri.to_s).to include model.uri.to_s
76
+ end
77
+ end
78
+
79
+ describe "loading" do
80
+ before do
81
+ model.save!
82
+ model.contains.create(title: ['title 1'])
83
+ model.contains.create(title: ['title 2'])
84
+ model.reload
85
+ end
86
+
87
+ it "has the two contained objects" do
88
+ expect(model.contains.size).to eq 2
89
+ expect(model.contains.map(&:title)).to eq [['title 1'], ['title 2']]
90
+ end
91
+ end
92
+
93
+ describe "#destroy_all" do
94
+ before do
95
+ model.save!
96
+ model.contains.create(title: ['title 1'])
97
+ model.contains.create(title: ['title 2'])
98
+ model.reload
99
+ end
100
+
101
+ it "destroys the two contained objects" do
102
+ expect { model.contains.destroy_all }
103
+ .to change { model.contains.size }.by(-2)
104
+ .and change { Thing.count }.by(-2)
105
+ end
106
+ end
107
+ end
108
+ end
@@ -177,7 +177,7 @@ END
177
177
  end
178
178
 
179
179
  class SpecContainer < ActiveFedora::Base
180
- contains :info, class_name: 'SpecDatastream'
180
+ has_subresource :info, class_name: 'SpecDatastream'
181
181
  end
182
182
 
183
183
  class SpecDatastream < ActiveFedora::NtriplesRDFDatastream
@@ -2,19 +2,19 @@ require 'spec_helper'
2
2
 
3
3
  describe "An object with RDF backed attributes" do
4
4
  before do
5
- class TestOne < ActiveFedora::Base
6
- class MyMetadata < ActiveFedora::NtriplesRDFDatastream
7
- Deprecation.silence(ActiveFedora::RDFDatastream) do
8
- property :title, predicate: ::RDF::Vocab::DC.title do |index|
9
- index.as :stored_searchable
10
- end
11
- property :date_uploaded, predicate: ::RDF::Vocab::DC.dateSubmitted do |index|
12
- index.type :date
13
- index.as :stored_searchable, :sortable
14
- end
5
+ class MyMetadata < ActiveFedora::NtriplesRDFDatastream
6
+ Deprecation.silence(ActiveFedora::RDFDatastream) do
7
+ property :title, predicate: ::RDF::Vocab::DC.title do |index|
8
+ index.as :stored_searchable
9
+ end
10
+ property :date_uploaded, predicate: ::RDF::Vocab::DC.dateSubmitted do |index|
11
+ index.type :date
12
+ index.as :stored_searchable, :sortable
15
13
  end
16
14
  end
17
- has_metadata 'descMetadata', type: MyMetadata
15
+ end
16
+ class TestOne < ActiveFedora::Base
17
+ has_subresource 'descMetadata', class_name: 'MyMetadata'
18
18
  Deprecation.silence(ActiveFedora::Attributes) do
19
19
  has_attributes :title, :date_uploaded, datastream: 'descMetadata'
20
20
  end
@@ -23,6 +23,7 @@ describe "An object with RDF backed attributes" do
23
23
 
24
24
  after do
25
25
  Object.send(:remove_const, :TestOne)
26
+ Object.send(:remove_const, :MyMetadata)
26
27
  end
27
28
 
28
29
  it "is able to grab the solr name" do
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe "Checking fixity" do
4
4
  before(:all) do
5
5
  class MockAFBase < ActiveFedora::Base
6
- contains "data", autocreate: true
6
+ has_subresource "data", autocreate: true
7
7
  end
8
8
  end
9
9
 
@@ -53,7 +53,10 @@ describe ActiveFedora::File do
53
53
  context "when autocreate is true" do
54
54
  before do
55
55
  class MockAFBase < ActiveFedora::Base
56
- has_metadata "descMetadata", type: ActiveFedora::QualifiedDublinCoreDatastream, autocreate: true
56
+ extend Deprecation
57
+ Deprecation.silence(MockAFBase) do
58
+ has_metadata "descMetadata", type: ActiveFedora::QualifiedDublinCoreDatastream, autocreate: true
59
+ end
57
60
  end
58
61
  end
59
62
 
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'generators/active_fedora/config/fedora/fedora_generator'
3
+
4
+ describe ActiveFedora::Config::FedoraGenerator do
5
+ describe "#fcrepo_wrapper_config" do
6
+ let(:generator) { described_class.new }
7
+ let(:files_to_test) {[
8
+ 'config/fcrepo_wrapper_test.yml',
9
+ '.fcrepo_wrapper'
10
+ ]}
11
+
12
+ before do
13
+ generator.fcrepo_wrapper_config
14
+ end
15
+
16
+ after do
17
+ files_to_test.each { |file| File.delete(file) if File.exist?(file) }
18
+ end
19
+
20
+ it "creates config files" do
21
+ files_to_test.each do |file|
22
+ expect(File).to exist(file), "Expected #{file} to exist"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'generators/active_fedora/config/solr/solr_generator'
3
+
4
+ describe ActiveFedora::Config::SolrGenerator do
5
+ describe "#solr_wrapper_config" do
6
+ let(:generator) { described_class.new }
7
+ let(:files_to_test) {[
8
+ 'config/solr_wrapper_test.yml',
9
+ '.solr_wrapper'
10
+ ]}
11
+
12
+ before do
13
+ generator.solr_wrapper_config
14
+ end
15
+
16
+ after do
17
+ files_to_test.each { |file| File.delete(file) if File.exist?(file) }
18
+ end
19
+
20
+ it "creates config files" do
21
+ files_to_test.each do |file|
22
+ expect(File).to exist(file), "Expected #{file} to exist"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -350,22 +350,12 @@ describe ActiveFedora::Base do
350
350
  before do
351
351
  class Item < ActiveFedora::Base
352
352
  has_many :components
353
- has_metadata "foo", type: ActiveFedora::SimpleDatastream do |m|
354
- m.field "title", :string
355
- end
356
- Deprecation.silence(ActiveFedora::Attributes) do
357
- has_attributes :title, datastream: 'foo'
358
- end
353
+ property :title, predicate: ::RDF::Vocab::DC.title
359
354
  end
360
355
 
361
356
  class Component < ActiveFedora::Base
362
357
  has_and_belongs_to_many :items, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf
363
- has_metadata "foo", type: ActiveFedora::SimpleDatastream do |m|
364
- m.field "description", :string
365
- end
366
- Deprecation.silence(ActiveFedora::Attributes) do
367
- has_attributes :description, datastream: 'foo'
368
- end
358
+ property :description, predicate: ::RDF::Vocab::DC.description
369
359
  end
370
360
  end
371
361
 
@@ -376,11 +366,11 @@ describe ActiveFedora::Base do
376
366
 
377
367
  describe "From the has_and_belongs_to_many side" do
378
368
  describe "dependent records" do
379
- let(:component) { Component.create(items: [Item.new(title: 'my title')]) }
369
+ let(:component) { Component.create(items: [Item.new(title: ['my title'])]) }
380
370
 
381
371
  it "is saved" do
382
372
  component.reload
383
- expect(component.items.first.title).to eq 'my title'
373
+ expect(component.items.first.title).to eq ['my title']
384
374
  end
385
375
  end
386
376
 
@@ -413,11 +403,11 @@ describe ActiveFedora::Base do
413
403
  end
414
404
 
415
405
  describe "From the has_many side" do
416
- let(:item) { Item.create(components: [Component.new(description: 'my description')]) }
406
+ let(:item) { Item.create(components: [Component.new(description: ['my description'])]) }
417
407
 
418
408
  it "saves dependent records" do
419
409
  item.reload
420
- expect(item.components.first.description).to eq 'my description'
410
+ expect(item.components.first.description).to eq ['my description']
421
411
  end
422
412
  end
423
413
  end
@@ -314,21 +314,11 @@ describe ActiveFedora::Associations::HasManyAssociation do
314
314
  before do
315
315
  class Item < ActiveFedora::Base
316
316
  has_many :components
317
- has_metadata "foo", type: ActiveFedora::SimpleDatastream do |m|
318
- m.field "title", :string
319
- end
320
- Deprecation.silence(ActiveFedora::Attributes) do
321
- has_attributes :title, datastream: 'foo'
322
- end
317
+ property :title, predicate: ::RDF::Vocab::DC.title
323
318
  end
324
319
  class Component < ActiveFedora::Base
325
320
  belongs_to :item, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf
326
- has_metadata "foo", type: ActiveFedora::SimpleDatastream do |m|
327
- m.field "description", :string
328
- end
329
- Deprecation.silence(ActiveFedora::Attributes) do
330
- has_attributes :description, datastream: 'foo'
331
- end
321
+ property :description, predicate: ::RDF::Vocab::DC.description
332
322
  end
333
323
  end
334
324
 
@@ -338,20 +328,20 @@ describe ActiveFedora::Associations::HasManyAssociation do
338
328
  end
339
329
 
340
330
  context "From the belongs_to side" do
341
- let(:component) { Component.create(item: Item.new(title: 'my title')) }
331
+ let(:component) { Component.create(item: Item.new(title: ['my title'])) }
342
332
 
343
333
  it "saves dependent records" do
344
334
  component.reload
345
- expect(component.item.title).to eq 'my title'
335
+ expect(component.item.title).to eq ['my title']
346
336
  end
347
337
  end
348
338
 
349
339
  context "From the has_many side" do
350
- let(:item) { Item.create(components: [Component.new(description: 'my description')]) }
340
+ let(:item) { Item.create(components: [Component.new(description: ['my description'])]) }
351
341
 
352
342
  it "saves dependent records" do
353
343
  item.reload
354
- expect(item.components.first.description).to eq 'my description'
344
+ expect(item.components.first.description).to eq ['my description']
355
345
  end
356
346
  end
357
347
  end