Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move PublishedRelationshipsFilter from dor-services
- Loading branch information
Showing
3 changed files
with
98 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# frozen_string_literal: true | ||
|
||
# Show the relationships that are publically available | ||
# removes things like hydra:isGovernedBy and fedora-model:hasModel | ||
class PublishedRelationshipsFilter | ||
INCLUDE_ELEMENTS = ['fedora:isMemberOf', 'fedora:isMemberOfCollection', 'fedora:isConstituentOf'].freeze | ||
NAMESPACE = { 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' }.freeze | ||
|
||
# @param [Dor::Abstract] object | ||
def initialize(object) | ||
@obj = object | ||
end | ||
|
||
def xml | ||
relationships_ng_xml do |rels_doc| | ||
statements(rels_doc).each do |rel| | ||
next if keep?(rel.namespace.prefix, rel.name) | ||
|
||
rel.next_sibling.remove if rel.next_sibling.content.strip.empty? | ||
rel.remove | ||
end | ||
end | ||
end | ||
|
||
private | ||
|
||
attr_reader :obj | ||
|
||
def statements(rels_doc) | ||
rels_doc.xpath('/rdf:RDF/rdf:Description/*', NAMESPACE) | ||
end | ||
|
||
def keep?(prefix, name) | ||
INCLUDE_ELEMENTS.include?([prefix, name].join(':')) | ||
end | ||
|
||
# This creates a duplicate of RELS-EXT and yields it to the block | ||
def relationships_ng_xml | ||
duplicate_rels_ext.tap do |ng_xml| | ||
yield(ng_xml) | ||
end | ||
end | ||
|
||
def duplicate_rels_ext | ||
Nokogiri::XML(obj.datastreams['RELS-EXT'].content) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper' | ||
|
||
RSpec.describe PublishedRelationshipsFilter do | ||
subject(:service) { described_class.new(obj) } | ||
|
||
let(:obj) { instantiate_fixture('druid:ab123cd4567', Dor::Item) } | ||
|
||
describe '#xml' do | ||
subject(:doc) { service.xml } | ||
|
||
context 'with isMemberOfCollection and isConstituentOf relationships' do | ||
let(:relationships) do | ||
<<~EOXML | ||
<rdf:RDF xmlns:fedora-model="info:fedora/fedora-system:def/model#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:fedora="info:fedora/fedora-system:def/relations-external#" xmlns:hydra="http://projecthydra.org/ns/relations#"> | ||
<rdf:Description rdf:about="info:fedora/druid:ab123cd4567"> | ||
<hydra:isGovernedBy rdf:resource="info:fedora/druid:789012"></hydra:isGovernedBy> | ||
<fedora-model:hasModel rdf:resource="info:fedora/hydra:commonMetadata"></fedora-model:hasModel> | ||
<fedora:isMemberOf rdf:resource="info:fedora/druid:xh235dd9059"></fedora:isMemberOf> | ||
<fedora:isMemberOfCollection rdf:resource="info:fedora/druid:xh235dd9059"></fedora:isMemberOfCollection> | ||
<fedora:isConstituentOf rdf:resource="info:fedora/druid:hj097bm8879"></fedora:isConstituentOf> | ||
</rdf:Description> | ||
</rdf:RDF> | ||
EOXML | ||
end | ||
|
||
before do | ||
ActiveFedora::RelsExtDatastream.from_xml(relationships, obj.rels_ext) | ||
# Needed to generate the Datastream#content | ||
obj.object_relations.dirty = true | ||
obj.rels_ext.serialize! | ||
end | ||
|
||
it 'discards the non-allowed relations' do | ||
expect(doc).to be_equivalent_to <<~XML | ||
<?xml version="1.0"?> | ||
<rdf:RDF xmlns:fedora-model="info:fedora/fedora-system:def/model#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:fedora="info:fedora/fedora-system:def/relations-external#" xmlns:hydra="http://projecthydra.org/ns/relations#"> | ||
<rdf:Description rdf:about="info:fedora/druid:ab123cd4567"> | ||
<fedora:isMemberOf rdf:resource="info:fedora/druid:xh235dd9059"/> | ||
<fedora:isMemberOfCollection rdf:resource="info:fedora/druid:xh235dd9059"/> | ||
<fedora:isConstituentOf rdf:resource="info:fedora/druid:hj097bm8879"/> | ||
</rdf:Description> | ||
</rdf:RDF> | ||
XML | ||
end | ||
end | ||
end | ||
end |