From 6ca3164ce7ef93b9da796e86edc6d7095add85a3 Mon Sep 17 00:00:00 2001 From: Michael Holloway Date: Tue, 14 Jan 2025 13:18:38 -0500 Subject: [PATCH 1/2] Demo: Claim-type-specific transformers --- .../transformers/base_claim_transformer.rb | 36 +++++++++++++++++++ .../iiif_manifest_claim_transformer.rb | 16 +++++++++ .../institutional_record_claim_transformer.rb | 12 +++++++ .../transformers/link_claim_transformer.rb | 13 +++---- .../shelfmark_claim_transformer.rb | 21 +++++++++++ 5 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 lib/digital_scriptorium/transformers/base_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb diff --git a/lib/digital_scriptorium/transformers/base_claim_transformer.rb b/lib/digital_scriptorium/transformers/base_claim_transformer.rb new file mode 100644 index 0000000..e4d81a8 --- /dev/null +++ b/lib/digital_scriptorium/transformers/base_claim_transformer.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class BaseClaimTransformer + + def initialize(prefix, claim) + @prefix = prefix + @claim = claim + end + + def display_values + [] + end + + def search_values + [] + end + + def facet_values + [] + end + + def extra_props + {} + end + + def to_solr_props + solr_props = {} + solr_props["#{prefix}_display"] = display_values if display_values.any? + solr_props["#{prefix}_search"] = search_values if search_values.any? + solr_props["#{prefix}_facet"] = facet_values if facet_values.any? + solr_props.merge(extra_props) + end + end +end diff --git a/lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb b/lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb new file mode 100644 index 0000000..15e97b8 --- /dev/null +++ b/lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for extracting links from relevant Digital Scriptorium claims. + class IiifManifestClaimTransformer < LinkClaimTransformer + PREFIX = 'iiif_manifest' + + def initialize(claim) + super(PREFIX, claim) + end + + def extra_props + super.merge { 'images_facet' => 'Yes' } + end + end +end diff --git a/lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb b/lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb new file mode 100644 index 0000000..213d03a --- /dev/null +++ b/lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for extracting links from relevant Digital Scriptorium claims. + class InstitutionalRecordClaimTransformer < LinkClaimTransformer + PREFIX = 'institutional_record' + + def initialize(claim) + super(PREFIX, claim) + end + end +end diff --git a/lib/digital_scriptorium/transformers/link_claim_transformer.rb b/lib/digital_scriptorium/transformers/link_claim_transformer.rb index f4faf8e..869a39c 100644 --- a/lib/digital_scriptorium/transformers/link_claim_transformer.rb +++ b/lib/digital_scriptorium/transformers/link_claim_transformer.rb @@ -1,15 +1,10 @@ # frozen_string_literal: true module DigitalScriptorium - # Transformer for extracting links from relevant Digital Scriptorium items. - class LinkClaimTransformer - include PropertyId - - def self.transform(claim, config) - solr_props = {} - solr_props['images_facet'] = ['Yes'] if claim.data_value && claim.property_id == IIIF_MANIFEST - solr_props["#{config['prefix']}_link"] = [claim.data_value] - solr_props + # Transformer for extracting links from relevant Digital Scriptorium claims. + class LinkClaimTransformer < BaseClaimTransformer + def extra_props + { "#{@prefix}_link" => [@claim.data_value] } end end end diff --git a/lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb b/lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb new file mode 100644 index 0000000..37c07ab --- /dev/null +++ b/lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class ShelfmarkClaimTransformer < BaseClaimTransformer + + PREFIX = 'shelfmark' + + def initialize(claim) + super(PREFIX, claim) + end + + def display_values + [claim.data_value] + end + + def search_values + [claim.data_value] + end + end +end From e50d87c4db1d711cc32cdad526400433eef5080c Mon Sep 17 00:00:00 2001 From: Michael Holloway Date: Tue, 14 Jan 2025 21:49:27 -0500 Subject: [PATCH 2/2] Restructure claim transformers, make them more Rubyish --- .rubocop_todo.yml | 12 - lib/digital_scriptorium.rb | 21 +- lib/digital_scriptorium/solr_field_filter.rb | 25 -- .../acknowledgements_claim_transformer.rb | 16 + .../transformers/base_claim_transformer.rb | 20 +- .../transformers/date_claim_transformer.rb | 18 + .../transformers/dated_claim_transformer.rb | 16 + .../iiif_manifest_claim_transformer.rb | 6 +- .../institution_claim_transformer.rb | 14 + .../institutional_record_claim_transformer.rb | 4 +- .../language_claim_transformer.rb | 14 + .../material_claim_transformer.rb | 14 + .../transformers/name_claim_transformer.rb | 62 +--- .../transformers/note_claim_transformer.rb | 20 ++ .../physical_description_claim_transformer.rb | 20 ++ .../transformers/place_claim_transformer.rb | 14 + .../qualified_claim_transformer.rb | 118 +++---- ...d_claim_transformer_with_facet_fallback.rb | 10 + .../shelfmark_claim_transformer.rb | 9 +- .../transformers/term_claim_transformer.rb | 14 + .../transformers/title_claim_transformer.rb | 14 + .../uniform_title_claim_transformer.rb | 16 + .../unqualified_claim_transformer.rb | 29 -- property_config.yml | 121 +------ ...acknowledgements_claim_transformer_spec.rb | 19 ++ .../date_claim_transformer_spec.rb | 42 +++ .../dated_claim_transformer_spec.rb | 15 + .../iiif_manifest_claim_transformer_spec.rb | 18 + .../institution_claim_transformer_spec.rb | 38 +++ ...itutional_record_claim_transformer_spec.rb | 17 + .../language_claim_transformer_spec.rb | 37 +++ .../link_claim_transformer_spec.rb | 41 --- .../material_claim_transformer_spec.rb | 37 +++ .../name_claim_transformer_spec.rb | 17 +- .../note_claim_transformer_spec.rb | 18 + ...ical_description_claim_transformer_spec.rb | 20 ++ .../place_claim_transformer_spec.rb | 40 +++ .../qualified_claim_transformer_spec.rb | 311 ------------------ .../shelfmark_claim_transformer_spec.rb | 18 + .../solr_field_filter_spec.rb | 41 --- .../term_claim_transformer_spec.rb | 72 ++++ .../title_claim_transformer_spec.rb | 56 ++++ .../uniform_title_claim_transformer_spec.rb | 17 + .../unqualified_claim_transformer_spec.rb | 100 ------ spec/spec_helper.rb | 5 + wikibase_to_solr_new.rb | 29 +- 46 files changed, 796 insertions(+), 839 deletions(-) delete mode 100644 lib/digital_scriptorium/solr_field_filter.rb create mode 100644 lib/digital_scriptorium/transformers/acknowledgements_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/date_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/dated_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/institution_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/language_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/material_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/note_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/physical_description_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/place_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/qualified_claim_transformer_with_facet_fallback.rb create mode 100644 lib/digital_scriptorium/transformers/term_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/title_claim_transformer.rb create mode 100644 lib/digital_scriptorium/transformers/uniform_title_claim_transformer.rb delete mode 100644 lib/digital_scriptorium/transformers/unqualified_claim_transformer.rb create mode 100644 spec/digital_scriptorium/acknowledgements_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/date_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/dated_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/iiif_manifest_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/institution_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/institutional_record_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/language_claim_transformer_spec.rb delete mode 100644 spec/digital_scriptorium/link_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/material_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/note_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/physical_description_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/place_claim_transformer_spec.rb delete mode 100644 spec/digital_scriptorium/qualified_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/shelfmark_claim_transformer_spec.rb delete mode 100644 spec/digital_scriptorium/solr_field_filter_spec.rb create mode 100644 spec/digital_scriptorium/term_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/title_claim_transformer_spec.rb create mode 100644 spec/digital_scriptorium/uniform_title_claim_transformer_spec.rb delete mode 100644 spec/digital_scriptorium/unqualified_claim_transformer_spec.rb diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index c4d473d..e69de29 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,12 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2025-01-14 03:47:56 UTC using RuboCop version 1.69.2. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -# Configuration parameters: CountComments, CountAsOne. -Metrics/ModuleLength: - Max: 269 diff --git a/lib/digital_scriptorium.rb b/lib/digital_scriptorium.rb index 9238b81..4b3ad7f 100644 --- a/lib/digital_scriptorium.rb +++ b/lib/digital_scriptorium.rb @@ -12,9 +12,24 @@ require 'digital_scriptorium/export' require 'digital_scriptorium/export_representer' +require 'digital_scriptorium/transformers/base_claim_transformer' require 'digital_scriptorium/transformers/link_claim_transformer' -require 'digital_scriptorium/transformers/name_claim_transformer' require 'digital_scriptorium/transformers/qualified_claim_transformer' -require 'digital_scriptorium/transformers/unqualified_claim_transformer' +require 'digital_scriptorium/transformers/qualified_claim_transformer_with_facet_fallback' -require 'digital_scriptorium/solr_field_filter' +require 'digital_scriptorium/transformers/acknowledgements_claim_transformer' +require 'digital_scriptorium/transformers/date_claim_transformer' +require 'digital_scriptorium/transformers/dated_claim_transformer' +require 'digital_scriptorium/transformers/iiif_manifest_claim_transformer' +require 'digital_scriptorium/transformers/institution_claim_transformer' +require 'digital_scriptorium/transformers/institutional_record_claim_transformer' +require 'digital_scriptorium/transformers/language_claim_transformer' +require 'digital_scriptorium/transformers/material_claim_transformer' +require 'digital_scriptorium/transformers/name_claim_transformer' +require 'digital_scriptorium/transformers/note_claim_transformer' +require 'digital_scriptorium/transformers/physical_description_claim_transformer' +require 'digital_scriptorium/transformers/place_claim_transformer' +require 'digital_scriptorium/transformers/shelfmark_claim_transformer' +require 'digital_scriptorium/transformers/term_claim_transformer' +require 'digital_scriptorium/transformers/title_claim_transformer' +require 'digital_scriptorium/transformers/uniform_title_claim_transformer' diff --git a/lib/digital_scriptorium/solr_field_filter.rb b/lib/digital_scriptorium/solr_field_filter.rb deleted file mode 100644 index af2157d..0000000 --- a/lib/digital_scriptorium/solr_field_filter.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require 'set' - -module DigitalScriptorium - # Filters Solr documents to remove items not requested in config - class SolrFieldFilter - FILTERABLE_FIELDS = Set['display', 'search', 'facet'] - - def self.filter(solr_item, property_config) - solr_item.select do |field, _| - suffix = field.split('_').last - !filterable?(suffix) || requested?(suffix, property_config) - end - end - - def self.filterable?(suffix) - FILTERABLE_FIELDS.include? suffix - end - - def self.requested?(suffix, property_config) - property_config['fields'].include? suffix - end - end -end diff --git a/lib/digital_scriptorium/transformers/acknowledgements_claim_transformer.rb b/lib/digital_scriptorium/transformers/acknowledgements_claim_transformer.rb new file mode 100644 index 0000000..9255a58 --- /dev/null +++ b/lib/digital_scriptorium/transformers/acknowledgements_claim_transformer.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class AcknowledgementsClaimTransformer < BaseClaimTransformer + PREFIX = 'acknowledgements' + + def initialize(claim, _) + super(claim, prefix: PREFIX) + end + + def display_values + [display_value(@claim.data_value)] + end + end +end diff --git a/lib/digital_scriptorium/transformers/base_claim_transformer.rb b/lib/digital_scriptorium/transformers/base_claim_transformer.rb index e4d81a8..c6a48d9 100644 --- a/lib/digital_scriptorium/transformers/base_claim_transformer.rb +++ b/lib/digital_scriptorium/transformers/base_claim_transformer.rb @@ -3,10 +3,9 @@ module DigitalScriptorium # Base transformer class providing a common interface for all transformers. class BaseClaimTransformer - - def initialize(prefix, claim) - @prefix = prefix + def initialize(claim, **kwargs) @claim = claim + @prefix = kwargs[:prefix] end def display_values @@ -25,11 +24,18 @@ def extra_props {} end - def to_solr_props + def display_value(recorded_value, in_original_script = nil, linked_terms = []) + value = { 'recorded_value' => recorded_value } + value['original_script'] = in_original_script if in_original_script + value['linked_terms'] = linked_terms if linked_terms.any? + value.to_json + end + + def solr_props solr_props = {} - solr_props["#{prefix}_display"] = display_values if display_values.any? - solr_props["#{prefix}_search"] = search_values if search_values.any? - solr_props["#{prefix}_facet"] = facet_values if facet_values.any? + solr_props["#{@prefix}_display"] = display_values if display_values.any? + solr_props["#{@prefix}_search"] = search_values if search_values.any? + solr_props["#{@prefix}_facet"] = facet_values if facet_values.any? solr_props.merge(extra_props) end end diff --git a/lib/digital_scriptorium/transformers/date_claim_transformer.rb b/lib/digital_scriptorium/transformers/date_claim_transformer.rb new file mode 100644 index 0000000..3856329 --- /dev/null +++ b/lib/digital_scriptorium/transformers/date_claim_transformer.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class DateClaimTransformer < QualifiedClaimTransformer + include PropertyId + + PREFIX = 'date' + + def initialize(claim, export_hash) + super(claim, export_hash, prefix: PREFIX, authority_id: PRODUCTION_CENTURY_IN_AUTHORITY_FILE) + end + + def extra_props + { 'date_meta' => [@claim.data_value] } + end + end +end diff --git a/lib/digital_scriptorium/transformers/dated_claim_transformer.rb b/lib/digital_scriptorium/transformers/dated_claim_transformer.rb new file mode 100644 index 0000000..fb30c43 --- /dev/null +++ b/lib/digital_scriptorium/transformers/dated_claim_transformer.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class DatedClaimTransformer < BaseClaimTransformer + PREFIX = 'dated' + + def initialize(claim, _export_hash) + super(claim, prefix: PREFIX) + end + + def facet_values + [export_hash[@claim.entity_id_value]&.label('en')].compact + end + end +end diff --git a/lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb b/lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb index 15e97b8..168f69a 100644 --- a/lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb +++ b/lib/digital_scriptorium/transformers/iiif_manifest_claim_transformer.rb @@ -5,12 +5,12 @@ module DigitalScriptorium class IiifManifestClaimTransformer < LinkClaimTransformer PREFIX = 'iiif_manifest' - def initialize(claim) - super(PREFIX, claim) + def initialize(claim, _) + super(claim, prefix: PREFIX) end def extra_props - super.merge { 'images_facet' => 'Yes' } + super.merge({ 'images_facet' => ['Yes'] }) end end end diff --git a/lib/digital_scriptorium/transformers/institution_claim_transformer.rb b/lib/digital_scriptorium/transformers/institution_claim_transformer.rb new file mode 100644 index 0000000..b360330 --- /dev/null +++ b/lib/digital_scriptorium/transformers/institution_claim_transformer.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class InstitutionClaimTransformer < QualifiedClaimTransformer + include PropertyId + + PREFIX = 'institution' + + def initialize(claim, export_hash) + super(claim, export_hash, prefix: PREFIX, authority_id: HOLDING_INSTITUTION_IN_AUTHORITY_FILE) + end + end +end diff --git a/lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb b/lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb index 213d03a..a9890e2 100644 --- a/lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb +++ b/lib/digital_scriptorium/transformers/institutional_record_claim_transformer.rb @@ -5,8 +5,8 @@ module DigitalScriptorium class InstitutionalRecordClaimTransformer < LinkClaimTransformer PREFIX = 'institutional_record' - def initialize(claim) - super(PREFIX, claim) + def initialize(claim, _) + super(claim, prefix: PREFIX) end end end diff --git a/lib/digital_scriptorium/transformers/language_claim_transformer.rb b/lib/digital_scriptorium/transformers/language_claim_transformer.rb new file mode 100644 index 0000000..dec5943 --- /dev/null +++ b/lib/digital_scriptorium/transformers/language_claim_transformer.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for converting qualified claims of Digital Scriptorium items into Solr fields. + class LanguageClaimTransformer < QualifiedClaimTransformer + include PropertyId + + PREFIX = 'language' + + def initialize(claim, export_hash) + super(claim, export_hash, prefix: PREFIX, authority_id: LANGUAGE_IN_AUTHORITY_FILE) + end + end +end diff --git a/lib/digital_scriptorium/transformers/material_claim_transformer.rb b/lib/digital_scriptorium/transformers/material_claim_transformer.rb new file mode 100644 index 0000000..7ff6a9e --- /dev/null +++ b/lib/digital_scriptorium/transformers/material_claim_transformer.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for converting qualified claims of Digital Scriptorium items into Solr fields. + class MaterialClaimTransformer < QualifiedClaimTransformer + include PropertyId + + PREFIX = 'material' + + def initialize(claim, export_hash) + super(claim, export_hash, prefix: PREFIX, authority_id: MATERIAL_IN_AUTHORITY_FILE) + end + end +end diff --git a/lib/digital_scriptorium/transformers/name_claim_transformer.rb b/lib/digital_scriptorium/transformers/name_claim_transformer.rb index feb0a1b..06d3fa9 100644 --- a/lib/digital_scriptorium/transformers/name_claim_transformer.rb +++ b/lib/digital_scriptorium/transformers/name_claim_transformer.rb @@ -1,65 +1,23 @@ # frozen_string_literal: true module DigitalScriptorium - # Special-purpose transformer for name (P14) claims - class NameClaimTransformer + # Transformer for name (P14) claims. + # NOTE: Name claims produce fields prefixes derived from the value of their role (P15) qualifiers + # (owner, author, scribe, artist, agent). + class NameClaimTransformer < QualifiedClaimTransformerWithFacetFallback include PropertyId - def self.transform(claim, export_hash) - # TODO: Log a warning to stdout if this qualifier is missing, it's a mistake that should be addressed - return {} unless claim.qualifiers_by_property_id? ROLE_IN_AUTHORITY_FILE - - prefix = get_role_prefix(claim, export_hash) - recorded_value = claim.data_value - original_script = claim.qualifiers_by_property_id(IN_ORIGINAL_SCRIPT)&.first&.data_value&.value - linked_terms = get_linked_terms(claim, export_hash) - - build_solr_props(prefix, recorded_value, original_script, linked_terms) + def initialize(claim, export_hash) + super(claim, export_hash, prefix: role_prefix(claim, export_hash), authority_id: NAME_IN_AUTHORITY_FILE) end - def self.build_solr_props(prefix, recorded_value, original_script, linked_terms) - linked_term_labels = get_labels(linked_terms) - - { - "#{prefix}_display" => [{ - 'recorded_value' => recorded_value, - 'original_script' => original_script, - 'linked_terms' => linked_terms.any? ? linked_terms : nil - }.compact.to_json], - "#{prefix}_search" => ([recorded_value, original_script].compact + linked_term_labels).uniq, - "#{prefix}_facet" => linked_term_labels.any? ? linked_term_labels : [recorded_value] - } - end - - def self.get_linked_terms(claim, export_hash) - linked_terms = [] - - claim.qualifiers_by_property_id(NAME_IN_AUTHORITY_FILE)&.each do |qualifier| - authority_id = qualifier.entity_id_value - authority = export_hash[authority_id] - linked_terms << get_linked_term(authority) if authority - end - - linked_terms.uniq - end - - def self.get_linked_term(authority) - term = { 'label' => authority.label('en') } - wikidata_id = authority.claims_by_property_id(WIKIDATA_QID)&.first&.data_value - wikidata_uri = wikidata_id && "https://www.wikidata.org/wiki/#{wikidata_id}" - term['source_url'] = wikidata_uri - term.compact - end - - def self.get_role_prefix(claim, export_hash) + def role_prefix(claim, export_hash) role_entity_id = claim.qualifiers_by_property_id(ROLE_IN_AUTHORITY_FILE).first.entity_id_value role_item = export_hash[role_entity_id] role_label = role_item.label('en') - role_label.downcase.split.last - end - - def self.get_labels(linked_terms) - linked_terms.map { |term| term['label'] }.uniq + role_label.split.last.downcase + rescue e + raise "Error fetching role qualifier: #{e}" end end end diff --git a/lib/digital_scriptorium/transformers/note_claim_transformer.rb b/lib/digital_scriptorium/transformers/note_claim_transformer.rb new file mode 100644 index 0000000..6d96d5c --- /dev/null +++ b/lib/digital_scriptorium/transformers/note_claim_transformer.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class NoteClaimTransformer < BaseClaimTransformer + PREFIX = 'note' + + def initialize(claim, _) + super(claim, prefix: PREFIX) + end + + def display_values + [display_value(@claim.data_value)] + end + + def search_values + [@claim.data_value] + end + end +end diff --git a/lib/digital_scriptorium/transformers/physical_description_claim_transformer.rb b/lib/digital_scriptorium/transformers/physical_description_claim_transformer.rb new file mode 100644 index 0000000..e97afdc --- /dev/null +++ b/lib/digital_scriptorium/transformers/physical_description_claim_transformer.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class PhysicalDescriptionClaimTransformer < BaseClaimTransformer + PREFIX = 'physical_description' + + def initialize(claim, _) + super(claim, prefix: PREFIX) + end + + def display_values + [display_value(@claim.data_value)] + end + + def search_values + [@claim.data_value] + end + end +end diff --git a/lib/digital_scriptorium/transformers/place_claim_transformer.rb b/lib/digital_scriptorium/transformers/place_claim_transformer.rb new file mode 100644 index 0000000..e54648a --- /dev/null +++ b/lib/digital_scriptorium/transformers/place_claim_transformer.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for converting qualified claims of Digital Scriptorium items into Solr fields. + class PlaceClaimTransformer < QualifiedClaimTransformer + include PropertyId + + PREFIX = 'place' + + def initialize(claim, export_hash) + super(claim, export_hash, prefix: PREFIX, authority_id: PLACE_IN_AUTHORITY_FILE) + end + end +end diff --git a/lib/digital_scriptorium/transformers/qualified_claim_transformer.rb b/lib/digital_scriptorium/transformers/qualified_claim_transformer.rb index d23b4e4..5da3dcb 100644 --- a/lib/digital_scriptorium/transformers/qualified_claim_transformer.rb +++ b/lib/digital_scriptorium/transformers/qualified_claim_transformer.rb @@ -1,101 +1,77 @@ # frozen_string_literal: true -require 'time' -require 'wikibase_representable' - module DigitalScriptorium # Transformer for converting qualified claims of Digital Scriptorium items into Solr fields. - class QualifiedClaimTransformer + class QualifiedClaimTransformer < BaseClaimTransformer include PropertyId - def self.transform(claim, export_hash, config) - recorded_value = primary_value_from_claim(claim, export_hash) - original_script = claim.qualifiers_by_property_id(IN_ORIGINAL_SCRIPT)&.first&.data_value&.value - linked_terms = get_linked_terms(claim, export_hash, config) - - build_solr_props(claim, config, recorded_value, original_script, linked_terms) + def initialize(claim, export_hash, **kwargs) + super(claim, **kwargs) + @export_hash = export_hash + @authority_id = kwargs[:authority_id] end - def self.build_solr_props(claim, config, recorded_value, original_script, linked_terms) - linked_term_labels = get_labels(linked_terms) - - { - "#{config['prefix']}_display" => [{ - 'recorded_value' => recorded_value, - 'original_script' => original_script, - 'linked_terms' => linked_terms.any? ? linked_terms : nil - }.compact.to_json], - "#{config['prefix']}_search" => ([recorded_value, original_script].compact + linked_term_labels).uniq, - "#{config['prefix']}_facet" => facet(linked_term_labels, recorded_value, config) - }.merge(get_date_props(claim)).compact + def display_values + [display_value(main_snak_value, in_original_script, linked_terms)] end - def self.get_date_props(claim) - return {} unless claim.property_id == PRODUCTION_DATE_AS_RECORDED - return { 'date_meta' => [claim.data_value] } unless claim.qualifiers - - { - 'date_meta' => [claim.data_value], - 'century_int' => [parse_year(time_value_from_qualifier(claim, CENTURY))], - 'earliest_int' => [parse_year(time_value_from_qualifier(claim, EARLIEST_DATE))], - 'latest_int' => [parse_year(time_value_from_qualifier(claim, LATEST_DATE))] - } + def search_values + [main_snak_value, in_original_script, linked_term_labels].flatten.compact.uniq end - def self.get_linked_terms(claim, export_hash, config) - linked_terms = [] - - claim.qualifiers_by_property_id(config['authority'])&.each do |qualifier| - authority_id = qualifier.entity_id_value - authority = export_hash[authority_id] - linked_terms << get_linked_term(authority) if authority - end - - linked_terms.uniq + def facet_values + linked_term_labels end - def self.get_linked_term(authority) - term = { 'label' => authority.label('en') } - - external_uri = authority.claims_by_property_id(EXTERNAL_URI)&.first&.data_value - wikidata_id = authority.claims_by_property_id(WIKIDATA_QID)&.first&.data_value - wikidata_uri = wikidata_id && "https://www.wikidata.org/wiki/#{wikidata_id}" + def in_original_script + @claim.qualifiers_by_property_id(IN_ORIGINAL_SCRIPT)&.first&.data_value&.value + end - # Only one or the other of these seem to exist for a given item in practice. - term['source_url'] = (external_uri || wikidata_uri) - term.compact + def external_uri(authority) + authority.claims_by_property_id(EXTERNAL_URI)&.first&.data_value end - def self.primary_value_from_claim(claim, export_hash) - if claim.value_type? WikibaseRepresentable::Model::EntityIdValue - entity_id = claim.entity_id_value - referenced_item = export_hash[entity_id] - referenced_item.label('en') - else - claim.data_value - end + def wikidata_id(authority) + authority.claims_by_property_id(WIKIDATA_QID)&.first&.data_value end - def self.get_labels(linked_terms) - linked_terms.map { |term| term['label'] }.uniq + def wikidata_uri(authority) + wikidata_id(authority) && "https://www.wikidata.org/wiki/#{wikidata_id(authority)}" end - def self.time_value_from_qualifier(claim, property_id) - claim.qualifiers_by_property_id(property_id)&.first&.time_value + def linked_term_for(authority) + { + 'label' => authority.label('en'), + 'source_url' => external_uri(authority) || wikidata_uri(authority) + }.compact end - # Wikibase date format "resembling ISO 8601": +YYYY-MM-DDT00:00:00Z - # https://www.wikidata.org/wiki/Help:Dates#Time_datatype - def self.parse_year(date) - Time.iso8601(date[1..]).year + def linked_terms + @linked_terms ||= begin + linked_terms = [] + + @claim.qualifiers_by_property_id(@authority_id)&.each do |qualifier| + authority_file_item_id = qualifier.entity_id_value + authority = @export_hash[authority_file_item_id] + linked_terms << linked_term_for(authority) if authority + end + + linked_terms.uniq + end end - def self.facet(linked_term_labels, recorded_value, config) - linked_term_labels.any? ? linked_term_labels : facet_fallback(recorded_value, config) + def linked_term_labels + @linked_term_labels ||= linked_terms.map { |term| term['label'] }.uniq end - def self.facet_fallback(recorded_value, config) - config['fallback'] ? [recorded_value] : nil + def main_snak_value + if @claim.value_type? WikibaseRepresentable::Model::EntityIdValue + entity_id = @claim.entity_id_value + referenced_item = @export_hash[entity_id] + referenced_item.label('en') + else + @claim.data_value + end end end end diff --git a/lib/digital_scriptorium/transformers/qualified_claim_transformer_with_facet_fallback.rb b/lib/digital_scriptorium/transformers/qualified_claim_transformer_with_facet_fallback.rb new file mode 100644 index 0000000..1affd6e --- /dev/null +++ b/lib/digital_scriptorium/transformers/qualified_claim_transformer_with_facet_fallback.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for converting qualified claims of Digital Scriptorium items into Solr fields. + class QualifiedClaimTransformerWithFacetFallback < QualifiedClaimTransformer + def facet_values + super.any? ? super : [@claim.data_value] + end + end +end diff --git a/lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb b/lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb index 37c07ab..18c4cc4 100644 --- a/lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb +++ b/lib/digital_scriptorium/transformers/shelfmark_claim_transformer.rb @@ -3,19 +3,18 @@ module DigitalScriptorium # Base transformer class providing a common interface for all transformers. class ShelfmarkClaimTransformer < BaseClaimTransformer - PREFIX = 'shelfmark' - def initialize(claim) - super(PREFIX, claim) + def initialize(claim, _) + super(claim, prefix: PREFIX) end def display_values - [claim.data_value] + [display_value(@claim.data_value)] end def search_values - [claim.data_value] + [@claim.data_value] end end end diff --git a/lib/digital_scriptorium/transformers/term_claim_transformer.rb b/lib/digital_scriptorium/transformers/term_claim_transformer.rb new file mode 100644 index 0000000..9492ba2 --- /dev/null +++ b/lib/digital_scriptorium/transformers/term_claim_transformer.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for converting qualified claims of Digital Scriptorium items into Solr fields. + class TermClaimTransformer < QualifiedClaimTransformerWithFacetFallback + include PropertyId + + PREFIX = 'term' + + def initialize(claim, export_hash) + super(claim, export_hash, prefix: PREFIX, authority_id: TERM_IN_AUTHORITY_FILE) + end + end +end diff --git a/lib/digital_scriptorium/transformers/title_claim_transformer.rb b/lib/digital_scriptorium/transformers/title_claim_transformer.rb new file mode 100644 index 0000000..2e53cc5 --- /dev/null +++ b/lib/digital_scriptorium/transformers/title_claim_transformer.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Transformer for converting qualified claims of Digital Scriptorium items into Solr fields. + class TitleClaimTransformer < QualifiedClaimTransformerWithFacetFallback + include PropertyId + + PREFIX = 'title' + + def initialize(claim, export_hash) + super(claim, export_hash, prefix: PREFIX, authority_id: STANDARD_TITLE) + end + end +end diff --git a/lib/digital_scriptorium/transformers/uniform_title_claim_transformer.rb b/lib/digital_scriptorium/transformers/uniform_title_claim_transformer.rb new file mode 100644 index 0000000..ae8b822 --- /dev/null +++ b/lib/digital_scriptorium/transformers/uniform_title_claim_transformer.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module DigitalScriptorium + # Base transformer class providing a common interface for all transformers. + class UniformTitleClaimTransformer < BaseClaimTransformer + PREFIX = 'uniform_title' + + def initialize(claim, _) + super(claim, prefix: PREFIX) + end + + def search_values + [@claim.data_value] + end + end +end diff --git a/lib/digital_scriptorium/transformers/unqualified_claim_transformer.rb b/lib/digital_scriptorium/transformers/unqualified_claim_transformer.rb deleted file mode 100644 index 53b61c2..0000000 --- a/lib/digital_scriptorium/transformers/unqualified_claim_transformer.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require 'wikibase_representable' - -module DigitalScriptorium - # Transformer for converting unqualified claims of Digital Scriptorium items into Solr fields. - class UnqualifiedClaimTransformer - include PropertyId - - def self.transform(claim, export_hash, config) - value = primary_value_from_claim(claim, export_hash) - { - "#{config['prefix']}_display" => [{ 'recorded_value' => value }.to_json], - "#{config['prefix']}_search" => [value], - "#{config['prefix']}_facet" => [value] - } - end - - def self.primary_value_from_claim(claim, export_hash) - if claim.value_type? WikibaseRepresentable::Model::EntityIdValue - entity_id = claim.entity_id_value - referenced_item = export_hash[entity_id] - referenced_item.label('en') - else - claim.data_value - end - end - end -end diff --git a/property_config.yml b/property_config.yml index 8b3eb96..a49cd27 100644 --- a/property_config.yml +++ b/property_config.yml @@ -1,121 +1,34 @@ P5: - type: qualified - prefix: institution - fields: - - display - - search - - facet - authority: P4 + transformer_class: InstitutionClaimTransformer P8: - type: unqualified - prefix: shelfmark - fields: - - display - - search + transformer_class: ShelfmarkClaimTransformer P9: - type: link - prefix: institutional_record - fields: - - link + transformer_class: InstitutionalRecordClaimTransformer P10: - type: qualified - prefix: title - fields: - - display - - search - - facet - authority: P11 - fallback: true + transformer_class: TitleClaimTransformer P12: - type: unqualified - prefix: uniform_title - fields: - - search -# NOTE: P14 can translate to any of a few different Solr fields with prefixes derived from the -# value of its role (P15) qualifier. It is handled in its own dedicated processing method. + transformer_class: UniformTitleClaimTransformer P14: - type: qualified - fields: - - display - - search - - facet - fallback: true + transformer_class: NameClaimTransformer P18: - type: qualified - prefix: term - fields: - - display - - search - - facet - authority: P20 - fallback: true + transformer_class: TermClaimTransformer P19: - type: qualified - prefix: term - fields: - - display - - search - - facet - authority: P20 - fallback: true + transformer_class: TermClaimTransformer P21: - type: qualified - prefix: language - fields: - - display - - search - - facet - authority: P22 + transformer_class: LanguageClaimTransformer P23: - type: qualified - prefix: date - fields: - - meta - - display - - search - - facet - authority: P24 + transformer_class: DateClaimTransformer P26: - type: unqualified - prefix: dated - fields: - - facet + transformer_class: DatedClaimTransformer P27: - type: qualified - prefix: place - fields: - - display - - search - - facet - authority: P28 + transformer_class: PlaceClaimTransformer P29: - type: unqualified - prefix: physical_description - fields: - - display - - search + transformer_class: PhysicalDescriptionClaimTransformer P30: - type: qualified - prefix: material - fields: - - display - - search - - facet - authority: P31 + transformer_class: MaterialClaimTransformer P32: - type: unqualified - prefix: note - fields: - - display - - search + transformer_class: NoteClaimTransformer P33: - type: unqualified - prefix: acknowledgements - fields: - - display + transformer_class: AcknowledgementsClaimTransformer P41: - type: link - prefix: iiif_manifest - fields: - - facet - - link + transformer_class: IiifManifestClaimTransformer diff --git a/spec/digital_scriptorium/acknowledgements_claim_transformer_spec.rb b/spec/digital_scriptorium/acknowledgements_claim_transformer_spec.rb new file mode 100644 index 0000000..0a17181 --- /dev/null +++ b/spec/digital_scriptorium/acknowledgements_claim_transformer_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe AcknowledgementsClaimTransformer do + context 'with an acknowledgements (P33) claim' do + json = read_fixture('claims/P33_acknowledgements.json') + expected = { + 'acknowledgements_display' => [ + '{"recorded_value":"We thank Michael W. Heil for his work in making this description available."}' + ] + } + + it 'provides the acknowledgements in the display field only' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/date_claim_transformer_spec.rb b/spec/digital_scriptorium/date_claim_transformer_spec.rb new file mode 100644 index 0000000..a2d6022 --- /dev/null +++ b/spec/digital_scriptorium/date_claim_transformer_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'json' + +module DigitalScriptorium + RSpec.describe DateClaimTransformer do + context 'with a qualified date (P23) claim' do + json = read_fixture('claims/P23_date_qualified.json') + expected = { + 'date_meta' => ['1358.'], + 'date_display' => [{ + 'recorded_value' => '1358.', + 'linked_terms' => [{ + 'label' => 'fourteenth century (dates CE)', + 'source_url' => 'http://vocab.getty.edu/aat/300404506' + }] + }.to_json], + 'date_search' => ['1358.', 'fourteenth century (dates CE)'], + 'date_facet' => ['fourteenth century (dates CE)'] + } + + it 'extracts display, search, facet and extra date fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified date (P23) claim' do + json = read_fixture('claims/P23_date_unqualified.json') + expected = { + 'date_meta' => ['1358.'], + 'date_display' => [{ 'recorded_value' => '1358.' }.to_json], + 'date_search' => ['1358.'] + } + + it 'provides the recorded value only in the display, search, and meta fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/dated_claim_transformer_spec.rb b/spec/digital_scriptorium/dated_claim_transformer_spec.rb new file mode 100644 index 0000000..ed69130 --- /dev/null +++ b/spec/digital_scriptorium/dated_claim_transformer_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe DatedClaimTransformer do + context 'with a dated (P26) claim' do + json = read_fixture('claims/P26_dated.json') + expected = { 'dated_facet' => ['Non-dated'] } + + it 'provides the label for the applicable entity ID value' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/iiif_manifest_claim_transformer_spec.rb b/spec/digital_scriptorium/iiif_manifest_claim_transformer_spec.rb new file mode 100644 index 0000000..3f89904 --- /dev/null +++ b/spec/digital_scriptorium/iiif_manifest_claim_transformer_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe IiifManifestClaimTransformer do + context 'with an IIIF manifest (P41) claim' do + json = read_fixture('claims/P41_iiif_manifest.json') + expected = { + 'iiif_manifest_link' => ['https://colenda.library.upenn.edu/phalt/iiif/2/81431-p33p8v/manifest'], + 'images_facet' => ['Yes'] + } + + it 'provides the link to the IIIF manifest in the link property and "Yes" in the facet property' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/institution_claim_transformer_spec.rb b/spec/digital_scriptorium/institution_claim_transformer_spec.rb new file mode 100644 index 0000000..1ac9e0f --- /dev/null +++ b/spec/digital_scriptorium/institution_claim_transformer_spec.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe InstitutionClaimTransformer do + context 'with a qualified institution (P5) claim' do + json = read_fixture('claims/P5_institution_qualified.json') + expected = { + 'institution_display' => [{ + 'recorded_value' => 'U. of Penna.', + 'linked_terms' => [{ + 'label' => 'University of Pennsylvania', + 'source_url' => 'https://www.wikidata.org/wiki/Q49117' + }] + }.to_json], + 'institution_search' => ['U. of Penna.', 'University of Pennsylvania'], + 'institution_facet' => ['University of Pennsylvania'] + } + + it 'provides the qualifier label in the display, search, and facet fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified institution (P5) claim' do + json = read_fixture('claims/P5_institution_unqualified.json') + expected = { + 'institution_display' => [{ 'recorded_value' => 'U. of Penna.' }.to_json], + 'institution_search' => ['U. of Penna.'] + } + + it 'provides the recorded value only in the search and display fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/institutional_record_claim_transformer_spec.rb b/spec/digital_scriptorium/institutional_record_claim_transformer_spec.rb new file mode 100644 index 0000000..617a940 --- /dev/null +++ b/spec/digital_scriptorium/institutional_record_claim_transformer_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe InstitutionalRecordClaimTransformer do + context 'with an institutional record (P9) claim' do + json = read_fixture('claims/P9_institutional_record.json') + expected = { + 'institutional_record_link' => ['https://franklin.library.upenn.edu/catalog/FRANKLIN_9949945603503681'] + } + + it 'provides the link to the institutional record' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/language_claim_transformer_spec.rb b/spec/digital_scriptorium/language_claim_transformer_spec.rb new file mode 100644 index 0000000..e886676 --- /dev/null +++ b/spec/digital_scriptorium/language_claim_transformer_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'json' + +module DigitalScriptorium + RSpec.describe LanguageClaimTransformer do + context 'with a qualified language (P21) claim' do + json = read_fixture('claims/P21_language_qualified.json') + expected = { + 'language_display' => [{ + 'recorded_value' => 'In Latin', + 'linked_terms': [{ 'label' => 'Latin', 'source_url' => 'https://www.wikidata.org/wiki/Q397' }] + }.to_json], + 'language_search' => ['In Latin', 'Latin'], + 'language_facet' => ['Latin'] + } + + it 'provides both values in display and search fields and authoritative value in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified language (P21) claim' do + json = read_fixture('claims/P21_language_unqualified.json') + expected = { + 'language_display' => [{ 'recorded_value' => 'In Latin' }.to_json], + 'language_search' => ['In Latin'] + } + + it 'provides the recorded value in the display and search fields only' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/link_claim_transformer_spec.rb b/spec/digital_scriptorium/link_claim_transformer_spec.rb deleted file mode 100644 index 5a99565..0000000 --- a/spec/digital_scriptorium/link_claim_transformer_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -require 'wikibase_representable' -require 'yaml' - -module DigitalScriptorium - include PropertyId - include WikibaseRepresentable::Model - include WikibaseRepresentable::Representers - - RSpec.describe LinkClaimTransformer do - context 'with an institutional record (P9) claim' do - json = read_fixture('claims/P9_institutional_record.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[LINK_TO_INSTITUTIONAL_RECORD] - expected = { - 'institutional_record_link' => ['https://franklin.library.upenn.edu/catalog/FRANKLIN_9949945603503681'] - } - - it 'provides the link to the institutional record' do - solr_item = described_class.transform(claim, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an IIIF manifest (P41) claim' do - json = read_fixture('claims/P41_iiif_manifest.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[IIIF_MANIFEST] - expected = { - 'iiif_manifest_link' => ['https://colenda.library.upenn.edu/phalt/iiif/2/81431-p33p8v/manifest'], - 'images_facet' => ['Yes'] - } - - it 'provides the link to the IIIF manifest in the link property and "Yes" in the facet property' do - solr_item = described_class.transform(claim, config) - expect(solr_item).to eq(expected) - end - end - end -end diff --git a/spec/digital_scriptorium/material_claim_transformer_spec.rb b/spec/digital_scriptorium/material_claim_transformer_spec.rb new file mode 100644 index 0000000..92e7a43 --- /dev/null +++ b/spec/digital_scriptorium/material_claim_transformer_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'json' + +module DigitalScriptorium + RSpec.describe MaterialClaimTransformer do + context 'with a qualified material (P30) claim' do + json = read_fixture('claims/P30_material_qualified.json') + expected = { + 'material_display' => [{ + 'recorded_value' => 'parchment', + 'linked_terms' => [{ 'label' => 'Parchment', 'source_url' => 'http://vocab.getty.edu/aat/300011851' }] + }.to_json], + 'material_search' => %w[parchment Parchment], + 'material_facet' => ['Parchment'] + } + + it 'provides the authoritative label in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified material (P30) claim' do + json = read_fixture('claims/P30_material_unqualified.json') + expected = { + 'material_display' => [{ 'recorded_value' => 'parchment' }.to_json], + 'material_search' => ['parchment'] + } + + it 'provides the recorded value only in the search and display fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/name_claim_transformer_spec.rb b/spec/digital_scriptorium/name_claim_transformer_spec.rb index 22e525a..096b734 100644 --- a/spec/digital_scriptorium/name_claim_transformer_spec.rb +++ b/spec/digital_scriptorium/name_claim_transformer_spec.rb @@ -1,13 +1,11 @@ # frozen_string_literal: true require 'json' -require 'wikibase_representable' module DigitalScriptorium RSpec.describe NameClaimTransformer do context 'with a single authority file (P17) qualifier' do json = read_fixture('claims/P14_name_qualified_no_original_script.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) expected = { 'owner_display' => [{ 'recorded_value' => 'Schoenberg, Lawrence J', @@ -21,15 +19,13 @@ module DigitalScriptorium } it 'includes the qualifier data in all fields' do - solr_item = described_class.transform(claim, export_hash) - expect(solr_item).to eq(expected) + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) end end context 'with multiple authority file (P17) qualifiers' do json = read_fixture('claims/P14_name_multiple_qualifier_values.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - recorded_value = 'From the codex made for Leonello d\'Este. ' \ 'Brought to Wales as war booty by 1813, already in a damaged state, by the Rolls family, ' \ 'later enobled as Barons Llangattock, of The Hendre, Monmouth ' \ @@ -56,14 +52,13 @@ module DigitalScriptorium } it 'includes the data from all qualifiers in the display, search, and facet fields' do - solr_item = described_class.transform(claim, export_hash) - expect(solr_item).to eq(expected) + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) end end context 'with a authority file (P17) and original script (P13) qualifiers' do json = read_fixture('claims/P14_name_qualified_original_script.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) expected = { 'author_display' => [{ 'recorded_value' => 'Dioscorides Pedanius, of Anazarbos', @@ -78,8 +73,8 @@ module DigitalScriptorium } it 'includes the original script value in the display and search fields' do - solr_item = described_class.transform(claim, export_hash) - expect(solr_item).to eq(expected) + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) end end end diff --git a/spec/digital_scriptorium/note_claim_transformer_spec.rb b/spec/digital_scriptorium/note_claim_transformer_spec.rb new file mode 100644 index 0000000..825e05f --- /dev/null +++ b/spec/digital_scriptorium/note_claim_transformer_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe NoteClaimTransformer do + context 'with a note (P32) claim' do + json = read_fixture('claims/P32_note.json') + expected = { + 'note_display' => ['{"recorded_value":"Ms. codex."}'], + 'note_search' => ['Ms. codex.'] + } + + it 'provides the note in the display and search fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/physical_description_claim_transformer_spec.rb b/spec/digital_scriptorium/physical_description_claim_transformer_spec.rb new file mode 100644 index 0000000..03a4ff1 --- /dev/null +++ b/spec/digital_scriptorium/physical_description_claim_transformer_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require 'wikibase_representable' + +module DigitalScriptorium + RSpec.describe PhysicalDescriptionClaimTransformer do + context 'with a physical description (P29) claim' do + json = read_fixture('claims/P29_physical_description.json') + expected = { + 'physical_description_display' => ['{"recorded_value":"Extent: 1 parchment ; 170 x 245 mm."}'], + 'physical_description_search' => ['Extent: 1 parchment ; 170 x 245 mm.'] + } + + it 'provides the recorded physical description in the display and search fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/place_claim_transformer_spec.rb b/spec/digital_scriptorium/place_claim_transformer_spec.rb new file mode 100644 index 0000000..536c108 --- /dev/null +++ b/spec/digital_scriptorium/place_claim_transformer_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'json' + +module DigitalScriptorium + RSpec.describe PlaceClaimTransformer do + context 'with a qualified place (P27) claim with multi-valued qualifier' do + json = read_fixture('claims/P27_place_multiple_qualifier_values.json') + expected = { + 'place_display' => [{ + 'recorded_value' => '[Provence or Spain],', + 'linked_terms' => [ + { 'label' => 'Provence', 'source_url' => 'http://vocab.getty.edu/tgn/7012209' }, + { 'label' => 'Spain', 'source_url' => 'http://vocab.getty.edu/tgn/1000095' } + ] + }.to_json], + 'place_search' => ['[Provence or Spain],', 'Provence', 'Spain'], + 'place_facet' => %w[Provence Spain] + } + + it 'includes the data from all qualifiers in the display, search, and facet fields' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified place (P27) claim' do + json = read_fixture('claims/P27_place_unqualified.json') + expected = { + 'place_display' => [{ 'recorded_value' => '[Provence or Spain],' }.to_json], + 'place_search' => ['[Provence or Spain],'] + } + + it 'provides the recorded value in the search and facet fields only' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/qualified_claim_transformer_spec.rb b/spec/digital_scriptorium/qualified_claim_transformer_spec.rb deleted file mode 100644 index 30bdca3..0000000 --- a/spec/digital_scriptorium/qualified_claim_transformer_spec.rb +++ /dev/null @@ -1,311 +0,0 @@ -# frozen_string_literal: true - -require 'json' -require 'wikibase_representable' - -module DigitalScriptorium - include PropertyId - include WikibaseRepresentable::Model - include WikibaseRepresentable::Representers - - RSpec.describe QualifiedClaimTransformer do - def build_claim(json) - StatementRepresenter.new(Statement.new).from_json(json) - end - - context 'with a qualified institution (P5) claim' do - json = read_fixture('claims/P5_institution_qualified.json') - config = property_config[HOLDING_INSTITUTION_AS_RECORDED] - expected = { - 'institution_display' => [{ - 'recorded_value' => 'U. of Penna.', - 'linked_terms' => [{ - 'label' => 'University of Pennsylvania', - 'source_url' => 'https://www.wikidata.org/wiki/Q49117' - }] - }.to_json], - 'institution_search' => ['U. of Penna.', 'University of Pennsylvania'], - 'institution_facet' => ['University of Pennsylvania'] - } - - it 'provides the qualifier label in the display, search, and facet fields' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified institution (P5) claim' do - json = read_fixture('claims/P5_institution_unqualified.json') - config = property_config[HOLDING_INSTITUTION_AS_RECORDED] - expected = { - 'institution_display' => [{ 'recorded_value' => 'U. of Penna.' }.to_json], - 'institution_search' => ['U. of Penna.'] - } - - it 'provides the recorded value only in the search and display fields' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a title (P10) claim with standard title (P11) and original script (P13) qualifiers' do - json = read_fixture('claims/P10_title_qualified.json') - config = property_config[TITLE_AS_RECORDED] - expected = { - 'title_display' => [{ - 'recorded_value' => 'Kitāb al-Majisṭī', - 'original_script' => 'كتاب المجسطي.', - 'linked_terms': [{ 'label' => 'Almagest' }] - }.to_json], - 'title_search' => ['Kitāb al-Majisṭī', 'كتاب المجسطي.', 'Almagest'], - 'title_facet' => ['Almagest'] - } - - it 'provides all titles in the display and search fields and the standard title in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a title (P10) claim with only an original script (P13) qualifier' do - json = read_fixture('claims/P10_title_qualified_original_script_only.json') - config = property_config[TITLE_AS_RECORDED] - expected = { - 'title_display' => [{ - 'recorded_value' => 'Kitāb al-Majisṭī', - 'original_script' => 'كتاب المجسطي.' - }.to_json], - 'title_search' => ['Kitāb al-Majisṭī', 'كتاب المجسطي.'], - 'title_facet' => ['Kitāb al-Majisṭī'] - } - - it 'provides the original script title and falls back to the recorded title in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified title (P10) claim' do - json = read_fixture('claims/P10_title_unqualified.json') - config = property_config[TITLE_AS_RECORDED] - expected = { - 'title_display' => [{ 'recorded_value' => 'Kitāb al-Majisṭī' }.to_json], - 'title_search' => ['Kitāb al-Majisṭī'], - 'title_facet' => ['Kitāb al-Majisṭī'] - } - - it 'falls back to the recorded title in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a qualified genre (P18) claim' do - json = read_fixture('claims/P18_genre_qualified.json') - config = property_config[GENRE_AS_RECORDED] - expected = { - 'term_display' => [{ - 'recorded_value' => 'Deeds', - 'linked_terms': [{ 'label' => 'deeds', 'source_url' => 'http://vocab.getty.edu/aat/300027249' }] - }.to_json], - 'term_search' => %w[Deeds deeds], - 'term_facet' => ['deeds'] - } - - it 'provides both values in display and search fields and authoritative value in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified genre (P18) claim' do - json = read_fixture('claims/P18_genre_unqualified.json') - config = property_config[GENRE_AS_RECORDED] - expected = { - 'term_display' => [{ 'recorded_value' => 'Deeds' }.to_json], - 'term_search' => ['Deeds'], - 'term_facet' => ['Deeds'] - } - - it 'provides the recorded value for display and search and falls back to recorded value for the facet' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a subject (P19) claim with multiple authority (P20) values' do - json = read_fixture('claims/P19_subject_multiple_qualifier_values.json') - config = property_config[SUBJECT_AS_RECORDED] - expected = { - 'term_display' => [{ - 'recorded_value' => 'Cosmology--Early works to 1800', - 'linked_terms' => [ - { 'label' => 'Cosmology', 'source_url' => 'http://id.worldcat.org/fast/880600' }, - { 'label' => 'Early works', 'source_url' => 'http://id.worldcat.org/fast/1411636' } - ] - }.to_json], - 'term_search' => ['Cosmology--Early works to 1800', 'Cosmology', 'Early works'], - 'term_facet' => ['Cosmology', 'Early works'] - } - - it 'provides all values in display and search fields and authoritative values in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified subject (P19) claim' do - json = read_fixture('claims/P19_subject_unqualified.json') - config = property_config[SUBJECT_AS_RECORDED] - expected = { - 'term_display' => [{ 'recorded_value' => 'Cosmology--Early works to 1800' }.to_json], - 'term_search' => ['Cosmology--Early works to 1800'], - 'term_facet' => ['Cosmology--Early works to 1800'] - } - - it 'provides recorded value in display and search fields and falls back to recorded value in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a qualified language (P21) claim' do - json = read_fixture('claims/P21_language_qualified.json') - config = property_config[LANGUAGE_AS_RECORDED] - expected = { - 'language_display' => [{ - 'recorded_value' => 'In Latin', - 'linked_terms': [{ 'label' => 'Latin', 'source_url' => 'https://www.wikidata.org/wiki/Q397' }] - }.to_json], - 'language_search' => ['In Latin', 'Latin'], - 'language_facet' => ['Latin'] - } - - it 'provides both values in display and search fields and authoritative value in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified language (P21) claim' do - json = read_fixture('claims/P21_language_unqualified.json') - config = property_config[LANGUAGE_AS_RECORDED] - expected = { - 'language_display' => [{ 'recorded_value' => 'In Latin' }.to_json], - 'language_search' => ['In Latin'] - } - - it 'provides the recorded value in the display and search fields only' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a qualified date (P23) claim' do - json = read_fixture('claims/P23_date_qualified.json') - config = property_config[PRODUCTION_DATE_AS_RECORDED] - expected = { - 'date_meta' => ['1358.'], - 'date_display' => [{ - 'recorded_value' => '1358.', - 'linked_terms' => [{ - 'label' => 'fourteenth century (dates CE)', - 'source_url' => 'http://vocab.getty.edu/aat/300404506' - }] - }.to_json], - 'date_search' => ['1358.', 'fourteenth century (dates CE)'], - 'date_facet' => ['fourteenth century (dates CE)'], - 'century_int' => [1301], - 'earliest_int' => [1358], - 'latest_int' => [1358] - } - - it 'extracts display, search, facet and extra date fields' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified date (P23) claim' do - json = read_fixture('claims/P23_date_unqualified.json') - config = property_config[PRODUCTION_DATE_AS_RECORDED] - expected = { - 'date_meta' => ['1358.'], - 'date_display' => [{ 'recorded_value' => '1358.' }.to_json], - 'date_search' => ['1358.'] - } - - it 'provides the recorded value only in the display, search, and meta fields' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a qualified place (P27) claim with multi-valued qualifier' do - json = read_fixture('claims/P27_place_multiple_qualifier_values.json') - config = property_config[PRODUCTION_PLACE_AS_RECORDED] - expected = { - 'place_display' => [{ - 'recorded_value' => '[Provence or Spain],', - 'linked_terms' => [ - { 'label' => 'Provence', 'source_url' => 'http://vocab.getty.edu/tgn/7012209' }, - { 'label' => 'Spain', 'source_url' => 'http://vocab.getty.edu/tgn/1000095' } - ] - }.to_json], - 'place_search' => ['[Provence or Spain],', 'Provence', 'Spain'], - 'place_facet' => %w[Provence Spain] - } - - it 'includes the data from all qualifiers in the display, search, and facet fields' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified place (P27) claim' do - json = read_fixture('claims/P27_place_unqualified.json') - config = property_config[PRODUCTION_PLACE_AS_RECORDED] - expected = { - 'place_display' => [{ 'recorded_value' => '[Provence or Spain],' }.to_json], - 'place_search' => ['[Provence or Spain],'] - } - - it 'provides the recorded value in the search and facet fields only' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with a qualified material (P30) claim' do - json = read_fixture('claims/P30_material_qualified.json') - config = property_config[MATERIAL_AS_RECORDED] - expected = { - 'material_display' => [{ - 'recorded_value' => 'parchment', - 'linked_terms' => [{ 'label' => 'Parchment', 'source_url' => 'http://vocab.getty.edu/aat/300011851' }] - }.to_json], - 'material_search' => %w[parchment Parchment], - 'material_facet' => ['Parchment'] - } - - it 'provides the authoritative label in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - - context 'with an unqualified material (P30) claim' do - json = read_fixture('claims/P30_material_unqualified.json') - config = property_config[MATERIAL_AS_RECORDED] - expected = { - 'material_display' => [{ 'recorded_value' => 'parchment' }.to_json], - 'material_search' => ['parchment'] - } - - it 'provides the authoritative label in the facet field' do - solr_item = described_class.transform(build_claim(json), export_hash, config) - expect(solr_item).to eq(expected) - end - end - end -end diff --git a/spec/digital_scriptorium/shelfmark_claim_transformer_spec.rb b/spec/digital_scriptorium/shelfmark_claim_transformer_spec.rb new file mode 100644 index 0000000..53663d9 --- /dev/null +++ b/spec/digital_scriptorium/shelfmark_claim_transformer_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe ShelfmarkClaimTransformer do + context 'with a shelfmark (P8) claim' do + json = read_fixture('claims/P8_shelfmark.json') + expected = { + 'shelfmark_display' => ['{"recorded_value":"Oversize LJS 110"}'], + 'shelfmark_search' => ['Oversize LJS 110'] + } + + it 'provides the recorded shelfmark in the display and search properties' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/solr_field_filter_spec.rb b/spec/digital_scriptorium/solr_field_filter_spec.rb deleted file mode 100644 index 0be6055..0000000 --- a/spec/digital_scriptorium/solr_field_filter_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -module DigitalScriptorium - RSpec.describe SolrFieldFilter do - let(:date_display_json) do - { - 'recorded_value' => '1358.', - 'linked_terms' => [{ - 'label' => 'fourteenth century (dates CE)', - 'source_url' => 'http://vocab.getty.edu/aat/300404506' - }] - }.to_json - end - - let(:solr_item) do - { - 'date_meta' => ['1358.'], - 'date_display' => [date_display_json], - 'date_search' => ['1358.', 'fourteenth century (dates CE)'], - 'date_facet' => ['fourteenth century (dates CE)'], - 'century_int' => [1301], - 'earliest_int' => [1358], - 'latest_int' => [1358] - } - end - - it 'filters out non-requested filterable fields' do - property_config = { 'fields' => ['display'] } - - expect(described_class.filter(solr_item, property_config)).to eq( - { - 'date_meta' => ['1358.'], - 'date_display' => [date_display_json], - 'century_int' => [1301], - 'earliest_int' => [1358], - 'latest_int' => [1358] - } - ) - end - end -end diff --git a/spec/digital_scriptorium/term_claim_transformer_spec.rb b/spec/digital_scriptorium/term_claim_transformer_spec.rb new file mode 100644 index 0000000..6a532a0 --- /dev/null +++ b/spec/digital_scriptorium/term_claim_transformer_spec.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require 'json' + +module DigitalScriptorium + RSpec.describe TermClaimTransformer do + context 'with a qualified genre (P18) claim' do + json = read_fixture('claims/P18_genre_qualified.json') + expected = { + 'term_display' => [{ + 'recorded_value' => 'Deeds', + 'linked_terms': [{ 'label' => 'deeds', 'source_url' => 'http://vocab.getty.edu/aat/300027249' }] + }.to_json], + 'term_search' => %w[Deeds deeds], + 'term_facet' => ['deeds'] + } + + it 'provides both values in display and search fields and authoritative value in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified genre (P18) claim' do + json = read_fixture('claims/P18_genre_unqualified.json') + expected = { + 'term_display' => [{ 'recorded_value' => 'Deeds' }.to_json], + 'term_search' => ['Deeds'], + 'term_facet' => ['Deeds'] + } + + it 'provides the recorded value for display and search and falls back to recorded value for the facet' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with a subject (P19) claim with multiple authority (P20) values' do + json = read_fixture('claims/P19_subject_multiple_qualifier_values.json') + expected = { + 'term_display' => [{ + 'recorded_value' => 'Cosmology--Early works to 1800', + 'linked_terms' => [ + { 'label' => 'Cosmology', 'source_url' => 'http://id.worldcat.org/fast/880600' }, + { 'label' => 'Early works', 'source_url' => 'http://id.worldcat.org/fast/1411636' } + ] + }.to_json], + 'term_search' => ['Cosmology--Early works to 1800', 'Cosmology', 'Early works'], + 'term_facet' => ['Cosmology', 'Early works'] + } + + it 'provides all values in display and search fields and authoritative values in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified subject (P19) claim' do + json = read_fixture('claims/P19_subject_unqualified.json') + expected = { + 'term_display' => [{ 'recorded_value' => 'Cosmology--Early works to 1800' }.to_json], + 'term_search' => ['Cosmology--Early works to 1800'], + 'term_facet' => ['Cosmology--Early works to 1800'] + } + + it 'provides recorded value in display and search fields and falls back to recorded value in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/title_claim_transformer_spec.rb b/spec/digital_scriptorium/title_claim_transformer_spec.rb new file mode 100644 index 0000000..4ab7cf8 --- /dev/null +++ b/spec/digital_scriptorium/title_claim_transformer_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require 'json' + +module DigitalScriptorium + RSpec.describe TitleClaimTransformer do + context 'with a title (P10) claim with standard title (P11) and original script (P13) qualifiers' do + json = read_fixture('claims/P10_title_qualified.json') + expected = { + 'title_display' => [{ + 'recorded_value' => 'Kitāb al-Majisṭī', + 'original_script' => 'كتاب المجسطي.', + 'linked_terms': [{ 'label' => 'Almagest' }] + }.to_json], + 'title_search' => ['Kitāb al-Majisṭī', 'كتاب المجسطي.', 'Almagest'], + 'title_facet' => ['Almagest'] + } + + it 'provides all titles in the display and search fields and the standard title in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with a title (P10) claim with only an original script (P13) qualifier' do + json = read_fixture('claims/P10_title_qualified_original_script_only.json') + expected = { + 'title_display' => [{ + 'recorded_value' => 'Kitāb al-Majisṭī', + 'original_script' => 'كتاب المجسطي.' + }.to_json], + 'title_search' => ['Kitāb al-Majisṭī', 'كتاب المجسطي.'], + 'title_facet' => ['Kitāb al-Majisṭī'] + } + + it 'provides the original script title and falls back to the recorded title in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + + context 'with an unqualified title (P10) claim' do + json = read_fixture('claims/P10_title_unqualified.json') + expected = { + 'title_display' => [{ 'recorded_value' => 'Kitāb al-Majisṭī' }.to_json], + 'title_search' => ['Kitāb al-Majisṭī'], + 'title_facet' => ['Kitāb al-Majisṭī'] + } + + it 'falls back to the recorded title in the facet field' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/uniform_title_claim_transformer_spec.rb b/spec/digital_scriptorium/uniform_title_claim_transformer_spec.rb new file mode 100644 index 0000000..85794a5 --- /dev/null +++ b/spec/digital_scriptorium/uniform_title_claim_transformer_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module DigitalScriptorium + RSpec.describe UniformTitleClaimTransformer do + context 'with a uniform title (P12) claim' do + json = read_fixture('claims/P12_uniform_title.json') + expected = { + 'uniform_title_search' => ['Image du monde.'] + } + + it 'provides the uniform title in the search field only' do + solr_props = described_class.new(build_claim(json), export_hash).solr_props + expect(solr_props).to eq(expected) + end + end + end +end diff --git a/spec/digital_scriptorium/unqualified_claim_transformer_spec.rb b/spec/digital_scriptorium/unqualified_claim_transformer_spec.rb deleted file mode 100644 index 59e22ee..0000000 --- a/spec/digital_scriptorium/unqualified_claim_transformer_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -# frozen_string_literal: true - -require 'json' -require 'wikibase_representable' -require 'yaml' - -module DigitalScriptorium - include PropertyId - include WikibaseRepresentable::Model - include WikibaseRepresentable::Representers - - RSpec.describe UnqualifiedClaimTransformer do - context 'with a shelfmark (P8) claim' do - json = read_fixture('claims/P8_shelfmark.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[SHELFMARK] - expected = { - 'shelfmark_display' => ['{"recorded_value":"Oversize LJS 110"}'], - 'shelfmark_search' => ['Oversize LJS 110'] - } - - it 'provides the recorded shelfmark in the display and search properties' do - solr_item = SolrFieldFilter.filter described_class.transform(claim, export_hash, config), config - expect(solr_item).to eq(expected) - end - end - - context 'with a uniform title (P12) claim' do - json = read_fixture('claims/P12_uniform_title.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[UNIFORM_TITLE_AS_RECORDED] - expected = { - 'uniform_title_search' => ['Image du monde.'] - } - - it 'provides the uniform title in the search field only' do - solr_item = SolrFieldFilter.filter described_class.transform(claim, export_hash, config), config - expect(solr_item).to eq(expected) - end - end - - context 'with a dated (P26) claim' do - json = read_fixture('claims/P26_dated.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[DATED] - expected = { 'dated_facet' => ['Non-dated'] } - - it 'provides the label for the applicable entity ID value' do - solr_item = SolrFieldFilter.filter described_class.transform(claim, export_hash, config), config - expect(solr_item).to eq(expected) - end - end - - context 'with a physical description (P29) claim' do - json = read_fixture('claims/P29_physical_description.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[PHYSICAL_DESCRIPTION] - expected = { - 'physical_description_display' => ['{"recorded_value":"Extent: 1 parchment ; 170 x 245 mm."}'], - 'physical_description_search' => ['Extent: 1 parchment ; 170 x 245 mm.'] - } - - it 'provides the recorded physical description in the display and search fields' do - solr_item = SolrFieldFilter.filter described_class.transform(claim, export_hash, config), config - expect(solr_item).to eq(expected) - end - end - - context 'with a note (P32) claim' do - json = read_fixture('claims/P32_note.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[NOTE] - expected = { - 'note_display' => ['{"recorded_value":"Ms. codex."}'], - 'note_search' => ['Ms. codex.'] - } - - it 'provides the note in the display and search fields' do - solr_item = SolrFieldFilter.filter described_class.transform(claim, export_hash, config), config - expect(solr_item).to eq(expected) - end - end - - context 'with an acknowledgements (P33) claim' do - json = read_fixture('claims/P33_acknowledgements.json') - claim = StatementRepresenter.new(Statement.new).from_json(json) - config = property_config[ACKNOWLEDGEMENTS] - expected = { - 'acknowledgements_display' => [ - '{"recorded_value":"We thank Michael W. Heil for his work in making this description available."}' - ] - } - - it 'provides the acknowledgements in the display field only' do - solr_item = SolrFieldFilter.filter described_class.transform(claim, export_hash, config), config - expect(solr_item).to eq(expected) - end - end - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9b6cf8f..6a5c687 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -28,6 +28,11 @@ def read_fixture(file) File.read(fixture_path(file)) end +def build_claim(json) + statement = WikibaseRepresentable::Model::Statement.new + WikibaseRepresentable::Representers::StatementRepresenter.new(statement).from_json(json) +end + def item_from_fixture(file) item = DigitalScriptorium::DsItem.new WikibaseRepresentable::Representers::ItemRepresenter.new(item).from_json(read_fixture(file)) diff --git a/wikibase_to_solr_new.rb b/wikibase_to_solr_new.rb index 5dab2b6..6910b50 100644 --- a/wikibase_to_solr_new.rb +++ b/wikibase_to_solr_new.rb @@ -42,26 +42,6 @@ def merge(solr_item, new_props) end end -def link_property?(property_config) - property_config['type'] == 'link' -end - -def qualified_property?(property_config) - property_config['type'] == 'qualified' -end - -def get_transformed_fields(claim, export_hash, property_config) - if link_property?(property_config) - DigitalScriptorium::LinkClaimTransformer.transform(claim, property_config) - elsif claim.property_id == DigitalScriptorium::PropertyId::ASSOCIATED_NAME_AS_RECORDED - DigitalScriptorium::NameClaimTransformer.transform(claim, export_hash) - elsif qualified_property?(property_config) - DigitalScriptorium::QualifiedClaimTransformer.transform(claim, export_hash, property_config) - else - DigitalScriptorium::UnqualifiedClaimTransformer.transform(claim, export_hash, property_config) - end -end - def base_solr_item(meta) ds_id = meta.manuscript.ds_id { @@ -111,8 +91,13 @@ def record?(entity) claims.each do |claim| next unless (property_config = config[property_id]) - fields = get_transformed_fields(claim, export_hash, property_config) - solr_item = merge(solr_item, DigitalScriptorium::SolrFieldFilter.filter(fields, property_config)) + begin + transformer = property_config['transformer_class'].new claim, export_hash + solr_item = merge(solr_item, transformer.solr_props) + rescue e + # TODO: Log properly + puts "Error processing item ID #{item.id}: #{e}" + end end end end