Restructure MDPlausiForLegalStatus to take image rights from the

constructor on, add translations

Close #2
This commit is contained in:
Joshua Ramon Enslin 2023-09-12 01:12:39 +02:00
parent 4454217cc0
commit 0d9feaed19
Signed by: jrenslin
GPG Key ID: 46016F84501B70AE
5 changed files with 302 additions and 32 deletions

View File

@ -25,6 +25,8 @@ final class MDPlausiForLegalStatus {
/** @var array<MDPlausiEvent> */
private array $_events;
/** @var array<array{name: string, license: string}> */
private array $_representations;
# private string $_latest_production_name;
private int $_latest_production;
@ -90,7 +92,9 @@ final class MDPlausiForLegalStatus {
# $this->_production->latest_time_name = $event->actor_death;
}
// Actors who have not yet died
// Actors who have not yet died will have their birth set as the last
// possible time. This is a bit hacky, but should work for all
// actors who have not lived beyond 100 years.
if (
$event->actor_death_normalized === false
&& $event->actor_birth_normalized !== false
@ -111,11 +115,9 @@ final class MDPlausiForLegalStatus {
* Evaluates a range of representations and returns a simple answer without translations.
* For translations, use the wrapper function $this->evaluate().
*
* @param array<array{name: string, license: string}> $representations Representations of the object.
*
* @return array{has_warning: bool, msgs: array<array{name: string, license: string, type: string, additional?: array{representation: MDCopyrightCollective}}>}
* @return array{has_warning: bool, msgs: array<array{name: string, license: string, reason: MDPlausiLegalCheckReason, type: MDPlausiLegalCheckResultType, additional?: array{representation: MDCopyrightCollective}}>}
*/
public function evaluateSimple(array $representations):array {
public function evaluateSimple():array {
if ($this->_expected_status === 'any') {
return ['has_warning' => false, 'msgs' => []];
@ -126,7 +128,7 @@ final class MDPlausiForLegalStatus {
}
$msgs = [];
foreach ($representations as $representation) {
foreach ($this->_representations as $representation) {
if ($this->_expected_status === 'pd'
@ -135,7 +137,8 @@ final class MDPlausiForLegalStatus {
$msgs[] = [
'name' => $representation['name'],
'license' => $representation['license'],
'type' => 'expect_public_domain',
'reason' => MDPlausiLegalCheckReason::creator_dead_for_years,
'type' => MDPlausiLegalCheckResultType::expect_public_domain,
];
}
@ -147,7 +150,8 @@ final class MDPlausiForLegalStatus {
$msgs[] = [
'name' => $representation['name'],
'license' => $representation['license'],
'type' => 'expect_restricted_legal_status',
'reason' => MDPlausiLegalCheckReason::creator_recently_or_not_dead,
'type' => MDPlausiLegalCheckResultType::expect_restricted_legal_status,
'additional' => [
'representation' => $collective
],
@ -157,7 +161,8 @@ final class MDPlausiForLegalStatus {
$msgs[] = [
'name' => $representation['name'],
'license' => $representation['license'],
'type' => 'expect_restricted_legal_status',
'reason' => MDPlausiLegalCheckReason::creator_recently_or_not_dead,
'type' => MDPlausiLegalCheckResultType::expect_restricted_legal_status,
];
}
}
@ -170,18 +175,39 @@ final class MDPlausiForLegalStatus {
}
/**
* Formulates a human-readable, translated text message for a notice.
*
* @param MDTlLoader $tlLoader Translation loader.
* @param array{name: string, license: string, reason: MDPlausiLegalCheckReason, type: MDPlausiLegalCheckResultType, additional?: array{representation: MDCopyrightCollective}} $msg Input message.
*
* @return string
*/
private function _formulateText(MDTlLoader $tlLoader, array $msg):string {
$output = $tlLoader->tl("basis", "basis", "image") . ' "' . $msg['name'] . '": ' . $msg['reason']->getTl($tlLoader) . ' ' . $msg['type']->getTl($tlLoader);
$output .= ' ' . $tlLoader->tl("quality", "quality", "current_license") . ': ' . $msg['license'] . '.';
if (!empty($msg['additional'])) {
$output .= ' ' . $tlLoader->tl("quality", "quality", "creator_represented_by_copyright_collective") . ': ' . $msg['additional']['representation']->getName() . '.';
}
return $output;
}
/**
* Evaluates an object's representations' legal / licensing status based on
* the expected values.
*
* @param MDTlLoader $tlLoader Translation loader.
* @param array<array{name: string, license: string}> $representations Representations of the object.
* @param MDTlLoader $tlLoader Translation loader.
*
* @return array{has_warning: bool, msgs: array<array{name: string, license: string, type: string, text: string}>}
* @return array{has_warning: bool, msgs: array<array{name: string, license: string, reason: MDPlausiLegalCheckReason, type: MDPlausiLegalCheckResultType, text: string, link: string}>}
*/
public function evaluate(MDTlLoader $tlLoader, array $representations):array {
public function evaluate(MDTlLoader $tlLoader):array {
$evaluation = $this->evaluateSimple($representations);
$evaluation = $this->evaluateSimple();
if ($evaluation['has_warning'] === false) {
return ['has_warning' => false, 'msgs' => []];
}
@ -189,11 +215,18 @@ final class MDPlausiForLegalStatus {
$output = [];
foreach ($evaluation['msgs'] as $msg) {
throw new Exception("To be implemented");
if (!empty($msg['additional'])) {
$link = $msg['additional']['representation']->getContactForm();
}
else $link = '';
$output[] = [
'name' => $msg['name'],
'license' => $msg['license'],
'reason' => $msg['reason'],
'type' => $msg['type'],
'text' => $this->_formulateText($tlLoader, $msg),
'link' => $link,
];
}
@ -221,13 +254,15 @@ final class MDPlausiForLegalStatus {
/**
* Constructor.
*
* @param array<MDPlausiEvent> $events Events.
* @param array<MDPlausiEvent> $events Events.
* @param array<array{name: string, license: string}> $representations Representations of the object.
*
* @return void
*/
public function __construct(array $events) {
public function __construct(array $events, array $representations) {
$this->_events = $events;
$this->_representations = $representations;
$this->_categorizeEvents();
$this->_expected_status = $this->_determineExpectedStatus();

View File

@ -0,0 +1,119 @@
<?PHP
/**
* Describes a reason for a notice on why the provided copyright status of
* an object or its representations is invalid.
*
* @author Joshua Ramon Enslin <joshua@museum-digital.de>
*/
declare(strict_types = 1);
/**
* Represents a possible status for to-dos.
*/
enum MDPlausiLegalCheckReason implements JsonSerializable {
case creator_dead_for_years;
case creator_recently_or_not_dead;
/**
* Returns a value of this type based on a string.
*
* @param string $input Input to get a value from.
*
* @return MDPlausiLegalCheckReason
*/
public static function fromString(string $input):MDPlausiLegalCheckReason {
return match($input) {
'creator_dead_for_years' => self::creator_dead_for_years,
'creator_recently_or_not_dead' => self::creator_recently_or_not_dead,
default => throw new MDpageParameterNotFromListException("Unknown reason"),
};
}
/**
* Returns a value of this type based on a integer.
*
* @param integer $input Input to get a value from.
*
* @return MDPlausiLegalCheckReason
*/
public static function fromInt(int $input):MDPlausiLegalCheckReason {
return match($input) {
1 => self::creator_dead_for_years,
2 => self::creator_recently_or_not_dead,
default => throw new MDpageParameterNotFromListException("Unknown reason"),
};
}
/**
* Returns a numeric representation of the type, e.g. for efficient storage in a DB.
*
* @return integer
*/
public function toInt():int {
return match($this) {
self::creator_dead_for_years => 1,
self::creator_recently_or_not_dead => 2,
};
}
/**
* Lists all available names.
*
* @return array<string>
*/
public static function caseNames():array {
$output = [];
$cases = self::cases();
foreach ($cases as $case) {
$output[] = $case->name;
}
return $output;
}
/**
* Returns a translation for the entry.
*
* @param MDTlLoader $tlLoader Translation loader.
*
* @return string
*/
public function getTl(MDTlLoader $tlLoader):string {
$tl = $tlLoader->tl("quality", "quality", "legal_check_reason_" . $this->name);
$toReplaceWith = (string)match($this) {
self::creator_dead_for_years => MDPlausiForLegalStatus::YEARS_AFTER_DEATH_TO_PUBLIC_DOMAIN,
self::creator_recently_or_not_dead => MDPlausiForLegalStatus::YEARS_AFTER_DEATH_TO_PUBLIC_DOMAIN_CERTAIN,
};
if (str_contains($tl, "[placeholder_copyright_expiry]") === false) {
throw new Exception("Error in translating. Language " . $tlLoader->getLang() . " is missing placeholder [placeholder_copyright_expiry].");
}
return str_replace("[placeholder_copyright_expiry]", $toReplaceWith, $tl);
}
/**
* Provides the option to serialize as a string during json_encode().
*
* @return string
*/
public function jsonSerialize():string {
return $this->name;
}
}

View File

@ -0,0 +1,108 @@
<?PHP
/**
* Describes a suggestion / warning for possible invalid legal statuses of an object's
* or its representations legal status.
*
* @author Joshua Ramon Enslin <joshua@museum-digital.de>
*/
declare(strict_types = 1);
/**
* Represents a possible status for to-dos.
*/
enum MDPlausiLegalCheckResultType implements JsonSerializable {
case expect_public_domain;
case expect_restricted_legal_status;
/**
* Returns a value of this type based on a string.
*
* @param string $input Input to get a value from.
*
* @return MDPlausiLegalCheckResultType
*/
public static function fromString(string $input):MDPlausiLegalCheckResultType {
return match($input) {
'expect_public_domain' => self::expect_public_domain,
'expect_restricted_legal_status' => self::expect_restricted_legal_status,
default => throw new MDpageParameterNotFromListException("Unknown result type"),
};
}
/**
* Returns a value of this type based on a integer.
*
* @param integer $input Input to get a value from.
*
* @return MDPlausiLegalCheckResultType
*/
public static function fromInt(int $input):MDPlausiLegalCheckResultType {
return match($input) {
1 => self::expect_public_domain,
2 => self::expect_restricted_legal_status,
default => throw new MDpageParameterNotFromListException("Unknown result type"),
};
}
/**
* Returns a numeric representation of the type, e.g. for efficient storage in a DB.
*
* @return integer
*/
public function toInt():int {
return match($this) {
self::expect_public_domain => 1,
self::expect_restricted_legal_status => 2,
};
}
/**
* Lists all available names.
*
* @return array<string>
*/
public static function caseNames():array {
$output = [];
$cases = self::cases();
foreach ($cases as $case) {
$output[] = $case->name;
}
return $output;
}
/**
* Returns a translation for the entry.
*
* @param MDTlLoader $tlLoader Translation loader.
*
* @return string
*/
public function getTl(MDTlLoader $tlLoader):string {
return $tlLoader->tl("quality", "quality", "legal_check_msg_type_" . $this->name);
}
/**
* Provides the option to serialize as a string during json_encode().
*
* @return string
*/
public function jsonSerialize():string {
return $this->name;
}
}

View File

@ -9,6 +9,8 @@ declare(strict_types = 1);
use PHPUnit\Framework\TestCase;
require_once __DIR__ . '/../src/Checks/PlausiForLegalStatus/MDPlausiForLegalStatus.php';
require_once __DIR__ . '/../src/Checks/PlausiForLegalStatus/MDPlausiLegalCheckResultType.php';
require_once __DIR__ . '/../src/Checks/PlausiForLegalStatus/MDPlausiLegalCheckReason.php';
require_once __DIR__ . '/../src/Checks/Puqi/MDPuqi.php';
require_once __DIR__ . '/../src/Checks/Plausi/MDEventCategory.php';
require_once __DIR__ . '/../src/Checks/Plausi/MDPlausiEvent.php';
@ -37,8 +39,8 @@ final class MDPlausiForLegalStatusTest extends TestCase {
"",
"");
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent]);
$warningStatus = $plausiLegal->evaluateSimple([['name' => 'test.jpg', 'license' => 'RR-F']]);
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent], [['name' => 'test.jpg', 'license' => 'RR-F']]);
$warningStatus = $plausiLegal->evaluateSimple();
self::assertFalse($warningStatus['has_warning']);
self::assertEmpty($warningStatus['msgs']);
@ -61,12 +63,12 @@ final class MDPlausiForLegalStatusTest extends TestCase {
"1859",
"1900");
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent]);
$warningStatus = $plausiLegal->evaluateSimple([['name' => 'test.jpg', 'license' => 'RR-F']]);
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent], [['name' => 'test.jpg', 'license' => 'RR-F']]);
$warningStatus = $plausiLegal->evaluateSimple();
self::assertTrue($warningStatus['has_warning']);
self::assertNotEmpty($warningStatus['msgs']);
self::assertEquals('expect_public_domain', $warningStatus['msgs'][0]['type']);
self::assertEquals(MDPlausiLegalCheckResultType::expect_public_domain, $warningStatus['msgs'][0]['type']);
}
@ -85,12 +87,12 @@ final class MDPlausiForLegalStatusTest extends TestCase {
strval((int)date("Y") - 20),
date("Y"));
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent]);
$warningStatus = $plausiLegal->evaluateSimple([['name' => 'test.jpg', 'license' => 'Public Domain Mark']]);
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent], [['name' => 'test.jpg', 'license' => 'Public Domain Mark']]);
$warningStatus = $plausiLegal->evaluateSimple();
self::assertTrue($warningStatus['has_warning']);
self::assertNotEmpty($warningStatus['msgs']);
self::assertEquals('expect_restricted_legal_status', $warningStatus['msgs'][0]['type']);
self::assertEquals(MDPlausiLegalCheckResultType::expect_restricted_legal_status, $warningStatus['msgs'][0]['type']);
}
@ -109,12 +111,12 @@ final class MDPlausiForLegalStatusTest extends TestCase {
strval((int)date("Y") - 20),
"");
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent]);
$warningStatus = $plausiLegal->evaluateSimple([['name' => 'test.jpg', 'license' => 'Public Domain Mark']]);
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent], [['name' => 'test.jpg', 'license' => 'Public Domain Mark']]);
$warningStatus = $plausiLegal->evaluateSimple();
self::assertTrue($warningStatus['has_warning'], var_export($plausiLegal, true));
self::assertNotEmpty($warningStatus['msgs']);
self::assertEquals('expect_restricted_legal_status', $warningStatus['msgs'][0]['type']);
self::assertEquals(MDPlausiLegalCheckResultType::expect_restricted_legal_status, $warningStatus['msgs'][0]['type']);
}
@ -133,14 +135,14 @@ final class MDPlausiForLegalStatusTest extends TestCase {
strval((int)date("Y") - 20),
"");
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent]);
$plausiLegal = new MDPlausiForLegalStatus([$plausiEvent], [['name' => 'test.jpg', 'license' => 'Public Domain Mark']]);
$plausiLegal->setCreatorsRepresentedByCopyrightCollective(["Helmut Meyer" => MDCopyrightCollective::vg_bildkunst]);
$warningStatus = $plausiLegal->evaluateSimple([['name' => 'test.jpg', 'license' => 'Public Domain Mark']]);
$warningStatus = $plausiLegal->evaluateSimple();
self::assertTrue($warningStatus['has_warning']);
self::assertNotEmpty($warningStatus['msgs']);
self::assertEquals('expect_restricted_legal_status', $warningStatus['msgs'][0]['type']);
self::assertEquals(MDPlausiLegalCheckResultType::expect_restricted_legal_status, $warningStatus['msgs'][0]['type']);
self::assertArrayHasKey('additional', $warningStatus['msgs'][0]);
self::assertEquals(MDCopyrightCollective::vg_bildkunst, $warningStatus['msgs'][0]['additional']['representation']);

View File

@ -12,11 +12,17 @@ require_once __DIR__ . '/../src/Checks/Plausi/MDPlausi.php';
require_once __DIR__ . '/../src/Checks/Plausi/MDEventCategory.php';
require_once __DIR__ . '/../src/Checks/Plausi/MDPlausiEventCategory.php';
require_once __DIR__ . '/../src/Checks/Plausi/MDPlausiEvent.php';
require_once __DIR__ . '/../../MDTlLoader/src/MDTlLoader.php';
# require_once __DIR__ . '/../../MDTlLoader/src/MDTlLoader.php';
require_once __DIR__ . '/../../importer/dependencies/MDAllowedValueSets/src/MDRequirementsSet.php';
require_once __DIR__ . '/../../importer/dependencies/MDAllowedValueSets/src/MDValueSet.php';
require_once __DIR__ . '/../../importer/dependencies/MDAllowedValueSets/src/MDEventsSet.php';
/** For mocking */
class MDTlLoader {
public function tl() {
}
}
/**
* Tests for plausi.
*/