modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2025-04-19 07:48:20 +04:00
parent 80fab7e636
commit 587df17273
27 changed files with 114 additions and 129 deletions

View File

@ -1,18 +1,13 @@
<?php <?php
namespace nulib; namespace nulib;
use nulib\A; use nulib\app\cli\Application;
use nulib\app\LockFile; use nulib\app\LockFile;
use nulib\app\RunFile; use nulib\app\RunFile;
use nulib\cl;
use nulib\ExitError;
use nulib\os\path; use nulib\os\path;
use nulib\os\sh; use nulib\os\sh;
use nulib\php\func; use nulib\php\func;
use nulib\str;
use nulib\ValueException;
use nur\cli\Application as nur_Application; use nur\cli\Application as nur_Application;
use nulib\app\cli\Application;
class app { class app {
private static function isa_Application($app): bool { private static function isa_Application($app): bool {

View File

@ -2,6 +2,7 @@
namespace nulib\app\cli; namespace nulib\app\cli;
use Exception; use Exception;
use nulib\app;
use nulib\app\RunFile; use nulib\app\RunFile;
use nulib\ExitError; use nulib\ExitError;
use nulib\ext\yaml; use nulib\ext\yaml;
@ -13,7 +14,6 @@ use nulib\ValueException;
use nur\cli\ArgsException; use nur\cli\ArgsException;
use nur\cli\ArgsParser; use nur\cli\ArgsParser;
use nur\config; use nur\config;
use nulib\app;
/** /**
* Class Application: application de base * Class Application: application de base

View File

@ -1,8 +1,6 @@
<?php <?php
namespace nulib\php\access; namespace nulib\php\access;
use nulib\cl;
/** /**
* Class GetAccess: accès à une valeur de $_GET * Class GetAccess: accès à une valeur de $_GET
*/ */

View File

@ -1,8 +1,6 @@
<?php <?php
namespace nulib\php\access; namespace nulib\php\access;
use ReflectionClass;
/** /**
* Interface IAccess: abstraction d'un accès complet à une valeur * Interface IAccess: abstraction d'un accès complet à une valeur
*/ */

View File

@ -3,7 +3,6 @@ namespace nulib\php\access;
use ArrayAccess; use ArrayAccess;
use nulib\cl; use nulib\cl;
use nulib\ref\schema\ref_schema;
/** /**
* Class KeyAccess: accès * Class KeyAccess: accès

View File

@ -1,8 +1,6 @@
<?php <?php
namespace nulib\php\access; namespace nulib\php\access;
use nulib\cl;
/** /**
* Class PostAccess: accès à une valeur de $_POST * Class PostAccess: accès à une valeur de $_POST
*/ */

View File

@ -5,7 +5,6 @@ use Exception;
use Generator; use Generator;
use Iterator; use Iterator;
use IteratorAggregate; use IteratorAggregate;
use nulib\php\ICloseable;
use nulib\StopException; use nulib\StopException;
use nulib\ValueException; use nulib\ValueException;
use Traversable; use Traversable;

View File

@ -1,98 +1,67 @@
<?php <?php
namespace nulib\schema; namespace nulib\schema;
use nulib\ref\schema\ref_analyze;
use nulib\ValueException; use nulib\ValueException;
class ConsolidatedResult extends Result { class ConsolidatedResult extends Result {
function addMissingMessage(Wrapper $wrapper): void { protected int $highestResult;
$this->resultAvailable = true;
$this->present = false; function reset(): void {
$this->available = false; parent::reset();
$this->null = false; $this->highestResult = -1;
$this->valid = false; }
$this->messageKey = "missing";
protected function _addMessage(Wrapper $wrapper, $prefix=null): void {
$result = $wrapper->getResult(); $result = $wrapper->getResult();
$resultException = $result->exception;
$resultMessage = $result->message;
if ($resultException !== null) {
$tmessage = ValueException::get_message($resultException);
if ($tmessage) {
if ($resultMessage !== null) $resultMessage .= ": ";
$resultMessage .= $tmessage;
}
}
$message = $this->message; $message = $this->message;
if ($message) $message .= "\n"; if ($message) $message .= "\n";
$message .= $resultMessage; if ($prefix !== null) $message .= "$prefix: ";
$message .= $result->message;
$this->message = $message; $this->message = $message;
} }
function addUnavailableMessage(Wrapper $wrapper): void { function addMissingMessage(Wrapper $wrapper, $prefix=null): void {
$this->resultAvailable = true; if ($this->highestResult < ref_analyze::MISSING) {
$this->present = true; $this->present = false;
$this->available = false; $this->available = false;
$this->null = false; $this->null = false;
$this->valid = false; $this->valid = false;
$this->messageKey = "unavailable"; $this->messageKey = "missing";
$result = $wrapper->getResult();
$resultException = $result->exception;
$resultMessage = $result->message;
if ($resultException !== null) {
$tmessage = ValueException::get_message($resultException);
if ($tmessage) {
if ($resultMessage !== null) $resultMessage .= ": ";
$resultMessage .= $tmessage;
}
} }
$message = $this->message; $this->_addMessage($wrapper, $prefix);
if ($message) $message .= "\n";
$message .= $resultMessage;
$this->message = $message;
} }
function addNullMessage(Wrapper $wrapper): void { function addUnavailableMessage(Wrapper $wrapper, $prefix=null): void {
$this->resultAvailable = true; if ($this->highestResult < ref_analyze::UNAVAILABLE) {
$this->present = true; $this->present = true;
$this->available = true; $this->available = false;
$this->null = true; $this->null = false;
$this->valid = false; $this->valid = false;
$this->messageKey = "null"; $this->messageKey = "unavailable";
$result = $wrapper->getResult();
$resultException = $result->exception;
$resultMessage = $result->message;
if ($resultException !== null) {
$tmessage = ValueException::get_message($resultException);
if ($tmessage) {
if ($resultMessage !== null) $resultMessage .= ": ";
$resultMessage .= $tmessage;
}
} }
$message = $this->message; $this->_addMessage($wrapper, $prefix);
if ($message) $message .= "\n";
$message .= $resultMessage;
$this->message = $message;
} }
function addInvalidMessage(Wrapper $wrapper): void { function addNullMessage(Wrapper $wrapper, $prefix=null): void {
$this->resultAvailable = true; if ($this->highestResult < ref_analyze::NULL) {
$this->present = true; $this->present = true;
$this->available = true; $this->available = true;
$this->null = false; $this->null = true;
$this->valid = false; $this->valid = false;
$this->messageKey = "invalid"; $this->messageKey = "null";
$result = $wrapper->getResult();
$resultException = $result->exception;
$resultMessage = $result->message;
if ($resultException !== null) {
$tmessage = ValueException::get_message($resultException);
if ($tmessage) {
if ($resultMessage !== null) $resultMessage .= ": ";
$resultMessage .= $tmessage;
}
} }
$message = $this->message; $this->_addMessage($wrapper, $prefix);
if ($message) $message .= "\n"; }
$message .= $resultMessage;
$this->message = $message; function addInvalidMessage(Wrapper $wrapper, $prefix=null): void {
if ($this->highestResult < ref_analyze::INVALID) {
$this->present = true;
$this->available = true;
$this->null = false;
$this->valid = false;
$this->messageKey = "invalid";
}
$this->_addMessage($wrapper, $prefix);
} }
} }

View File

@ -39,7 +39,7 @@ class Result {
public ?string $messageKey; public ?string $messageKey;
public ?string $message; public ?string $message;
public ?Throwable $exception; public ?Throwable $exception;
public ?string $origValue; public $origValue;
public $normalizedValue; public $normalizedValue;
/** réinitialiser tous les objets résultats accessibles via cet objet */ /** réinitialiser tous les objets résultats accessibles via cet objet */
@ -119,11 +119,9 @@ class Result {
$this->valid = false; $this->valid = false;
$this->origValue = $value; $this->origValue = $value;
$this->messageKey = $messageKey = "invalid"; $this->messageKey = $messageKey = "invalid";
$message = $this->getMessage($messageKey, $schema); $message = null;
if ($exception !== null) { if ($exception !== null) $message = ValueException::get_message($exception);
$tmessage = ValueException::get_message($exception); if (!$message) $message = $this->getMessage($messageKey, $schema);
if ($tmessage) $message = $tmessage;
}
$this->message = $message; $this->message = $message;
$this->exception = $exception; $this->exception = $exception;
return ref_analyze::INVALID; return ref_analyze::INVALID;

View File

@ -12,8 +12,8 @@ use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\types\IType; use nulib\schema\types\IType;
use nulib\schema\types\tarray; use nulib\schema\types\tarray;
use nulib\schema\types\tbool; use nulib\schema\types\tbool;
use nulib\schema\types\tfunc;
use nulib\schema\types\tcontent; use nulib\schema\types\tcontent;
use nulib\schema\types\tfunc;
use nulib\schema\types\tpkey; use nulib\schema\types\tpkey;
use nulib\schema\types\trawstring; use nulib\schema\types\trawstring;

View File

@ -3,9 +3,9 @@ namespace nulib\schema\_assoc;
use nulib\cl; use nulib\cl;
use nulib\ref\schema\ref_schema; use nulib\ref\schema\ref_schema;
use nulib\ValueException;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\schema\Wrapper; use nulib\schema\Wrapper;
use nulib\ValueException;
/** /**
* Class AssocSchema * Class AssocSchema

View File

@ -105,18 +105,21 @@ class AssocWrapper extends Wrapper {
$result = $context->consolidatedResult; $result = $context->consolidatedResult;
$result->setValid(); $result->setValid();
foreach ($context->keyWrappers as $keyWrapper) { foreach ($context->keyWrappers as $key => $keyWrapper) {
$keyWrapper->analyze($params); $keyWrapper->analyze($params);
if ($keyWrapper->isValid()) continue; if ($keyWrapper->isValid()) continue;
$what = ref_analyze::INVALID; $what = ref_analyze::INVALID;
#XXX utiliser si possible la description ou une autre valeur "user-friendly"
# possibilité de sélectionner la valeur à utiliser dans $params?
$prefix = $key;
if (!$keyWrapper->isPresent()) { if (!$keyWrapper->isPresent()) {
$result->addMissingMessage($keyWrapper); $result->addMissingMessage($keyWrapper, $prefix);
} elseif (!$keyWrapper->isAvailable()) { } elseif (!$keyWrapper->isAvailable()) {
$result->addUnavailableMessage($keyWrapper); $result->addUnavailableMessage($keyWrapper, $prefix);
} elseif ($keyWrapper->isNull()) { } elseif ($keyWrapper->isNull()) {
$result->addNullMessage($keyWrapper); $result->addNullMessage($keyWrapper, $prefix);
} else { } else {
$result->addInvalidMessage($keyWrapper); $result->addInvalidMessage($keyWrapper, $prefix);
} }
} }

View File

@ -2,9 +2,9 @@
namespace nulib\schema\_list; namespace nulib\schema\_list;
use nulib\ref\schema\ref_schema; use nulib\ref\schema\ref_schema;
use nulib\ValueException;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\schema\Wrapper; use nulib\schema\Wrapper;
use nulib\ValueException;
class ListSchema extends Schema { class ListSchema extends Schema {
/** @var array meta-schema d'un schéma de nature liste */ /** @var array meta-schema d'un schéma de nature liste */

View File

@ -1,11 +1,10 @@
<?php <?php
namespace nulib\schema\_scalar; namespace nulib\schema\_scalar;
use nulib\cl;
use nulib\ref\schema\ref_schema; use nulib\ref\schema\ref_schema;
use nulib\ValueException;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\schema\Wrapper; use nulib\schema\Wrapper;
use nulib\ValueException;
/** /**
* Class ScalarSchema * Class ScalarSchema

View File

@ -1,11 +1,11 @@
<?php <?php
namespace nulib\schema\input; namespace nulib\schema\input;
use nulib\ref\schema\ref_input;
use nulib\StateException;
use nulib\php\access\IAccess; use nulib\php\access\IAccess;
use nulib\php\access\KeyAccess; use nulib\php\access\KeyAccess;
use nulib\php\access\PropertyAccess; use nulib\php\access\PropertyAccess;
use nulib\ref\schema\ref_input;
use nulib\StateException;
/** /**
* Class Input: accès à une valeur * Class Input: accès à une valeur

View File

@ -1,14 +1,13 @@
<?php <?php
namespace nulib\schema; namespace nulib\schema;
use nulib\ValueException;
use nulib\schema\types\IType; use nulib\schema\types\IType;
use nulib\schema\types\Registry; use nulib\schema\types\Registry;
use nulib\schema\types\tarray; use nulib\schema\types\tarray;
use nulib\schema\types\tbool; use nulib\schema\types\tbool;
use nulib\schema\types\tfunc;
use nulib\schema\types\tcontent; use nulib\schema\types\tcontent;
use nulib\schema\types\tfloat; use nulib\schema\types\tfloat;
use nulib\schema\types\tfunc;
use nulib\schema\types\tint; use nulib\schema\types\tint;
use nulib\schema\types\tkey; use nulib\schema\types\tkey;
use nulib\schema\types\tmixed; use nulib\schema\types\tmixed;
@ -17,6 +16,7 @@ use nulib\schema\types\traw;
use nulib\schema\types\trawstring; use nulib\schema\types\trawstring;
use nulib\schema\types\tstring; use nulib\schema\types\tstring;
use nulib\schema\types\ttext; use nulib\schema\types\ttext;
use nulib\ValueException;
/** /**
* Class types: classe outil pour gérer le registre de types * Class types: classe outil pour gérer le registre de types

View File

@ -1,10 +1,10 @@
<?php <?php
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\ValueException;
use nulib\schema\input\Input; use nulib\schema\input\Input;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\ValueException;
/** /**
* Interface IType: un type de données * Interface IType: un type de données

View File

@ -1,9 +1,8 @@
<?php <?php
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\StateException;
use nur\prop;
use nulib\schema\input\Input; use nulib\schema\input\Input;
use nur\prop;
use nur\str; use nur\str;
abstract class _tsimple implements IType { abstract class _tsimple implements IType {

View File

@ -2,7 +2,6 @@
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\cl; use nulib\cl;
use nulib\ValueException;
use nulib\schema\_scalar\ScalarSchema; use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;

View File

@ -2,12 +2,12 @@
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\cl; use nulib\cl;
use nulib\ValueException;
use nur\prop;
use nulib\schema\_scalar\ScalarSchema; use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\input\Input; use nulib\schema\input\Input;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\ValueException;
use nur\prop;
class tbool extends _tformatable { class tbool extends _tformatable {
const NAME = "bool"; const NAME = "bool";
@ -60,7 +60,7 @@ class tbool extends _tformatable {
} }
function getMissingValue(?bool &$valid=null) { function getMissingValue(?bool &$valid=null) {
$valid = !$this->nullable; $valid = false;
return null; return null;
} }

View File

@ -1,10 +1,10 @@
<?php <?php
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\ValueException;
use nulib\schema\_scalar\ScalarSchema; use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\ValueException;
class tfloat extends _tformatable { class tfloat extends _tformatable {
const NAME = "float"; const NAME = "float";

View File

@ -3,10 +3,10 @@ namespace nulib\schema\types;
use Exception; use Exception;
use nulib\php\func; use nulib\php\func;
use nulib\ValueException;
use nulib\schema\_scalar\ScalarSchema; use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\ValueException;
class tfunc extends _tsimple { class tfunc extends _tsimple {
const NAME = "func"; const NAME = "func";

View File

@ -1,11 +1,10 @@
<?php <?php
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\ValueException;
use nulib\schema\_scalar\ScalarSchema; use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\input\Input;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\ValueException;
class tgeneric extends _tsimple { class tgeneric extends _tsimple {
function __construct(string $class, bool $nullable, ?array $params=null) { function __construct(string $class, bool $nullable, ?array $params=null) {

View File

@ -1,10 +1,10 @@
<?php <?php
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\ValueException;
use nulib\schema\_scalar\ScalarSchema; use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\ValueException;
class tint extends _tformatable { class tint extends _tformatable {
const NAME = "int"; const NAME = "int";

View File

@ -1,10 +1,10 @@
<?php <?php
namespace nulib\schema\types; namespace nulib\schema\types;
use nulib\str;
use nulib\schema\_scalar\ScalarSchema; use nulib\schema\_scalar\ScalarSchema;
use nulib\schema\Result; use nulib\schema\Result;
use nulib\schema\Schema; use nulib\schema\Schema;
use nulib\str;
class trawstring extends _tstring { class trawstring extends _tstring {
const NAME = "rawstring"; const NAME = "rawstring";

View File

@ -6,6 +6,7 @@ use nulib\tests\TestCase;
use nulib\ValueException; use nulib\ValueException;
use nulib\schema\_scalar\ScalarSchemaTest; use nulib\schema\_scalar\ScalarSchemaTest;
use nulib\schema\Schema; use nulib\schema\Schema;
use PHPStan\Type\Enum\EnumCaseObjectType;
class AssocSchemaTest extends TestCase { class AssocSchemaTest extends TestCase {
const NULL_SCHEMA = [ const NULL_SCHEMA = [
@ -32,6 +33,8 @@ class AssocSchemaTest extends TestCase {
"messages" => null, "messages" => null,
"formatter_func" => null, "formatter_func" => null,
"format" => null, "format" => null,
"size" => null,
"precision" => null,
"name" => null, "name" => null,
"pkey" => null, "pkey" => null,
"header" => null, "header" => null,
@ -169,8 +172,8 @@ class AssocSchemaTest extends TestCase {
"b" => false, "b" => false,
], $array); ], $array);
// false équivaut à absent // false équivaut à absent, sauf pour "b" qui est de type bool
$array = ["s" => false, "i" => false, "b" => null]; $array = ["s" => false, "i" => false, "b" => false];
$schema->getWrapper($array, null, ["ensure_keys" => true]); $schema->getWrapper($array, null, ["ensure_keys" => true]);
self::assertSame([ self::assertSame([
"s" => "", "s" => "",
@ -178,9 +181,11 @@ class AssocSchemaTest extends TestCase {
"b" => false, "b" => false,
], $array); ], $array);
$array = ["s" => false, "i" => false, "b" => null]; $array = ["s" => false, "i" => false, "b" => false];
$schema->getWrapper($array, null, ["ensure_keys" => false]); $schema->getWrapper($array, null, ["ensure_keys" => false]);
self::assertSame([], $array); self::assertSame([
"b" => false,
], $array);
} }
const STRING_SCHEMA = [ const STRING_SCHEMA = [
@ -363,4 +368,29 @@ class AssocSchemaTest extends TestCase {
$schema->getWrapper($array); $schema->getWrapper($array);
}); });
} }
function testMessage() {
$schema = new AssocSchema([
"rs" => ["string", "required" => true],
"i" => ["int"],
]);
$value = [];
$result = $schema->getWrapper($value, null, ["throw" => false])->getResult(null);
$expectedMessage = <<<EOT
rs: vous devez spécifier cette valeur
EOT;
self::assertSame($expectedMessage, $result->message);
$value = [
"rs" => null,
"i" => "abc",
];
$result = $schema->getWrapper($value, null, ["throw" => false])->getResult(null);
$expectedMessage = <<<EOT
rs: cette valeur ne doit pas être nulle
i: une valeur numérique entière est attendue
EOT;
self::assertSame($expectedMessage, $result->message);
}
} }

View File

@ -19,6 +19,8 @@ class ScalarSchemaTest extends TestCase {
"messages" => null, "messages" => null,
"formatter_func" => null, "formatter_func" => null,
"format" => null, "format" => null,
"size" => null,
"precision" => null,
"" => [ "" => [
"scalar", "scalar",
"compute_func" => null, "compute_func" => null,