ddr-models 1.11.8 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/component.rb +1 -0
  3. data/app/models/item.rb +13 -2
  4. data/config/initializers/active_fedora_base.rb +9 -5
  5. data/config/initializers/subscriptions.rb +3 -0
  6. data/config/locales/groups.en.yml +0 -7
  7. data/lib/ddr/auth/remote_group_service.rb +2 -11
  8. data/lib/ddr/datastreams.rb +5 -4
  9. data/lib/ddr/datastreams/{admin_metadata_datastream.rb → administrative_metadata_datastream.rb} +2 -2
  10. data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +4 -45
  11. data/lib/ddr/datastreams/metadata_datastream.rb +44 -0
  12. data/lib/ddr/datastreams/structural_metadata_datastream.rb +24 -0
  13. data/lib/ddr/events.rb +2 -2
  14. data/lib/ddr/events/deletion_event.rb +12 -0
  15. data/lib/ddr/events/event.rb +0 -15
  16. data/lib/ddr/events/preservation_event_behavior.rb +4 -2
  17. data/lib/ddr/index_fields.rb +32 -36
  18. data/lib/ddr/managers/permanent_id_manager.rb +2 -1
  19. data/lib/ddr/metadata.rb +0 -3
  20. data/lib/ddr/models.rb +1 -1
  21. data/lib/ddr/models/base.rb +4 -0
  22. data/lib/ddr/models/describable.rb +5 -5
  23. data/lib/ddr/models/has_admin_metadata.rb +1 -1
  24. data/lib/ddr/models/has_children.rb +1 -5
  25. data/lib/ddr/models/has_content.rb +10 -0
  26. data/lib/ddr/models/has_struct_metadata.rb +57 -0
  27. data/lib/ddr/models/indexing.rb +0 -10
  28. data/lib/ddr/models/solr_document.rb +1 -5
  29. data/lib/ddr/models/version.rb +1 -1
  30. data/lib/ddr/notifications.rb +2 -1
  31. data/lib/ddr/utils.rb +2 -2
  32. data/lib/ddr/vocab.rb +3 -0
  33. data/lib/ddr/vocab/asset.rb +3 -0
  34. data/lib/ddr/{metadata → vocab}/duke_terms.rb +2 -2
  35. data/lib/ddr/{metadata → vocab}/rdf_vocabulary_parser.rb +2 -2
  36. data/lib/ddr/{metadata → vocab}/sources/duketerms.rdf.xml +0 -0
  37. data/lib/ddr/{metadata → vocab}/vocabulary.rb +2 -2
  38. data/spec/dummy/log/development.log +0 -3829
  39. data/spec/dummy/log/test.log +0 -46079
  40. data/spec/factories/test_model_factories.rb +0 -57
  41. data/spec/models/collection_spec.rb +0 -5
  42. data/spec/models/descriptive_metadata_datastream_spec.rb +20 -4
  43. data/spec/models/events_spec.rb +8 -0
  44. data/spec/models/has_struct_metadata_spec.rb +34 -0
  45. data/spec/models/item_spec.rb +13 -1
  46. data/spec/support/shared_examples_for_ddr_models.rb +11 -1
  47. data/spec/support/shared_examples_for_describables.rb +5 -5
  48. data/spec/support/shared_examples_for_events.rb +4 -40
  49. metadata +13 -23
  50. data/lib/ddr/datastreams/content_metadata_datastream.rb +0 -147
  51. data/lib/ddr/datastreams/preservation_metadata_datastream.rb +0 -13
  52. data/lib/ddr/events/preservation_event_type.rb +0 -24
  53. data/lib/ddr/models/has_content_metadata.rb +0 -16
  54. data/spec/fixtures/contentMetadata.xml +0 -37
  55. data/spec/models/solr_document_spec.rb +0 -23
  56. data/spec/services/remote_group_service_spec.rb +0 -16
  57. data/spec/support/shared_examples_for_event_loggables.rb +0 -3
  58. data/spec/support/shared_examples_for_has_content_metadata.rb +0 -74
  59. data/spec/support/shared_examples_for_licensable.rb +0 -15
