From 1e06e8816d3a7f29a5e5cbe79e9ce57c03e1f441 Mon Sep 17 00:00:00 2001 From: Amy Wieliczka Date: Fri, 11 Aug 2023 11:53:42 -0700 Subject: [PATCH] identifier should be a list; don't error on http vs. https --- metadata_mapper/mappers/oai/chapman_mapper.py | 59 +++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/metadata_mapper/mappers/oai/chapman_mapper.py b/metadata_mapper/mappers/oai/chapman_mapper.py index f5e6d5d95..cf4e23bda 100644 --- a/metadata_mapper/mappers/oai/chapman_mapper.py +++ b/metadata_mapper/mappers/oai/chapman_mapper.py @@ -1,6 +1,7 @@ -from typing import Union +from typing import Union, Any from .oai_mapper import OaiRecord, OaiVernacular +from ..mapper import Validator class ChapmanRecord(OaiRecord): """Mapping discrepancies: @@ -16,13 +17,15 @@ def UCLDC_map(self): } def map_is_shown_at(self) -> Union[str, None]: - return self.map_identifier() + identifiers = self.map_identifier() + return identifiers[0] if identifiers else None def map_is_shown_by(self) -> Union[str, None]: if not self.is_image_type(): return - url: Union[str, None] = self.map_identifier() + identifiers = self.map_identifier() + url: Union[str, None] = identifiers[0] if identifiers else None return f"{url.replace('items', 'thumbs')}?gallery=preview" if url else None @@ -51,7 +54,55 @@ def map_identifier(self) -> Union[str, None]: identifiers = [i for i in self.source_metadata.get('identifier') if "context" not in i] - return identifiers[0] if identifiers else None + return identifiers + + +class ChapmanValidator(Validator): + def __init__(self, **options): + super().__init__(**options) + self.add_validatable_field( + field="identifier", type=Validator.list_of(str), + validations=[ + ChapmanValidator.list_match_ignore_url_protocol, + Validator.type_match, + ] + ) + self.add_validatable_field( + field="is_shown_at", type=str, + validations=[ + Validator.required_field, + ChapmanValidator.str_match_ignore_url_protocol, + Validator.type_match, + ] + ) + + @staticmethod + def list_match_ignore_url_protocol(validation_def: dict, + rikolti_value: Any, + comparison_value: Any) -> None: + if rikolti_value == comparison_value: + return + + for comparison_item in comparison_value: + if comparison_item.startswith('http'): + comparison_item.replace('http', 'https') + if not rikolti_value == comparison_value: + return "Content mismatch" + + + @staticmethod + def str_match_ignore_url_protocol(validation_def: dict, + rikolti_value: Any, + comparison_value: Any) -> None: + if rikolti_value == comparison_value: + return + + if comparison_value.startswith('http'): + comparison_value.replace('http', 'https') + if not rikolti_value == comparison_value: + return "Content mismatch" + class ChapmanVernacular(OaiVernacular): record_cls = ChapmanRecord + validator = ChapmanValidator