fix:更新已知bug,优化代码

This commit is contained in:
Ying
2022-11-28 19:11:12 +08:00
parent f6aee95cfc
commit 9445b206a2
1378 changed files with 53759 additions and 20789 deletions

View File

@@ -21,15 +21,13 @@ namespace Symfony\Component\Console\Helper;
class DebugFormatterHelper extends Helper
{
private const COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default'];
private $started = [];
private $count = -1;
private array $started = [];
private int $count = -1;
/**
* Starts a debug formatting session.
*
* @return string
*/
public function start(string $id, string $message, string $prefix = 'RUN')
public function start(string $id, string $message, string $prefix = 'RUN'): string
{
$this->started[$id] = ['border' => ++$this->count % \count(self::COLORS)];
@@ -38,10 +36,8 @@ class DebugFormatterHelper extends Helper
/**
* Adds progress to a formatting session.
*
* @return string
*/
public function progress(string $id, string $buffer, bool $error = false, string $prefix = 'OUT', string $errorPrefix = 'ERR')
public function progress(string $id, string $buffer, bool $error = false, string $prefix = 'OUT', string $errorPrefix = 'ERR'): string
{
$message = '';
@@ -74,10 +70,8 @@ class DebugFormatterHelper extends Helper
/**
* Stops a formatting session.
*
* @return string
*/
public function stop(string $id, string $message, bool $successful, string $prefix = 'RES')
public function stop(string $id, string $message, bool $successful, string $prefix = 'RES'): string
{
$trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : '';
@@ -100,7 +94,7 @@ class DebugFormatterHelper extends Helper
/**
* {@inheritdoc}
*/
public function getName()
public function getName(): string
{
return 'debug_formatter';
}

View File

@@ -29,7 +29,7 @@ class DescriptorHelper extends Helper
/**
* @var DescriptorInterface[]
*/
private $descriptors = [];
private array $descriptors = [];
public function __construct()
{
@@ -70,7 +70,7 @@ class DescriptorHelper extends Helper
*
* @return $this
*/
public function register(string $format, DescriptorInterface $descriptor)
public function register(string $format, DescriptorInterface $descriptor): static
{
$this->descriptors[$format] = $descriptor;
@@ -80,7 +80,7 @@ class DescriptorHelper extends Helper
/**
* {@inheritdoc}
*/
public function getName()
public function getName(): string
{
return 'descriptor';
}

View File

@@ -24,7 +24,7 @@ final class Dumper
private $output;
private $dumper;
private $cloner;
private $handler;
private \Closure $handler;
public function __construct(OutputInterface $output, CliDumper $dumper = null, ClonerInterface $cloner = null)
{
@@ -57,7 +57,7 @@ final class Dumper
}
}
public function __invoke($var): string
public function __invoke(mixed $var): string
{
return ($this->handler)($var);
}

View File

@@ -22,22 +22,16 @@ class FormatterHelper extends Helper
{
/**
* Formats a message within a section.
*
* @return string
*/
public function formatSection(string $section, string $message, string $style = 'info')
public function formatSection(string $section, string $message, string $style = 'info'): string
{
return sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);
}
/**
* Formats a message as a block of text.
*
* @param string|array $messages The message to write in the block
*
* @return string
*/
public function formatBlock($messages, string $style, bool $large = false)
public function formatBlock(string|array $messages, string $style, bool $large = false): string
{
if (!\is_array($messages)) {
$messages = [$messages];
@@ -68,10 +62,8 @@ class FormatterHelper extends Helper
/**
* Truncates a message to the given length.
*
* @return string
*/
public function truncate(string $message, int $length, string $suffix = '...')
public function truncate(string $message, int $length, string $suffix = '...'): string
{
$computedLength = $length - self::width($suffix);
@@ -85,7 +77,7 @@ class FormatterHelper extends Helper
/**
* {@inheritdoc}
*/
public function getName()
public function getName(): string
{
return 'formatter';
}

View File

@@ -34,25 +34,11 @@ abstract class Helper implements HelperInterface
/**
* {@inheritdoc}
*/
public function getHelperSet()
public function getHelperSet(): ?HelperSet
{
return $this->helperSet;
}
/**
* Returns the length of a string, using mb_strwidth if it is available.
*
* @deprecated since Symfony 5.3
*
* @return int
*/
public static function strlen(?string $string)
{
trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::width() or Helper::length() instead.', __METHOD__);
return self::width($string);
}
/**
* Returns the width of a string, using mb_strwidth if it is available.
* The width is how many characters positions the string will use.
@@ -93,10 +79,8 @@ abstract class Helper implements HelperInterface
/**
* Returns the subset of a string, using mb_substr if it is available.
*
* @return string
*/
public static function substr(?string $string, int $from, int $length = null)
public static function substr(?string $string, int $from, int $length = null): string
{
$string ?? $string = '';
@@ -107,7 +91,7 @@ abstract class Helper implements HelperInterface
return mb_substr($string, $from, $length, $encoding);
}
public static function formatTime($secs)
public static function formatTime(int|float $secs)
{
static $timeFormats = [
[0, '< 1 sec'],
@@ -153,16 +137,6 @@ abstract class Helper implements HelperInterface
return sprintf('%d B', $memory);
}
/**
* @deprecated since Symfony 5.3
*/
public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, ?string $string)
{
trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::removeDecoration() instead.', __METHOD__);
return self::width(self::removeDecoration($formatter, $string));
}
public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string)
{
$isDecorated = $formatter->isDecorated();
@@ -171,6 +145,8 @@ abstract class Helper implements HelperInterface
$string = $formatter->format($string ?? '');
// remove already formatted characters
$string = preg_replace("/\033\[[^m]*m/", '', $string ?? '');
// remove terminal hyperlinks
$string = preg_replace('/\\033]8;[^;]*;[^\\033]*\\033\\\\/', '', $string ?? '');
$formatter->setDecorated($isDecorated);
return $string;

View File

@@ -25,10 +25,8 @@ interface HelperInterface
/**
* Gets the helper set associated with this helper.
*
* @return HelperSet|null
*/
public function getHelperSet();
public function getHelperSet(): ?HelperSet;
/**
* Returns the canonical name of this helper.

View File

@@ -11,7 +11,6 @@
namespace Symfony\Component\Console\Helper;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidArgumentException;
/**
@@ -24,8 +23,7 @@ use Symfony\Component\Console\Exception\InvalidArgumentException;
class HelperSet implements \IteratorAggregate
{
/** @var array<string, Helper> */
private $helpers = [];
private $command;
private array $helpers = [];
/**
* @param Helper[] $helpers An array of helper
@@ -49,10 +47,8 @@ class HelperSet implements \IteratorAggregate
/**
* Returns true if the helper if defined.
*
* @return bool
*/
public function has(string $name)
public function has(string $name): bool
{
return isset($this->helpers[$name]);
}
@@ -60,11 +56,9 @@ class HelperSet implements \IteratorAggregate
/**
* Gets a helper value.
*
* @return HelperInterface
*
* @throws InvalidArgumentException if the helper is not defined
*/
public function get(string $name)
public function get(string $name): HelperInterface
{
if (!$this->has($name)) {
throw new InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name));
@@ -73,35 +67,7 @@ class HelperSet implements \IteratorAggregate
return $this->helpers[$name];
}
/**
* @deprecated since Symfony 5.4
*/
public function setCommand(Command $command = null)
{
trigger_deprecation('symfony/console', '5.4', 'Method "%s()" is deprecated.', __METHOD__);
$this->command = $command;
}
/**
* Gets the command associated with this helper set.
*
* @return Command
*
* @deprecated since Symfony 5.4
*/
public function getCommand()
{
trigger_deprecation('symfony/console', '5.4', 'Method "%s()" is deprecated.', __METHOD__);
return $this->command;
}
/**
* @return \Traversable<string, Helper>
*/
#[\ReturnTypeWillChange]
public function getIterator()
public function getIterator(): \Traversable
{
return new \ArrayIterator($this->helpers);
}

View File

@@ -32,7 +32,7 @@ class ProcessHelper extends Helper
* @param callable|null $callback A PHP callback to run whenever there is some
* output available on STDOUT or STDERR
*/
public function run(OutputInterface $output, $cmd, string $error = null, callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process
public function run(OutputInterface $output, array|Process $cmd, string $error = null, callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process
{
if (!class_exists(Process::class)) {
throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".');
@@ -48,10 +48,6 @@ class ProcessHelper extends Helper
$cmd = [$cmd];
}
if (!\is_array($cmd)) {
throw new \TypeError(sprintf('The "command" argument of "%s()" must be an array or a "%s" instance, "%s" given.', __METHOD__, Process::class, get_debug_type($cmd)));
}
if (\is_string($cmd[0] ?? null)) {
$process = new Process($cmd);
$cmd = [];
@@ -98,7 +94,7 @@ class ProcessHelper extends Helper
*
* @see run()
*/
public function mustRun(OutputInterface $output, $cmd, string $error = null, callable $callback = null): Process
public function mustRun(OutputInterface $output, array|Process $cmd, string $error = null, callable $callback = null): Process
{
$process = $this->run($output, $cmd, $error, $callback);

View File

@@ -36,32 +36,32 @@ final class ProgressBar
private const FORMAT_DEBUG_NOMAX = 'debug_nomax';
private const FORMAT_NORMAL_NOMAX = 'normal_nomax';
private $barWidth = 28;
private $barChar;
private $emptyBarChar = '-';
private $progressChar = '>';
private $format;
private $internalFormat;
private $redrawFreq = 1;
private $writeCount;
private $lastWriteTime;
private $minSecondsBetweenRedraws = 0;
private $maxSecondsBetweenRedraws = 1;
private int $barWidth = 28;
private string $barChar;
private string $emptyBarChar = '-';
private string $progressChar = '>';
private ?string $format = null;
private ?string $internalFormat = null;
private ?int $redrawFreq = 1;
private int $writeCount = 0;
private float $lastWriteTime = 0;
private float $minSecondsBetweenRedraws = 0;
private float $maxSecondsBetweenRedraws = 1;
private $output;
private $step = 0;
private $max;
private $startTime;
private $stepWidth;
private $percent = 0.0;
private $formatLineCount;
private $messages = [];
private $overwrite = true;
private int $step = 0;
private ?int $max = null;
private int $startTime;
private int $stepWidth;
private float $percent = 0.0;
private int $formatLineCount;
private array $messages = [];
private bool $overwrite = true;
private $terminal;
private $previousMessage;
private ?string $previousMessage = null;
private $cursor;
private static $formatters;
private static $formats;
private static array $formatters;
private static array $formats;
/**
* @param int $max Maximum steps (0 if unknown)
@@ -103,9 +103,7 @@ final class ProgressBar
*/
public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void
{
if (!self::$formatters) {
self::$formatters = self::initPlaceholderFormatters();
}
self::$formatters ??= self::initPlaceholderFormatters();
self::$formatters[$name] = $callable;
}
@@ -117,9 +115,7 @@ final class ProgressBar
*/
public static function getPlaceholderFormatterDefinition(string $name): ?callable
{
if (!self::$formatters) {
self::$formatters = self::initPlaceholderFormatters();
}
self::$formatters ??= self::initPlaceholderFormatters();
return self::$formatters[$name] ?? null;
}
@@ -134,9 +130,7 @@ final class ProgressBar
*/
public static function setFormatDefinition(string $name, string $format): void
{
if (!self::$formats) {
self::$formats = self::initFormats();
}
self::$formats ??= self::initFormats();
self::$formats[$name] = $format;
}
@@ -148,9 +142,7 @@ final class ProgressBar
*/
public static function getFormatDefinition(string $name): ?string
{
if (!self::$formats) {
self::$formats = self::initFormats();
}
self::$formats ??= self::initFormats();
return self::$formats[$name] ?? null;
}
@@ -574,6 +566,8 @@ final class ProgressBar
private function buildLine(): string
{
\assert(null !== $this->format);
$regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i";
$callback = function ($matches) {
if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) {

View File

@@ -32,19 +32,19 @@ class ProgressIndicator
];
private $output;
private $startTime;
private $format;
private $message;
private $indicatorValues;
private $indicatorCurrent;
private $indicatorChangeInterval;
private $indicatorUpdateTime;
private $started = false;
private int $startTime;
private ?string $format = null;
private ?string $message = null;
private array $indicatorValues;
private int $indicatorCurrent;
private int $indicatorChangeInterval;
private float $indicatorUpdateTime;
private bool $started = false;
/**
* @var array<string, callable>
*/
private static $formatters;
private static array $formatters;
/**
* @param int $indicatorChangeInterval Change interval in milliseconds
@@ -146,10 +146,8 @@ class ProgressIndicator
/**
* Gets the format for a given name.
*
* @return string|null
*/
public static function getFormatDefinition(string $name)
public static function getFormatDefinition(string $name): ?string
{
return self::FORMATS[$name] ?? null;
}
@@ -161,23 +159,17 @@ class ProgressIndicator
*/
public static function setPlaceholderFormatterDefinition(string $name, callable $callable)
{
if (!self::$formatters) {
self::$formatters = self::initPlaceholderFormatters();
}
self::$formatters ??= self::initPlaceholderFormatters();
self::$formatters[$name] = $callable;
}
/**
* Gets the placeholder formatter for a given name (including the delimiter char like %).
*
* @return callable|null
*/
public static function getPlaceholderFormatterDefinition(string $name)
public static function getPlaceholderFormatterDefinition(string $name): ?callable
{
if (!self::$formatters) {
self::$formatters = self::initPlaceholderFormatters();
}
self::$formatters ??= self::initPlaceholderFormatters();
return self::$formatters[$name] ?? null;
}
@@ -229,6 +221,9 @@ class ProgressIndicator
return round(microtime(true) * 1000);
}
/**
* @return array<string, \Closure>
*/
private static function initPlaceholderFormatters(): array
{
return [

View File

@@ -39,8 +39,8 @@ class QuestionHelper extends Helper
*/
private $inputStream;
private static $stty = true;
private static $stdinIsInteractive;
private static bool $stty = true;
private static bool $stdinIsInteractive;
/**
* Asks a question to the user.
@@ -49,7 +49,7 @@ class QuestionHelper extends Helper
*
* @throws RuntimeException If there is no data to read in the input stream
*/
public function ask(InputInterface $input, OutputInterface $output, Question $question)
public function ask(InputInterface $input, OutputInterface $output, Question $question): mixed
{
if ($output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
@@ -87,7 +87,7 @@ class QuestionHelper extends Helper
/**
* {@inheritdoc}
*/
public function getName()
public function getName(): string
{
return 'question';
}
@@ -103,11 +103,9 @@ class QuestionHelper extends Helper
/**
* Asks the question to the user.
*
* @return mixed
*
* @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
*/
private function doAsk(OutputInterface $output, Question $question)
private function doAsk(OutputInterface $output, Question $question): mixed
{
$this->writePrompt($output, $question);
@@ -154,10 +152,7 @@ class QuestionHelper extends Helper
return $ret;
}
/**
* @return mixed
*/
private function getDefaultAnswer(Question $question)
private function getDefaultAnswer(Question $question): mixed
{
$default = $question->getDefault();
@@ -205,7 +200,7 @@ class QuestionHelper extends Helper
/**
* @return string[]
*/
protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag)
protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag): array
{
$messages = [];
@@ -457,11 +452,9 @@ class QuestionHelper extends Helper
*
* @param callable $interviewer A callable that will ask for a question and return the result
*
* @return mixed The validated response
*
* @throws \Exception In case the max number of attempts has been reached and no valid response has been given
*/
private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question)
private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question): mixed
{
$error = null;
$attempts = $question->getMaxAttempts();
@@ -488,7 +481,7 @@ class QuestionHelper extends Helper
return false;
}
if (null !== self::$stdinIsInteractive) {
if (isset(self::$stdinIsInteractive)) {
return self::$stdinIsInteractive;
}
@@ -514,10 +507,8 @@ class QuestionHelper extends Helper
*
* @param resource $inputStream The handler resource
* @param Question $question The question being asked
*
* @return string|false The input received, false in case input could not be read
*/
private function readInput($inputStream, Question $question)
private function readInput($inputStream, Question $question): string|false
{
if (!$question->isMultiline()) {
$cp = $this->setIOCodepage();
@@ -543,11 +534,6 @@ class QuestionHelper extends Helper
return $this->resetIOCodepage($cp, $ret);
}
/**
* Sets console I/O to the host code page.
*
* @return int Previous code page in IBM/EBCDIC format
*/
private function setIOCodepage(): int
{
if (\function_exists('sapi_windows_cp_set')) {
@@ -562,12 +548,8 @@ class QuestionHelper extends Helper
/**
* Sets console I/O to the specified code page and converts the user input.
*
* @param string|false $input
*
* @return string|false
*/
private function resetIOCodepage(int $cp, $input)
private function resetIOCodepage(int $cp, string|false $input): string|false
{
if (0 !== $cp) {
sapi_windows_cp_set($cp);

View File

@@ -36,69 +36,27 @@ class Table
private const BORDER_OUTSIDE = 0;
private const BORDER_INSIDE = 1;
private $headerTitle;
private $footerTitle;
/**
* Table headers.
*/
private $headers = [];
/**
* Table rows.
*/
private $rows = [];
private $horizontal = false;
/**
* Column widths cache.
*/
private $effectiveColumnWidths = [];
/**
* Number of columns cache.
*
* @var int
*/
private $numberOfColumns;
/**
* @var OutputInterface
*/
private ?string $headerTitle = null;
private ?string $footerTitle = null;
private array $headers = [];
private array $rows = [];
private bool $horizontal = false;
private array $effectiveColumnWidths = [];
private int $numberOfColumns;
private $output;
/**
* @var TableStyle
*/
private $style;
private array $columnStyles = [];
private array $columnWidths = [];
private array $columnMaxWidths = [];
private bool $rendered = false;
/**
* @var array
*/
private $columnStyles = [];
/**
* User set column widths.
*
* @var array
*/
private $columnWidths = [];
private $columnMaxWidths = [];
/**
* @var array<string, TableStyle>|null
*/
private static $styles;
private $rendered = false;
private static array $styles;
public function __construct(OutputInterface $output)
{
$this->output = $output;
if (!self::$styles) {
self::$styles = self::initStyles();
}
self::$styles ??= self::initStyles();
$this->setStyle('default');
}
@@ -108,39 +66,27 @@ class Table
*/
public static function setStyleDefinition(string $name, TableStyle $style)
{
if (!self::$styles) {
self::$styles = self::initStyles();
}
self::$styles ??= self::initStyles();
self::$styles[$name] = $style;
}
/**
* Gets a style definition by name.
*
* @return TableStyle
*/
public static function getStyleDefinition(string $name)
public static function getStyleDefinition(string $name): TableStyle
{
if (!self::$styles) {
self::$styles = self::initStyles();
}
self::$styles ??= self::initStyles();
if (isset(self::$styles[$name])) {
return self::$styles[$name];
}
throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
return self::$styles[$name] ?? throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
}
/**
* Sets table style.
*
* @param TableStyle|string $name The style name or a TableStyle instance
*
* @return $this
*/
public function setStyle($name)
public function setStyle(TableStyle|string $name): static
{
$this->style = $this->resolveStyle($name);
@@ -149,10 +95,8 @@ class Table
/**
* Gets the current table style.
*
* @return TableStyle
*/
public function getStyle()
public function getStyle(): TableStyle
{
return $this->style;
}
@@ -164,7 +108,7 @@ class Table
*
* @return $this
*/
public function setColumnStyle(int $columnIndex, $name)
public function setColumnStyle(int $columnIndex, TableStyle|string $name): static
{
$this->columnStyles[$columnIndex] = $this->resolveStyle($name);
@@ -175,10 +119,8 @@ class Table
* Gets the current style for a column.
*
* If style was not set, it returns the global table style.
*
* @return TableStyle
*/
public function getColumnStyle(int $columnIndex)
public function getColumnStyle(int $columnIndex): TableStyle
{
return $this->columnStyles[$columnIndex] ?? $this->getStyle();
}
@@ -188,7 +130,7 @@ class Table
*
* @return $this
*/
public function setColumnWidth(int $columnIndex, int $width)
public function setColumnWidth(int $columnIndex, int $width): static
{
$this->columnWidths[$columnIndex] = $width;
@@ -200,7 +142,7 @@ class Table
*
* @return $this
*/
public function setColumnWidths(array $widths)
public function setColumnWidths(array $widths): static
{
$this->columnWidths = [];
foreach ($widths as $index => $width) {
@@ -218,7 +160,7 @@ class Table
*
* @return $this
*/
public function setColumnMaxWidth(int $columnIndex, int $width): self
public function setColumnMaxWidth(int $columnIndex, int $width): static
{
if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) {
throw new \LogicException(sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, get_debug_type($this->output->getFormatter())));
@@ -232,7 +174,7 @@ class Table
/**
* @return $this
*/
public function setHeaders(array $headers)
public function setHeaders(array $headers): static
{
$headers = array_values($headers);
if (!empty($headers) && !\is_array($headers[0])) {
@@ -254,7 +196,7 @@ class Table
/**
* @return $this
*/
public function addRows(array $rows)
public function addRows(array $rows): static
{
foreach ($rows as $row) {
$this->addRow($row);
@@ -266,7 +208,7 @@ class Table
/**
* @return $this
*/
public function addRow($row)
public function addRow(TableSeparator|array $row): static
{
if ($row instanceof TableSeparator) {
$this->rows[] = $row;
@@ -274,10 +216,6 @@ class Table
return $this;
}
if (!\is_array($row)) {
throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.');
}
$this->rows[] = array_values($row);
return $this;
@@ -288,7 +226,7 @@ class Table
*
* @return $this
*/
public function appendRow($row): self
public function appendRow(TableSeparator|array $row): static
{
if (!$this->output instanceof ConsoleSectionOutput) {
throw new RuntimeException(sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__));
@@ -307,7 +245,7 @@ class Table
/**
* @return $this
*/
public function setRow($column, array $row)
public function setRow(int|string $column, array $row): static
{
$this->rows[$column] = $row;
@@ -317,7 +255,7 @@ class Table
/**
* @return $this
*/
public function setHeaderTitle(?string $title): self
public function setHeaderTitle(?string $title): static
{
$this->headerTitle = $title;
@@ -327,7 +265,7 @@ class Table
/**
* @return $this
*/
public function setFooterTitle(?string $title): self
public function setFooterTitle(?string $title): static
{
$this->footerTitle = $title;
@@ -337,7 +275,7 @@ class Table
/**
* @return $this
*/
public function setHorizontal(bool $horizontal = true): self
public function setHorizontal(bool $horizontal = true): static
{
$this->horizontal = $horizontal;
@@ -678,7 +616,7 @@ class Table
{
$unmergedRows = [];
foreach ($rows[$line] as $column => $cell) {
if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !(\is_object($cell) && method_exists($cell, '__toString'))) {
if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !$cell instanceof \Stringable) {
throw new InvalidArgumentException(sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', get_debug_type($cell)));
}
if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
@@ -847,7 +785,7 @@ class Table
private function cleanup()
{
$this->effectiveColumnWidths = [];
$this->numberOfColumns = null;
unset($this->numberOfColumns);
}
/**
@@ -900,16 +838,12 @@ class Table
];
}
private function resolveStyle($name): TableStyle
private function resolveStyle(TableStyle|string $name): TableStyle
{
if ($name instanceof TableStyle) {
return $name;
}
if (isset(self::$styles[$name])) {
return self::$styles[$name];
}
throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
return self::$styles[$name] ?? throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
}
}

View File

@@ -18,8 +18,8 @@ use Symfony\Component\Console\Exception\InvalidArgumentException;
*/
class TableCell
{
private $value;
private $options = [
private string $value;
private array $options = [
'rowspan' => 1,
'colspan' => 1,
'style' => null,
@@ -43,30 +43,24 @@ class TableCell
/**
* Returns the cell value.
*
* @return string
*/
public function __toString()
public function __toString(): string
{
return $this->value;
}
/**
* Gets number of colspan.
*
* @return int
*/
public function getColspan()
public function getColspan(): int
{
return (int) $this->options['colspan'];
}
/**
* Gets number of rowspan.
*
* @return int
*/
public function getRowspan()
public function getRowspan(): int
{
return (int) $this->options['rowspan'];
}

View File

@@ -32,7 +32,7 @@ class TableCellStyle
'right' => \STR_PAD_LEFT,
];
private $options = [
private array $options = [
'fg' => 'default',
'bg' => 'default',
'options' => null,
@@ -63,7 +63,7 @@ class TableCellStyle
*
* @return string[]
*/
public function getTagOptions()
public function getTagOptions(): array
{
return array_filter(
$this->getOptions(),
@@ -74,10 +74,7 @@ class TableCellStyle
);
}
/**
* @return int
*/
public function getPadByAlign()
public function getPadByAlign(): int
{
return self::ALIGN_MAP[$this->getOptions()['align']];
}

View File

@@ -16,7 +16,7 @@ namespace Symfony\Component\Console\Helper;
*/
class TableRows implements \IteratorAggregate
{
private $generator;
private \Closure $generator;
public function __construct(\Closure $generator)
{

View File

@@ -23,37 +23,37 @@ use Symfony\Component\Console\Exception\LogicException;
*/
class TableStyle
{
private $paddingChar = ' ';
private $horizontalOutsideBorderChar = '-';
private $horizontalInsideBorderChar = '-';
private $verticalOutsideBorderChar = '|';
private $verticalInsideBorderChar = '|';
private $crossingChar = '+';
private $crossingTopRightChar = '+';
private $crossingTopMidChar = '+';
private $crossingTopLeftChar = '+';
private $crossingMidRightChar = '+';
private $crossingBottomRightChar = '+';
private $crossingBottomMidChar = '+';
private $crossingBottomLeftChar = '+';
private $crossingMidLeftChar = '+';
private $crossingTopLeftBottomChar = '+';
private $crossingTopMidBottomChar = '+';
private $crossingTopRightBottomChar = '+';
private $headerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
private $footerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
private $cellHeaderFormat = '<info>%s</info>';
private $cellRowFormat = '%s';
private $cellRowContentFormat = ' %s ';
private $borderFormat = '%s';
private $padType = \STR_PAD_RIGHT;
private string $paddingChar = ' ';
private string $horizontalOutsideBorderChar = '-';
private string $horizontalInsideBorderChar = '-';
private string $verticalOutsideBorderChar = '|';
private string $verticalInsideBorderChar = '|';
private string $crossingChar = '+';
private string $crossingTopRightChar = '+';
private string $crossingTopMidChar = '+';
private string $crossingTopLeftChar = '+';
private string $crossingMidRightChar = '+';
private string $crossingBottomRightChar = '+';
private string $crossingBottomMidChar = '+';
private string $crossingBottomLeftChar = '+';
private string $crossingMidLeftChar = '+';
private string $crossingTopLeftBottomChar = '+';
private string $crossingTopMidBottomChar = '+';
private string $crossingTopRightBottomChar = '+';
private string $headerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
private string $footerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
private string $cellHeaderFormat = '<info>%s</info>';
private string $cellRowFormat = '%s';
private string $cellRowContentFormat = ' %s ';
private string $borderFormat = '%s';
private int $padType = \STR_PAD_RIGHT;
/**
* Sets padding character, used for cell padding.
*
* @return $this
*/
public function setPaddingChar(string $paddingChar)
public function setPaddingChar(string $paddingChar): static
{
if (!$paddingChar) {
throw new LogicException('The padding char must not be empty.');
@@ -66,10 +66,8 @@ class TableStyle
/**
* Gets padding character, used for cell padding.
*
* @return string
*/
public function getPaddingChar()
public function getPaddingChar(): string
{
return $this->paddingChar;
}
@@ -90,7 +88,7 @@ class TableStyle
*
* @return $this
*/
public function setHorizontalBorderChars(string $outside, string $inside = null): self
public function setHorizontalBorderChars(string $outside, string $inside = null): static
{
$this->horizontalOutsideBorderChar = $outside;
$this->horizontalInsideBorderChar = $inside ?? $outside;
@@ -115,7 +113,7 @@ class TableStyle
*
* @return $this
*/
public function setVerticalBorderChars(string $outside, string $inside = null): self
public function setVerticalBorderChars(string $outside, string $inside = null): static
{
$this->verticalOutsideBorderChar = $outside;
$this->verticalInsideBorderChar = $inside ?? $outside;
@@ -169,7 +167,7 @@ class TableStyle
*
* @return $this
*/
public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, string $topLeftBottom = null, string $topMidBottom = null, string $topRightBottom = null): self
public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, string $topLeftBottom = null, string $topMidBottom = null, string $topRightBottom = null): static
{
$this->crossingChar = $cross;
$this->crossingTopLeftChar = $topLeft;
@@ -199,10 +197,8 @@ class TableStyle
/**
* Gets crossing character.
*
* @return string
*/
public function getCrossingChar()
public function getCrossingChar(): string
{
return $this->crossingChar;
}
@@ -235,7 +231,7 @@ class TableStyle
*
* @return $this
*/
public function setCellHeaderFormat(string $cellHeaderFormat)
public function setCellHeaderFormat(string $cellHeaderFormat): static
{
$this->cellHeaderFormat = $cellHeaderFormat;
@@ -244,10 +240,8 @@ class TableStyle
/**
* Gets header cell format.
*
* @return string
*/
public function getCellHeaderFormat()
public function getCellHeaderFormat(): string
{
return $this->cellHeaderFormat;
}
@@ -257,7 +251,7 @@ class TableStyle
*
* @return $this
*/
public function setCellRowFormat(string $cellRowFormat)
public function setCellRowFormat(string $cellRowFormat): static
{
$this->cellRowFormat = $cellRowFormat;
@@ -266,10 +260,8 @@ class TableStyle
/**
* Gets row cell format.
*
* @return string
*/
public function getCellRowFormat()
public function getCellRowFormat(): string
{
return $this->cellRowFormat;
}
@@ -279,7 +271,7 @@ class TableStyle
*
* @return $this
*/
public function setCellRowContentFormat(string $cellRowContentFormat)
public function setCellRowContentFormat(string $cellRowContentFormat): static
{
$this->cellRowContentFormat = $cellRowContentFormat;
@@ -288,10 +280,8 @@ class TableStyle
/**
* Gets row cell content format.
*
* @return string
*/
public function getCellRowContentFormat()
public function getCellRowContentFormat(): string
{
return $this->cellRowContentFormat;
}
@@ -301,7 +291,7 @@ class TableStyle
*
* @return $this
*/
public function setBorderFormat(string $borderFormat)
public function setBorderFormat(string $borderFormat): static
{
$this->borderFormat = $borderFormat;
@@ -310,10 +300,8 @@ class TableStyle
/**
* Gets table border format.
*
* @return string
*/
public function getBorderFormat()
public function getBorderFormat(): string
{
return $this->borderFormat;
}
@@ -323,7 +311,7 @@ class TableStyle
*
* @return $this
*/
public function setPadType(int $padType)
public function setPadType(int $padType): static
{
if (!\in_array($padType, [\STR_PAD_LEFT, \STR_PAD_RIGHT, \STR_PAD_BOTH], true)) {
throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).');
@@ -336,10 +324,8 @@ class TableStyle
/**
* Gets cell padding type.
*
* @return int
*/
public function getPadType()
public function getPadType(): int
{
return $this->padType;
}
@@ -352,7 +338,7 @@ class TableStyle
/**
* @return $this
*/
public function setHeaderTitleFormat(string $format): self
public function setHeaderTitleFormat(string $format): static
{
$this->headerTitleFormat = $format;
@@ -367,7 +353,7 @@ class TableStyle
/**
* @return $this
*/
public function setFooterTitleFormat(string $format): self
public function setFooterTitleFormat(string $format): static
{
$this->footerTitleFormat = $format;