@@ -14,14 +14,9 @@ class TestChild < TestModel
14
14
  belongs_to :parent, property: :is_part_of, class_name: 'TestParent'
15
15
  end
16
16
 
17
- class TestContentMetadata < TestParent
18
- include Ddr::Models::HasContentMetadata
19
- end
20
-
21
17
  class TestModelOmnibus < TestModel
22
18
  include Ddr::Models::Governable
23
19
  include Ddr::Models::HasContent
24
- include Ddr::Models::HasContentMetadata
25
20
  include Ddr::Models::HasAttachments
26
21
  has_many :children, property: :is_part_of, class_name: 'TestChild'
27
22
  belongs_to :parent, property: :is_part_of, class_name: 'TestParent'
@@ -68,58 +63,6 @@ FactoryGirl.define do
68
63
  after(:create) { |c| c.fixity_check! }
69
64
  end
70
65
  end
71
-
72
- factory :test_content_metadata do
73
- title [ "DulHydra Test Content Metadata Object" ]
74
- sequence(:identifier) { |n| [ "testcontentmetadata%05d" % n ] }
75
-
76
- factory :test_content_metadata_has_children do
77
- ignore do
78
- child_count 3
79
- end
80
- after(:create) do |parent, evaluator|
81
- FactoryGirl.create_list(:test_child, evaluator.child_count, :parent => parent)
82
- child_pids = []
83
- parent.children.each do |child|
84
- child_pids << child.pid
85
- end
86
- parent.contentMetadata.content = <<-EOS
87
- <mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
88
- <fileSec>
89
- <fileGrp ID="GRP01" USE="Master Image">
90
- <file ID="FILE001">
91
- <FLocat xlink:href="#{child_pids[2]}/content" LOCTYPE="URL"/>
92
- </file>
93
- <file ID="FILE002">
94
- <FLocat xlink:href="#{child_pids[0]}/content" LOCTYPE="URL"/>
95
- </file>
96
- </fileGrp>
97
- <fileGrp ID="GRP00" USE="Composite PDF">
98
- <file ID="FILE000">
99
- <FLocat xlink:href="#{child_pids[1]}/content" LOCTYPE="URL"/>
100
- </file>
101
- </fileGrp>
102
- </fileSec>
103
- <structMap>
104
- <div ID="DIV01" TYPE="image" LABEL="Images">
105
- <div ORDER="1">
106
- <fptr FILEID="FILE001"/>
107
- </div>
108
- <div ORDER="2">
109
- <fptr FILEID="FILE002"/>
110
- </div>
111
- </div>
112
- <div ID="DIV00" TYPE="pdf" LABEL="PDF">
113
- <fptr FILEID="FILE000"/>
114
- </div>
115
- </structMap>
116
- </mets>
117
- EOS
118
- parent.contentMetadata.mimeType = "application/xml"
119
- parent.save!
120
- end
121
- end
122
- end
123
66
 
124
67
  factory :test_model_omnibus do
125
68
  title [ "DulHydra Test Omnibus Object" ]
@@ -20,11 +20,6 @@ RSpec.describe Collection, :type => :model do
20
20
  expect(collection.defaultRights.license.description.first).to eq("License Description")
21
21
  expect(collection.defaultRights.license.url.first).to eq("http://library.duke.edu")
22
22
  end
23
- it "should index the terms" do
24
- expect(collection.to_solr[Ddr::IndexFields::DEFAULT_LICENSE_TITLE]).to eq("License Title")
25
- expect(collection.to_solr[Ddr::IndexFields::DEFAULT_LICENSE_DESCRIPTION]).to eq("License Description")
26
- expect(collection.to_solr[Ddr::IndexFields::DEFAULT_LICENSE_URL]).to eq("http://library.duke.edu")
27
- end
28
23
  end
