SymfonyConsoleProgress   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 133
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 5
dl 0
loc 133
c 0
b 0
f 0
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getSubscribedEvents() 0 9 1
A __construct() 0 4 1
A start() 0 15 3
A tick() 0 31 4
A finish() 0 10 2
A abort() 0 5 2
1
<?php
2
3
/**
4
 * Tack Tracker - A library for tracking long-running task progress
5
 *
6
 * @license http://opensource.org/licenses/MIT
7
 * @link https://github.com/caseyamcl/tasktracker
8
 * @version 2.0
9
 * @package caseyamcl/tasktracker
10
 * @author Casey McLaughlin <[email protected]>
11
 *
12
 * For the full copyright and license information, please view the LICENSE
13
 * file that was distributed with this source code.
14
 *
15
 * ------------------------------------------------------------------
16
 */
17
18
namespace TaskTracker\Subscriber;
19
20
use Symfony\Component\Console\Helper\ProgressBar;
21
use Symfony\Component\Console\Output\OutputInterface;
22
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
23
use TaskTracker\Events;
24
use TaskTracker\Helper\BytesToHumanTrait;
25
use TaskTracker\Tick;
26
27
/**
28
 * Symfony Console Progress Bar Task Tracker Subscriber
29
 *
30
 * @author Casey McLaughlin <[email protected]>
31
 */
32
class SymfonyConsoleProgress implements EventSubscriberInterface
33
{
34
    // Use traits for prettier output
35
    use BytesToHumanTrait;
36
37
    // ---------------------------------------------------------------
38
39
    /**
40
     * @var OutputInterface;
41
     */
42
    private $output;
43
44
    /**
45
     * @var ProgressBar|null  Set at runtime
46
     */
47
    private $progressBar;
48
49
    // --------------------------------------------------------------
50
51
    /**
52
     * {@inheritdoc}
53
     */
54
    public static function getSubscribedEvents()
55
    {
56
        return [
57
            Events::TRACKER_START  => 'start',
58
            Events::TRACKER_TICK   => 'tick',
59
            Events::TRACKER_FINISH => 'finish',
60
            Events::TRACKER_ABORT  => 'abort'
61
        ];
62
    }
63
64
    // --------------------------------------------------------------
65
66
    /**
67
     * Constructor
68
     *
69
     * @param OutputInterface $output
70
     */
71
    public function __construct(OutputInterface $output)
72
    {
73
        $this->output = $output;
74
    }
75
76
    // ---------------------------------------------------------------
77
78
    /**
79
     * Start callback
80
     *
81
     * @param Tick $tick
82
     */
83
    public function start(Tick $tick)
84
    {
85
        if ($tick->getMessage()) {
86
            $this->output->writeln($tick->getMessage());
87
        }
88
89
        $this->progressBar = new ProgressBar(
90
            $this->output,
91
            $tick->getReport()->getTotalItemCount() > -1
92
                ? $tick->getReport()->getTotalItemCount()
93
                : 0
94
        );
95
96
        $this->progressBar->start();
97
    }
98
99
    // ---------------------------------------------------------------
100
101
    /**
102
     * Tick callback
103
     *
104
     * @param Tick $tick
105
     */
106
    public function tick(Tick $tick)
107
    {
108
        $rpt = $tick->getReport();
109
110
        if ( ! $this->progressBar) {
111
            $this->start($tick);
112
        }
113
114
        $msgSegs = [$tick->getMessage()];
115
116
        if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
117
            $msgSegs[] = sprintf('Processed: <fg=green>%s</fg=green>', number_format($rpt->getNumItemsSuccess(), 0));
118
            $msgSegs[] = sprintf('Skipped: <fg=yellow>%s</fg=yellow>', number_format($rpt->getNumItemsFail(), 0));
119
            $msgSegs[] = sprintf('Failed: <fg=red>%s</fg=red>'       , number_format($rpt->getNumItemsSkip(), 0));
120
        }
121
122
        if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE) {
123
124
            $msgSegs[] = sprintf("Avg: %s", number_format($rpt->getAvgItemTime(), 2));
125
126
            $msgSegs[] = sprintf(
127
                'Memory: %s/%s',
128
                $this->bytesToHuman($rpt->getMemUsage(),   2),
129
                $this->bytesToHuman($rpt->getMemPeakUsage(), 2)
130
            );
131
        }
132
133
        $this->progressBar->setMessage(implode(' | ', $msgSegs));
134
        $this->progressBar->setProgress($rpt->getNumItemsProcessed());
135
        //$this->progressBar->advance($rpt->getTick()->getIncrementBy());
136
    }
137
138
    /**
139
     * Finish callback
140
     *
141
     * @param Tick $tick
142
     */
143
    public function finish(Tick $tick)
144
    {
145
        $this->progressBar->finish();
146
147
        if ($tick->getMessage()) {
148
149
            $this->output->writeln(PHP_EOL . $tick->getMessage());
150
        }
151
152
    }
153
154
    /**
155
     * Abort callback
156
     *
157
     * @param Tick $tick
158
     */
159
    public function abort(Tick $tick)
160
    {
161
        $this->progressBar->clear();
162
        $this->output->writeln($tick->getMessage() ?: 'Aborted');
163
    }
164
}
165