first commit
This commit is contained in:
		
							
								
								
									
										182
									
								
								vendor/symfony/console/Question/ChoiceQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								vendor/symfony/console/Question/ChoiceQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| <?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 $choices; | ||||
|     private $multiselect = false; | ||||
|     private $prompt = ' > '; | ||||
|     private $errorMessage = 'Value "%s" is invalid'; | ||||
|  | ||||
|     /** | ||||
|      * @param string $question The question to ask to the user | ||||
|      * @param array  $choices  The list of available choices | ||||
|      * @param mixed  $default  The default answer to return | ||||
|      */ | ||||
|     public function __construct(string $question, array $choices, $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. | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getChoices() | ||||
|     { | ||||
|         return $this->choices; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets multiselect option. | ||||
|      * | ||||
|      * When multiselect is set to true, multiple choices can be answered. | ||||
|      * | ||||
|      * @param bool $multiselect | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setMultiselect($multiselect) | ||||
|     { | ||||
|         $this->multiselect = $multiselect; | ||||
|         $this->setValidator($this->getDefaultValidator()); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether the choices are multiselect. | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function isMultiselect() | ||||
|     { | ||||
|         return $this->multiselect; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the prompt for choices. | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getPrompt() | ||||
|     { | ||||
|         return $this->prompt; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the prompt for choices. | ||||
|      * | ||||
|      * @param string $prompt | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setPrompt($prompt) | ||||
|     { | ||||
|         $this->prompt = $prompt; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the error message for invalid values. | ||||
|      * | ||||
|      * The error message has a string placeholder (%s) for the invalid value. | ||||
|      * | ||||
|      * @param string $errorMessage | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setErrorMessage($errorMessage) | ||||
|     { | ||||
|         $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('/^[^,]+(?:,[^,]+)*$/', $selected, $matches)) { | ||||
|                     throw new InvalidArgumentException(sprintf($errorMessage, $selected)); | ||||
|                 } | ||||
|  | ||||
|                 $selectedChoices = array_map('trim', explode(',', $selected)); | ||||
|             } else { | ||||
|                 $selectedChoices = [trim($selected)]; | ||||
|             } | ||||
|  | ||||
|             $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)); | ||||
|                 } | ||||
|  | ||||
|                 $multiselectChoices[] = (string) $result; | ||||
|             } | ||||
|  | ||||
|             if ($multiselect) { | ||||
|                 return $multiselectChoices; | ||||
|             } | ||||
|  | ||||
|             return current($multiselectChoices); | ||||
|         }; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										59
									
								
								vendor/symfony/console/Question/ConfirmationQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								vendor/symfony/console/Question/ConfirmationQuestion.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| <?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 $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. | ||||
|      * | ||||
|      * @return callable | ||||
|      */ | ||||
|     private function getDefaultNormalizer() | ||||
|     { | ||||
|         $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; | ||||
|         }; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										246
									
								
								vendor/symfony/console/Question/Question.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								vendor/symfony/console/Question/Question.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,246 @@ | ||||