29
24
 
30
25
  describe "#components_from_solr" do
@@ -25,19 +25,19 @@ module Ddr
25
25
  context "terminology" do
26
26
  subject { described_class.term_names }
27
27
  it "should have a term for each term name in the RDF::DC vocab" do
28
- expect(subject).to include(*Ddr::Metadata::Vocabulary.term_names(RDF::DC))
28
+ expect(subject).to include(*Ddr::Vocab::Vocabulary.term_names(RDF::DC))
29
29
  end
30
30
  it "should have a term for each term name in the DukeTerms vocab" do
31
- expect(subject).to include(*Ddr::Metadata::Vocabulary.term_names(Ddr::Metadata::DukeTerms))
31
+ expect(subject).to include(*Ddr::Vocab::Vocabulary.term_names(Ddr::Vocab::DukeTerms))
32
32
  end
33
33
  end
34
34
  context "properties" do
35
35
  subject { described_class.properties.map { |prop| prop[1].predicate } }
36
36
  it "should include all the RDF::DC predicates" do
37
- expect(subject).to include(*Ddr::Metadata::Vocabulary.property_terms(RDF::DC))
37
+ expect(subject).to include(*Ddr::Vocab::Vocabulary.property_terms(RDF::DC))
38
38
  end
39
39
  it "should include all the DukeTerms predicates" do
40
- expect(subject).to include(*Ddr::Metadata::Vocabulary.property_terms(Ddr::Metadata::DukeTerms))
40
+ expect(subject).to include(*Ddr::Vocab::Vocabulary.property_terms(Ddr::Vocab::DukeTerms))
41
41
  end
42
42
  end
43
43
  context "raw content" do
@@ -77,6 +77,22 @@ module Ddr
77
77
  expect(ds.resource).to be_isomorphic_with(RDF::Reader.for(:ntriples).new(content))
78
78
  end
79
79
  end
80
+ context "using the set_values and add_value methods" do
81
+ let(:ds) { described_class.new(nil, 'descMetadata') }
82
+ before { ds.type = "Photograph" }
83
+ context "#set_values" do
84
+ it "should set the values of the term to those supplied" do
85
+ ds.set_values :type, [ "Image", "Still Image" ]
86
+ expect(ds.type).to eq([ "Image", "Still Image" ])
87
+ end
88
+ end
89
+ context "#add_value" do
90
+ it "should add the supplied value to those of the term" do
91
+ ds.add_value :type, "Image"
92
+ expect(ds.type).to eq([ "Photograph", "Image" ])
93
+ end
94
+ end
95
+ end
80
96
  context "solrization" do
81
97
  let(:ds) { described_class.new(nil, 'descMetadata') }
82
98
  subject { ds.to_solr }
@@ -60,5 +60,13 @@ module Ddr
60
60
  expect(subject.display_type).to eq "Validation"
61
61
  end
62
62
  end
63
+
64
+ RSpec.describe DeletionEvent, type: :model, events: true do
65
+ it_behaves_like "an event"
66
+ it_behaves_like "a preservation-related event"
67
+ it "should have a display type" do
68
+ expect(subject.display_type).to eq "Deletion"
69
+ end
70
+ end
63
71
  end
64
72
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ module Ddr
4
+ module Models
5
+ RSpec.describe HasStructMetadata, type: :model do
6
+
7
+ context "component" do
8
+ describe "component creation" do
9
+ let(:item) { Item.new }
10
+ let(:comp) { Component.new(identifier: [ "id001" ]) }
11
+ before do
12
+ allow(comp).to receive(:parent).and_return(item)
13
+ allow(comp).to receive(:has_content?).and_return(true)
14
+ allow(comp).to receive(:content_type).and_return("image/tiff")
15
+ allow(item).to receive(:children_by_file_use).and_return({})
16
+ end
17
+ it "should assign default values for unassigned attributes" do
18
+ comp.save
19
+ expect(comp.file_use).to_not be_nil
20
+ expect(comp.order).to_not be_nil
21
+ expect(comp.file_group).to_not be_nil
22
+ end
23
+ it "should not overwrite assigned attributes" do
24
+ comp.update_attributes(file_use: 'foo', order: 3, file_group: 'special')
25
+ expect(comp.file_use).to eq('foo')
26
+ expect(comp.order).to eq(3)
27
+ expect(comp.file_group).to eq('special')
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -2,7 +2,19 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe Item, :type => :model do
4
4
  it_behaves_like "a DDR model"
