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(''); } }