summaryrefslogtreecommitdiff
path: root/vendor/symfony/console/Helper/ProgressHelper.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/symfony/console/Helper/ProgressHelper.php')
-rw-r--r--vendor/symfony/console/Helper/ProgressHelper.php471
1 files changed, 471 insertions, 0 deletions
diff --git a/vendor/symfony/console/Helper/ProgressHelper.php b/vendor/symfony/console/Helper/ProgressHelper.php
new file mode 100644
index 00000000..96b6202c
--- /dev/null
+++ b/vendor/symfony/console/Helper/ProgressHelper.php
@@ -0,0 +1,471 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Output\NullOutput;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * The Progress class provides helpers to display progress output.
+ *
+ * @author Chris Jones <leeked@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.5, to be removed in 3.0
+ * Use {@link ProgressBar} instead.
+ */
+class ProgressHelper extends Helper
+{
+ const FORMAT_QUIET = ' %percent%%';
+ const FORMAT_NORMAL = ' %current%/%max% [%bar%] %percent%%';
+ const FORMAT_VERBOSE = ' %current%/%max% [%bar%] %percent%% Elapsed: %elapsed%';
+ const FORMAT_QUIET_NOMAX = ' %current%';
+ const FORMAT_NORMAL_NOMAX = ' %current% [%bar%]';
+ const FORMAT_VERBOSE_NOMAX = ' %current% [%bar%] Elapsed: %elapsed%';
+
+ // options
+ private $barWidth = 28;
+ private $barChar = '=';
+ private $emptyBarChar = '-';
+ private $progressChar = '>';
+ private $format = null;
+ private $redrawFreq = 1;
+
+ private $lastMessagesLength;
+ private $barCharOriginal;
+
+ /**
+ * @var OutputInterface
+ */
+ private $output;
+
+ /**
+ * Current step.
+ *
+ * @var int
+ */
+ private $current;
+
+ /**
+ * Maximum number of steps.
+ *
+ * @var int
+ */
+ private $max;
+
+ /**
+ * Start time of the progress bar.
+ *
+ * @var int
+ */
+ private $startTime;
+
+ /**
+ * List of formatting variables.
+ *
+ * @var array
+ */
+ private $defaultFormatVars = array(
+ 'current',
+ 'max',
+ 'bar',
+ 'percent',
+ 'elapsed',
+ );
+
+ /**
+ * Available formatting variables.
+ *
+ * @var array
+ */
+ private $formatVars;
+
+ /**
+ * Stored format part widths (used for padding).
+ *
+ * @var array
+ */
+ private $widths = array(
+ 'current' => 4,
+ 'max' => 4,
+ 'percent' => 3,
+ 'elapsed' => 6,
+ );
+
+ /**
+ * Various time formats.
+ *
+ * @var array
+ */
+ private $timeFormats = array(
+ array(0, '???'),
+ array(2, '1 sec'),
+ array(59, 'secs', 1),
+ array(60, '1 min'),
+ array(3600, 'mins', 60),
+ array(5400, '1 hr'),
+ array(86400, 'hrs', 3600),
+ array(129600, '1 day'),
+ array(604800, 'days', 86400),
+ );
+
+ public function __construct($triggerDeprecationError = true)
+ {
+ if ($triggerDeprecationError) {
+ @trigger_error('The '.__CLASS__.' class is deprecated since version 2.5 and will be removed in 3.0. Use the Symfony\Component\Console\Helper\ProgressBar class instead.', E_USER_DEPRECATED);
+ }
+ }
+
+ /**
+ * Sets the progress bar width.
+ *
+ * @param int $size The progress bar size
+ */
+ public function setBarWidth($size)
+ {
+ $this->barWidth = (int) $size;
+ }
+
+ /**
+ * Sets the bar character.
+ *
+ * @param string $char A character
+ */
+ public function setBarCharacter($char)
+ {
+ $this->barChar = $char;
+ }
+
+ /**
+ * Sets the empty bar character.
+ *
+ * @param string $char A character
+ */
+ public function setEmptyBarCharacter($char)
+ {
+ $this->emptyBarChar = $char;
+ }
+
+ /**
+ * Sets the progress bar character.
+ *
+ * @param string $char A character
+ */
+ public function setProgressCharacter($char)
+ {
+ $this->progressChar = $char;
+ }
+
+ /**
+ * Sets the progress bar format.
+ *
+ * @param string $format The format
+ */
+ public function setFormat($format)
+ {
+ $this->format = $format;
+ }
+
+ /**
+ * Sets the redraw frequency.
+ *
+ * @param int $freq The frequency in steps
+ */
+ public function setRedrawFrequency($freq)
+ {
+ $this->redrawFreq = (int) $freq;
+ }
+
+ /**
+ * Starts the progress output.
+ *
+ * @param OutputInterface $output An Output instance
+ * @param int|null $max Maximum steps
+ */
+ public function start(OutputInterface $output, $max = null)
+ {
+ if ($output instanceof ConsoleOutputInterface) {
+ $output = $output->getErrorOutput();
+ }
+
+ $this->startTime = time();
+ $this->current = 0;
+ $this->max = (int) $max;
+
+ // Disabling output when it does not support ANSI codes as it would result in a broken display anyway.
+ $this->output = $output->isDecorated() ? $output : new NullOutput();
+ $this->lastMessagesLength = 0;
+ $this->barCharOriginal = '';
+
+ if (null === $this->format) {
+ switch ($output->getVerbosity()) {
+ case OutputInterface::VERBOSITY_QUIET:
+ $this->format = self::FORMAT_QUIET_NOMAX;
+ if ($this->max > 0) {
+ $this->format = self::FORMAT_QUIET;
+ }
+ break;
+ case OutputInterface::VERBOSITY_VERBOSE:
+ case OutputInterface::VERBOSITY_VERY_VERBOSE:
+ case OutputInterface::VERBOSITY_DEBUG:
+ $this->format = self::FORMAT_VERBOSE_NOMAX;
+ if ($this->max > 0) {
+ $this->format = self::FORMAT_VERBOSE;
+ }
+ break;
+ default:
+ $this->format = self::FORMAT_NORMAL_NOMAX;
+ if ($this->max > 0) {
+ $this->format = self::FORMAT_NORMAL;
+ }
+ break;
+ }
+ }
+
+ $this->initialize();
+ }
+
+ /**
+ * Advances the progress output X steps.
+ *
+ * @param int $step Number of steps to advance
+ * @param bool $redraw Whether to redraw or not
+ *
+ * @throws LogicException
+ */
+ public function advance($step = 1, $redraw = false)
+ {
+ $this->setCurrent($this->current + $step, $redraw);
+ }
+
+ /**
+ * Sets the current progress.
+ *
+ * @param int $current The current progress
+ * @param bool $redraw Whether to redraw or not
+ *
+ * @throws LogicException
+ */
+ public function setCurrent($current, $redraw = false)
+ {
+ if (null === $this->startTime) {
+ throw new LogicException('You must start the progress bar before calling setCurrent().');
+ }
+
+ $current = (int) $current;
+
+ if ($current < $this->current) {
+ throw new LogicException('You can\'t regress the progress bar');
+ }
+
+ if (0 === $this->current) {
+ $redraw = true;
+ }
+
+ $prevPeriod = (int) ($this->current / $this->redrawFreq);
+
+ $this->current = $current;
+
+ $currPeriod = (int) ($this->current / $this->redrawFreq);
+ if ($redraw || $prevPeriod !== $currPeriod || $this->max === $this->current) {
+ $this->display();
+ }
+ }
+
+ /**
+ * Outputs the current progress string.
+ *
+ * @param bool $finish Forces the end result
+ *
+ * @throws LogicException
+ */
+ public function display($finish = false)
+ {
+ if (null === $this->startTime) {
+ throw new LogicException('You must start the progress bar before calling display().');
+ }
+
+ $message = $this->format;
+ foreach ($this->generate($finish) as $name => $value) {
+ $message = str_replace("%{$name}%", $value, $message);
+ }
+ $this->overwrite($this->output, $message);
+ }
+
+ /**
+ * Removes the progress bar from the current line.
+ *
+ * This is useful if you wish to write some output
+ * while a progress bar is running.
+ * Call display() to show the progress bar again.
+ */
+ public function clear()
+ {
+ $this->overwrite($this->output, '');
+ }
+
+ /**
+ * Finishes the progress output.
+ */
+ public function finish()
+ {
+ if (null === $this->startTime) {
+ throw new LogicException('You must start the progress bar before calling finish().');
+ }
+
+ if (null !== $this->startTime) {
+ if (!$this->max) {
+ $this->barChar = $this->barCharOriginal;
+ $this->display(true);
+ }
+ $this->startTime = null;
+ $this->output->writeln('');
+ $this->output = null;
+ }
+ }
+
+ /**
+ * Initializes the progress helper.
+ */
+ private function initialize()
+ {
+ $this->formatVars = array();
+ foreach ($this->defaultFormatVars as $var) {
+ if (false !== strpos($this->format, "%{$var}%")) {
+ $this->formatVars[$var] = true;
+ }
+ }
+
+ if ($this->max > 0) {
+ $this->widths['max'] = $this->strlen($this->max);
+ $this->widths['current'] = $this->widths['max'];
+ } else {
+ $this->barCharOriginal = $this->barChar;
+ $this->barChar = $this->emptyBarChar;
+ }
+ }
+
+ /**
+ * Generates the array map of format variables to values.
+ *
+ * @param bool $finish Forces the end result
+ *
+ * @return array Array of format vars and values
+ */
+ private function generate($finish = false)
+ {
+ $vars = array();
+ $percent = 0;
+ if ($this->max > 0) {
+ $percent = (float) $this->current / $this->max;
+ }
+
+ if (isset($this->formatVars['bar'])) {
+ $completeBars = 0;
+
+ if ($this->max > 0) {
+ $completeBars = floor($percent * $this->barWidth);
+ } else {
+ if (!$finish) {
+ $completeBars = floor($this->current % $this->barWidth);
+ } else {
+ $completeBars = $this->barWidth;
+ }
+ }
+
+ $emptyBars = $this->barWidth - $completeBars - $this->strlen($this->progressChar);
+ $bar = str_repeat($this->barChar, $completeBars);
+ if ($completeBars < $this->barWidth) {
+ $bar .= $this->progressChar;
+ $bar .= str_repeat($this->emptyBarChar, $emptyBars);
+ }
+
+ $vars['bar'] = $bar;
+ }
+
+ if (isset($this->formatVars['elapsed'])) {
+ $elapsed = time() - $this->startTime;
+ $vars['elapsed'] = str_pad($this->humaneTime($elapsed), $this->widths['elapsed'], ' ', STR_PAD_LEFT);
+ }
+
+ if (isset($this->formatVars['current'])) {
+ $vars['current'] = str_pad($this->current, $this->widths['current'], ' ', STR_PAD_LEFT);
+ }
+
+ if (isset($this->formatVars['max'])) {
+ $vars['max'] = $this->max;
+ }
+
+ if (isset($this->formatVars['percent'])) {
+ $vars['percent'] = str_pad(floor($percent * 100), $this->widths['percent'], ' ', STR_PAD_LEFT);
+ }
+
+ return $vars;
+ }
+
+ /**
+ * Converts seconds into human-readable format.
+ *
+ * @param int $secs Number of seconds
+ *
+ * @return string Time in readable format
+ */
+ private function humaneTime($secs)
+ {
+ $text = '';
+ foreach ($this->timeFormats as $format) {
+ if ($secs < $format[0]) {
+ if (count($format) == 2) {
+ $text = $format[1];
+ break;
+ } else {
+ $text = ceil($secs / $format[2]).' '.$format[1];
+ break;
+ }
+ }
+ }
+
+ return $text;
+ }
+
+ /**
+ * Overwrites a previous message to the output.
+ *
+ * @param OutputInterface $output An Output instance
+ * @param string $message The message
+ */
+ private function overwrite(OutputInterface $output, $message)
+ {
+ $length = $this->strlen($message);
+
+ // append whitespace to match the last line's length
+ if (null !== $this->lastMessagesLength && $this->lastMessagesLength > $length) {
+ $message = str_pad($message, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT);
+ }
+
+ // carriage return
+ $output->write("\x0D");
+ $output->write($message);
+
+ $this->lastMessagesLength = $this->strlen($message);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName()
+ {
+ return 'progress';
+ }
+}