Skip to content

Commit

Permalink
Merge pull request #882 from pulibrary/start_canvas
Browse files Browse the repository at this point in the history
Add Start Canvas
  • Loading branch information
sdellis committed Mar 8, 2018
2 parents ec40548 + d3cd4ad commit 3155d36
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 2 deletions.
10 changes: 9 additions & 1 deletion app/services/manifest_builder/manifest_service_locator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ def record_property_builder
ManifestBuilder::RecordPropertyBuilder
end

def start_canvas_builder
IIIFManifest::ManifestServiceLocator::InjectedFactory.new(
::ManifestBuilder::StartCanvasBuilder,
canvas_builder: canvas_builder
)
end

##
# Objects are either in 'manifests' or 'collections' depending on if the
# child resource is a IIIF::Manifest or a IIIF::Collection. This special
Expand Down Expand Up @@ -109,7 +116,8 @@ def sequence_builder
IIIFManifest::ManifestServiceLocator::InjectedFactory.new(
::ManifestBuilder::SequenceBuilder, # This whole method is overridden just for this constant.
canvas_builder_factory: canvas_builder_factory,
sequence_factory: sequence_factory
sequence_factory: sequence_factory,
start_canvas_builder: start_canvas_builder
)
end

Expand Down
7 changes: 7 additions & 0 deletions app/services/manifest_builder/sequence_builder.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
# frozen_string_literal: true
class ManifestBuilder
class SequenceBuilder < IIIFManifest::ManifestBuilder::SequenceBuilder
attr_reader :start_canvas_builder
def initialize(work, canvas_builder_factory:, sequence_factory:, start_canvas_builder:)
super(work, canvas_builder_factory: canvas_builder_factory, sequence_factory: sequence_factory)
@start_canvas_builder = start_canvas_builder
end

def apply(manifest)
sequence["viewingHint"] = manifest["viewingHint"]
start_canvas_builder.new(work).apply(sequence)
super
end
end
Expand Down
38 changes: 38 additions & 0 deletions app/services/manifest_builder/start_canvas_builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# frozen_string_literal: true
class ManifestBuilder
class StartCanvasBuilder
attr_reader :resource, :canvas_builder

# @param [Valhalla::Resource] resource the Resource being viewed
def initialize(resource, canvas_builder:)
@resource = resource
@canvas_builder = canvas_builder
end

def apply(manifest)
return manifest unless start_canvas_id && file_set
manifest['startCanvas'] = path
manifest
end

private

def path
canvas_builder.new(file_set, resource).path
end

def file_set
@file_set ||= query_service.find_by(id: start_canvas_id)
rescue Valkyrie::Persistence::ObjectNotFoundError
nil
end

def query_service
Valkyrie.config.metadata_adapter.query_service
end

def start_canvas_id
Array.wrap(resource.resource.try(:start_canvas)).first
end
end
end
13 changes: 12 additions & 1 deletion spec/services/manifest_builder_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
let(:metadata_adapter) { Valkyrie.config.metadata_adapter }
let(:query_service) { metadata_adapter.query_service }
let(:file) { fixture_file_upload('files/example.tif', 'image/tiff') }
let(:start_canvas) { nil }

def logical_structure(file_set_id)
[
Expand Down Expand Up @@ -61,7 +62,7 @@ def logical_structure(file_set_id)
file_set.local_identifier = "p79409x97p"
metadata_adapter.persister.save(resource: file_set)
change_set = ScannedResourceChangeSet.new(output)
change_set.validate(logical_structure: logical_structure(file_set_id))
change_set.validate(logical_structure: logical_structure(file_set_id), start_canvas: start_canvas || file_set_id)
change_set.sync
change_set_persister.save(change_set: change_set)
end
Expand Down Expand Up @@ -92,6 +93,7 @@ def logical_structure(file_set_id)
expect(output["thumbnail"]).not_to be_blank
expect(output["thumbnail"]["@id"]).to eq "#{first_image['resource']['service']['@id']}/full/!200,150/0/default.jpg"
expect(output["thumbnail"]["service"]["@id"]).to eq first_image["resource"]["service"]["@id"]
expect(output["sequences"][0]["startCanvas"]).to eq canvas_id
end

context "when there's no derivative_file" do
Expand Down Expand Up @@ -129,6 +131,15 @@ def logical_structure(file_set_id)
end
end

context "when a start_canvas doesn't exist" do
let(:start_canvas) { Valkyrie::ID.new("blablabla") }
it "doesn't set a startCanvas" do
output = manifest_builder.build
first_sequence = output["sequences"][0]
expect(first_sequence["startCanvas"]).to be_nil
end
end

context "when in staging" do
it "generates cantaloupe links" do
allow(Rails.env).to receive(:development?).and_return(false)
Expand Down

0 comments on commit 3155d36

Please sign in to comment.