feat: kernel dump

This commit is contained in:
Nuno Maduro
2023-02-18 14:39:44 +00:00
parent d0e949bf19
commit 7fc12613a8
10 changed files with 201 additions and 24 deletions

91
src/KernelDump.php Normal file
View File

@ -0,0 +1,91 @@
<?php
declare(strict_types=1);
namespace Pest;
use Pest\Support\View;
use Symfony\Component\Console\Output\OutputInterface;
final class KernelDump
{
/**
* The output buffer, if any.
*/
private string $buffer = '';
/**
* Creates a new Kernel Dump instance.
*/
public function __construct(
private readonly OutputInterface $output,
) {
// ...
}
/**
* Enable the output buffering.
*/
public function enable(): void
{
ob_start(function (string $message): string {
$this->buffer .= $message;
return '';
});
}
/**
* Disable the output buffering.
*/
public function disable(): void
{
ob_clean();
if ($this->buffer !== '') {
$this->flush('INFO');
}
}
/**
* Shutdown the output buffering.
*/
public function shutdown(): void
{
ob_clean();
if ($this->buffer !== '') {
$this->flush('ERROR');
}
}
/**
* Flushes the buffer.
*/
private function flush(string $type): void
{
View::renderUsing($this->output);
if ($this->isOpeningHeadline($this->buffer)) {
$this->buffer = implode(PHP_EOL, array_slice(explode(PHP_EOL, $this->buffer), 2));
}
$this->buffer = trim($this->buffer);
$this->buffer = rtrim($this->buffer, '.').'.';
View::render('components.badge', [
'type' => $type,
'content' => $this->buffer,
]);
$this->buffer = '';
}
/**
* Checks if the given output contains an opening headline.
*/
private function isOpeningHeadline(string $output): bool
{
return str_contains($output, 'by Sebastian Bergmann and contributors.');
}
}