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;
}
}