5
- it_behaves_like "an object that has content metadata"
6
5
  it_behaves_like "it has an association", :belongs_to, :parent, :is_member_of_collection, "Collection"
7
6
  it_behaves_like "it has an association", :has_many, :children, :is_part_of, "Component"
7
+
8
+ context "has structured children" do
9
+ let!(:item) { Item.create }
10
+ let!(:comp1) { Component.create(parent: item, file_use: 'master', order: 2) }
11
+ let!(:comp2) { Component.create(parent: item, file_use: 'reference', order: 1) }
12
+ let!(:comp3) { Component.create(parent: item, file_use: 'master', order: 1) }
13
+ it "should group and order the children" do
14
+ results = item.children_by_file_use
15
+ expect(results['master']).to eq([ comp3, comp1 ])
16
+ expect(results['reference']).to eq([ comp2 ])
17
+ end
18
+ end
19
+
8
20
  end
@@ -1,8 +1,18 @@
1
1
  RSpec.shared_examples "a DDR model" do
2
+
2
3
  it_behaves_like "a describable object"
3
4
  it_behaves_like "a governable object"
4
- it_behaves_like "a licensable object"
5
5
  it_behaves_like "an access controllable object"
6
6
  it_behaves_like "an object that has properties"
7
7
  it_behaves_like "an object that has a display title"
8
+
9
+ describe "events" do
10
+ describe "on deletion with #destroy" do
11
+ before { subject.save(validate: false) }
12
+ it "should create a deletion event" do
13
+ expect { subject.destroy }.to change { Ddr::Events::DeletionEvent.for_object(subject).count }.from(0).to(1)
14
+ end
15
+ end
16
+ end
17
+
8
18
  end
@@ -15,11 +15,11 @@ RSpec.shared_examples "a describable object" do
15
15
  end
16
16
  describe "arguments" do
17
17
  it "with fixed results" do
18
- expect(object.desc_metadata_terms(:dcterms)).to eq(Ddr::Metadata::Vocabulary.term_names(RDF::DC11) + (Ddr::Metadata::Vocabulary.term_names(RDF::DC) - Ddr::Metadata::Vocabulary.term_names(RDF::DC11)))
19
- expect(object.desc_metadata_terms(:dcterms)).to match_array Ddr::Metadata::Vocabulary.term_names(RDF::DC)
20
- expect(object.desc_metadata_terms(:duke)).to eq Ddr::Metadata::Vocabulary.term_names(Ddr::Metadata::DukeTerms)
21
- expect(object.desc_metadata_terms(:dcterms_elements11)).to eq Ddr::Metadata::Vocabulary.term_names(RDF::DC11)
22
- expect(object.desc_metadata_terms(:defined_attributes)).to match_array Ddr::Metadata::Vocabulary.term_names(RDF::DC11)
18
+ expect(object.desc_metadata_terms(:dcterms)).to eq(Ddr::Vocab::Vocabulary.term_names(RDF::DC11) + (Ddr::Vocab::Vocabulary.term_names(RDF::DC) - Ddr::Vocab::Vocabulary.term_names(RDF::DC11)))
19
+ expect(object.desc_metadata_terms(:dcterms)).to match_array Ddr::Vocab::Vocabulary.term_names(RDF::DC)
20
+ expect(object.desc_metadata_terms(:duke)).to eq Ddr::Vocab::Vocabulary.term_names(Ddr::Vocab::DukeTerms)
21
+ expect(object.desc_metadata_terms(:dcterms_elements11)).to eq Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
22
+ expect(object.desc_metadata_terms(:defined_attributes)).to match_array Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
23
23
  end
