mirror of
https://github.com/pestphp/pest.git
synced 2026-03-07 16:27:23 +01:00
feat: improves exporter
This commit is contained in:
82
src/Support/Exporter.php
Normal file
82
src/Support/Exporter.php
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Pest\Support;
|
||||
|
||||
use SebastianBergmann\Exporter\Exporter as BaseExporter;
|
||||
use SebastianBergmann\RecursionContext\Context;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Exporter
|
||||
{
|
||||
/**
|
||||
* The maximum number of items in an array to export.
|
||||
*/
|
||||
private const MAX_ARRAY_ITEMS = 3;
|
||||
|
||||
/**
|
||||
* Creates a new Exporter instance.
|
||||
*/
|
||||
public function __construct(
|
||||
private readonly BaseExporter $exporter,
|
||||
) {
|
||||
// ...
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Exporter instance.
|
||||
*/
|
||||
public static function default(): self
|
||||
{
|
||||
return new self(
|
||||
new BaseExporter()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Exports a value into a single-line string recursively.
|
||||
*
|
||||
* @param array<int|string, mixed> $data
|
||||
*/
|
||||
public function shortenedRecursiveExport(array &$data, Context $context = null): string
|
||||
{
|
||||
$result = [];
|
||||
$array = $data;
|
||||
$itemsCount = 0;
|
||||
$exporter = self::default();
|
||||
$context ??= new Context();
|
||||
|
||||
$context->add($data);
|
||||
|
||||
foreach ($array as $key => $value) {
|
||||
if (++$itemsCount > self::MAX_ARRAY_ITEMS) {
|
||||
$result[] = '…';
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (! is_array($value)) {
|
||||
$result[] = $exporter->shortenedExport($value);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$result[] = $context->contains($data[$key]) !== false
|
||||
? '*RECURSION*'
|
||||
: sprintf('[%s]', $this->shortenedRecursiveExport($data[$key], $context));
|
||||
}
|
||||
|
||||
return implode(', ', $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Exports a value into a single-line string.
|
||||
*/
|
||||
public function shortenedExport(mixed $value): string
|
||||
{
|
||||
return (string) preg_replace(['#\.{3}#', '#\\\n\s*#'], ['…'], $this->exporter->shortenedExport($value));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user