Chris@0: getOption('answers')) { Chris@0: $answers = json_decode($answers_raw, TRUE); Chris@0: if (!is_array($answers)) { Chris@0: throw new InvalidOptionException('Answers should be encoded in JSON format.'); Chris@0: } Chris@0: } Chris@0: Chris@0: /** @var \Symfony\Component\Console\Helper\QuestionHelper $question_helper */ Chris@0: $question_helper = $this->getHelperSet()->get('question'); Chris@0: Chris@0: /** @var \DrupalCodeGenerator\Command\GeneratorInterface $command */ Chris@0: $command = $this->getHelperSet()->getCommand(); Chris@0: $directory = $command->getDirectory(); Chris@0: Chris@0: foreach ($questions as $name => $question) { Chris@5: Chris@5: if (in_array($name, $this->askedQuestions)) { Chris@5: continue; Chris@5: } Chris@5: $this->askedQuestions[] = $name; Chris@5: Chris@0: /** @var \Symfony\Component\Console\Question\Question $question */ Chris@0: $default_value = $question->getDefault(); Chris@0: Chris@0: // Make some assumptions based on question name. Chris@0: if ($default_value === NULL) { Chris@0: switch ($name) { Chris@0: case 'name': Chris@0: $root_directory = basename(Utils::getExtensionRoot($directory) ?: $directory); Chris@0: $default_value = Utils::machine2human($root_directory); Chris@0: break; Chris@0: Chris@0: case 'machine_name': Chris@0: $default_value = function (array $vars) use ($directory) { Chris@0: return Utils::human2machine(isset($vars['name']) ? $vars['name'] : basename($directory)); Chris@0: }; Chris@0: break; Chris@0: } Chris@0: } Chris@0: Chris@0: // Turn the callback into a value acceptable for Symfony question helper. Chris@0: if (is_callable($default_value)) { Chris@0: // Do not treat simple strings as callable because they may match PHP Chris@0: // builtin functions. Chris@0: if (!is_string($default_value) || strpos('::', $default_value) !== FALSE) { Chris@0: $default_value = call_user_func($default_value, $vars); Chris@0: } Chris@0: } Chris@0: // Default value may have tokens. Chris@0: $default_value = Utils::tokenReplace($default_value, $vars); Chris@0: $this->setQuestionDefault($question, $default_value); Chris@0: Chris@0: if ($answers) { Chris@0: if (array_key_exists($name, $answers)) { Chris@0: $answer = $answers[$name]; Chris@4: // Validate provided answer. Chris@4: if ($validator = $question->getValidator()) { Chris@4: $validator($answer); Chris@4: } Chris@0: // Turn 'yes/no' string into boolean. Chris@0: if ($question instanceof ConfirmationQuestion && !is_bool($answer)) { Chris@0: $answer = strcasecmp($answer, 'yes') == 0; Chris@0: } Chris@0: } Chris@0: else { Chris@0: $answer = $default_value; Chris@0: } Chris@0: } Chris@0: else { Chris@0: $this->formatQuestionText($question); Chris@0: $answer = $question_helper->ask($input, $output, $question); Chris@0: } Chris@0: Chris@0: $vars[$name] = $answer; Chris@0: } Chris@0: Chris@0: return $vars; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Formats question text. Chris@0: * Chris@0: * @param \Symfony\Component\Console\Question\Question $question Chris@0: * The question. Chris@0: */ Chris@0: protected function formatQuestionText(Question $question) { Chris@0: $question_text = $question->getQuestion(); Chris@0: $default_value = $question->getDefault(); Chris@0: Chris@0: $question_text = "\n $question_text"; Chris@0: if (is_bool($default_value)) { Chris@0: $default_value = $default_value ? 'Yes' : 'No'; Chris@0: } Chris@0: if ($default_value) { Chris@0: $question_text .= " [$default_value]"; Chris@0: } Chris@0: $question_text .= ":"; Chris@0: if ($question instanceof ChoiceQuestion) { Chris@0: $question->setPrompt(' ➤➤➤ '); Chris@0: } Chris@0: else { Chris@0: $question_text .= "\n ➤ "; Chris@0: } Chris@0: Chris@0: $this->setQuestionText($question, $question_text); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Normalizes questions. Chris@0: * Chris@0: * @param \Symfony\Component\Console\Question\Question[] $questions Chris@0: * Questions to normalize. Chris@0: * Chris@0: * @return \Symfony\Component\Console\Question\Question[] Chris@0: * Normalized questions Chris@0: * Chris@0: * @deprecated Chris@0: * Use Symfony\Component\Console\Question\Question to define questions. Chris@0: * Chris@0: * @codeCoverageIgnore Chris@0: */ Chris@0: protected function normalizeQuestions(array $questions) { Chris@0: return array_map(function ($question) { Chris@0: // Support array syntax. Chris@0: if (is_array($question)) { Chris@0: if (count($question) > 2) { Chris@0: throw new \OutOfBoundsException('The question array is too long.'); Chris@0: } Chris@0: list($question_text, $default_value) = array_pad($question, 2, NULL); Chris@0: $question = new Question($question_text, $default_value); Chris@0: } Chris@0: return $question; Chris@0: }, $questions); Chris@0: } Chris@0: Chris@0: }