modifs.mineures sans commentaires
This commit is contained in:
		
							parent
							
								
									7257654753
								
							
						
					
					
						commit
						26817d2826
					
				| @ -118,33 +118,71 @@ class KeyAccess extends AbstractAccess { | ||||
|     ]); | ||||
|   } | ||||
| 
 | ||||
|   function ensureAssoc(array $keys): void { | ||||
|     $index = 0; | ||||
|   function ensureAssoc(array $keys, ?array $params=null): void { | ||||
|     $dest =& $this->dest; | ||||
|     $prefix = $params["key_prefix"] ?? null; | ||||
|     $suffix = $params["key_suffix"] ?? null; | ||||
|     $index = 0; | ||||
|     foreach ($keys as $key) { | ||||
|       if ($dest !== null && array_key_exists($key, $dest)) continue; | ||||
|       if ($prefix !== null || $suffix !== null) { | ||||
|         $destKey = "$prefix$key$suffix"; | ||||
|       } else { | ||||
|         # préserver les clés numériques
 | ||||
|         $destKey = $key; | ||||
|       } | ||||
|       if ($dest !== null && array_key_exists($destKey, $dest)) continue; | ||||
|       while (in_array($index, $keys, true)) { | ||||
|         $index++; | ||||
|       } | ||||
|       if ($dest !== null && array_key_exists($index, $dest)) { | ||||
|         $dest[$key] = $dest[$index]; | ||||
|         $dest[$destKey] = $dest[$index]; | ||||
|         unset($dest[$index]); | ||||
|         $index++; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   function ensureKeys(array $defaults): void { | ||||
|   function ensureKeys(array $defaults, ?array $params=null): void { | ||||
|     $dest =& $this->dest; | ||||
|     $keys = array_keys($defaults); | ||||
|     $prefix = $params["key_prefix"] ?? null; | ||||
|     $suffix = $params["key_suffix"] ?? null; | ||||
|     foreach ($keys as $key) { | ||||
|       if ($dest === null || !array_key_exists($key, $dest)) { | ||||
|         $dest[$key] = $defaults[$key]; | ||||
|       $destKey = "$prefix$key$suffix"; | ||||
|       if ($dest === null || !array_key_exists($destKey, $dest)) { | ||||
|         $dest[$destKey] = $defaults[$key]; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   function ensureOrder(array $keys): void { | ||||
|   function ensureOrder(array $keys, ?array $params=null): void { | ||||
|     $dest =& $this->dest; | ||||
|     if ($dest === null) return; | ||||
| 
 | ||||
|     $prefix = $params["key_prefix"] ?? null; | ||||
|     $suffix = $params["key_suffix"] ?? null; | ||||
|     if ($prefix !== null || $suffix !== null) { | ||||
|       foreach ($keys as &$key) { | ||||
|         $key = "$prefix$key$suffix"; | ||||
|       }; unset($key); | ||||
|     } | ||||
| 
 | ||||
|     $destKeys = array_keys($dest); | ||||
|     $keyCount = count($keys); | ||||
|     if (array_slice($destKeys, 0, $keyCount) === $keys) { | ||||
|       # si le tableau a déjà les bonnes clés dans le bon ordre, rien à faire
 | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     $ordered = []; | ||||
|     foreach ($keys as $key) { | ||||
|       if (array_key_exists($key, $dest)) { | ||||
|         $ordered[$key] = $dest[$key]; | ||||
|         unset($dest[$key]); | ||||
|       } | ||||
|     } | ||||
|     $preserveKeys = $params["preserve_keys"] ?? false; | ||||
|     if ($preserveKeys) $dest = cl::merge2($ordered, $dest); | ||||
|     else $dest = array_merge($ordered, $dest); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -5,7 +5,9 @@ use nulib\StateException; | ||||
| use nulib\str; | ||||
| use ReflectionClass; | ||||
| use ReflectionException; | ||||
| use ReflectionNamedType; | ||||
| use ReflectionProperty; | ||||
| use stdClass; | ||||
| 
 | ||||
| class PropertyAccess extends AbstractAccess { | ||||
|   const PROTECT_DEST = true; | ||||
| @ -32,24 +34,32 @@ class PropertyAccess extends AbstractAccess { | ||||
| 
 | ||||
|   protected ?ReflectionProperty $property; | ||||
| 
 | ||||
|   private function _getName(string $key): string { | ||||
|     return $this->mapNames? str::us2camel($key): $key; | ||||
|   } | ||||
|   private function _setName(?string $name): void { | ||||
|     if ($this->mapNames) $name = str::us2camel($name); | ||||
|     if ($name !== null) $name = $this->_getName($name); | ||||
|     $this->name = $name; | ||||
|   } | ||||
| 
 | ||||
|   private function _setDest(?object $dest): void { | ||||
|     $this->dest = $dest; | ||||
|   private function _getProperty(?string $name, ?ReflectionClass $class, ?object $object=null): ?ReflectionProperty { | ||||
|     $property = null; | ||||
|     $name = $this->name; | ||||
|     if ($dest !== null && $name !== null) { | ||||
|       $class = new ReflectionClass($dest); | ||||
|     if ($class === null && $object !== null) { | ||||
|       $class = new ReflectionClass($object); | ||||
|     } | ||||
|     if ($class !== null && $name !== null) { | ||||
|       try { | ||||
|         $property = $class->getProperty($name); | ||||
|         $property->setAccessible(true); | ||||
|       } catch (ReflectionException $e) { | ||||
|       } | ||||
|     } | ||||
|     $this->property = $property; | ||||
|     return $property; | ||||
|   } | ||||
| 
 | ||||
|   private function _setDest(?object $dest): void { | ||||
|     $this->dest = $dest; | ||||
|     $this->property = $this->_getProperty($this->name, null, $dest); | ||||
|   } | ||||
| 
 | ||||
|   function reset(?object $dest, ?string $name=null): self { | ||||
| @ -135,4 +145,39 @@ class PropertyAccess extends AbstractAccess { | ||||
|     if ($key === null) return $this; | ||||
|     return new ChainAccess($this, $key); | ||||
|   } | ||||
| 
 | ||||
|   function ensureAssoc(array $keys, ?array $params=null): void { | ||||
|     # NOP
 | ||||
|   } | ||||
| 
 | ||||
|   function ensureKeys(array $defaults, ?array $params=null): void { | ||||
|     $dest = $this->dest; | ||||
|     if ($dest === null) { | ||||
|       # comme ne connait pas la classe de l'objet destination, on n'essaie pas
 | ||||
|       # de le créer
 | ||||
|       return; | ||||
|     } | ||||
|     $class = new ReflectionClass($dest); | ||||
|     $keys = array_keys($defaults); | ||||
|     $prefix = $params["key_prefix"] ?? null; | ||||
|     $suffix = $params["key_suffix"] ?? null; | ||||
|     foreach ($keys as $key) { | ||||
|       $name = $this->_getName("$prefix$key$suffix"); | ||||
|       $property = $this->_getProperty($name, $class); | ||||
|       if ($property !== null) { | ||||
|         $type = $property->getType(); | ||||
|         if ($type !== null && !$property->isInitialized($dest) && $type->allowsNull()) { | ||||
|           # initialiser avec null au lieu de $defaults[$key] pour respecter le
 | ||||
|           # type de la propriété
 | ||||
|           $property->setValue($dest, null); | ||||
|         } | ||||
|       } elseif (!property_exists($dest, $name)) { | ||||
|         $dest->$name = $defaults[$key]; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   function ensureOrder(array $keys, ?array $params=null): void { | ||||
|     # NOP
 | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -126,9 +126,9 @@ class KeyAccessTest extends TestCase { | ||||
|     self::assertSame("", $a->get($default)); | ||||
|   } | ||||
| 
 | ||||
|   private function _ensureAssoc(?array $orig, ?array $expected, array $keys) { | ||||
|   private function _ensureAssoc(?array $orig, ?array $expected, array $keys, ?array $params=null) { | ||||
|     $v = $orig; $a = new KeyAccess($v); | ||||
|     $a->ensureAssoc($keys); | ||||
|     $a->ensureAssoc($keys, $params); | ||||
|     self::assertSame($expected, $v); | ||||
|   } | ||||
|   function testEnsureAssoc() { | ||||
| @ -150,9 +150,9 @@ class KeyAccessTest extends TestCase { | ||||
|     $this->_ensureAssoc([1, 2], [1, "a" => 2], $keys); | ||||
|   } | ||||
| 
 | ||||
|   private function _ensureKeys(?array $orig, ?array $expected, array $defaults) { | ||||
|   private function _ensureKeys(?array $orig, ?array $expected, array $defaults, ?array $params=null) { | ||||
|     $v = $orig; $a = new KeyAccess($v); | ||||
|     $a->ensureKeys($defaults); | ||||
|     $a->ensureKeys($defaults, $params); | ||||
|     self::assertSame($expected, $v); | ||||
|   } | ||||
|   function testEnsureKeys() { | ||||
| @ -168,12 +168,27 @@ class KeyAccessTest extends TestCase { | ||||
|     $this->_ensureKeys(["a" => 1, "b" => 2, "c" => 3, "x"], ["a" => 1, "b" => 2, "c" => 3, "x"], $defaults); | ||||
|   } | ||||
| 
 | ||||
|   private function _ensureAssocKeysOrder(?array $orig, ?array $expected, array $defaults) { | ||||
|   private function _ensureOrder(?array $orig, ?array $expected, array $keys, ?array $params=null) { | ||||
|     $v = $orig; $a = new KeyAccess($v); | ||||
|     $a->ensureOrder($keys, $params); | ||||
|     self::assertSame($expected, $v); | ||||
|   } | ||||
|   function testEnsureOrder() { | ||||
|     $keys = ["a", "b", "c"]; | ||||
| 
 | ||||
|     $this->_ensureOrder(null, null, $keys); | ||||
|     $this->_ensureOrder([], [], $keys); | ||||
|     $this->_ensureOrder([1], [1], $keys); | ||||
|     $this->_ensureOrder(["b" => 2, "a" => 1], ["a" => 1, "b" => 2], $keys); | ||||
|     $this->_ensureOrder(["c" => 3, "a" => 1], ["a" => 1, "c" => 3], $keys); | ||||
|   } | ||||
| 
 | ||||
|   private function _ensureAssocKeysOrder(?array $orig, ?array $expected, array $defaults, ?array $params=null) { | ||||
|     $v = $orig; $a = new KeyAccess($v); | ||||
|     $keys = array_keys($defaults); | ||||
|     $a->ensureAssoc($keys); | ||||
|     $a->ensureKeys($defaults); | ||||
|     $a->ensureOrder($keys); | ||||
|     $a->ensureAssoc($keys, $params); | ||||
|     $a->ensureKeys($defaults, $params); | ||||
|     $a->ensureOrder($keys, $params); | ||||
|     self::assertSame($expected, $v); | ||||
|   } | ||||
|   function testEnsureAssocKeysOrder() { | ||||
| @ -183,11 +198,18 @@ class KeyAccessTest extends TestCase { | ||||
|     $this->_ensureAssocKeysOrder([], ["a" => false, "b" => false, "c" => false], $defaults); | ||||
|     $this->_ensureAssocKeysOrder([1], ["a" => 1, "b" => false, "c" => false], $defaults); | ||||
|     $this->_ensureAssocKeysOrder([1, 2, 3], ["a" => 1, "b" => 2, "c" => 3], $defaults); | ||||
|     $this->_ensureAssocKeysOrder([1, 2, 3, 4], [3 => 4, "a" => 1, "b" => 2, "c" => 3], $defaults); | ||||
|     $this->_ensureAssocKeysOrder(["c" => 3, 1], ["c" => 3, "a" => 1, "b" => false], $defaults); | ||||
|     $this->_ensureAssocKeysOrder(["c" => 3, "b" => 2, 1], ["c" => 3, "b" => 2, "a" => 1], $defaults); | ||||
|     $this->_ensureAssocKeysOrder(["c" => 3, "b" => 2, "a" => 1], ["c" => 3, "b" => 2, "a" => 1], $defaults); | ||||
|     $this->_ensureAssocKeysOrder([1, 2, 3, 4], ["a" => 1, "b" => 2, "c" => 3, 4], $defaults); | ||||
|     $this->_ensureAssocKeysOrder([1, 2, 3, 4], ["a" => 1, "b" => 2, "c" => 3, 3 => 4], $defaults, [ | ||||
|       "preserve_keys" => true, | ||||
|     ]); | ||||
|     $this->_ensureAssocKeysOrder(["c" => 3, 1], ["a" => 1, "b" => false, "c" => 3], $defaults); | ||||
|     $this->_ensureAssocKeysOrder(["c" => 3, "b" => 2, 1], ["a" => 1, "b" => 2, "c" => 3], $defaults); | ||||
|     $this->_ensureAssocKeysOrder(["c" => 3, "b" => 2, "a" => 1], ["a" => 1, "b" => 2, "c" => 3], $defaults); | ||||
|     $this->_ensureAssocKeysOrder(["a" => 1, 2], ["a" => 1, "b" => 2, "c" => false], $defaults); | ||||
|     $this->_ensureAssocKeysOrder([2, "a" => 1], ["a" => 1, "b" => 2, "c" => false], $defaults); | ||||
| 
 | ||||
|     $this->_ensureAssocKeysOrder([1], ["x_a" => 1, "x_b" => false, "x_c" => false], $defaults, [ | ||||
|       "key_prefix" => "x_", | ||||
|     ]); | ||||
|   } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user