From fe59eab399359a9026cc87fa8ca94a895e9c2763 Mon Sep 17 00:00:00 2001 From: Joshua Ramon Enslin Date: Tue, 10 Oct 2023 00:46:49 +0200 Subject: [PATCH] Add check for Minimaldatensatz field set (http://minimaldatensatz.de) --- .../MinimaldatensatzCheck.php | 133 ++++++++++++++++++ ...zCheckIncompletelyImplementedException.php | 25 ++++ src/Checks/Minimaldatensatz/README.md | 3 + tests/MinimaldatensatzCheckTest.php | 31 ++++ 4 files changed, 192 insertions(+) create mode 100644 src/Checks/Minimaldatensatz/MinimaldatensatzCheck.php create mode 100644 src/Checks/Minimaldatensatz/MinimaldatensatzCheckIncompletelyImplementedException.php create mode 100644 src/Checks/Minimaldatensatz/README.md create mode 100644 tests/MinimaldatensatzCheckTest.php diff --git a/src/Checks/Minimaldatensatz/MinimaldatensatzCheck.php b/src/Checks/Minimaldatensatz/MinimaldatensatzCheck.php new file mode 100644 index 0000000..49b12b1 --- /dev/null +++ b/src/Checks/Minimaldatensatz/MinimaldatensatzCheck.php @@ -0,0 +1,133 @@ + + */ +declare(strict_types = 1); + +/** + * Since about 2022, a Germany-wide working group got together to work on a minimal + * set of recommended and required fields for a basic object record. Primarily, this + * targets import data for the German Digital Library. + * This check is German-language only. + */ +final class MinimaldatensatzCheck { + + public bool $_has_title; + public bool $_has_type; + public bool $_has_topic_category; + public bool $_has_inventory_number; + public bool $_has_description; + public bool $_has_material; + public bool $_has_technique; + public bool $_has_measurements; + public bool $_has_event; + public bool $_has_tag; + public bool $_has_image; + public bool $_has_image_license; + public bool $_has_image_owner; + + /** + * Returns an evaluation message for a given required field. + * + * @param string $field Field to evaluate. + * @param boolean $passed Sets whether the field is available and filled or not. + * @param string $fieldname_de German language field name. + * + * @return array{field: string, passed: bool, text: string} + */ + private function _generateOutputMessageForRequiredField(string $field, bool $passed, string $fieldname_de):array { + + return [ + 'field' => $field, + 'required' => true, + 'passed' => $passed, + 'text' => match($passed) { + true => 'Das Feld "' . $fieldname_de . '" ist vorhanden und ausgefüllt. Gut.', + false => 'Das Pflichtfeld "' . $fieldname_de . '" ist nicht vorhanden oder nicht ausgefüllt.', + }, + ]; + + } + + /** + * Returns an evaluation message for a given optional field. + * + * @param string $field Field to evaluate. + * @param boolean $passed Sets whether the field is available and filled or not. + * @param string $fieldname_de German language field name. + * + * @return array{field: string, passed: bool, text: string} + */ + private function _generateOutputMessageForOptionalField(string $field, bool $passed, string $fieldname_de):array { + + return [ + 'field' => $field, + 'required' => false, + 'passed' => $passed, + 'text' => match($passed) { + true => 'Das Feld "' . $fieldname_de . '" ist vorhanden und ausgefüllt. Gut.', + false => 'Das Feld "' . $fieldname_de . '" ist nicht vorhanden oder nicht ausgefüllt. Es wird empfolen, diese Information mitzuliefern.', + }, + ]; + + } + + /** + * Returns a list of evaluations / checks for each field. + * + * @return array + */ + public function evaluate():array { + + $output = []; + + if (!isset($this->_has_title)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Title has not been checked"); + $output[] = $this->_generateOutputMessageForRequiredField("title", $this->_has_title, "Objekttitel oder -benennung"); + + if (!isset($this->_has_type)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Type has not been checked"); + $output[] = $this->_generateOutputMessageForRequiredField("type", $this->_has_type, "Objekttyp oder -bezeichnung"); + + if (!isset($this->_has_topic_category)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Topic category has not been checked"); + $output[] = $this->_generateOutputMessageForOptionalField("topic_category", $this->_has_topic_category, "Themenkategorie"); + + if (!isset($this->_has_inventory_number)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Inventory number has not been checked"); + $output[] = $this->_generateOutputMessageForRequiredField("inventory_number", $this->_has_inventory_number, "Inventarnummer"); + + if (!isset($this->_has_description)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Description has not been checked"); + $output[] = $this->_generateOutputMessageForOptionalField("description", $this->_has_description, "Objektbeschreibung"); + + if (!isset($this->_has_material)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Material has not been checked"); + $output[] = $this->_generateOutputMessageForOptionalField("material", $this->_has_material, "Material"); + + if (!isset($this->_has_technique)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Technique has not been checked"); + $output[] = $this->_generateOutputMessageForOptionalField("technique", $this->_has_technique, "Technik"); + + if (!isset($this->_has_measurements)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Measurements has not been checked"); + $output[] = $this->_generateOutputMessageForOptionalField("measurements", $this->_has_measurements, "Maße"); + + if (!isset($this->_has_event)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Event has not been checked"); + $output[] = $this->_generateOutputMessageForRequiredField("event", $this->_has_event, "Ereignis in der Objektgeschichte (Feldgruppe)"); + + if (!isset($this->_has_tag)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Tag has not been checked"); + $output[] = $this->_generateOutputMessageForOptionalField("tag", $this->_has_tag, "Inhaltsschlagwort"); + + if (!isset($this->_has_image)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Image has not been checked"); + $output[] = $this->_generateOutputMessageForRequiredField("image", $this->_has_image, "Mediendatei (Feldgruppe)"); + + if (!isset($this->_has_image_license)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Image license has not been checked"); + $output[] = $this->_generateOutputMessageForRequiredField("image_license", $this->_has_image_license, "Nutzungsrechte Mediendatei"); + + if (!isset($this->_has_image_owner)) throw new MinimaldatensatzCheckIncompletelyImplementedException("Image owner has not been checked"); + $output[] = $this->_generateOutputMessageForRequiredField("image_owner", $this->_has_image_owner, "Rechteinhaber*in Mediendatei"); + + return $output; + + } +} diff --git a/src/Checks/Minimaldatensatz/MinimaldatensatzCheckIncompletelyImplementedException.php b/src/Checks/Minimaldatensatz/MinimaldatensatzCheckIncompletelyImplementedException.php new file mode 100644 index 0000000..7411846 --- /dev/null +++ b/src/Checks/Minimaldatensatz/MinimaldatensatzCheckIncompletelyImplementedException.php @@ -0,0 +1,25 @@ + + */ +declare(strict_types = 1); + +/** + * Custom exception class to be raised when not all fields have been set in the MinimaldatensatzCheck class. + */ +final class MinimaldatensatzCheckIncompletelyImplementedException extends Exception { + /** + * Error message. + * + * @return string + */ + public function errorMessage() { + //error message + return 'Incompletely implemented check for Minimaldatensatz: ' . $this->getMessage(); + + } +} diff --git a/src/Checks/Minimaldatensatz/README.md b/src/Checks/Minimaldatensatz/README.md new file mode 100644 index 0000000..097dfa5 --- /dev/null +++ b/src/Checks/Minimaldatensatz/README.md @@ -0,0 +1,3 @@ +# Checks for required and recommended fields according to the work of the Working Group "Minimaldatensatz" (Minimal Object Record) + +See: http://minimaldatensatz.de diff --git a/tests/MinimaldatensatzCheckTest.php b/tests/MinimaldatensatzCheckTest.php new file mode 100644 index 0000000..578f8c4 --- /dev/null +++ b/tests/MinimaldatensatzCheckTest.php @@ -0,0 +1,31 @@ + + */ +declare(strict_types = 1); + +use PHPUnit\Framework\TestCase; +require_once __DIR__ . '/../src/Checks/Minimaldatensatz/MinimaldatensatzCheck.php'; +require_once __DIR__ . '/../src/Checks/Minimaldatensatz/MinimaldatensatzCheckIncompletelyImplementedException.php'; + +/** + * Tests for check for Minimaldatensatz conformity. + */ +final class MinimaldatensatzCheckTest extends TestCase { + /** + * Ensures that a warning is thrown, if a value has not been set. + * + * @return void + */ + public function testImageNotChecked():void { + + $check = new MinimaldatensatzCheck; + $this->expectException(MinimaldatensatzCheckIncompletelyImplementedException::class); + $check->evaluate(); + + } +}