From 66397a3bd0796f868038e522812c4aadefcee257 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 14 Mar 2025 15:46:42 +0400 Subject: [PATCH 1/6] Init changelog & version 0.4.0p82 --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index eca9977..1eef20e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,5 @@ +## Release 0.4.0p82 du 14/03/2025-15:46 + ## Release 0.4.0p74 du 14/03/2025-15:44 * `4b84f11` début assocSchema From 6e93c7da625960f6c684d5ce1b8e7c67f5d9c723 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 16 Mar 2025 18:02:08 +0400 Subject: [PATCH 2/6] modifs.mineures sans commentaires --- src/schema/TODO.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/schema/TODO.md b/src/schema/TODO.md index a7a5233..1aea69f 100644 --- a/src/schema/TODO.md +++ b/src/schema/TODO.md @@ -1,5 +1,16 @@ # nulib\schema +* renommer AnalyzerContext en WrapperContext +* plus de {key} ni {orig} dans messages + * les messages standard ne sont utilisés que s'il n'y a pas de message dans + l'exception + * si instance de UserException, prendre le message "non technique" pour + résultat +* valeurs composite/computed + * analyse / vérification de la valeur complète après calcul du résultat, si + tous les résultats sont bons + * calcul des valeurs composites/computed par une fonction avant/après l'analyse + globale si résultat ok * tdate et tdatetime. qu'en est-il des autres classes (delay, etc.) * possibilité de spécifier le format de la date à analyser * ScalarSchema::from_property() @@ -8,6 +19,17 @@ Schema::ns($schema, [ MyType::class, null, "une valeur de type MyType" ]); + # ou + Schema::ns($schema, [ + [MyType::class => $params], null, "une valeur de type MyType" + ]); + ~~~ + MyType doit implémenter IType +* possibilité de spécifier une instance de type, e.g + ~~~php + Schema::ns($schema, [ + new MyType(), null, "une valeur de type MyType" + ]); ~~~ MyType doit implémenter IType * type générique construit à partir d'un nom de classe, e.g From 26b483a29fd6ab65fa3e3202bb8775578e23311d Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 17 Mar 2025 10:49:25 +0400 Subject: [PATCH 3/6] modifs.mineures sans commentaires --- src/schema/TODO.md | 27 ---------- ...AnalyzerContext.php => WrapperContext.php} | 2 +- src/schema/_scalar/ScalarWrapper.php | 8 +-- src/schema/types.php | 7 ++- src/schema/types/IType.php | 2 + src/schema/types/Registry.php | 13 ++++- src/schema/types/tgeneric.php | 52 +++++++++++++++++++ src/schema/types/tmixed.php | 2 +- 8 files changed, 77 insertions(+), 36 deletions(-) rename src/schema/{AnalyzerContext.php => WrapperContext.php} (96%) create mode 100644 src/schema/types/tgeneric.php diff --git a/src/schema/TODO.md b/src/schema/TODO.md index 1aea69f..46e80ce 100644 --- a/src/schema/TODO.md +++ b/src/schema/TODO.md @@ -1,6 +1,5 @@ # nulib\schema -* renommer AnalyzerContext en WrapperContext * plus de {key} ni {orig} dans messages * les messages standard ne sont utilisés que s'il n'y a pas de message dans l'exception @@ -14,32 +13,6 @@ * tdate et tdatetime. qu'en est-il des autres classes (delay, etc.) * possibilité de spécifier le format de la date à analyser * ScalarSchema::from_property() -* possibilité de spécifier un type via sa classe, e.g - ~~~php - Schema::ns($schema, [ - MyType::class, null, "une valeur de type MyType" - ]); - # ou - Schema::ns($schema, [ - [MyType::class => $params], null, "une valeur de type MyType" - ]); - ~~~ - MyType doit implémenter IType -* possibilité de spécifier une instance de type, e.g - ~~~php - Schema::ns($schema, [ - new MyType(), null, "une valeur de type MyType" - ]); - ~~~ - MyType doit implémenter IType -* type générique construit à partir d'un nom de classe, e.g - ~~~php - Schema::ns($schema, [ - MyClass::class, null, "une valeur de type MyClass" - ]); - ~~~ - MyClass ne doit pas implémenter IType, et le type correspondant est créé avec - `new tgeneric(MyClass::class)` * dans AssocSchema, support `[key_prefix]` qui permet de spécifier un préfixe commun aux champs dans le tableau destination, e.g diff --git a/src/schema/AnalyzerContext.php b/src/schema/WrapperContext.php similarity index 96% rename from src/schema/AnalyzerContext.php rename to src/schema/WrapperContext.php index 3136c04..5ee0d37 100644 --- a/src/schema/AnalyzerContext.php +++ b/src/schema/WrapperContext.php @@ -4,7 +4,7 @@ namespace nur\sery\wip\schema; use nur\sery\wip\schema\input\Input; use nur\sery\wip\schema\types\IType; -class AnalyzerContext { +class WrapperContext { function __construct(Schema $schema, Wrapper $wrapper, Input $input, $valueKey, Result $result) { $this->schema = $schema; $this->wrapper = $wrapper; diff --git a/src/schema/_scalar/ScalarWrapper.php b/src/schema/_scalar/ScalarWrapper.php index bfd0a81..0ea9596 100644 --- a/src/schema/_scalar/ScalarWrapper.php +++ b/src/schema/_scalar/ScalarWrapper.php @@ -4,7 +4,7 @@ namespace nur\sery\wip\schema\_scalar; use nulib\php\func; use nulib\ref\schema\ref_analyze; use nulib\ValueException; -use nur\sery\wip\schema\AnalyzerContext; +use nur\sery\wip\schema\WrapperContext; use nur\sery\wip\schema\input\Input; use nur\sery\wip\schema\types; use nur\sery\wip\schema\types\IType; @@ -74,7 +74,7 @@ class ScalarWrapper extends Wrapper { } /** analyser la valeur et résoudre son type */ - protected function analyze0(AnalyzerContext $context): int { + protected function analyze0(WrapperContext $context): int { /** @var ScalarSchema $schema */ $schema = $context->schema; $input = $context->input; @@ -171,7 +171,7 @@ class ScalarWrapper extends Wrapper { $valueKey = $this->valueKey; $result = $this->result; $result->reset(); - $context = new AnalyzerContext($schema, $this, $input, $valueKey, $result); + $context = new WrapperContext($schema, $this, $input, $valueKey, $result); /** @var func $analyzerFunc */ $analyzerFunc = $schema->analyzerFunc; @@ -243,7 +243,7 @@ class ScalarWrapper extends Wrapper { /** @var func $normalizerFunc */ $normalizerFunc = $schema->normalizerFunc; if ($normalizerFunc !== null) { - $context = new AnalyzerContext($schema, $this, $this->input, $valueKey, $result); + $context = new WrapperContext($schema, $this, $this->input, $valueKey, $result); $orig = $value; $value = $normalizerFunc->invoke([$orig, $context]); $modified = $value !== $orig; diff --git a/src/schema/types.php b/src/schema/types.php index 7e3442a..c1b618b 100644 --- a/src/schema/types.php +++ b/src/schema/types.php @@ -1,6 +1,7 @@ get($nullable, $name, $args, $definition); } diff --git a/src/schema/types/IType.php b/src/schema/types/IType.php index a245fd7..36f5fd4 100644 --- a/src/schema/types/IType.php +++ b/src/schema/types/IType.php @@ -10,6 +10,8 @@ use nur\sery\wip\schema\Schema; * Interface IType: un type de données */ interface IType { + static function get_params_from_definition(?array $definition): ?array; + /** * obtenir, pour information, le nom officiel de ce type, utilisable dans une * définition de schéma diff --git a/src/schema/types/Registry.php b/src/schema/types/Registry.php index eb16596..e7bdecd 100644 --- a/src/schema/types/Registry.php +++ b/src/schema/types/Registry.php @@ -3,6 +3,7 @@ namespace nur\sery\wip\schema\types; use nulib\cl; use nulib\php\func; +use nulib\ValueException; class Registry { const TYPES = [ @@ -31,8 +32,6 @@ class Registry { protected $types; function get(bool $nullable, ?string $name, ?array $args=null, ?array $definition=null): IType { - $name ??= "raw"; - $class = self::TYPES[$name]; if (cl::is_list($args)) { $key = array_key_last($args); $params = $args[$key]; @@ -41,6 +40,16 @@ class Registry { $params = $args; $args = null; } + $name ??= "raw"; + $class = cl::get(self::TYPES, $name); + if ($class === null) { + $class = $name; + if (!class_exists($class)) { + throw ValueException::invalid_type($class, IType::class); + } elseif (!is_subclass_of($class, IType::class)) { + return new tgeneric($class, $nullable, $params); + } + } $params = cl::merge($class::get_params_from_definition($definition), $params); if ($args || $params !== null) { $args ??= []; diff --git a/src/schema/types/tgeneric.php b/src/schema/types/tgeneric.php new file mode 100644 index 0000000..16f86a8 --- /dev/null +++ b/src/schema/types/tgeneric.php @@ -0,0 +1,52 @@ +class = $class; + parent::__construct($nullable, $params); + } + + protected string $class; + + function getClass(): string { + return $this->class; + } + + function isAvailable(Input $input, $valueKey): bool { + return $input->isAvailable($valueKey); + } + + public function isNull($value): bool { + return $value === null; + } + + function isValid($value, ?bool &$normalized=null): bool { + $normalized = true; + return $value instanceof $this->class; + } + + function parse(string $value) { + throw ValueException::invalid_type($value, $this->class); + } + + /** + * @var ScalarResult $result + * @var ScalarSchema $schema + */ + function verifix(&$value, Result $result, Schema $schema): bool { + $result->setNormalized(); + return false; + } + + function format($value, $format=null): string { + return strval($value); + } +} diff --git a/src/schema/types/tmixed.php b/src/schema/types/tmixed.php index 5f387c6..fa525eb 100644 --- a/src/schema/types/tmixed.php +++ b/src/schema/types/tmixed.php @@ -41,6 +41,6 @@ class tmixed extends _tsimple { } function format($value, $format=null): string { - return var_export($value, true); + return strval($value); } } From 69203352d81b8a35c4bd36a35d619f9feee10ce3 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 17 Mar 2025 11:43:05 +0400 Subject: [PATCH 4/6] modifs.mineures sans commentaires --- src/schema/Schema.php | 2 +- src/schema/TODO.md | 1 + src/schema/_scalar/ScalarResult.php | 1 - src/schema/_scalar/ScalarSchema.php | 5 +++++ src/schema/types/Registry.php | 2 +- tests/wip/schema/_assoc/AssocSchemaTest.php | 2 +- tests/wip/schema/_scalar/ScalarSchemaTest.php | 2 +- 7 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/schema/Schema.php b/src/schema/Schema.php index 0bbd86e..02365cb 100644 --- a/src/schema/Schema.php +++ b/src/schema/Schema.php @@ -164,7 +164,7 @@ abstract class Schema implements ArrayAccess { tcallable::ensure_ncallable($definition["normalizer_func"]); tarray::ensure_narray($definition["messages"]); tcallable::ensure_ncallable($definition["formatter_func"]); - tbool::ensure_nbool($definition["composite"]); + tbool::ensure_nbool($definition["computed"]); switch ($nature[0] ?? null) { case "assoc": diff --git a/src/schema/TODO.md b/src/schema/TODO.md index 46e80ce..5f50801 100644 --- a/src/schema/TODO.md +++ b/src/schema/TODO.md @@ -1,5 +1,6 @@ # nulib\schema +* instance de WrapperContext directement dans le schéma * plus de {key} ni {orig} dans messages * les messages standard ne sont utilisés que s'il n'y a pas de message dans l'exception diff --git a/src/schema/_scalar/ScalarResult.php b/src/schema/_scalar/ScalarResult.php index ee28c05..cb568d5 100644 --- a/src/schema/_scalar/ScalarResult.php +++ b/src/schema/_scalar/ScalarResult.php @@ -1,7 +1,6 @@ newWrapper(); + return $wrapper->reset($value, $valueKey, false); + } if (!($wrapper instanceof ScalarWrapper)) $wrapper = $this->newWrapper(); return $wrapper->reset($value, $valueKey); } diff --git a/src/schema/types/Registry.php b/src/schema/types/Registry.php index e7bdecd..fdaabde 100644 --- a/src/schema/types/Registry.php +++ b/src/schema/types/Registry.php @@ -17,7 +17,7 @@ class Registry { "array" => tarray::class, "callable" => tcallable::class, # types spéciaux - "raw" => tmixed::class, + "raw" => traw::class, "mixed" => tmixed::class, "key" => tkey::class, "pkey" => tpkey::class, diff --git a/tests/wip/schema/_assoc/AssocSchemaTest.php b/tests/wip/schema/_assoc/AssocSchemaTest.php index 25ebc31..4ac9fca 100644 --- a/tests/wip/schema/_assoc/AssocSchemaTest.php +++ b/tests/wip/schema/_assoc/AssocSchemaTest.php @@ -25,7 +25,7 @@ class AssocSchemaTest extends TestCase { "name" => null, "pkey" => null, "header" => null, - "composite" => null, + "computed" => null, ]; static function schema(array $definition, array $keyDefinitions): array { diff --git a/tests/wip/schema/_scalar/ScalarSchemaTest.php b/tests/wip/schema/_scalar/ScalarSchemaTest.php index 84fdd35..c862fa5 100644 --- a/tests/wip/schema/_scalar/ScalarSchemaTest.php +++ b/tests/wip/schema/_scalar/ScalarSchemaTest.php @@ -24,7 +24,7 @@ class ScalarSchemaTest extends TestCase { "name" => null, "pkey" => null, "header" => null, - "composite" => null, + "computed" => null, ]; static function schema(array $schema): array { From d6078e8b5241f8a695c7952c8f984169a9290cba Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 17 Mar 2025 13:56:32 +0400 Subject: [PATCH 5/6] modifs.mineures sans commentaires --- src/schema/_scalar/ScalarSchema.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/schema/_scalar/ScalarSchema.php b/src/schema/_scalar/ScalarSchema.php index 1a01418..a4c11bf 100644 --- a/src/schema/_scalar/ScalarSchema.php +++ b/src/schema/_scalar/ScalarSchema.php @@ -91,13 +91,11 @@ class ScalarSchema extends Schema { } function getWrapper(&$value=null, $valueKey=null, ?Wrapper &$wrapper=null): ScalarWrapper { - if ($value === null && $wrapper === null) { - # si pas de wrapper ni de valeur, pas de vérification et donc pas d'exception - $wrapper = $this->newWrapper(); - return $wrapper->reset($value, $valueKey, false); - } + # si pas de valeur ni de wrapper, pas de vérification et donc pas d'exception + # cf le code similaire dans ScalarWrapper::__construct() + $verifix = $value !== null || $wrapper !== null; if (!($wrapper instanceof ScalarWrapper)) $wrapper = $this->newWrapper(); - return $wrapper->reset($value, $valueKey); + return $wrapper->reset($value, $valueKey, $verifix); } ############################################################################# From 56fda96c782925d64ab4b9ef6dcc4c58ce65ab6c Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 17 Mar 2025 16:34:29 +0400 Subject: [PATCH 6/6] =?UTF-8?q?changer=20le=20type=20de=20variables=20g?= =?UTF-8?q?=C3=A9r=C3=A9es=20par=20EnvConfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nur_src/config/EnvConfig.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/nur_src/config/EnvConfig.php b/nur_src/config/EnvConfig.php index 12e95cb..80de154 100644 --- a/nur_src/config/EnvConfig.php +++ b/nur_src/config/EnvConfig.php @@ -15,10 +15,9 @@ use Throwable; * profil par défaut est dépendant de l'implémentation de IConfigManager * utilisée. Dans l'implémentation actuelle, 'ALL' est le profil par défaut. * - PKEY est le chemin de clé dans lequel les caractères '.' sont remplacés - * par '__' et '-' par '_' (celà signifie qu'il n'est pas possible de définir - * un chemin de clé qui contient le caractère '_') + * par '__' * - * par exemple, la valeur dbs.my-auth.type du profil par défaut est pris dans + * par exemple, la valeur dbs.my_auth.type du profil par défaut est pris dans * la variable 'CONFIG_ALL_dbs__my_auth__type'. pour le profil prod c'est la * variable 'CONFIG_prod_dbs__my_auth__type' * @@ -51,7 +50,9 @@ class EnvConfig extends DynConfig { $profile = substr($name, 0, $i); $name = substr($name, $i + 1); $pkey = str_replace("__", ".", $name); - $pkey = str_replace("_", "-", $pkey); + #XXX désactiver parce que les configurations sont plus généralement avec + # le caractères '_', par le caractères '-' + //$pkey = str_replace("_", "-", $pkey); return [$pkey, $profile]; }