24
24
  context "with variable results" do
25
25
  before do
@@ -31,27 +31,12 @@ end
31
31
 
32
32
  RSpec.shared_examples "an event" do
33
33
  describe "validation" do
34
- context "of pid" do
35
- it "should require presence" do
36
- expect(subject).not_to be_valid
37
- expect(subject.errors[:pid]).to include "can't be blank"
38
- end
39
- context "when the object exists" do
40
- before { subject.pid = ActiveFedora::Base.create.pid }
41
- it "should be valid" do
42
- expect(subject).to be_valid
43
- end
44
- end
45
- context "when the object doesn't exist" do
46
- before { subject.pid = "test:123" }
47
- it "should not be valid" do
48
- expect(subject).not_to be_valid
49
- expect(subject.errors).to have_key :pid
50
- end
51
- end
34
+ it "should require a PID" do
35
+ expect(subject).not_to be_valid
36
+ expect(subject.errors[:pid]).to include "can't be blank"
52
37
  end
53
38
  it "should require an event_date_time" do
54
- subject.event_date_time = nil # reset b/c set to default after init
39
+ allow(subject).to receive(:event_date_time) { nil } # b/c set to default after init
55
40
  expect(subject).not_to be_valid
56
41
  expect(subject.errors[:event_date_time]).to include "can't be blank"
57
42
  end
@@ -135,27 +120,6 @@ RSpec.shared_examples "an event" do
135
120
  end
136
121
  end
137
122
 
138
- describe "object existence" do
139
- it "should be false if pid is nil" do
140
- expect(subject.object_exists?).to be_falsey
141
- end
142
- it "should be false if pid not found in repository" do
143
- subject.pid = "test:123"
144
- expect(subject.object_exists?).to be_falsey
145
- end
146
- it "should be true if object exists in repository" do
147
- allow(ActiveFedora::Base).to receive(:find).with("test:123") { mock_object }
148
- subject.pid = "test:123"
149
- expect(subject.object_exists?).to be_truthy
150
- end
151
- it "should be true if object instance variable is set" do
152
- obj = mock_object(pid: "test:123")
153
- allow(obj).to receive(:new_record?) { false }
154
- subject.object = obj
155
- expect(subject.object_exists?).to be_truthy
156
- end
157
- end
158
-
159
123
  describe "event_date_time string representation" do
160
124
  subject { described_class.new(event_date_time: Time.utc(2014, 6, 4, 11, 7, 35)) }
161
125
  it "should conform to the specified format" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddr-models
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.8
4
+ version: 1.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Coble
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-03-16 00:00:00.000000000 Z
12
+ date: 2015-03-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -323,19 +323,19 @@ files:
323
323
  - lib/ddr/auth/superuser.rb
324
324
  - lib/ddr/auth/user.rb
325
325
  - lib/ddr/datastreams.rb
326
- - lib/ddr/datastreams/admin_metadata_datastream.rb
327
- - lib/ddr/datastreams/content_metadata_datastream.rb
326
+ - lib/ddr/datastreams/administrative_metadata_datastream.rb
328
327
  - lib/ddr/datastreams/datastream_behavior.rb
329
328
  - lib/ddr/datastreams/descriptive_metadata_datastream.rb
330
- - lib/ddr/datastreams/preservation_metadata_datastream.rb
329
+ - lib/ddr/datastreams/metadata_datastream.rb
331
330
  - lib/ddr/datastreams/properties_datastream.rb
331
+ - lib/ddr/datastreams/structural_metadata_datastream.rb
332
332
  - lib/ddr/events.rb
333
333
  - lib/ddr/events/creation_event.rb
334
+ - lib/ddr/events/deletion_event.rb
334
335
  - lib/ddr/events/event.rb
