Skip to content

Commit

Permalink
Add manifest_metadata method into ManifestEnabledWorkShowPresenter to
Browse files Browse the repository at this point in the history
support adding metadata into the IIIF manifest
  • Loading branch information
Julie Allinson committed Oct 2, 2017
1 parent 9bdc698 commit e4eaebf
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 25 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ gem 'zk'
gem 'mods', '~> 2.1'
gem 'riiif', '~> 1.1'

gem 'iiif_manifest', '~> 0.2.0'
gem 'iiif_manifest', '~> 0.3.0'

group :aws, :test do
gem 'carrierwave-aws'
Expand Down
4 changes: 2 additions & 2 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ GEM
activesupport (>= 3.2.18)
faraday (>= 0.9)
json
iiif_manifest (0.2.0)
iiif_manifest (0.3.0)
activesupport (>= 4)
iiif-presentation (~> 0.2.0)
inflecto (0.0.2)
Expand Down Expand Up @@ -898,7 +898,7 @@ DEPENDENCIES
hyrax!
i18n-debug
i18n-tasks
iiif_manifest (~> 0.2.0)
iiif_manifest (~> 0.3.0)
is_it_working
jbuilder (~> 2.5)
jquery-rails
Expand Down
68 changes: 49 additions & 19 deletions app/presenters/hyku/manifest_enabled_work_show_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,31 @@ def manifest_url
manifest_helper.polymorphic_url([:manifest, self])
end

# Hash to populate IIIF manifest with extras. Currently only sequence rendering is implemented.
# IIIF rendering linking property for inclusion in the manifest
#
# @return [Hash] hash including sequence_rendering
def manifest_extras
{
sequence_rendering: sequence_rendering
}
# @return [Array] array of rendering hashes
def sequence_rendering
renderings = []
if solr_document.rendering_ids.present?
solr_document.rendering_ids.each do |file_set_id|
renderings << build_rendering(file_set_id)
end
end
renderings.flatten
end

# IIIF metadata for inclusion in the manifest
#
# @return [Array] array of metadata hashes
def manifest_metadata
metadata = []
metadata_fields.each do |field|
metadata << {
'label' => field.to_s.humanize.capitalize,
'value' => get_metadata_value(field)
}
end
metadata
end

private
Expand All @@ -23,19 +41,6 @@ def manifest_helper
@manifest_helper ||= ManifestHelper.new(request.base_url)
end

# IIIF rendering linking property for inclusion in the manifest
#
# @return [Array] array of rendering hashes
def sequence_rendering
renderings = []
if solr_document.rendering_ids.present?
solr_document.rendering_ids.each do |file_set_id|
renderings << build_rendering(file_set_id)
end
end
renderings.flatten
end

# Build a rendering hash
#
# @return [Hash] rendering
Expand All @@ -58,5 +63,30 @@ def query_for_rendering(file_set_id)
fl: [ActiveFedora.id_field, 'label_ssi', 'mime_type_ssi'],
rows: 1)
end

# Retrieve the required fields from the Form class. Derive the Form class name from the Model name.
# The class should exist, but it may not if different amespaces are being used.
# If it does not exist, rescue and return an empty Array.
#
# @return [Array] required fields
def metadata_fields
ns = "Hyrax"
model = solr_document['has_model_ssim'].first

"#{ns}::#{model}Form".constantize.required_fields
rescue
[]
end

# Get the metadata value; return a String for single values and an Array of hashes for multiple values.
#
# @return [String or Array] field value(s)
def get_metadata_value(field)
if send(field).count == 1
send(field).first
else
send(field).collect { |f| f }
end
end
end
end
2 changes: 2 additions & 0 deletions config/solr_wrapper_test.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Place any default configuration for solr_wrapper here
port: 8985
# TODO: Relax this when we're Solr 7-compliant
version: 6.6.1
collection:
dir: solr/config/
name: hydra-test
Expand Down
31 changes: 28 additions & 3 deletions spec/presenters/hyku/manifest_enabled_work_show_presenter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@

describe "#manifest_url" do
subject { presenter.manifest_url }

let(:document) { { "has_model_ssim" => ['GenericWork'], 'id' => '99' } }

it { is_expected.to eq 'http://test.host/concern/generic_works/99/manifest' }
end

Expand All @@ -25,9 +27,9 @@
end
end

describe "manifest_extras" do
describe "#sequence rendering" do
subject do
presenter.manifest_extras
presenter.sequence_rendering
end

before do
Expand All @@ -37,7 +39,30 @@

it "returns a hash containing the rendering information" do
work.rendering_ids = [work.file_sets.first.id]
expect(subject).to include(:sequence_rendering)
expect(subject).to be_an Array
end
end

describe "#manifest metadata" do
subject do
presenter.manifest_metadata
end

context do
it "returns a hash containing the metadata with a single value" do
expect(subject).to be_a Array
expect(subject[0]['value']).to eq 'Test title'
end
end

context do
before do
work.title = ['Test title', 'Another test title']
end

it "returns an array of metadata values" do
expect(subject[0]['value']).to include('Test title', 'Another test title')
end
end
end
end

0 comments on commit e4eaebf

Please sign in to comment.