primo commit
This commit is contained in:
		
							
								
								
									
										177
									
								
								libraries/vendor/symfony/console/Question/ChoiceQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								libraries/vendor/symfony/console/Question/ChoiceQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,177 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * This file is part of the Symfony package. | ||||
|  * | ||||
|  * (c) Fabien Potencier <fabien@symfony.com> | ||||
|  * | ||||
|  * For the full copyright and license information, please view the LICENSE | ||||
|  * file that was distributed with this source code. | ||||
|  */ | ||||
|  | ||||
| namespace Symfony\Component\Console\Question; | ||||
|  | ||||
| use Symfony\Component\Console\Exception\InvalidArgumentException; | ||||
|  | ||||
| /** | ||||
|  * Represents a choice question. | ||||
|  * | ||||
|  * @author Fabien Potencier <fabien@symfony.com> | ||||
|  */ | ||||
| class ChoiceQuestion extends Question | ||||
| { | ||||
|     private array $choices; | ||||
|     private bool $multiselect = false; | ||||
|     private string $prompt = ' > '; | ||||
|     private string $errorMessage = 'Value "%s" is invalid'; | ||||
|  | ||||
|     /** | ||||
|      * @param string                     $question The question to ask to the user | ||||
|      * @param array                      $choices  The list of available choices | ||||
|      * @param string|bool|int|float|null $default  The default answer to return | ||||
|      */ | ||||
|     public function __construct(string $question, array $choices, string|bool|int|float|null $default = null) | ||||
|     { | ||||
|         if (!$choices) { | ||||
|             throw new \LogicException('Choice question must have at least 1 choice available.'); | ||||
|         } | ||||
|  | ||||
|         parent::__construct($question, $default); | ||||
|  | ||||
|         $this->choices = $choices; | ||||
|         $this->setValidator($this->getDefaultValidator()); | ||||
|         $this->setAutocompleterValues($choices); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns available choices. | ||||
|      */ | ||||
|     public function getChoices(): array | ||||
|     { | ||||
|         return $this->choices; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets multiselect option. | ||||
|      * | ||||
|      * When multiselect is set to true, multiple choices can be answered. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setMultiselect(bool $multiselect): static | ||||
|     { | ||||
|         $this->multiselect = $multiselect; | ||||
|         $this->setValidator($this->getDefaultValidator()); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether the choices are multiselect. | ||||
|      */ | ||||
|     public function isMultiselect(): bool | ||||
|     { | ||||
|         return $this->multiselect; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the prompt for choices. | ||||
|      */ | ||||
|     public function getPrompt(): string | ||||
|     { | ||||
|         return $this->prompt; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the prompt for choices. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setPrompt(string $prompt): static | ||||
|     { | ||||
|         $this->prompt = $prompt; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the error message for invalid values. | ||||
|      * | ||||
|      * The error message has a string placeholder (%s) for the invalid value. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setErrorMessage(string $errorMessage): static | ||||
|     { | ||||
|         $this->errorMessage = $errorMessage; | ||||
|         $this->setValidator($this->getDefaultValidator()); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     private function getDefaultValidator(): callable | ||||
|     { | ||||
|         $choices = $this->choices; | ||||
|         $errorMessage = $this->errorMessage; | ||||
|         $multiselect = $this->multiselect; | ||||
|         $isAssoc = $this->isAssoc($choices); | ||||
|  | ||||
|         return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) { | ||||
|             if ($multiselect) { | ||||
|                 // Check for a separated comma values | ||||
|                 if (!preg_match('/^[^,]+(?:,[^,]+)*$/', (string) $selected, $matches)) { | ||||
|                     throw new InvalidArgumentException(sprintf($errorMessage, $selected)); | ||||
|                 } | ||||
|  | ||||
|                 $selectedChoices = explode(',', (string) $selected); | ||||
|             } else { | ||||
|                 $selectedChoices = [$selected]; | ||||
|             } | ||||
|  | ||||
|             if ($this->isTrimmable()) { | ||||
|                 foreach ($selectedChoices as $k => $v) { | ||||
|                     $selectedChoices[$k] = trim((string) $v); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $multiselectChoices = []; | ||||
|             foreach ($selectedChoices as $value) { | ||||
|                 $results = []; | ||||
|                 foreach ($choices as $key => $choice) { | ||||
|                     if ($choice === $value) { | ||||
|                         $results[] = $key; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (\count($results) > 1) { | ||||
|                     throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of "%s".', implode('" or "', $results))); | ||||
|                 } | ||||
|  | ||||
|                 $result = array_search($value, $choices); | ||||
|  | ||||
|                 if (!$isAssoc) { | ||||
|                     if (false !== $result) { | ||||
|                         $result = $choices[$result]; | ||||
|                     } elseif (isset($choices[$value])) { | ||||
|                         $result = $choices[$value]; | ||||
|                     } | ||||
|                 } elseif (false === $result && isset($choices[$value])) { | ||||
|                     $result = $value; | ||||
|                 } | ||||
|  | ||||
|                 if (false === $result) { | ||||
|                     throw new InvalidArgumentException(sprintf($errorMessage, $value)); | ||||
|                 } | ||||
|  | ||||
|                 // For associative choices, consistently return the key as string: | ||||
|                 $multiselectChoices[] = $isAssoc ? (string) $result : $result; | ||||
|             } | ||||
|  | ||||
|             if ($multiselect) { | ||||
|                 return $multiselectChoices; | ||||
|             } | ||||
|  | ||||
|             return current($multiselectChoices); | ||||
|         }; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										57
									
								
								libraries/vendor/symfony/console/Question/ConfirmationQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								libraries/vendor/symfony/console/Question/ConfirmationQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * This file is part of the Symfony package. | ||||
|  * | ||||
|  * (c) Fabien Potencier <fabien@symfony.com> | ||||
|  * | ||||
|  * For the full copyright and license information, please view the LICENSE | ||||
|  * file that was distributed with this source code. | ||||
|  */ | ||||
|  | ||||
| namespace Symfony\Component\Console\Question; | ||||
|  | ||||
| /** | ||||
|  * Represents a yes/no question. | ||||
|  * | ||||
|  * @author Fabien Potencier <fabien@symfony.com> | ||||
|  */ | ||||
| class ConfirmationQuestion extends Question | ||||
| { | ||||
|     private string $trueAnswerRegex; | ||||
|  | ||||
|     /** | ||||
|      * @param string $question        The question to ask to the user | ||||
|      * @param bool   $default         The default answer to return, true or false | ||||
|      * @param string $trueAnswerRegex A regex to match the "yes" answer | ||||
|      */ | ||||
|     public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i') | ||||
|     { | ||||
|         parent::__construct($question, $default); | ||||
|  | ||||
|         $this->trueAnswerRegex = $trueAnswerRegex; | ||||
|         $this->setNormalizer($this->getDefaultNormalizer()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the default answer normalizer. | ||||
|      */ | ||||
|     private function getDefaultNormalizer(): callable | ||||
|     { | ||||
|         $default = $this->getDefault(); | ||||
|         $regex = $this->trueAnswerRegex; | ||||
|  | ||||
|         return function ($answer) use ($default, $regex) { | ||||
|             if (\is_bool($answer)) { | ||||
|                 return $answer; | ||||
|             } | ||||
|  | ||||
|             $answerIsTrue = (bool) preg_match($regex, $answer); | ||||
|             if (false === $default) { | ||||
|                 return $answer && $answerIsTrue; | ||||
|             } | ||||
|  | ||||
|             return '' === $answer || $answerIsTrue; | ||||
|         }; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										291
									
								
								libraries/vendor/symfony/console/Question/Question.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								libraries/vendor/symfony/console/Question/Question.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,291 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * This file is part of the Symfony package. | ||||
|  * | ||||
|  * (c) Fabien Potencier <fabien@symfony.com> | ||||
|  * | ||||
|  * For the full copyright and license information, please view the LICENSE | ||||
|  * file that was distributed with this source code. | ||||
|  */ | ||||
|  | ||||
| namespace Symfony\Component\Console\Question; | ||||
|  | ||||
| use Symfony\Component\Console\Exception\InvalidArgumentException; | ||||
| use Symfony\Component\Console\Exception\LogicException; | ||||
|  | ||||
| /** | ||||
|  * Represents a Question. | ||||
|  * | ||||
|  * @author Fabien Potencier <fabien@symfony.com> | ||||
|  */ | ||||
| class Question | ||||
| { | ||||
|     private string $question; | ||||
|     private ?int $attempts = null; | ||||
|     private bool $hidden = false; | ||||
|     private bool $hiddenFallback = true; | ||||
|     private ?\Closure $autocompleterCallback = null; | ||||
|     private ?\Closure $validator = null; | ||||
|     private string|int|bool|null|float $default; | ||||
|     private ?\Closure $normalizer = null; | ||||
|     private bool $trimmable = true; | ||||
|     private bool $multiline = false; | ||||
|  | ||||
|     /** | ||||
|      * @param string                     $question The question to ask to the user | ||||
|      * @param string|bool|int|float|null $default  The default answer to return if the user enters nothing | ||||
|      */ | ||||
|     public function __construct(string $question, string|bool|int|float|null $default = null) | ||||
|     { | ||||
|         $this->question = $question; | ||||
|         $this->default = $default; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the question. | ||||
|      */ | ||||
|     public function getQuestion(): string | ||||
|     { | ||||
|         return $this->question; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the default answer. | ||||
|      */ | ||||
|     public function getDefault(): string|bool|int|float|null | ||||
|     { | ||||
|         return $this->default; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether the user response accepts newline characters. | ||||
|      */ | ||||
|     public function isMultiline(): bool | ||||
|     { | ||||
|         return $this->multiline; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets whether the user response should accept newline characters. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setMultiline(bool $multiline): static | ||||
|     { | ||||
|         $this->multiline = $multiline; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether the user response must be hidden. | ||||
|      */ | ||||
|     public function isHidden(): bool | ||||
|     { | ||||
|         return $this->hidden; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets whether the user response must be hidden or not. | ||||
|      * | ||||
|      * @return $this | ||||
|      * | ||||
|      * @throws LogicException In case the autocompleter is also used | ||||
|      */ | ||||
|     public function setHidden(bool $hidden): static | ||||
|     { | ||||
|         if ($this->autocompleterCallback) { | ||||
|             throw new LogicException('A hidden question cannot use the autocompleter.'); | ||||
|         } | ||||
|  | ||||
|         $this->hidden = $hidden; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * In case the response cannot be hidden, whether to fallback on non-hidden question or not. | ||||
|      */ | ||||
|     public function isHiddenFallback(): bool | ||||
|     { | ||||
|         return $this->hiddenFallback; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets whether to fallback on non-hidden question if the response cannot be hidden. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setHiddenFallback(bool $fallback): static | ||||
|     { | ||||
|         $this->hiddenFallback = $fallback; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets values for the autocompleter. | ||||
|      */ | ||||
|     public function getAutocompleterValues(): ?iterable | ||||
|     { | ||||
|         $callback = $this->getAutocompleterCallback(); | ||||
|  | ||||
|         return $callback ? $callback('') : null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets values for the autocompleter. | ||||
|      * | ||||
|      * @return $this | ||||
|      * | ||||
|      * @throws LogicException | ||||
|      */ | ||||
|     public function setAutocompleterValues(?iterable $values): static | ||||
|     { | ||||
|         if (\is_array($values)) { | ||||
|             $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values); | ||||
|  | ||||
|             $callback = static fn () => $values; | ||||
|         } elseif ($values instanceof \Traversable) { | ||||
|             $callback = static function () use ($values) { | ||||
|                 static $valueCache; | ||||
|  | ||||
|                 return $valueCache ??= iterator_to_array($values, false); | ||||
|             }; | ||||
|         } else { | ||||
|             $callback = null; | ||||
|         } | ||||
|  | ||||
|         return $this->setAutocompleterCallback($callback); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the callback function used for the autocompleter. | ||||
|      */ | ||||
|     public function getAutocompleterCallback(): ?callable | ||||
|     { | ||||
|         return $this->autocompleterCallback; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the callback function used for the autocompleter. | ||||
|      * | ||||
|      * The callback is passed the user input as argument and should return an iterable of corresponding suggestions. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setAutocompleterCallback(?callable $callback = null): static | ||||
|     { | ||||
|         if (1 > \func_num_args()) { | ||||
|             trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); | ||||
|         } | ||||
|         if ($this->hidden && null !== $callback) { | ||||
|             throw new LogicException('A hidden question cannot use the autocompleter.'); | ||||
|         } | ||||
|  | ||||
|         $this->autocompleterCallback = null === $callback ? null : $callback(...); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets a validator for the question. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setValidator(?callable $validator = null): static | ||||
|     { | ||||
|         if (1 > \func_num_args()) { | ||||
|             trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); | ||||
|         } | ||||
|         $this->validator = null === $validator ? null : $validator(...); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the validator for the question. | ||||
|      */ | ||||
|     public function getValidator(): ?callable | ||||
|     { | ||||
|         return $this->validator; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the maximum number of attempts. | ||||
|      * | ||||
|      * Null means an unlimited number of attempts. | ||||
|      * | ||||
|      * @return $this | ||||
|      * | ||||
|      * @throws InvalidArgumentException in case the number of attempts is invalid | ||||
|      */ | ||||
|     public function setMaxAttempts(?int $attempts): static | ||||
|     { | ||||
|         if (null !== $attempts && $attempts < 1) { | ||||
|             throw new InvalidArgumentException('Maximum number of attempts must be a positive value.'); | ||||
|         } | ||||
|  | ||||
|         $this->attempts = $attempts; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the maximum number of attempts. | ||||
|      * | ||||
|      * Null means an unlimited number of attempts. | ||||
|      */ | ||||
|     public function getMaxAttempts(): ?int | ||||
|     { | ||||
|         return $this->attempts; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets a normalizer for the response. | ||||
|      * | ||||
|      * The normalizer can be a callable (a string), a closure or a class implementing __invoke. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setNormalizer(callable $normalizer): static | ||||
|     { | ||||
|         $this->normalizer = $normalizer(...); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the normalizer for the response. | ||||
|      * | ||||
|      * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. | ||||
|      */ | ||||
|     public function getNormalizer(): ?callable | ||||
|     { | ||||
|         return $this->normalizer; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function isAssoc(array $array) | ||||
|     { | ||||
|         return (bool) \count(array_filter(array_keys($array), 'is_string')); | ||||
|     } | ||||
|  | ||||
|     public function isTrimmable(): bool | ||||
|     { | ||||
|         return $this->trimmable; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setTrimmable(bool $trimmable): static | ||||
|     { | ||||
|         $this->trimmable = $trimmable; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user