335
336
  - lib/ddr/events/fixity_check_event.rb
336
337
  - lib/ddr/events/ingestion_event.rb
337
338
  - lib/ddr/events/preservation_event_behavior.rb
338
- - lib/ddr/events/preservation_event_type.rb
339
339
  - lib/ddr/events/reindex_object_after_save.rb
340
340
  - lib/ddr/events/update_event.rb
341
341
  - lib/ddr/events/validation_event.rb
@@ -347,11 +347,7 @@ files:
347
347
  - lib/ddr/managers/role_manager.rb
348
348
  - lib/ddr/managers/workflow_manager.rb
349
349
  - lib/ddr/metadata.rb
350
- - lib/ddr/metadata/duke_terms.rb
351
350
  - lib/ddr/metadata/premis_event.rb
352
- - lib/ddr/metadata/rdf_vocabulary_parser.rb
353
- - lib/ddr/metadata/sources/duketerms.rdf.xml
354
- - lib/ddr/metadata/vocabulary.rb
355
351
  - lib/ddr/models.rb
356
352
  - lib/ddr/models/access_controllable.rb
357
353
  - lib/ddr/models/base.rb
@@ -366,8 +362,8 @@ files:
366
362
  - lib/ddr/models/has_attachments.rb
367
363
  - lib/ddr/models/has_children.rb
368
364
  - lib/ddr/models/has_content.rb
369
- - lib/ddr/models/has_content_metadata.rb
370
365
  - lib/ddr/models/has_properties.rb
366
+ - lib/ddr/models/has_struct_metadata.rb
371
367
  - lib/ddr/models/has_thumbnail.rb
372
368
  - lib/ddr/models/indexing.rb
373
369
  - lib/ddr/models/licensable.rb
@@ -377,7 +373,11 @@ files:
377
373
  - lib/ddr/utils.rb
378
374
  - lib/ddr/vocab.rb
379
375
  - lib/ddr/vocab/asset.rb
376
+ - lib/ddr/vocab/duke_terms.rb
377
+ - lib/ddr/vocab/rdf_vocabulary_parser.rb
380
378
  - lib/ddr/vocab/roles.rb
379
+ - lib/ddr/vocab/sources/duketerms.rdf.xml
380
+ - lib/ddr/vocab/vocabulary.rb
381
381
  - spec/controllers/application_controller_spec.rb
382
382
  - spec/controllers/users/sessions_controller_spec.rb
383
383
  - spec/dummy/README.rdoc
@@ -428,7 +428,6 @@ files:
428
428
  - spec/factories/target_factories.rb
429
429
  - spec/factories/test_model_factories.rb
430
430
  - spec/factories/user_factories.rb
431
- - spec/fixtures/contentMetadata.xml
432
431
  - spec/fixtures/image1.tiff
433
432
  - spec/fixtures/image2.tiff
434
433
  - spec/fixtures/image3.tiff
@@ -446,27 +445,23 @@ files:
446
445
  - spec/models/events_spec.rb
447
446
  - spec/models/file_management_spec.rb
448
447
  - spec/models/has_admin_metadata_spec.rb
448
+ - spec/models/has_struct_metadata_spec.rb
449
449
  - spec/models/item_spec.rb
450
- - spec/models/solr_document_spec.rb
451
450
  - spec/models/superuser_spec.rb
452
451
  - spec/models/target_spec.rb
453
452
  - spec/models/user_spec.rb
454
453
  - spec/routing/user_routing_spec.rb
455
454
  - spec/services/group_service_spec.rb
456
- - spec/services/remote_group_service_spec.rb
457
455
  - spec/spec_helper.rb
458
456
  - spec/support/shared_examples_for_access_controllables.rb
459
457
  - spec/support/shared_examples_for_associations.rb
460
458
  - spec/support/shared_examples_for_ddr_models.rb
461
459
  - spec/support/shared_examples_for_describables.rb
