diff --git a/.composer.yaml b/.composer.yaml
index 64a027f..d6ec37d 100644
--- a/.composer.yaml
+++ b/.composer.yaml
@@ -1,8 +1,8 @@
# -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
-composer_php_min: '7.4'
+composer_php_min: '7.3'
composer_php_max: '8.0'
composer_registry: pubdocker.univ-reunion.fr
-composer_image: image/phpbuilder:d11
+composer_image: image/phpbuilder:d10
defaults:
master:
allow_link: true
diff --git a/.idea/nur-sery.iml b/.idea/nur-sery.iml
index d492cf6..6dca733 100644
--- a/.idea/nur-sery.iml
+++ b/.idea/nur-sery.iml
@@ -3,7 +3,6 @@
-
diff --git a/.idea/php.xml b/.idea/php.xml
index 31dc4ce..327efe2 100644
--- a/.idea/php.xml
+++ b/.idea/php.xml
@@ -45,7 +45,7 @@
-
+
diff --git a/composer.json b/composer.json
index d51c33d..17d5453 100644
--- a/composer.json
+++ b/composer.json
@@ -14,10 +14,10 @@
],
"require": {
"nulib/php": "dev-wip",
- "php": ">=7.4"
+ "php": ">=7.3"
},
"require-dev": {
- "nulib/tests": "9",
+ "nulib/tests": "7.3",
"phpunit/phpunit": "^9"
},
"autoload": {
diff --git a/composer.lock b/composer.lock
index 76593ac..3511d9e 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "35175827c89c36554dda904ee7e0658d",
+ "content-hash": "3255ed049bfe20f7ca8dfc802bcf506e",
"packages": [
{
"name": "nulib/php",
@@ -12,7 +12,7 @@
"dist": {
"type": "path",
"url": "../nulib",
- "reference": "7cac433cbc8890b4aa6787a12da3a87cc0bb6c3d"
+ "reference": "ae65a36505313c06f822797f4dca58476af065eb"
},
"require": {
"php": ">=7.3"
@@ -231,7 +231,7 @@
},
{
"name": "nulib/tests",
- "version": "9",
+ "version": "7.3",
"source": {
"type": "git",
"url": "https://git.univ-reunion.fr/sda-php/nulib-tests.git",
@@ -1760,16 +1760,16 @@
},
{
"name": "theseer/tokenizer",
- "version": "1.2.1",
+ "version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
+ "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
"shasum": ""
},
"require": {
@@ -1798,7 +1798,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.2"
},
"funding": [
{
@@ -1806,7 +1806,7 @@
"type": "github"
}
],
- "time": "2021-07-28T10:34:58+00:00"
+ "time": "2023-11-20T00:12:19+00:00"
}
],
"aliases": [],
@@ -1817,7 +1817,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
- "php": ">=7.4"
+ "php": ">=7.3"
},
"platform-dev": [],
"plugin-api-version": "2.2.0"
diff --git a/doc/schema.md b/doc/schema.md
index 4d7689c..5f3907c 100644
--- a/doc/schema.md
+++ b/doc/schema.md
@@ -39,30 +39,26 @@ La nature indique le type de données représenté par le schéma.
"title" => "libellé de la valeur",
"required" => false,
"nullable" => true,
- "desc" => description de la valeur,
+ "desc" => "description de la valeur",
"name" => "identifiant de la valeur",
],
ITEM_SCHEMA,
];
~~~
- les champs required, nullable, title et desc ne sont considérés que s'ils ne
- sont pas déjà définis dans un schéma parent.
* nature tableau associatif: modélise un tableau associatif
~~~php
const ASSOC_SCHEMA = [
- "" => [assoc",
+ "" => ["assoc",
"title" => "libellé de la valeur",
"required" => false,
"nullable" => true,
- "desc" => description de la valeur,
+ "desc" => "description de la valeur",
"name" => "identifiant de la valeur",
],
KEY => VALUE_SCHEMA,
...
];
~~~
- les champs required, nullable, title et desc ne sont considérés que s'ils ne
- sont pas déjà définis dans un schéma parent.
## Schéma d'une valeur scalaire
diff --git a/src/schema/AssocSchema.php b/src/schema/AssocSchema.php
new file mode 100644
index 0000000..af722f6
--- /dev/null
+++ b/src/schema/AssocSchema.php
@@ -0,0 +1,40 @@
+definition = $definition;
+ }
+}
diff --git a/src/schema/ListSchema.php b/src/schema/ListSchema.php
new file mode 100644
index 0000000..0f9b6aa
--- /dev/null
+++ b/src/schema/ListSchema.php
@@ -0,0 +1,40 @@
+definition = $definition;
+ }
+}
diff --git a/src/schema/OldSchema.php b/src/schema/OldSchema.php
new file mode 100644
index 0000000..29e1b27
--- /dev/null
+++ b/src/schema/OldSchema.php
@@ -0,0 +1,129 @@
+ indique ce qu'est la valeur qu'on vérifixe
+# retourne MISSING (la valeur n'existe pas)
+# NULL (la valeur existe mais est nulle)
+# STRING (la valeur est une chaine qu'il faut parser)
+# INVALID (la valeur n'est pas du bon type et il n'est pas possible de la convertir)
+# VALID (la valeur est dans le bon type)
+# extract() et [extractor_func] --> si analyze() retourne STRING, extraire la
+# chaine à parser
+# parse() et [parser_func] --> parser la chaine et retourner la valeur
+# format() et [formatter_func] --> formatter la valeur et retourner une chaine
+
+class OldSchema {
+ /**
+ * créer une nouvelle instance de cette classe à partir d'un schéma
+ *
+ * @param bool $normalized indique si le schéma est normalisé
+ * normalisé
+ */
+ static function new(&$md, $schema, bool $normalized=false): self {
+ if ($md === null) $md = new static($schema, !$normalized);
+ return $md;
+ }
+
+ static function normalize($schema): array {
+ if ($schema === null) throw new SchemaException("schema is required");
+ elseif (!is_array($schema)) $schema = [$schema];
+ #XXX
+ return $schema;
+ }
+
+ const SCHEMA = null;
+
+ function __construct($schema=null, bool $normalize=true) {
+ if ($schema === null) $schema = static::SCHEMA;
+ if ($normalize) $schema = self::normalize($schema);
+ $this->schema = $schema;
+ }
+
+ /**
+ * @var array schéma normalisé
+ *
+ * il y a 3 formes pour un schéma:
+ * - schéma valeur scalaire [0 => type, 1 => default, ...]
+ * - schéma tableau séquentiel [schema]
+ * - schéma tableau associatif [key => schema, ...]
+ */
+ protected $schema;
+
+ /**
+ * retourner true si le schéma est pour une valeur scalaire, false s'il s'agit
+ * du schéma d'un tableau (séquentiel ou associatif)
+ */
+ function isScalar(): bool {
+ return array_key_exists(0, $this->schema) && array_key_exists(1, $this->schema);
+ }
+
+ /** retourner true si le schéma est pour un tableau séquentiel */
+ function isSeq(): bool {
+ return array_key_exists(0, $this->schema) && !array_key_exists(1, $this->schema);
+ }
+
+ /** retourner true si le schéma est pour un tableau associatif */
+ function isAssoc(): bool {
+ return !array_key_exists(0, $this->schema) && !array_key_exists(1, $this->schema);
+ }
+
+ /**
+ * @var bool true si toutes les clés du schéma doivent exister, avec leur
+ * valeur par défaut le cas échéant
+ */
+ protected $ppEnsureKeys;
+
+ /** @var bool true si les clés doivent être dans l'ordre du schéma */
+ protected $ppOrderKeys;
+
+ /**
+ * @var bool true si les valeurs doivent être automatiquement vérifiées et
+ * corrigées
+ */
+ protected $ppVerifix;
+
+ function ensureSchema(&$value, $key=null, ?array $params=null): void {
+ }
+
+ /** retourner true si la valeur est scalaire */
+ function getScalar(&$value, $key=null, ?ScalarValue &$scalar=null): bool {
+ if (!$this->isScalar()) return false;
+ if ($value instanceof Input) $input = $value;
+ else $input = new Input($value);
+ $scalar = new ScalarValue($input, $this->schema, $key);
+ return true;
+ }
+
+ /** retourner true la valeur est un tableau séquentiel */
+ function getSeq(&$value, $key=null, ?SeqValue &$seq=null): bool {
+ if (!$this->isSeq()) return false;
+ if ($value instanceof Input) $input = $value;
+ else $input = new Input($value);
+ $seq = new SeqValue($input, $this->schema, $key);
+ return true;
+ }
+
+ /** retourner true la valeur est un tableau associatif */
+ function getAssoc(&$value, $key=null, ?AssocValue &$assoc=null): bool {
+ if (!$this->isAssoc()) return false;
+ if ($value instanceof Input) $input = $value;
+ else $input = new Input($value);
+ $assoc = new AssocValue($input, $this->schema, $key);
+ return true;
+ }
+
+ function getValue(&$value, $key=null): IValue {
+ if ($this->getScalar($input, $key, $scalar)) return $scalar;
+ elseif ($this->getSeq($input, $key, $seq)) return $seq;
+ elseif ($this->getAssoc($input, $key, $assoc)) return $assoc;
+ else throw StateException::unexpected_state();
+ }
+}
diff --git a/src/schema/ScalarSchema.php b/src/schema/ScalarSchema.php
new file mode 100644
index 0000000..5a1f221
--- /dev/null
+++ b/src/schema/ScalarSchema.php
@@ -0,0 +1,48 @@
+ 1;
+ }
+
+ static function normalize($definition): array {
+
+ }
+
+ function __construct($definition=null, bool $normalize=true) {
+ if ($definition === null) $definition = static::SCHEMA;
+ if ($normalize) $definition = self::normalize($definition);
+ $this->definition = $definition;
+ }
+}
diff --git a/src/schema/Schema.php b/src/schema/Schema.php
index 7ec51ae..5519a1d 100644
--- a/src/schema/Schema.php
+++ b/src/schema/Schema.php
@@ -1,129 +1,31 @@
indique ce qu'est la valeur qu'on vérifixe
-# retourne MISSING (la valeur n'existe pas)
-# NULL (la valeur existe mais est nulle)
-# STRING (la valeur est une chaine qu'il faut parser)
-# INVALID (la valeur n'est pas du bon type et il n'est pas possible de la convertir)
-# VALID (la valeur est dans le bon type)
-# extract() et [extractor_func] --> si analyze() retourne STRING, extraire la
-# chaine à parser
-# parse() et [parser_func] --> parser la chaine et retourner la valeur
-# format() et [formatter_func] --> formatter la valeur et retourner une chaine
-
-class Schema {
+abstract class Schema {
/**
- * créer une nouvelle instance de cette classe à partir d'un schéma
- *
- * @param bool $normalized indique si le schéma est normalisé
- * normalisé
+ * créer si besoin une nouvelle instance à partir d'une définition de schéma
*/
- static function new(&$md, $schema, bool $normalized=false): self {
- if ($md === null) $md = new static($schema, !$normalized);
+ static function new(&$md, $definition): self {
+ if ($md === null) {
+ if (AssocSchema::isa_definition($definition)) {
+ $md = new AssocSchema($definition);
+ } elseif (ListSchema::isa_definition($definition)) {
+ $md = new ListSchema($definition);
+ } elseif (ScalarSchema::isa_definition($definition)) {
+ $md = new ScalarSchema($definition);
+ } else {
+ throw SchemaException::invalid_schema();
+ }
+ }
return $md;
}
- static function normalize($schema): array {
- if ($schema === null) throw new SchemaException("schema is required");
- elseif (!is_array($schema)) $schema = [$schema];
- #XXX
- return $schema;
- }
-
+ /**
+ * @var array définition du schéma, à redéfinir le cas échéant dans une classe
+ * dérivée
+ */
const SCHEMA = null;
- function __construct($schema=null, bool $normalize=true) {
- if ($schema === null) $schema = static::SCHEMA;
- if ($normalize) $schema = self::normalize($schema);
- $this->schema = $schema;
- }
-
- /**
- * @var array schéma normalisé
- *
- * il y a 3 formes pour un schéma:
- * - schéma valeur scalaire [0 => type, 1 => default, ...]
- * - schéma tableau séquentiel [schema]
- * - schéma tableau associatif [key => schema, ...]
- */
- protected $schema;
-
- /**
- * retourner true si le schéma est pour une valeur scalaire, false s'il s'agit
- * du schéma d'un tableau (séquentiel ou associatif)
- */
- function isScalar(): bool {
- return array_key_exists(0, $this->schema) && array_key_exists(1, $this->schema);
- }
-
- /** retourner true si le schéma est pour un tableau séquentiel */
- function isSeq(): bool {
- return array_key_exists(0, $this->schema) && !array_key_exists(1, $this->schema);
- }
-
- /** retourner true si le schéma est pour un tableau associatif */
- function isAssoc(): bool {
- return !array_key_exists(0, $this->schema) && !array_key_exists(1, $this->schema);
- }
-
- /**
- * @var bool true si toutes les clés du schéma doivent exister, avec leur
- * valeur par défaut le cas échéant
- */
- protected $ppEnsureKeys;
-
- /** @var bool true si les clés doivent être dans l'ordre du schéma */
- protected $ppOrderKeys;
-
- /**
- * @var bool true si les valeurs doivent être automatiquement vérifiées et
- * corrigées
- */
- protected $ppVerifix;
-
- function ensureSchema(&$value, $key=null, ?array $params=null): void {
- }
-
- /** retourner true si la valeur est scalaire */
- function getScalar(&$value, $key=null, ?ScalarValue &$scalar=null): bool {
- if (!$this->isScalar()) return false;
- if ($value instanceof Input) $input = $value;
- else $input = new Input($value);
- $scalar = new ScalarValue($input, $this->schema, $key);
- return true;
- }
-
- /** retourner true la valeur est un tableau séquentiel */
- function getSeq(&$value, $key=null, ?SeqValue &$seq=null): bool {
- if (!$this->isSeq()) return false;
- if ($value instanceof Input) $input = $value;
- else $input = new Input($value);
- $seq = new SeqValue($input, $this->schema, $key);
- return true;
- }
-
- /** retourner true la valeur est un tableau associatif */
- function getAssoc(&$value, $key=null, ?AssocValue &$assoc=null): bool {
- if (!$this->isAssoc()) return false;
- if ($value instanceof Input) $input = $value;
- else $input = new Input($value);
- $assoc = new AssocValue($input, $this->schema, $key);
- return true;
- }
-
- function getValue(&$value, $key=null): IValue {
- if ($this->getScalar($input, $key, $scalar)) return $scalar;
- elseif ($this->getSeq($input, $key, $seq)) return $seq;
- elseif ($this->getAssoc($input, $key, $assoc)) return $assoc;
- else throw StateException::unexpected_state();
- }
+ /** @var array */
+ protected $definition;
}
diff --git a/src/schema/SchemaException.php b/src/schema/SchemaException.php
index bef20fd..2ff36ee 100644
--- a/src/schema/SchemaException.php
+++ b/src/schema/SchemaException.php
@@ -4,4 +4,7 @@ namespace nur\sery\schema;
use Exception;
class SchemaException extends Exception {
+ static final function invalid_schema(): self {
+ return new static("invalid schema");
+ }
}
diff --git a/src/schema/ref_schema.php b/src/schema/ref_schema.php
index 7f21ca7..7d5a734 100644
--- a/src/schema/ref_schema.php
+++ b/src/schema/ref_schema.php
@@ -30,6 +30,40 @@ class ref_schema {
const MESSAGES = [
"absent" => "{key}: Vous devez spécifier cette valeur",
"null" => "{key}: Cette valeur ne doit pas être nulle",
+ "empty" => "{key}: Cette valeur ne doit pas être vide",
"invalid" => "{key}: {orig}: cette valeur est invalide",
];
+
+ /** @var array schéma des natures de schéma */
+ public const NATURE_METASCHEMA = [
+ "nature" => ["string", null, "nature du schéma",
+ "key" => 0,
+ "allowed_values" => ["assoc", "list", "scalar"],
+ ],
+ "title" => ["?string", null, "libellé de la valeur"],
+ "required" => ["bool", false, "la valeur est-elle requise?"],
+ "nullable" => ["?bool", null, "la valeur peut-elle être nulle?"],
+ "desc" => ["?content", null, "description de la valeur"],
+ "name" => ["?key", null, "identifiant de la valeur"],
+ "schema" => ["?array", null, "définition du schéma"],
+ ];
+
+ /** @var array meta-schema d'un schéma de nature scalaire */
+ public const SCALAR_METASCHEMA = [
+ "type" => ["array", null, "types possibles de la valeur", "required" => true],
+ "default" => [null, null, "valeur par défaut si la valeur n'existe pas"],
+ "title" => ["?string", null, "libellé de la valeur"],
+ "required" => ["bool", false, "la valeur est-elle requise?"],
+ "nullable" => ["?bool", null, "la valeur peut-elle être nulle?"],
+ "desc" => ["?content", null, "description de la valeur"],
+ "analyzer_func" => ["?callable", null, "fonction qui analyse une valeur entrante et indique comment la traiter"],
+ "extractor_func" => ["?callable", null, "fonction qui extrait la valeur à analyser dans une chaine de caractère"],
+ "parser_func" => ["?callable", null, "fonction qui analyse une chaine de caractères pour produire la valeur"],
+ "normalizer_func" => ["?callable", null, "fonction qui normalise la valeur"],
+ "messages" => ["?array", null, "messages à afficher en cas d'erreur d'analyse"],
+ "formatter_func" => ["?callable", null, "fonction qui formatte la valeur pour affichage"],
+ "format" => [null, null, "format à utiliser pour l'affichage"],
+ "" => ["" => ["assoc", "schema" => self::NATURE_METASCHEMA]],
+ "name" => ["?key", null, "identifiant de la valeur"],
+ ];
}
diff --git a/src/schema/values/TValue.php b/src/schema/values/TValue.php
index 569da10..37d15de 100644
--- a/src/schema/values/TValue.php
+++ b/src/schema/values/TValue.php
@@ -1,17 +1,17 @@
md, $this->schema, true);
+ function md(): OldSchema {
+ return OldSchema::new($this->md, $this->schema, true);
}
/** @var mixed valeur ou référence d'un tableau contenant la valeur */
diff --git a/src/params/F.php b/src/web/params/F.php
similarity index 98%
rename from src/params/F.php
rename to src/web/params/F.php
index 68dae56..2f1d90c 100644
--- a/src/params/F.php
+++ b/src/web/params/F.php
@@ -1,5 +1,5 @@