output = $output;
}
public static function getSubscribedEvents(): array
{
return [
RunnerEvents::RUNNER_RUN => 'startProgress',
TaskEvents::TASK_RUN => 'advanceProgress',
TaskEvents::TASK_COMPLETE => 'onTaskProgress',
TaskEvents::TASK_FAILED => 'onTaskProgress',
TaskEvents::TASK_SKIPPED => 'onTaskProgress',
RunnerEvents::RUNNER_COMPLETE => 'finishProgress',
RunnerEvents::RUNNER_FAILED => 'finishProgress',
];
}
public function createProgressBar(int $totalTasks): ProgressBar
{
$minSecondsBetweenRedraws = 0.0; // New progressbar doesnt redraw frequently enough.
$this->progressBar = new ProgressBar($this->output, $totalTasks, $minSecondsBetweenRedraws);
$this->progressBar->setOverwrite(false);
$this->progressBar->setFormat('Running task %current%/%max%: %message%... ');
return $this->progressBar;
}
public function startProgress(RunnerEvent $event): void
{
$numberOftasks = $event->getTasks()->count();
$this->createProgressBar($numberOftasks);
$this->output->write('GrumPHP is sniffing your code!');
}
public function advanceProgress(TaskEvent $event): void
{
$config = $event->getTask()->getConfig();
$metadata = $config->getMetadata();
$this->progressBar->setMessage($metadata->label() ?: $config->getName());
$this->progressBar->advance();
}
public function onTaskProgress(TaskEvent $task, string $event): void
{
switch ($event) {
case TaskEvents::TASK_COMPLETE:
$this->output->write('✔');
break;
case TaskEvents::TASK_FAILED:
$this->output->write('✘');
break;
case TaskEvents::TASK_SKIPPED:
$this->output->write('', true);
$this->output->write('Oh no, we hit the windows cmd input limit!', true);
$this->output->write('Skipping task...');
}
}
public function finishProgress(RunnerEvent $runnerEvent): void
{
if ($this->progressBar->getProgress() !== $this->progressBar->getMaxSteps()) {
$this->progressBar->setFormat('%message%');
$this->progressBar->setMessage('Aborted ...');
}
$this->progressBar->finish();
$this->output->writeln('');
}
}