<pman>Intégration de la branche dev74
This commit is contained in:
		
						commit
						5732c8f4bd
					
				| @ -218,10 +218,10 @@ class A { | |||||||
|   static final function filter_f($dest): void { self::filter_if($dest, [cv::class, "f"]);} |   static final function filter_f($dest): void { self::filter_if($dest, [cv::class, "f"]);} | ||||||
|   static final function filter_pt($dest): void { self::filter_if($dest, [cv::class, "pt"]);} |   static final function filter_pt($dest): void { self::filter_if($dest, [cv::class, "pt"]);} | ||||||
|   static final function filter_pf($dest): void { self::filter_if($dest, [cv::class, "pf"]);} |   static final function filter_pf($dest): void { self::filter_if($dest, [cv::class, "pf"]);} | ||||||
|   static final function filter_equals($dest, $value): void { self::filter_if($dest, cv::equals($value)); } |   static final function filter_equals($dest, $value): void { self::filter_if($dest, cv::Fequals($value)); } | ||||||
|   static final function filter_not_equals($dest, $value): void { self::filter_if($dest, cv::not_equals($value)); } |   static final function filter_not_equals($dest, $value): void { self::filter_if($dest, cv::Fnot_equals($value)); } | ||||||
|   static final function filter_same($dest, $value): void { self::filter_if($dest, cv::same($value)); } |   static final function filter_same($dest, $value): void { self::filter_if($dest, cv::Fsame($value)); } | ||||||
|   static final function filter_not_same($dest, $value): void { self::filter_if($dest, cv::not_same($value)); } |   static final function filter_not_same($dest, $value): void { self::filter_if($dest, cv::Fnot_same($value)); } | ||||||
| 
 | 
 | ||||||
|   #############################################################################
 |   #############################################################################
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -817,10 +817,10 @@ class cl { | |||||||
|   static final function all_f(?array $array): bool { return self::all_if($array, [cv::class, "f"]);} |   static final function all_f(?array $array): bool { return self::all_if($array, [cv::class, "f"]);} | ||||||
|   static final function all_pt(?array $array): bool { return self::all_if($array, [cv::class, "pt"]);} |   static final function all_pt(?array $array): bool { return self::all_if($array, [cv::class, "pt"]);} | ||||||
|   static final function all_pf(?array $array): bool { return self::all_if($array, [cv::class, "pf"]);} |   static final function all_pf(?array $array): bool { return self::all_if($array, [cv::class, "pf"]);} | ||||||
|   static final function all_equals(?array $array, $value): bool { return self::all_if($array, cv::equals($value)); } |   static final function all_equals(?array $array, $value): bool { return self::all_if($array, cv::Fequals($value)); } | ||||||
|   static final function all_not_equals(?array $array, $value): bool { return self::all_if($array, cv::not_equals($value)); } |   static final function all_not_equals(?array $array, $value): bool { return self::all_if($array, cv::Fnot_equals($value)); } | ||||||
|   static final function all_same(?array $array, $value): bool { return self::all_if($array, cv::same($value)); } |   static final function all_same(?array $array, $value): bool { return self::all_if($array, cv::Fsame($value)); } | ||||||
|   static final function all_not_same(?array $array, $value): bool { return self::all_if($array, cv::not_same($value)); } |   static final function all_not_same(?array $array, $value): bool { return self::all_if($array, cv::Fnot_same($value)); } | ||||||
| 
 | 
 | ||||||
|   #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 |   #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | ||||||
| 
 | 
 | ||||||
| @ -842,10 +842,10 @@ class cl { | |||||||
|   static final function any_f(?array $array): bool { return self::any_if($array, [cv::class, "f"]);} |   static final function any_f(?array $array): bool { return self::any_if($array, [cv::class, "f"]);} | ||||||
|   static final function any_pt(?array $array): bool { return self::any_if($array, [cv::class, "pt"]);} |   static final function any_pt(?array $array): bool { return self::any_if($array, [cv::class, "pt"]);} | ||||||
|   static final function any_pf(?array $array): bool { return self::any_if($array, [cv::class, "pf"]);} |   static final function any_pf(?array $array): bool { return self::any_if($array, [cv::class, "pf"]);} | ||||||
|   static final function any_equals(?array $array, $value): bool { return self::any_if($array, cv::equals($value)); } |   static final function any_equals(?array $array, $value): bool { return self::any_if($array, cv::Fequals($value)); } | ||||||
|   static final function any_not_equals(?array $array, $value): bool { return self::any_if($array, cv::not_equals($value)); } |   static final function any_not_equals(?array $array, $value): bool { return self::any_if($array, cv::Fnot_equals($value)); } | ||||||
|   static final function any_same(?array $array, $value): bool { return self::any_if($array, cv::same($value)); } |   static final function any_same(?array $array, $value): bool { return self::any_if($array, cv::Fsame($value)); } | ||||||
|   static final function any_not_same(?array $array, $value): bool { return self::any_if($array, cv::not_same($value)); } |   static final function any_not_same(?array $array, $value): bool { return self::any_if($array, cv::Fnot_same($value)); } | ||||||
| 
 | 
 | ||||||
|   #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 |   #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | ||||||
|    |    | ||||||
| @ -876,10 +876,10 @@ class cl { | |||||||
|   static final function filter_f(?array $array): ?array { return self::filter_if($array, [cv::class, "f"]);} |   static final function filter_f(?array $array): ?array { return self::filter_if($array, [cv::class, "f"]);} | ||||||
|   static final function filter_pt(?array $array): ?array { return self::filter_if($array, [cv::class, "pt"]);} |   static final function filter_pt(?array $array): ?array { return self::filter_if($array, [cv::class, "pt"]);} | ||||||
|   static final function filter_pf(?array $array): ?array { return self::filter_if($array, [cv::class, "pf"]);} |   static final function filter_pf(?array $array): ?array { return self::filter_if($array, [cv::class, "pf"]);} | ||||||
|   static final function filter_equals(?array $array, $value): ?array { return self::filter_if($array, cv::equals($value)); } |   static final function filter_equals(?array $array, $value): ?array { return self::filter_if($array, cv::Fequals($value)); } | ||||||
|   static final function filter_not_equals(?array $array, $value): ?array { return self::filter_if($array, cv::not_equals($value)); } |   static final function filter_not_equals(?array $array, $value): ?array { return self::filter_if($array, cv::Fnot_equals($value)); } | ||||||
|   static final function filter_same(?array $array, $value): ?array { return self::filter_if($array, cv::same($value)); } |   static final function filter_same(?array $array, $value): ?array { return self::filter_if($array, cv::Fsame($value)); } | ||||||
|   static final function filter_not_same(?array $array, $value): ?array { return self::filter_if($array, cv::not_same($value)); } |   static final function filter_not_same(?array $array, $value): ?array { return self::filter_if($array, cv::Fnot_same($value)); } | ||||||
| 
 | 
 | ||||||
|   #############################################################################
 |   #############################################################################
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -49,7 +49,7 @@ class cv { | |||||||
|    * contruire une fonction qui retourne vrai si on lui passe en argument une |    * contruire une fonction qui retourne vrai si on lui passe en argument une | ||||||
|    * valeur égale à $value |    * valeur égale à $value | ||||||
|    */ |    */ | ||||||
|   static final function equals($value): callable { |   static final function Fequals($value): callable { | ||||||
|     return function ($arg) use($value) { return $arg == $value; }; |     return function ($arg) use($value) { return $arg == $value; }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -57,7 +57,7 @@ class cv { | |||||||
|    * contruire une fonction qui retourne vrai si on lui passe en argument une |    * contruire une fonction qui retourne vrai si on lui passe en argument une | ||||||
|    * valeur qui n'est pas égale à $value |    * valeur qui n'est pas égale à $value | ||||||
|    */ |    */ | ||||||
|   static final function not_equals($value): callable { |   static final function Fnot_equals($value): callable { | ||||||
|     return function ($arg) use($value) { return $arg != $value; }; |     return function ($arg) use($value) { return $arg != $value; }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -65,7 +65,7 @@ class cv { | |||||||
|    * contruire une fonction qui retourne vrai si on lui passe en argument une |    * contruire une fonction qui retourne vrai si on lui passe en argument une | ||||||
|    * valeur strictement égale à $value |    * valeur strictement égale à $value | ||||||
|    */ |    */ | ||||||
|   static final function same($value): callable { |   static final function Fsame($value): callable { | ||||||
|     return function ($arg) use($value) { return $arg === $value; }; |     return function ($arg) use($value) { return $arg === $value; }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -73,7 +73,7 @@ class cv { | |||||||
|    * contruire une fonction qui retourne vrai si on lui passe en argument une |    * contruire une fonction qui retourne vrai si on lui passe en argument une | ||||||
|    * valeur qui n'est pas strictement égale à $value |    * valeur qui n'est pas strictement égale à $value | ||||||
|    */ |    */ | ||||||
|   static final function not_same($value): callable { |   static final function Fnot_same($value): callable { | ||||||
|     return function ($arg) use($value) { return $arg !== $value; }; |     return function ($arg) use($value) { return $arg !== $value; }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -231,6 +231,24 @@ class cv { | |||||||
| 
 | 
 | ||||||
|   #############################################################################
 |   #############################################################################
 | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * tester l'égalité non stricte de deux valeurs, dans le cas où leurs types ne | ||||||
|  |    * sont pas forcément cohérents: par exemple eq("1", 1) === true | ||||||
|  |    * | ||||||
|  |    * cette fonction est utile par exemple quand on veut comparer des données | ||||||
|  |    * provenant d'une base de données: PHP a la facheuse tendance de retourner | ||||||
|  |    * les nombres sous forme de chaines | ||||||
|  |    */ | ||||||
|  |   static final function equals($a, $b): bool { | ||||||
|  |     # cette fonction existe parce que le type des valeurs retournées par la BDD
 | ||||||
|  |     # n'est pas cohérent, "1" au lieu de 1 par exemple
 | ||||||
|  |     if ($a === null) return $b === null; | ||||||
|  |     elseif ($b === null) return $a === null; | ||||||
|  |     elseif (is_scalar($a)) return strval($a) === strval($b); | ||||||
|  |     # ne pas utiliser l'égalité stricte ici: ce sont des objets
 | ||||||
|  |     else return $a == $b; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** retourner -1, 0 ou 1 en fonction de l'ordre relatif entre $a et $b */ |   /** retourner -1, 0 ou 1 en fonction de l'ordre relatif entre $a et $b */ | ||||||
|   static final function compare($a, $b): int { |   static final function compare($a, $b): int { | ||||||
|     if ($a === $b) return 0; |     if ($a === $b) return 0; | ||||||
|  | |||||||
| @ -182,11 +182,27 @@ class Capacitor implements ITransactor { | |||||||
|     return $this->storage->_delete($this->channel, $filter, $func, $args); |     return $this->storage->_delete($this->channel, $filter, $func, $args); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   function dbUpdate(array $update) { |   function dbAll(array $query, ?array $params=null): iterable { | ||||||
|  |     $primaryKeys = $this->channel->getPrimaryKeys(); | ||||||
|  |     return $this->storage->db()->all(cl::merge([ | ||||||
|  |       "select", | ||||||
|  |       "from" => $this->getTableName(), | ||||||
|  |     ], $query), $params, $primaryKeys); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function dbOne(array $query, ?array $params=null): ?array { | ||||||
|  |     return $this->storage->db()->one(cl::merge([ | ||||||
|  |       "select", | ||||||
|  |       "from" => $this->getTableName(), | ||||||
|  |     ], $query), $params); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** @return int|false */ | ||||||
|  |   function dbUpdate(array $query, ?array $params=null) { | ||||||
|     return $this->storage->db()->exec(cl::merge([ |     return $this->storage->db()->exec(cl::merge([ | ||||||
|       "update", |       "update", | ||||||
|       "table" => $this->getTableName(), |       "table" => $this->getTableName(), | ||||||
|     ], $update)); |     ], $query), $params); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   function close(): void { |   function close(): void { | ||||||
|  | |||||||
| @ -414,6 +414,11 @@ class CapacitorChannel implements ITransactor { | |||||||
|     return $this; |     return $this; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   function initStorage(CapacitorStorage $storage): self { | ||||||
|  |     new Capacitor($storage, $this); | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   function willUpdate(...$transactors): ITransactor { |   function willUpdate(...$transactors): ITransactor { | ||||||
|     return $this->capacitor->willUpdate(...$transactors); |     return $this->capacitor->willUpdate(...$transactors); | ||||||
|   } |   } | ||||||
| @ -508,8 +513,17 @@ class CapacitorChannel implements ITransactor { | |||||||
|     return $this->capacitor->delete($filter, $func, $args); |     return $this->capacitor->delete($filter, $func, $args); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   function dbUpdate(array $update) { |   function dbAll(array $query, ?array $params=null): iterable { | ||||||
|     return $this->capacitor->dbUpdate($update); |     return $this->capacitor->dbAll($query, $params); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function dbOne(array $query, ?array $params=null): ?array { | ||||||
|  |     return $this->capacitor->dbOne($query, $params); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** @return int|false */ | ||||||
|  |   function dbUpdate(array $query, ?array $params=null) { | ||||||
|  |     return $this->capacitor->dbUpdate($query, $params); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   function close(): void { |   function close(): void { | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ namespace nulib\db; | |||||||
| 
 | 
 | ||||||
| use nulib\A; | use nulib\A; | ||||||
| use nulib\cl; | use nulib\cl; | ||||||
|  | use nulib\cv; | ||||||
| use nulib\db\_private\_migration; | use nulib\db\_private\_migration; | ||||||
| use nulib\php\func; | use nulib\php\func; | ||||||
| use nulib\ValueException; | use nulib\ValueException; | ||||||
| @ -479,8 +480,9 @@ abstract class CapacitorStorage { | |||||||
|             # ne jamais mettre à jour la clé primaire
 |             # ne jamais mettre à jour la clé primaire
 | ||||||
|             continue; |             continue; | ||||||
|           } |           } | ||||||
|           $pvalue = $praw[$col] ?? null; |           if (!cv::equals($value, $praw[$col] ?? null)) { | ||||||
|           if ($value !== $pvalue) $updates[$col] = $value; |             $updates[$col] = $value; | ||||||
|  |           } | ||||||
|         } |         } | ||||||
|         if (count($updates) == 1 && array_key_first($updates) == "modified_") { |         if (count($updates) == 1 && array_key_first($updates) == "modified_") { | ||||||
|           # si l'unique modification porte sur la date de modification, alors
 |           # si l'unique modification porte sur la date de modification, alors
 | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								php/src/ext/utils.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								php/src/ext/utils.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\ext; | ||||||
|  | 
 | ||||||
|  | class utils { | ||||||
|  |   /** générateur d'UUIDv4 "du pauvre" */ | ||||||
|  |   static final function uuidgen(): string { | ||||||
|  |     $data = random_bytes(16); | ||||||
|  |     $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
 | ||||||
|  |     $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
 | ||||||
|  |     return vsprintf("%s%s-%s-%s-%s-%s%s%s", str_split(bin2hex($data), 4)); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -7,10 +7,10 @@ use nulib\php\func; | |||||||
|  * Class Printer: wrapper autour d'une instance de {@link IContent} qui affiche |  * Class Printer: wrapper autour d'une instance de {@link IContent} qui affiche | ||||||
|  * le contenu au lieu de le retourner |  * le contenu au lieu de le retourner | ||||||
|  * |  * | ||||||
|  * cette classe est conçue pour wrapper des objets complexes dont le contenu est |  * cette classe est conçue pour wrapper des objets complexes dont le contenu | ||||||
|  * contruit au fur et à mesure: ainsi, les objets peuvent être utilisés tels |  * peut être multiple et est contruit au fur et à mesure: ainsi, les objets | ||||||
|  * quels dans un contenu, ou alors être wrappés si on veut simplement les |  * peuvent être utilisés tels quels dans un contenu, ou alors être wrappés si | ||||||
|  * afficher |  * on veut simplement les afficher | ||||||
|  */ |  */ | ||||||
| class Printer implements IPrintable { | class Printer implements IPrintable { | ||||||
|   function __construct(IContent $content) { |   function __construct(IContent $content) { | ||||||
| @ -24,6 +24,9 @@ class Printer implements IPrintable { | |||||||
|     c::write($content); |     c::write($content); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * afficher le contenu retourné par une méthode spécifique de $content | ||||||
|  |    */ | ||||||
|   function __call($name, $args) { |   function __call($name, $args) { | ||||||
|     $content = func::call([$this->content, $name], ...$args); |     $content = func::call([$this->content, $name], ...$args); | ||||||
|     c::write($content); |     c::write($content); | ||||||
|  | |||||||
| @ -139,6 +139,12 @@ class DateTime extends \DateTime { | |||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** retourner le nombre de secondes depuis minuit */ | ||||||
|  |   static function _nbsecs_format(\DateTime $datetime): string { | ||||||
|  |     [$h, $m, $s] = explode(",", $datetime->format("H,i,s")); | ||||||
|  |     return $h * 3600 + $m * 60 + $s; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   static function _YmdHMSZ_format(\DateTime $datetime): string { |   static function _YmdHMSZ_format(\DateTime $datetime): string { | ||||||
|     $YmdHMS = $datetime->format("Ymd\\THis"); |     $YmdHMS = $datetime->format("Ymd\\THis"); | ||||||
|     $Z = $datetime->format("P"); |     $Z = $datetime->format("P"); | ||||||
| @ -156,6 +162,7 @@ class DateTime extends \DateTime { | |||||||
|     "second" => "s", |     "second" => "s", | ||||||
|     "wday" => "N", |     "wday" => "N", | ||||||
|     "wnum" => "W", |     "wnum" => "W", | ||||||
|  |     "nbsecs" => [self::class, "_nbsecs_format"], | ||||||
|   ]; |   ]; | ||||||
|   const STRING_FORMATS = [ |   const STRING_FORMATS = [ | ||||||
|     "timezone" => "P", |     "timezone" => "P", | ||||||
| @ -166,14 +173,6 @@ class DateTime extends \DateTime { | |||||||
|     "YmdHMSZ" => [self::class, "_YmdHMSZ_format"], |     "YmdHMSZ" => [self::class, "_YmdHMSZ_format"], | ||||||
|   ]; |   ]; | ||||||
| 
 | 
 | ||||||
|   static function clone(DateTimeInterface $dateTime): self { |  | ||||||
|     if ($dateTime instanceof static) return clone $dateTime; |  | ||||||
|     $clone = new static(); |  | ||||||
|     $clone->setTimestamp($dateTime->getTimestamp()); |  | ||||||
|     $clone->setTimezone($dateTime->getTimezone()); |  | ||||||
|     return $clone; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |   /** | ||||||
|    * corriger une année à deux chiffres qui est située dans le passé et |    * corriger une année à deux chiffres qui est située dans le passé et | ||||||
|    * retourner l'année à 4 chiffres. |    * retourner l'année à 4 chiffres. | ||||||
| @ -282,7 +281,7 @@ class DateTime extends \DateTime { | |||||||
|       if ($Y !== null) { |       if ($Y !== null) { | ||||||
|         if ($H === null) $datetime = sprintf("%04d-%02d-%02d", $Y, $m, $d); |         if ($H === null) $datetime = sprintf("%04d-%02d-%02d", $Y, $m, $d); | ||||||
|         else $datetime = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H, $M, $S); |         else $datetime = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H, $M, $S); | ||||||
|         if ($Z !== null) $timezone = new DateTimeZone(self::fix_z($Z)); |         if ($Z !== null) $timezone ??= new DateTimeZone(self::fix_z($Z)); | ||||||
|       } |       } | ||||||
|       parent::__construct($datetime, $timezone); |       parent::__construct($datetime, $timezone); | ||||||
| 
 | 
 | ||||||
| @ -295,7 +294,7 @@ class DateTime extends \DateTime { | |||||||
|       } else { |       } else { | ||||||
|         $datetime = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H ?? 0, $M ?? 0, $S ?? 0); |         $datetime = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H ?? 0, $M ?? 0, $S ?? 0); | ||||||
|       } |       } | ||||||
|       if ($Z !== null) $timezone = new DateTimeZone(self::fix_z($Z)); |       if ($Z !== null) $timezone ??= new DateTimeZone(self::fix_z($Z)); | ||||||
|       parent::__construct($datetime, $timezone); |       parent::__construct($datetime, $timezone); | ||||||
| 
 | 
 | ||||||
|     } else { |     } else { | ||||||
| @ -308,6 +307,10 @@ class DateTime extends \DateTime { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   function clone(): self { | ||||||
|  |     return clone $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   function diff($target, $absolute=false): DateInterval { |   function diff($target, $absolute=false): DateInterval { | ||||||
|     return new DateInterval(parent::diff($target, $absolute)); |     return new DateInterval(parent::diff($target, $absolute)); | ||||||
|   } |   } | ||||||
| @ -374,7 +377,7 @@ class DateTime extends \DateTime { | |||||||
|   function __get($name) { |   function __get($name) { | ||||||
|     if (array_key_exists($name, self::INT_FORMATS)) { |     if (array_key_exists($name, self::INT_FORMATS)) { | ||||||
|       $format = self::INT_FORMATS[$name]; |       $format = self::INT_FORMATS[$name]; | ||||||
|       if (is_callable($format)) return $format($this); |       if (is_callable($format)) return intval($format($this)); | ||||||
|       else return intval($this->format($format)); |       else return intval($this->format($format)); | ||||||
|     } elseif (array_key_exists($name, self::STRING_FORMATS)) { |     } elseif (array_key_exists($name, self::STRING_FORMATS)) { | ||||||
|       $format = self::STRING_FORMATS[$name]; |       $format = self::STRING_FORMATS[$name]; | ||||||
|  | |||||||
| @ -40,8 +40,8 @@ class Delay { | |||||||
|     "s" => [1, 0], |     "s" => [1, 0], | ||||||
|   ]; |   ]; | ||||||
| 
 | 
 | ||||||
|   static function compute_dest(int $x, string $u, ?int $y, DateTime $from): array { |   static function compute_dest(int $x, string $u, ?int $y, ?DateTimeInterface $from): array { | ||||||
|     $dest = DateTime::clone($from); |     $dest = DateTime::with($from)->clone(); | ||||||
|     $yu = null; |     $yu = null; | ||||||
|     switch ($u) { |     switch ($u) { | ||||||
|     case "w": |     case "w": | ||||||
| @ -92,7 +92,7 @@ class Delay { | |||||||
|   function __construct($delay, ?DateTimeInterface $from=null) { |   function __construct($delay, ?DateTimeInterface $from=null) { | ||||||
|     if ($from === null) $from = new DateTime(); |     if ($from === null) $from = new DateTime(); | ||||||
|     if ($delay === "INF") { |     if ($delay === "INF") { | ||||||
|       $dest = DateTime::clone($from); |       $dest = DateTime::with($from)->clone(); | ||||||
|       $dest->add(new DateInterval("P9999Y")); |       $dest->add(new DateInterval("P9999Y")); | ||||||
|       $repr = "INF"; |       $repr = "INF"; | ||||||
|     } elseif (is_int($delay)) { |     } elseif (is_int($delay)) { | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								php/src/php/time/TODO.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								php/src/php/time/TODO.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | # nulib\php\time | ||||||
|  | 
 | ||||||
|  | * Date, DateTime sont immutables par défaut. par exemple, add() retourne un nouvel objet. | ||||||
|  |   ajouter une version des méthodes qui modifie les données en place en les | ||||||
|  |   préfixant de `_` e.g `_add()` | ||||||
|  | 
 | ||||||
|  |   en terme d'implémentation, dériver \DateTime pour supporter les modification | ||||||
|  |   en place, bien que ce ne soit pas le fonctionnement par défaut | ||||||
|  | 
 | ||||||
|  | -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary | ||||||
| @ -17,6 +17,11 @@ class str { | |||||||
|     return $s; |     return $s; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** s'assure que $s est une chaine s'il n'est pas null */ | ||||||
|  |   static final function ensure(&$s): void { | ||||||
|  |     if ($s !== null) $s = self::with($s); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * Retourner $s converti en chaine non nulle, ou "" si $s est fausse selon les |    * Retourner $s converti en chaine non nulle, ou "" si $s est fausse selon les | ||||||
|    * règles de PHP |    * règles de PHP | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								php/tests/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								php/tests/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | *.db* | ||||||
|  | *.cache | ||||||
							
								
								
									
										1
									
								
								php/tests/db/sqlite/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								php/tests/db/sqlite/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| /capacitor.db* |  | ||||||
| @ -29,7 +29,7 @@ class DateTest extends TestCase { | |||||||
| 
 | 
 | ||||||
|   function testClone() { |   function testClone() { | ||||||
|     $date = self::dt("now"); |     $date = self::dt("now"); | ||||||
|     $clone = Date::clone($date); |     $clone = $date->clone(); | ||||||
|     self::assertInstanceOf(DateTime::class, $clone); |     self::assertInstanceOf(DateTime::class, $clone); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -32,13 +32,17 @@ class DateTimeTest extends TestCase { | |||||||
| 
 | 
 | ||||||
|   function testDateTimeZ() { |   function testDateTimeZ() { | ||||||
|     $date = new DateTime("20240405T091523Z"); |     $date = new DateTime("20240405T091523Z"); | ||||||
|  |     self::assertSame("20240405T131523", $date->YmdHMS); | ||||||
|  |     self::assertSame("20240405T131523+04:00", $date->YmdHMSZ); | ||||||
|  |     # comme on spécifie la timezone, la valeur Z est ignorée
 | ||||||
|  |     $date = new DateTime("20240405T091523Z", new DateTimeZone("Indian/Reunion")); | ||||||
|     self::assertSame("20240405T091523", $date->YmdHMS); |     self::assertSame("20240405T091523", $date->YmdHMS); | ||||||
|     self::assertSame("20240405T091523Z", $date->YmdHMSZ); |     self::assertSame("20240405T091523+04:00", $date->YmdHMSZ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   function testClone() { |   function testClone() { | ||||||
|     $date = self::dt("now"); |     $date = self::dt("now"); | ||||||
|     $clone = DateTime::clone($date); |     $clone = $date->clone(); | ||||||
|     self::assertInstanceOf(DateTime::class, $clone); |     self::assertInstanceOf(DateTime::class, $clone); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -51,7 +55,7 @@ class DateTimeTest extends TestCase { | |||||||
|     self::assertSame("05/04/2024 00:00:00", strval(new DateTime("20240405"))); |     self::assertSame("05/04/2024 00:00:00", strval(new DateTime("20240405"))); | ||||||
|     self::assertSame("05/04/2024 00:00:00", strval(new DateTime("240405"))); |     self::assertSame("05/04/2024 00:00:00", strval(new DateTime("240405"))); | ||||||
|     self::assertSame("05/04/2024 09:15:23", strval(new DateTime("20240405T091523"))); |     self::assertSame("05/04/2024 09:15:23", strval(new DateTime("20240405T091523"))); | ||||||
|     self::assertSame("05/04/2024 09:15:23", strval(new DateTime("20240405T091523Z"))); |     self::assertSame("05/04/2024 13:15:23", strval(new DateTime("20240405T091523Z"))); | ||||||
|     self::assertSame("05/04/2024 09:15:23", strval(new DateTime("5/4/2024 9:15:23"))); |     self::assertSame("05/04/2024 09:15:23", strval(new DateTime("5/4/2024 9:15:23"))); | ||||||
|     self::assertSame("05/04/2024 09:15:23", strval(new DateTime("5/4/2024 9.15.23"))); |     self::assertSame("05/04/2024 09:15:23", strval(new DateTime("5/4/2024 9.15.23"))); | ||||||
|     self::assertSame("05/04/2024 09:15:00", strval(new DateTime("5/4/2024 9:15"))); |     self::assertSame("05/04/2024 09:15:00", strval(new DateTime("5/4/2024 9:15"))); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user