| <?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 $question; | ||||
|     private $attempts; | ||||
|     private $hidden = false; | ||||
|     private $hiddenFallback = true; | ||||
|     private $autocompleterValues; | ||||
|     private $validator; | ||||
|     private $default; | ||||
|     private $normalizer; | ||||
|  | ||||
|     /** | ||||
|      * @param string $question The question to ask to the user | ||||
|      * @param mixed  $default  The default answer to return if the user enters nothing | ||||
|      */ | ||||
|     public function __construct(string $question, $default = null) | ||||
|     { | ||||
|         $this->question = $question; | ||||
|         $this->default = $default; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the question. | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getQuestion() | ||||
|     { | ||||
|         return $this->question; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the default answer. | ||||
|      * | ||||
|      * @return mixed | ||||
|      */ | ||||
|     public function getDefault() | ||||
|     { | ||||
|         return $this->default; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether the user response must be hidden. | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function isHidden() | ||||
|     { | ||||
|         return $this->hidden; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets whether the user response must be hidden or not. | ||||
|      * | ||||
|      * @param bool $hidden | ||||
|      * | ||||
|      * @return $this | ||||
|      * | ||||
|      * @throws LogicException In case the autocompleter is also used | ||||
|      */ | ||||
|     public function setHidden($hidden) | ||||
|     { | ||||
|         if ($this->autocompleterValues) { | ||||
|             throw new LogicException('A hidden question cannot use the autocompleter.'); | ||||
|         } | ||||
|  | ||||
|         $this->hidden = (bool) $hidden; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * In case the response can not be hidden, whether to fallback on non-hidden question or not. | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function isHiddenFallback() | ||||
|     { | ||||
|         return $this->hiddenFallback; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets whether to fallback on non-hidden question if the response can not be hidden. | ||||
|      * | ||||
|      * @param bool $fallback | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setHiddenFallback($fallback) | ||||
|     { | ||||
|         $this->hiddenFallback = (bool) $fallback; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets values for the autocompleter. | ||||
|      * | ||||
|      * @return iterable|null | ||||
|      */ | ||||
|     public function getAutocompleterValues() | ||||
|     { | ||||
|         return $this->autocompleterValues; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets values for the autocompleter. | ||||
|      * | ||||
|      * @param iterable|null $values | ||||
|      * | ||||
|      * @return $this | ||||
|      * | ||||
|      * @throws InvalidArgumentException | ||||
|      * @throws LogicException | ||||
|      */ | ||||
|     public function setAutocompleterValues($values) | ||||
|     { | ||||
|         if (\is_array($values)) { | ||||
|             $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values); | ||||
|         } | ||||
|  | ||||
|         if (null !== $values && !\is_array($values) && !$values instanceof \Traversable) { | ||||
|             throw new InvalidArgumentException('Autocompleter values can be either an array, "null" or a "Traversable" object.'); | ||||
|         } | ||||
|  | ||||
|         if ($this->hidden) { | ||||
|             throw new LogicException('A hidden question cannot use the autocompleter.'); | ||||
|         } | ||||
|  | ||||
|         $this->autocompleterValues = $values; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets a validator for the question. | ||||
|      * | ||||
|      * @param callable|null $validator | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setValidator(callable $validator = null) | ||||
|     { | ||||
|         $this->validator = $validator; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the validator for the question. | ||||
|      * | ||||
|      * @return callable|null | ||||
|      */ | ||||
|     public function getValidator() | ||||
|     { | ||||
|         return $this->validator; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the maximum number of attempts. | ||||
|      * | ||||
|      * Null means an unlimited number of attempts. | ||||
|      * | ||||
|      * @param int|null $attempts | ||||
|      * | ||||
|      * @return $this | ||||
|      * | ||||
|      * @throws InvalidArgumentException in case the number of attempts is invalid | ||||
|      */ | ||||
|     public function setMaxAttempts($attempts) | ||||
|     { | ||||
|         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. | ||||
|      * | ||||
|      * @return int|null | ||||
|      */ | ||||
|     public function getMaxAttempts() | ||||
|     { | ||||
|         return $this->attempts; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets a normalizer for the response. | ||||
|      * | ||||
|      * The normalizer can be a callable (a string), a closure or a class implementing __invoke. | ||||
|      * | ||||
|      * @param callable $normalizer | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     public function setNormalizer(callable $normalizer) | ||||
|     { | ||||
|         $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. | ||||
|      * | ||||
|      * @return callable | ||||
|      */ | ||||
|     public function getNormalizer() | ||||
|     { | ||||
|         return $this->normalizer; | ||||
|     } | ||||
|  | ||||
|     protected function isAssoc($array) | ||||
|     { | ||||
|         return (bool) \count(array_filter(array_keys($array), 'is_string')); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user