taskConfigResolver = $taskConfigResolver; $this->filesystem = $filesystem; $this->paths = $paths; } public static function getDefaultName(): string { return self::COMMAND_NAME; } /** * Configure command. */ protected function configure(): void { $this->addOption( 'force', null, InputOption::VALUE_NONE, 'Forces overwriting the configuration file when it already exists.' ); $this->addOption( 'silent', null, InputOption::VALUE_NONE, 'Only output what really matters.' ); } /** * @return int|void */ public function execute(InputInterface $input, OutputInterface $output): int { $this->input = $input; $configFile = $this->paths->getConfigFile(); $force = $input->getOption('force'); if ($this->filesystem->exists($configFile) && !$force) { if (!$input->getOption('silent')) { $output->writeln('GrumPHP is already configured!'); } return 0; } // Check configuration: $configuration = $this->buildConfiguration($input, $output); if (!$configuration) { $output->writeln('Skipped configuring GrumPHP. Using default configuration.'); return 0; } // Check write action $written = $this->writeConfiguration($configFile, $configuration); if (!$written) { $output->writeln('The configuration file could not be saved. Give me some permissions!'); return 1; } if (!$input->getOption('silent')) { $output->writeln('GrumPHP is configured and ready to kick ass!'); } return 0; } /** * This method will ask the developer for it's input and will result in a configuration array. */ protected function buildConfiguration(InputInterface $input, OutputInterface $output): array { /** @var QuestionHelper $helper */ $helper = $this->getHelper('question'); $questionString = $this->createQuestionString( 'Do you want to create a grumphp.yml file?', 'Yes' ); $question = new ConfirmationQuestion($questionString, true); if (!$helper->ask($input, $output, $question)) { return []; } // Search tasks $tasks = []; if ($input->isInteractive()) { $question = new ChoiceQuestion( $this->createQuestionString('Which tasks do you want to run?', null, ''), $this->taskConfigResolver->listAvailableTaskNames() ); $question->setMultiselect(true); $tasks = (array) $helper->ask($input, $output, $question); } // Build configuration return [ 'parameters' => [ 'tasks' => array_map(function ($task) { return null; }, array_flip($tasks)), ], ]; } protected function createQuestionString(string $question, string $default = null, string $separator = ':'): string { return null !== $default ? sprintf('%s [%s]%s ', $question, $default, $separator) : sprintf('%s%s ', $question, $separator); } protected function writeConfiguration(string $configFile, array $configuration): bool { try { $yaml = Yaml::dump($configuration); $this->filesystem->dumpFile($configFile, $yaml); return true; } catch (Exception $e) { // Fail silently and return false! } return false; } }