diff --git a/.rubocop.yml b/.rubocop.yml index 11c062b..747ae6f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -14,6 +14,7 @@ Metrics/BlockLength: Naming/MethodName: Exclude: - 'lib/iiif_manifest/manifest_builder/iiif_service.rb' + - 'lib/iiif_manifest/v3/manifest_builder/iiif_service.rb' RSpec/MultipleExpectations: Enabled: false diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 3452718..1631598 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -11,6 +11,8 @@ Metrics/AbcSize: Exclude: - 'lib/iiif_manifest/manifest_builder/resource_builder.rb' - 'lib/iiif_manifest/manifest_factory.rb' + - 'lib/iiif_manifest/v3/manifest_builder/resource_builder.rb' + - 'lib/iiif_manifest/v3/manifest_factory.rb' # Offense count: 1 # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. @@ -41,6 +43,7 @@ RSpec/VerifiedDoubles: RSpec/ExampleLength: Exclude: - 'spec/lib/iiif_manifest/manifest_factory_spec.rb' + - 'spec/lib/iiif_manifest/v3/manifest_factory_spec.rb' # Offense count: 20 Style/Documentation: @@ -66,7 +69,18 @@ Style/Documentation: - 'lib/iiif_manifest/manifest_service_locator.rb' - 'lib/iiif_manifest.rb' - 'lib/iiif_manifest/manifest_builder/iiif_service.rb' + - 'lib/iiif_manifest/v3.rb' + - 'lib/iiif_manifest/v3/manifest_factory.rb' + - 'lib/iiif_manifest/v3/manifest_builder/structure_builder.rb' + - 'lib/iiif_manifest/v3/manifest_builder/iiif_service.rb' + - 'lib/iiif_manifest/v3/manifest_builder/canvas_builder.rb' + - 'lib/iiif_manifest/v3/manifest_builder/image_builder.rb' + - 'lib/iiif_manifest/v3/manifest_builder/resource_builder.rb' + - 'lib/iiif_manifest/v3/manifest_builder/record_property_builder.rb' + - 'lib/iiif_manifest/v3/manifest_builder.rb' + - 'lib/iiif_manifest/v3/manifest_service_locator.rb' - 'spec/lib/iiif_manifest/manifest_factory_spec.rb' + - 'spec/lib/iiif_manifest/v3/manifest_factory_spec.rb' # Offense count: 1 Style/MethodMissing: diff --git a/lib/iiif_manifest/v3.rb b/lib/iiif_manifest/v3.rb index 0513d75..c0dfebf 100644 --- a/lib/iiif_manifest/v3.rb +++ b/lib/iiif_manifest/v3.rb @@ -2,9 +2,11 @@ require 'active_support/core_ext/module' require 'active_support/core_ext/object' -module IIIFManifest::V3 - extend ActiveSupport::Autoload - autoload :ManifestBuilder - autoload :ManifestFactory - autoload :ManifestServiceLocator +module IIIFManifest + module V3 + extend ActiveSupport::Autoload + autoload :ManifestBuilder + autoload :ManifestFactory + autoload :ManifestServiceLocator + end end diff --git a/lib/iiif_manifest/v3/manifest_builder.rb b/lib/iiif_manifest/v3/manifest_builder.rb index 6f88632..f31bead 100644 --- a/lib/iiif_manifest/v3/manifest_builder.rb +++ b/lib/iiif_manifest/v3/manifest_builder.rb @@ -5,31 +5,33 @@ require_relative 'manifest_builder/resource_builder' require_relative 'manifest_builder/structure_builder' -module IIIFManifest::V3 - class ManifestBuilder - attr_reader :work, - :builders, - :top_record_factory - def initialize(work, builders:, top_record_factory:) - @work = work - @builders = builders - @top_record_factory = top_record_factory - end +module IIIFManifest + module V3 + class ManifestBuilder + attr_reader :work, + :builders, + :top_record_factory + def initialize(work, builders:, top_record_factory:) + @work = work + @builders = builders + @top_record_factory = top_record_factory + end - def apply(collection) - collection['manifests'] ||= [] - collection['manifests'] << to_h - collection - end + def apply(collection) + collection['manifests'] ||= [] + collection['manifests'] << to_h + collection + end - def to_h - @to_h ||= builders.new(work).apply(top_record) - end + def to_h + @to_h ||= builders.new(work).apply(top_record) + end - private + private - def top_record - top_record_factory.new + def top_record + top_record_factory.new + end end end end diff --git a/lib/iiif_manifest/v3/manifest_builder/canvas_builder.rb b/lib/iiif_manifest/v3/manifest_builder/canvas_builder.rb index f51bcf3..9d34314 100644 --- a/lib/iiif_manifest/v3/manifest_builder/canvas_builder.rb +++ b/lib/iiif_manifest/v3/manifest_builder/canvas_builder.rb @@ -1,16 +1,18 @@ -module IIIFManifest::V3 - class ManifestBuilder - class CanvasBuilder < ::IIIFManifest::ManifestBuilder::CanvasBuilder - def apply(items) - return items if canvas.items.blank? - items << canvas - end +module IIIFManifest + module V3 + class ManifestBuilder + class CanvasBuilder < ::IIIFManifest::ManifestBuilder::CanvasBuilder + def apply(items) + return items if canvas.items.blank? + items << canvas + end - private + private - def apply_record_properties - canvas['id'] = path - canvas.label = record.to_s + def apply_record_properties + canvas['id'] = path + canvas.label = record.to_s + end end end end diff --git a/lib/iiif_manifest/v3/manifest_builder/iiif_service.rb b/lib/iiif_manifest/v3/manifest_builder/iiif_service.rb index 2fa7160..5c2f815 100644 --- a/lib/iiif_manifest/v3/manifest_builder/iiif_service.rb +++ b/lib/iiif_manifest/v3/manifest_builder/iiif_service.rb @@ -1,101 +1,35 @@ -module IIIFManifest::V3 - class ManifestBuilder - class IIIFService < IIIFManifest::ManifestBuilder::IIIFService - end - - class IIIFManifest < IIIFService - def label - inner_hash['label'] +module IIIFManifest + module V3 + class ManifestBuilder + class IIIFService < IIIFManifest::ManifestBuilder::IIIFService end - def label=(label) - inner_hash['label'] = label - end - - def summary=(summary) - return unless summary.present? - inner_hash['summary'] = summary - end - - def behavior=(behavior) - return unless behavior.present? - inner_hash['behavior'] = behavior - end - - def viewing_direction=(viewing_direction) - return unless viewing_direction.present? - inner_hash['viewingDirection'] = viewing_direction - end - - def viewingDirection - inner_hash['viewingDirection'] - end - - def items - inner_hash['items'] ||= [] - end - - def items=(items) - inner_hash['items'] = items - end - - def metadata=(metadata) - inner_hash['metadata'] = metadata - end - - def service - inner_hash['service'] || [] - end - - def service=(service) - inner_hash['service'] = service - end - - def see_also=(see_also) - inner_hash['seeAlso'] = see_also - end - - def rendering=(rendering) - inner_hash['rendering'] = rendering - end + class IIIFManifest < IIIFService + def label + inner_hash['label'] + end - def rights=(rights) - inner_hash['rights'] = rights - end + def label=(label) + inner_hash['label'] = label + end - def initial_attributes - { - '@context' => [ - "http://www.w3.org/ns/anno.jsonld", - "http://iiif.io/api/presentation/3/context.json" - ], - 'type' => 'Manifest' - } - end + def summary=(summary) + return unless summary.present? + inner_hash['summary'] = summary + end - class Collection < IIIFManifest - def initial_attributes - { - '@context' => [ - "http://www.w3.org/ns/anno.jsonld", - "http://iiif.io/api/presentation/3/context.json" - ], - 'type' => 'Collection' - } + def behavior=(behavior) + return unless behavior.present? + inner_hash['behavior'] = behavior end def viewing_direction=(viewing_direction) - raise NotImplementedError + return unless viewing_direction.present? + inner_hash['viewingDirection'] = viewing_direction end def viewingDirection - raise NotImplementedError - end - end - - class Canvas < IIIFService - def label=(label) - inner_hash['label'] = label + inner_hash['viewingDirection'] end def items @@ -106,81 +40,149 @@ def items=(items) inner_hash['items'] = items end - def initial_attributes - { - 'type' => 'Canvas' - } + def metadata=(metadata) + inner_hash['metadata'] = metadata end - end - class Range < IIIFService - def initial_attributes - { - 'type' => 'Range' - } + def service + inner_hash['service'] || [] end - end - class Resource < IIIFService def service=(service) inner_hash['service'] = service end - def initial_attributes - { - } + def see_also=(see_also) + inner_hash['seeAlso'] = see_also end - end - class Annotation < IIIFService - def body=(body) - inner_hash['body'] = body + def rendering=(rendering) + inner_hash['rendering'] = rendering end - def body - inner_hash['body'] + def rights=(rights) + inner_hash['rights'] = rights end def initial_attributes { - 'type' => 'Annotation', - 'motivation' => 'painting' - } - end - end - - class SearchService < IIIFService - def service=(service) - inner_hash['service'] = service - end - - def search_service=(search_service) - inner_hash['id'] = search_service - end - - def initial_attributes - { - '@context' => 'http://iiif.io/api/search/1/context.json', - 'profile' => 'http://iiif.io/api/search/1/search', - 'label' => 'Search within this manifest' + '@context' => [ + 'http://www.w3.org/ns/anno.jsonld', + 'http://iiif.io/api/presentation/3/context.json' + ], + 'type' => 'Manifest' } end - end - class AutocompleteService < IIIFService - def autocomplete_service - inner_hash['id'] - end - - def autocomplete_service=(autocomplete_service) - inner_hash['id'] = autocomplete_service - end - - def initial_attributes - { - 'profile' => 'http://iiif.io/api/search/1/autocomplete', - 'label' => 'Get suggested words in this manifest' - } + class Collection < IIIFManifest + def initial_attributes + { + '@context' => [ + 'http://www.w3.org/ns/anno.jsonld', + 'http://iiif.io/api/presentation/3/context.json' + ], + 'type' => 'Collection' + } + end + + def viewing_direction=(_viewing_direction) + raise NotImplementedError + end + + def viewingDirection + raise NotImplementedError + end + end + + class Canvas < IIIFService + def label=(label) + inner_hash['label'] = label + end + + def items + inner_hash['items'] ||= [] + end + + def items=(items) + inner_hash['items'] = items + end + + def initial_attributes + { + 'type' => 'Canvas' + } + end + end + + class Range < IIIFService + def initial_attributes + { + 'type' => 'Range' + } + end + end + + class Resource < IIIFService + def service=(service) + inner_hash['service'] = service + end + + def initial_attributes + { + } + end + end + + class Annotation < IIIFService + def body=(body) + inner_hash['body'] = body + end + + def body + inner_hash['body'] + end + + def initial_attributes + { + 'type' => 'Annotation', + 'motivation' => 'painting' + } + end + end + + class SearchService < IIIFService + def service=(service) + inner_hash['service'] = service + end + + def search_service=(search_service) + inner_hash['id'] = search_service + end + + def initial_attributes + { + '@context' => 'http://iiif.io/api/search/1/context.json', + 'profile' => 'http://iiif.io/api/search/1/search', + 'label' => 'Search within this manifest' + } + end + end + + class AutocompleteService < IIIFService + def autocomplete_service + inner_hash['id'] + end + + def autocomplete_service=(autocomplete_service) + inner_hash['id'] = autocomplete_service + end + + def initial_attributes + { + 'profile' => 'http://iiif.io/api/search/1/autocomplete', + 'label' => 'Get suggested words in this manifest' + } + end end end end diff --git a/lib/iiif_manifest/v3/manifest_builder/image_builder.rb b/lib/iiif_manifest/v3/manifest_builder/image_builder.rb index d62cc03..58406cf 100644 --- a/lib/iiif_manifest/v3/manifest_builder/image_builder.rb +++ b/lib/iiif_manifest/v3/manifest_builder/image_builder.rb @@ -1,11 +1,13 @@ -module IIIFManifest::V3 - class ManifestBuilder - class ImageBuilder < ::IIIFManifest::ManifestBuilder::ImageBuilder - def apply(canvas) - annotation['target'] = canvas['id'] - canvas['width'] = annotation.body['width'] - canvas['height'] = annotation.body['height'] - canvas.items += [annotation] +module IIIFManifest + module V3 + class ManifestBuilder + class ImageBuilder < ::IIIFManifest::ManifestBuilder::ImageBuilder + def apply(canvas) + annotation['target'] = canvas['id'] + canvas['width'] = annotation.body['width'] + canvas['height'] = annotation.body['height'] + canvas.items += [annotation] + end end end end diff --git a/lib/iiif_manifest/v3/manifest_builder/record_property_builder.rb b/lib/iiif_manifest/v3/manifest_builder/record_property_builder.rb index 645417e..37c3a80 100644 --- a/lib/iiif_manifest/v3/manifest_builder/record_property_builder.rb +++ b/lib/iiif_manifest/v3/manifest_builder/record_property_builder.rb @@ -1,44 +1,51 @@ -module IIIFManifest::V3 - class ManifestBuilder - class RecordPropertyBuilder < ::IIIFManifest::ManifestBuilder::RecordPropertyBuilder - attr_reader :canvas_builder_factory - def initialize(record, iiif_search_service_factory:, iiif_autocomplete_service_factory:, canvas_builder_factory:) - super(record, iiif_search_service_factory: iiif_search_service_factory, iiif_autocomplete_service_factory: iiif_autocomplete_service_factory) - @canvas_builder_factory = canvas_builder_factory - end +module IIIFManifest + module V3 + class ManifestBuilder + class RecordPropertyBuilder < ::IIIFManifest::ManifestBuilder::RecordPropertyBuilder + attr_reader :canvas_builder_factory + def initialize(record, + iiif_search_service_factory:, + iiif_autocomplete_service_factory:, + canvas_builder_factory:) + super(record, + iiif_search_service_factory: iiif_search_service_factory, + iiif_autocomplete_service_factory: iiif_autocomplete_service_factory) + @canvas_builder_factory = canvas_builder_factory + end - # rubocop:disable Metrics/AbcSize - def apply(manifest) - manifest['id'] = record.manifest_url.to_s - manifest.label = record.to_s - manifest.summary = record.description - manifest.behavior = viewing_hint if viewing_hint.present? - manifest.viewing_direction = viewing_direction if viewing_direction.present? - manifest.metadata = record.manifest_metadata if valid_metadata? - manifest.service = services if search_service.present? - manifest.rendering = populate_rendering - # Build the items array - canvas_builder.apply(manifest.items) - manifest - end - # rubocop:enable Metrics/AbcSize + # rubocop:disable Metrics/AbcSize + def apply(manifest) + manifest['id'] = record.manifest_url.to_s + manifest.label = record.to_s + manifest.summary = record.description + manifest.behavior = viewing_hint if viewing_hint.present? + manifest.viewing_direction = viewing_direction if viewing_direction.present? + manifest.metadata = record.manifest_metadata if valid_metadata? + manifest.service = services if search_service.present? + manifest.rendering = populate_rendering + # Build the items array + canvas_builder.apply(manifest.items) + manifest + end + # rubocop:enable Metrics/AbcSize - def populate_rendering - if record.respond_to?(:sequence_rendering) - record.sequence_rendering.collect do |rendering| - sequence_rendering = rendering.to_h.except('@id') - sequence_rendering['id'] = rendering['@id'] - sequence_rendering + def populate_rendering + if record.respond_to?(:sequence_rendering) + record.sequence_rendering.collect do |rendering| + sequence_rendering = rendering.to_h.except('@id') + sequence_rendering['id'] = rendering['@id'] + sequence_rendering + end + else + [] end - else - [] end - end - private + private - def canvas_builder - canvas_builder_factory.from(record) + def canvas_builder + canvas_builder_factory.from(record) + end end end end diff --git a/lib/iiif_manifest/v3/manifest_builder/resource_builder.rb b/lib/iiif_manifest/v3/manifest_builder/resource_builder.rb index 72b19e8..ba9db3c 100644 --- a/lib/iiif_manifest/v3/manifest_builder/resource_builder.rb +++ b/lib/iiif_manifest/v3/manifest_builder/resource_builder.rb @@ -1,14 +1,16 @@ -module IIIFManifest::V3 - class ManifestBuilder - class ResourceBuilder < ::IIIFManifest::ManifestBuilder::ResourceBuilder - def apply(annotation) - resource['id'] = display_image.url - resource['type'] = 'Image' - resource['height'] = display_image.height - resource['width'] = display_image.width - resource['format'] = display_image.format if display_image.format - image_service_builder.apply(resource) if iiif_endpoint - annotation.body = resource +module IIIFManifest + module V3 + class ManifestBuilder + class ResourceBuilder < ::IIIFManifest::ManifestBuilder::ResourceBuilder + def apply(annotation) + resource['id'] = display_image.url + resource['type'] = 'Image' + resource['height'] = display_image.height + resource['width'] = display_image.width + resource['format'] = display_image.format if display_image.format + image_service_builder.apply(resource) if iiif_endpoint + annotation.body = resource + end end end end diff --git a/lib/iiif_manifest/v3/manifest_builder/structure_builder.rb b/lib/iiif_manifest/v3/manifest_builder/structure_builder.rb index 7119c2f..ff8145c 100644 --- a/lib/iiif_manifest/v3/manifest_builder/structure_builder.rb +++ b/lib/iiif_manifest/v3/manifest_builder/structure_builder.rb @@ -1,41 +1,43 @@ -module IIIFManifest::V3 - class ManifestBuilder - class StructureBuilder < ::IIIFManifest::ManifestBuilder::StructureBuilder - def range_builder(top_range) - RangeBuilder.new( - top_range, - record, true, - canvas_builder_factory: canvas_builder_factory, - iiif_range_factory: iiif_range_factory - ) - end - end - class RangeBuilder < ::IIIFManifest::ManifestBuilder::RangeBuilder - def apply(manifest) - manifest << range - sub_ranges.map do |sub_range| - sub_range.apply(range['items']) - end - manifest - end - - def build_range - range['id'] = path - range['label'] = record.label - range['behavior'] = 'top' if top? - range['items'] = canvas_builders.collect {|cb| { 'id' => cb.path, 'type' => 'Canvas' } } - end - - def sub_ranges - @sub_ranges ||= record.ranges.map do |sub_range| +module IIIFManifest + module V3 + class ManifestBuilder + class StructureBuilder < ::IIIFManifest::ManifestBuilder::StructureBuilder + def range_builder(top_range) RangeBuilder.new( - sub_range, - parent, + top_range, + record, true, canvas_builder_factory: canvas_builder_factory, iiif_range_factory: iiif_range_factory ) end end + class RangeBuilder < ::IIIFManifest::ManifestBuilder::RangeBuilder + def apply(manifest) + manifest << range + sub_ranges.map do |sub_range| + sub_range.apply(range['items']) + end + manifest + end + + def build_range + range['id'] = path + range['label'] = record.label + range['behavior'] = 'top' if top? + range['items'] = canvas_builders.collect { |cb| { 'id' => cb.path, 'type' => 'Canvas' } } + end + + def sub_ranges + @sub_ranges ||= record.ranges.map do |sub_range| + RangeBuilder.new( + sub_range, + parent, + canvas_builder_factory: canvas_builder_factory, + iiif_range_factory: iiif_range_factory + ) + end + end + end end end end diff --git a/lib/iiif_manifest/v3/manifest_factory.rb b/lib/iiif_manifest/v3/manifest_factory.rb index 44f6d04..cdcc8f6 100644 --- a/lib/iiif_manifest/v3/manifest_factory.rb +++ b/lib/iiif_manifest/v3/manifest_factory.rb @@ -1,36 +1,38 @@ -module IIIFManifest::V3 - class ManifestFactory - class << self - def new(work, manifest_service_locator: ManifestServiceLocator) - super(manifest_service_locator).new(work) +module IIIFManifest + module V3 + class ManifestFactory + class << self + def new(work, manifest_service_locator: ManifestServiceLocator) + super(manifest_service_locator).new(work) + end end - end - delegate :collection_manifest_builder, :manifest_builder, :sammelband_manifest_builder, - to: :manifest_service_locator - attr_reader :manifest_service_locator + delegate :collection_manifest_builder, :manifest_builder, :sammelband_manifest_builder, + to: :manifest_service_locator + attr_reader :manifest_service_locator - def initialize(manifest_service_locator) - @manifest_service_locator = manifest_service_locator - end + def initialize(manifest_service_locator) + @manifest_service_locator = manifest_service_locator + end - def new(work) - if !work.work_presenters.empty? - if sammelband?(work) || !work.file_set_presenters.empty? + def new(work) + if !work.work_presenters.empty? + if sammelband?(work) || !work.file_set_presenters.empty? + manifest_builder.new(work) + elsif work.file_set_presenters.empty? + work = IIIFManifest::IIIFCollection.new(work) + collection_manifest_builder.new(work) + end + else manifest_builder.new(work) - elsif work.file_set_presenters.empty? - work = IIIFManifest::IIIFCollection.new(work) - collection_manifest_builder.new(work) end - else - manifest_builder.new(work) end - end - private + private - def sammelband?(work) - work.respond_to?(:sammelband?) && work.sammelband? + def sammelband?(work) + work.respond_to?(:sammelband?) && work.sammelband? + end end end end diff --git a/lib/iiif_manifest/v3/manifest_service_locator.rb b/lib/iiif_manifest/v3/manifest_service_locator.rb index 83ede54..aa6c3b9 100644 --- a/lib/iiif_manifest/v3/manifest_service_locator.rb +++ b/lib/iiif_manifest/v3/manifest_service_locator.rb @@ -1,119 +1,121 @@ -module IIIFManifest::V3 - class ManifestServiceLocator < IIIFManifest::ManifestServiceLocator - class << self - # Builders which receive a work as an argument to .new and return objects - # that respond to #apply. - def manifest_builders - composite_builder_factory.new( - record_property_builder, - structure_builder, - composite_builder: composite_builder - ) - end - - def collection_manifest_builders - composite_builder_factory.new( - record_property_builder, - child_manifest_builder_factory, - composite_builder: composite_builder - ) - end - - def iiif_collection_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest::Collection - end - - def record_property_builder - IIIFManifest::ManifestServiceLocator::InjectedFactory.new( - ManifestBuilder::RecordPropertyBuilder, - iiif_search_service_factory: iiif_search_service_factory, - iiif_autocomplete_service_factory: iiif_autocomplete_service_factory, - canvas_builder_factory: deep_canvas_builder_factory - # canvas_builder_factory: canvas_builder_factory - ) - end - - def structure_builder - IIIFManifest::ManifestServiceLocator::InjectedFactory.new( - ManifestBuilder::StructureBuilder, - canvas_builder_factory: canvas_builder, - iiif_range_factory: iiif_range_factory - ) - end - - def canvas_builder_factory - IIIFManifest::ManifestBuilder::CanvasBuilderFactory.new( - composite_builder: composite_builder, - canvas_builder_factory: canvas_builder - ) - end - - def canvas_builder - IIIFManifest::ManifestServiceLocator::InjectedFactory.new( - ManifestBuilder::CanvasBuilder, - iiif_canvas_factory: iiif_canvas_factory, - image_builder: image_builder - ) - end - - def image_builder - IIIFManifest::ManifestServiceLocator::InjectedFactory.new( - ManifestBuilder::ImageBuilder, - iiif_annotation_factory: iiif_annotation_factory, - resource_builder_factory: resource_builder_factory - ) - end - - def resource_builder_factory - IIIFManifest::ManifestServiceLocator::InjectedFactory.new( - ManifestBuilder::ResourceBuilder, - iiif_resource_factory: iiif_resource_factory, - image_service_builder_factory: image_service_builder_factory - ) - end - - def sequence_builder - raise NotImplementedError - end - - def sammelband_sequence_builder - raise NotImplementedError - end - - def sequence_factory - raise NotImplementedError - end - - def iiif_service_factory - IIIFManifest::V3::ManifestBuilder::IIIFService - end - - def iiif_resource_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest::Resource - end - - def iiif_annotation_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest::Annotation - end - - def iiif_manifest_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest - end - - def iiif_canvas_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest::Canvas - end - - def iiif_range_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest::Range - end - - def iiif_search_service_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest::SearchService - end - - def iiif_autocomplete_service_factory - IIIFManifest::V3::ManifestBuilder::IIIFManifest::AutocompleteService +module IIIFManifest + module V3 + class ManifestServiceLocator < IIIFManifest::ManifestServiceLocator + class << self + # Builders which receive a work as an argument to .new and return objects + # that respond to #apply. + def manifest_builders + composite_builder_factory.new( + record_property_builder, + structure_builder, + composite_builder: composite_builder + ) + end + + def collection_manifest_builders + composite_builder_factory.new( + record_property_builder, + child_manifest_builder_factory, + composite_builder: composite_builder + ) + end + + def iiif_collection_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest::Collection + end + + def record_property_builder + IIIFManifest::ManifestServiceLocator::InjectedFactory.new( + ManifestBuilder::RecordPropertyBuilder, + iiif_search_service_factory: iiif_search_service_factory, + iiif_autocomplete_service_factory: iiif_autocomplete_service_factory, + canvas_builder_factory: deep_canvas_builder_factory + # canvas_builder_factory: canvas_builder_factory + ) + end + + def structure_builder + IIIFManifest::ManifestServiceLocator::InjectedFactory.new( + ManifestBuilder::StructureBuilder, + canvas_builder_factory: canvas_builder, + iiif_range_factory: iiif_range_factory + ) + end + + def canvas_builder_factory + IIIFManifest::ManifestBuilder::CanvasBuilderFactory.new( + composite_builder: composite_builder, + canvas_builder_factory: canvas_builder + ) + end + + def canvas_builder + IIIFManifest::ManifestServiceLocator::InjectedFactory.new( + ManifestBuilder::CanvasBuilder, + iiif_canvas_factory: iiif_canvas_factory, + image_builder: image_builder + ) + end + + def image_builder + IIIFManifest::ManifestServiceLocator::InjectedFactory.new( + ManifestBuilder::ImageBuilder, + iiif_annotation_factory: iiif_annotation_factory, + resource_builder_factory: resource_builder_factory + ) + end + + def resource_builder_factory + IIIFManifest::ManifestServiceLocator::InjectedFactory.new( + ManifestBuilder::ResourceBuilder, + iiif_resource_factory: iiif_resource_factory, + image_service_builder_factory: image_service_builder_factory + ) + end + + def sequence_builder + raise NotImplementedError + end + + def sammelband_sequence_builder + raise NotImplementedError + end + + def sequence_factory + raise NotImplementedError + end + + def iiif_service_factory + IIIFManifest::V3::ManifestBuilder::IIIFService + end + + def iiif_resource_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest::Resource + end + + def iiif_annotation_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest::Annotation + end + + def iiif_manifest_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest + end + + def iiif_canvas_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest::Canvas + end + + def iiif_range_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest::Range + end + + def iiif_search_service_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest::SearchService + end + + def iiif_autocomplete_service_factory + IIIFManifest::V3::ManifestBuilder::IIIFManifest::AutocompleteService + end end end end diff --git a/spec/lib/iiif_manifest/v3/manifest_factory_spec.rb b/spec/lib/iiif_manifest/v3/manifest_factory_spec.rb index 3ecac7c..cd0f7fd 100644 --- a/spec/lib/iiif_manifest/v3/manifest_factory_spec.rb +++ b/spec/lib/iiif_manifest/v3/manifest_factory_spec.rb @@ -8,6 +8,8 @@ before do class Book + attr_reader :id + def initialize(id) @id = id end @@ -25,7 +27,7 @@ def work_presenters end def manifest_url - "http://test.host/books/#{@id}/manifest" + "http://test.host/books/#{id}/manifest" end def ranges @@ -48,14 +50,11 @@ def initialize(label:, ranges: [], file_set_presenters: []) end class DisplayImagePresenter + attr_reader :id def initialize(id: 'test-22') @id = id end - def id - @id - end - def display_image IIIFManifest::DisplayImage.new(id, width: 100, height: 100, format: 'image/jpeg') end @@ -129,6 +128,8 @@ def display_image before do class Book + attr_reader :id + def initialize(id) @id = id end @@ -146,7 +147,7 @@ def work_presenters end def manifest_url - "http://test.host/books/#{@id}/manifest" + "http://test.host/books/#{id}/manifest" end def sequence_rendering @@ -284,13 +285,15 @@ def sequence_rendering let(:child_work_presenter) { presenter_class.new('test-99') } let(:file_presenter) { DisplayImagePresenter.new(id: 'test-22') } let(:file_presenter2) { DisplayImagePresenter.new(id: 'test-33') } + let(:chapter_1_range) { ManifestRange.new(label: 'Chapter 1', file_set_presenters: [file_presenter]) } + let(:child_work_range) { ManifestRange.new(label: 'Child Work', file_set_presenters: [file_presenter2]) } before do allow(book_presenter).to receive(:work_presenters).and_return([child_work_presenter]) allow(book_presenter).to receive(:file_set_presenters).and_return([file_presenter]) allow(child_work_presenter).to receive(:file_set_presenters).and_return([file_presenter2]) - allow(child_work_presenter).to receive(:ranges).and_return([ManifestRange.new(label: 'Child Work', file_set_presenters: [file_presenter2])]) - allow(book_presenter.ranges[0]).to receive(:ranges).and_return([ManifestRange.new(label: 'Chapter 1', file_set_presenters: [file_presenter])] + child_work_presenter.ranges) + allow(child_work_presenter).to receive(:ranges).and_return([child_work_range]) + allow(book_presenter.ranges[0]).to receive(:ranges).and_return([chapter_1_range] + child_work_presenter.ranges) end it 'returns a IIIF Manifest' do expect(result['type']).to eq 'Manifest'