Skip to content

Commit 557328c

Browse files
committed
Added console extension
1 parent 8e39f05 commit 557328c

File tree

8 files changed

+168
-3
lines changed

8 files changed

+168
-3
lines changed

lib/Core/PipelineBuilder.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
namespace PhpBench\Pipeline\Core;
44

5-
use PhpBench\Pipeline\Extension\Core\CoreExtension;
5+
use PhpBench\Pipeline\Extension\Console\ConsoleExtension;
66
use Generator;
7+
use PhpBench\Pipeline\Extension\Core\CoreExtension;
78

89
final class PipelineBuilder
910
{
@@ -31,6 +32,7 @@ public static function createWithDefaults(): self
3132
{
3233
$builder = self::create();
3334
$builder->addExtension(new CoreExtension());
35+
$builder->addExtension(new ConsoleExtension());
3436

3537
return $builder;
3638
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace PhpBench\Pipeline\Extension\Console;
4+
5+
use PhpBench\Pipeline\Core\PipelineExtension;
6+
use PhpBench\Pipeline\Core\Stage;
7+
use PhpBench\Pipeline\Extension\Core\Stage\Encoder\JsonEncoder;
8+
use PhpBench\Pipeline\Extension\Core\Stage\Sampler\CallableSampler;
9+
use PhpBench\Pipeline\Extension\Core\Stage\Output\StreamOutput;
10+
use PhpBench\Pipeline\Extension\Core\Stage\Parameter\SerialParameter;
11+
use PhpBench\Pipeline\Extension\Core\Stage\Valve\TakeValve;
12+
use PhpBench\Pipeline\Extension\Core\Stage\Sampler\CurlSampler;
13+
use PhpBench\Pipeline\Extension\Core\Stage\Filter\KeysFilter;
14+
use PhpBench\Pipeline\Extension\Core\Stage\Aggregator\DescribeAggregator;
15+
use PhpBench\Pipeline\Extension\Core\Stage\Parameter\CounterParameter;
16+
use PhpBench\Pipeline\Extension\Core\Stage\Valve\DelayValve;
17+
use PhpBench\Pipeline\Extension\Console\Stage\Redraw;
18+
19+
class ConsoleExtension implements PipelineExtension
20+
{
21+
/**
22+
* @var array
23+
*/
24+
private $stages;
25+
26+
public function __construct()
27+
{
28+
$this->stages = [
29+
'console/redraw' => new Redraw(),
30+
];
31+
}
32+
33+
public function stageAliases(): array
34+
{
35+
return array_keys($this->stages);
36+
}
37+
38+
public function stage(string $alias): Stage
39+
{
40+
return $this->stages[$alias];
41+
}
42+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
namespace PhpBench\Pipeline\Extension\Console\Stage;
4+
5+
use PhpBench\Pipeline\Core\Stage;
6+
use PhpBench\Pipeline\Extension\Console\Util\ConsoleUtil;
7+
use Generator;
8+
use PhpBench\Pipeline\Core\Schema;
9+
10+
class Redraw implements Stage
11+
{
12+
const ANSI_SAVE_CURSOR_POS = "\033[s";
13+
const ANSI_RESTORE_CURSOR_POS = "\033[u";
14+
15+
public function __invoke(): Generator
16+
{
17+
list($config, $data) = yield;
18+
19+
$lastData = null;
20+
$lineLength = 0;
21+
22+
while (true) {
23+
foreach ($data as &$line) {
24+
if (null === $lastData) {
25+
$line = self::ANSI_SAVE_CURSOR_POS . $line;
26+
}
27+
28+
if ($lastData) {
29+
$line = self::ANSI_RESTORE_CURSOR_POS . $line;
30+
$lineLength = $this->maxLineLength($line, $lineLength);
31+
$line = $this->maximizeLines($line, $lineLength);
32+
}
33+
}
34+
35+
list($config, $data) = yield $data;
36+
$lastData = $data;
37+
}
38+
}
39+
40+
private function maxLineLength(string $result, int $maxLineLength)
41+
{
42+
foreach (explode(PHP_EOL, $result) as $line) {
43+
$length = mb_strlen($line);
44+
if ($length > $maxLineLength) {
45+
$maxLineLength = $length;
46+
}
47+
}
48+
49+
return $maxLineLength;
50+
}
51+
52+
private function maximizeLines(string $result, int $maxLineLength)
53+
{
54+
$result = trim($result, PHP_EOL);
55+
$lines = explode(PHP_EOL, $result);
56+
57+
foreach ($lines as &$line) {
58+
$line = ConsoleUtil::pad($line, $maxLineLength);
59+
}
60+
61+
return implode(PHP_EOL, $lines);
62+
}
63+
64+
public function configure(Schema $schema)
65+
{
66+
}
67+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace PhpBench\Pipeline\Extension\Console\Util;
4+
5+
class ConsoleUtil
6+
{
7+
public static function pad(string $string, int $length)
8+
{
9+
$width = $length - mb_strlen($string);
10+
return $string . str_repeat(' ', $width);
11+
}
12+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace PhpBench\Pipeline\Tests\Unit\Extension\Console;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use PhpBench\Pipeline\Core\PipelineBuilder;
7+
use PhpBench\Pipeline\Extension\Core\CoreExtension;
8+
use PhpBench\Pipeline\Extension\Console\ConsoleExtension;
9+
10+
class ConsoleTestCase extends TestCase
11+
{
12+
protected function pipeline(): PipelineBuilder
13+
{
14+
return PipelineBuilder::create()
15+
->addExtension(new ConsoleExtension());
16+
}
17+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace PhpBench\Pipeline\Tests\Unit\Extension\Console\Stage;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use PhpBench\Pipeline\Tests\Unit\Extension\Console\ConsoleTestCase;
7+
8+
class RedrawTest extends ConsoleTestCase
9+
{
10+
public function testAnsiControlCharsToOverwritePreviousOutput()
11+
{
12+
$generator = $this->pipeline()
13+
->stage(function () {
14+
yield;
15+
yield ['hello'];
16+
yield ['goodbye'];
17+
yield ['ciao'];
18+
})
19+
->stage('console/redraw')
20+
->generator();
21+
$generator->next();
22+
$generator->next();
23+
$result = $generator->current();
24+
$this->assertContains('ciao', $result[0]);
25+
}
26+
}

tests/Unit/Extension/Core/CoreTestCase.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PHPUnit\Framework\TestCase;
66
use PhpBench\Pipeline\Core\PipelineBuilder;
77
use PhpBench\Pipeline\Extension\Core\CoreExtension;
8+
use PhpBench\Pipeline\Extension\Console\ConsoleExtension;
89

910
class CoreTestCase extends TestCase
1011
{

tests/Unit/Extension/Core/Stage/Sampler/CurlSamplerTest.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,6 @@ public function testConcurrentRequests()
9494
->run();
9595

9696
$requests = $this->requests();
97-
98-
// although we specified a concurrency of 4, 6 requests were made?
9997
$this->assertCount(4, $requests);
10098
}
10199

0 commit comments

Comments
 (0)