462
- - spec/support/shared_examples_for_event_loggables.rb
463
460
  - spec/support/shared_examples_for_events.rb
464
461
  - spec/support/shared_examples_for_governables.rb
465
462
  - spec/support/shared_examples_for_has_content.rb
466
- - spec/support/shared_examples_for_has_content_metadata.rb
467
463
  - spec/support/shared_examples_for_has_properties.rb
468
464
  - spec/support/shared_examples_for_indexing.rb
469
- - spec/support/shared_examples_for_licensable.rb
470
465
  homepage: https://github.com/duke-libraries/ddr-models
471
466
  licenses:
472
467
  - BSD-3-Clause
@@ -543,7 +538,6 @@ test_files:
543
538
  - spec/factories/target_factories.rb
544
539
  - spec/factories/test_model_factories.rb
545
540
  - spec/factories/user_factories.rb
546
- - spec/fixtures/contentMetadata.xml
547
541
  - spec/fixtures/image1.tiff
548
542
  - spec/fixtures/image2.tiff
549
543
  - spec/fixtures/image3.tiff
@@ -561,24 +555,20 @@ test_files:
561
555
  - spec/models/events_spec.rb
562
556
  - spec/models/file_management_spec.rb
563
557
  - spec/models/has_admin_metadata_spec.rb
558
+ - spec/models/has_struct_metadata_spec.rb
564
559
  - spec/models/item_spec.rb
565
- - spec/models/solr_document_spec.rb
566
560
  - spec/models/superuser_spec.rb
567
561
  - spec/models/target_spec.rb
568
562
  - spec/models/user_spec.rb
569
563
  - spec/routing/user_routing_spec.rb
570
564
  - spec/services/group_service_spec.rb
571
- - spec/services/remote_group_service_spec.rb
572
565
  - spec/spec_helper.rb
573
566
  - spec/support/shared_examples_for_access_controllables.rb
574
567
  - spec/support/shared_examples_for_associations.rb
575
568
  - spec/support/shared_examples_for_ddr_models.rb
576
569
  - spec/support/shared_examples_for_describables.rb
577
- - spec/support/shared_examples_for_event_loggables.rb
578
570
  - spec/support/shared_examples_for_events.rb
579
571
  - spec/support/shared_examples_for_governables.rb
580
572
  - spec/support/shared_examples_for_has_content.rb
581
- - spec/support/shared_examples_for_has_content_metadata.rb
582
573
  - spec/support/shared_examples_for_has_properties.rb
583
574
  - spec/support/shared_examples_for_indexing.rb
584
- - spec/support/shared_examples_for_licensable.rb
@@ -1,147 +0,0 @@
1
- module Ddr
2
- module Datastreams
3
- class ContentMetadataDatastream < ActiveFedora::Datastream
4
-
5
- def parse
6
- parsed = []
7
- cm = Nokogiri::XML(self.content)
8
- fileSec_nodes = cm.xpath("//xmlns:fileSec")
9
- structMap_nodes = cm.xpath("//xmlns:structMap").sort{ |x,y| sort_nodes(x, y) }
10
- structMap_nodes.each do |structMap_node|
11
- structMap_hash = {}
12
- div_nodes = structMap_node.xpath("xmlns:div").sort{ |x,y| sort_nodes(x,y) }
13
- div_array = []
14
- div_nodes.each do |div_node|
15
- div_array << parse_div(fileSec_nodes, div_node)
16
- end
17
- structMap_hash["div"] = div_array
18
- parsed << structMap_hash
19
- end
20
- return parsed
21
- end
22
-
23
- def to_solr(solr_doc=Hash.new)
24
- solr_doc = super(solr_doc)
25
- if self.content
26
- solr_doc.merge!({Ddr::IndexFields::CONTENT_METADATA_PARSED => parse.to_json})
27
- end
28
- solr_doc
29
- end
30
-
31
- def first_pid
32
- find_first_pid(parse.first)
33
- end
34
-
35
- private
36
-
37
- def find_first_pid(structure)
38
- case
39
- when structure.has_key?("div")
40
- find_first_pid(structure["div"].first)
41
- when structure.has_key?("pids")
42
- structure["pids"].first["pid"]
43
- end
44
- end
45
-
46
- def walk_structure_to_pid(structure)
47
- if structure.has_key("div")
48
- walk_structure_div(structure["div"])
49
- else
50
- end
51
-
52
- end
53
-
54
- def parse_div(fileSec_nodes, div_node)
55
- div_hash = {}
56
- div_hash["label"] = div_node["LABEL"] unless div_node["LABEL"].nil?
57
- div_hash["orderlabel"] = div_node["ORDERLABEL"] unless div_node["ORDERLABEL"].nil?
58
- div_hash["type"] = div_node["TYPE"] unless div_node["TYPE"].nil?
59
- div_subnodes = div_node.xpath("xmlns:div").sort{ |x,y| sort_nodes(x, y) }
60
- if div_subnodes.empty?
61
- fptr_nodes = div_node.xpath("xmlns:fptr")
62
- fptr_array = []
63
- fptr_nodes.each do |fptr_node|
64
- fptr_hash = {}
65
- if !fptr_node["FILEID"].nil?
66
- pid = get_pid(fileSec_nodes, fptr_node["FILEID"])
67
- file_use = get_use(fileSec_nodes, fptr_node["FILEID"])
68
- fptr_hash["pid"] = pid unless pid.nil?
69
- fptr_hash["use"] = file_use unless file_use.nil?
70
- end
71
- fptr_array << fptr_hash
72
- end
73
- div_hash["pids"] = fptr_array
74
- else
75
- div_array = []
76
- div_subnodes.each do |div_subnode|
77
- div_array << parse_div(fileSec_nodes, div_subnode)
78
- end
79
- div_hash["div"] = div_array
80
- end
81
- return div_hash
82
- end
83
-
84
- def get_use(fileSec_nodes, file_id)
85
- file_nodes = fileSec_nodes.xpath("//xmlns:file[@ID='#{file_id}']")
86
- file_node =
87
- case file_nodes.size
88
- when 1
89
- file_nodes.first
90
- when 0
91
- raise "Matching file node not found"
92
- else
93
- raise "Multiple matching file nodes found"
94
- end
95
- return find_use(file_node)
96
- end
97
-
98
- def find_use(node)
99
- file_use = nil
100
- if node["USE"].nil?
101
- file_use = find_use(node.parent) unless node.name.eql?("fileGrp")
102
- else
103
- file_use = node["USE"]
104
- end
105
- return file_use
106
- end
107
-
108
- def get_pid(fileSec_nodes, file_id)
109
- file_nodes = fileSec_nodes.xpath("//xmlns:file[@ID='#{file_id}']")
110
- file_node =
111
- case file_nodes.size
112
- when 1
113
- file_nodes.first
114
- when 0
115
- raise "Matching file node not found"
116
- else
117
- raise "Multiple matching file nodes found"
118
- end
119
- fLocat_nodes = file_node.xpath("xmlns:FLocat")
120
- fLocat_node =
121
- case fLocat_nodes.size
122
- when 1
123
- fLocat_nodes.first
124
- when 0
125
- raise "FLocat node not found"
126
- else
127
- raise "Multiple FLocat nodes found"
128
- end
129
- href = fLocat_node["xlink:href"]
130
- pid = href.split('/')[0]
131
- end
132
-
133
- def sort_nodes(node_1, node_2)
134
- if node_1["ORDER"].nil? && node_2["ORDER"].nil?
135
- return 0
136
- elsif node_1["ORDER"].nil?
137
- return 1
138
- elsif node_2["ORDER"].nil?
139
- return -1
140
- else
141
- return node_1["ORDER"].to_i <=> node_2["ORDER"].to_i
142
- end
143
- end
144
-
145
- end
146
- end
147
- end