Skip to content

Commit

Permalink
Support higher versions of dependencies, PHP 8.0 requirement
Browse files Browse the repository at this point in the history
  • Loading branch information
ostrolucky committed Oct 16, 2022
1 parent 28b906d commit 43c8965
Show file tree
Hide file tree
Showing 13 changed files with 68 additions and 152 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/continuous-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ jobs:
fail-fast: false
matrix:
php-version:
- "7.1"
- "8.0"
- "8.1"
dependencies:
- "lowest"
- "highest"

steps:
- name: "Checkout repository"
uses: "actions/checkout@v2"
uses: "actions/checkout@v3"

- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
Expand Down
16 changes: 11 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,23 @@
}
],
"require": {
"php": ">=7.1",
"php": ">=8.0",
"ext-fileinfo": "*",
"ext-json": "*",
"amphp/amp": "^2.0",
"amphp/byte-stream": "^1.2.5",
"amphp/socket": "^1",
"jean85/pretty-package-versions": "^1.1 || ^2.0",
"psr/log": "^1.1",
"jean85/pretty-package-versions": "^2.0",
"psr/log": ">=2.0",
"symfony/console": ">=4.1",
"symfony/polyfill-php72": "^1.7"
},
"require-dev": {
"amphp/http-client": "^4.0.0-rc7",
"amphp/dns": "^1",
"amphp/http-client": "^4",
"amphp/parallel": "^1.0.1",
"amphp/process": "^1.0.3",
"phpunit/php-code-coverage": ">=6.1",
"phpunit/php-code-coverage": ">=9.0",
"phpunit/phpcov": ">=5.0",
"phpunit/phpunit": ">=7.5"
},
Expand All @@ -37,6 +38,11 @@
"Ostrolucky\\Stdinho\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"Ostrolucky\\Stdinho\\Tests\\": "tests"
}
},
"bin": [
"bin/stdinho"
]
Expand Down
14 changes: 3 additions & 11 deletions src/Bufferer/AbstractBufferer.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,10 @@

abstract class AbstractBufferer
{
/**
* @var string
*/
public $filePath;
/**
* @var null|InputStream
*/
public $inputStream;

public function __construct(string $filePath)
public ?InputStream $inputStream = null;

public function __construct(public string $filePath)
{
$this->filePath = $filePath;
}

abstract public function __invoke(): Promise;
Expand Down
55 changes: 9 additions & 46 deletions src/Bufferer/PipeBufferer.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,60 +17,23 @@

class PipeBufferer extends AbstractBufferer
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var OutputStream
*/
private $outputStream;
/**
* @var Server
*/
private $server;
/**
* @var Promise
*/
private $promiseThatIsResolvedWhenSomebodyConnects;
/**
* @var Deferred
*/
private $mimeType;
/**
* @var ProgressBar
*/
private $progressBar;
/**
* @var bool
*/
private $buffering = true;
/**
* @var null|Deferred
*/
private $deferred;
/**
* @var int
*/
private $bufferSize;
private Deferred $mimeType;
private ProgressBar $progressBar;
private bool $buffering = true;
private ?Deferred $deferred = null;

public function __construct(
LoggerInterface $logger,
InputStream $inputStream,
OutputStream $outputStream,
ConsoleSectionOutput $output,
Server $server,
Promise $promiseThatIsResolvedWhenSomebodyConnects,
int $bufferSize
private LoggerInterface $logger,
private OutputStream $outputStream,
private Server $server,
private Promise $promiseThatIsResolvedWhenSomebodyConnects,
private int $bufferSize,
) {
$this->logger = $logger;
$this->inputStream = $inputStream;
$this->outputStream = $outputStream;
$this->server = $server;
$this->promiseThatIsResolvedWhenSomebodyConnects = $promiseThatIsResolvedWhenSomebodyConnects;
$this->mimeType = new Deferred();
$this->progressBar = new ProgressBar($output, 0, 'buffer');
$this->bufferSize = $bufferSize;

$filePath = '';

Expand Down
10 changes: 2 additions & 8 deletions src/Bufferer/ResolvedBufferer.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,8 @@

class ResolvedBufferer extends AbstractBufferer
{
/**
* @var int
*/
private $filesize;
/**
* @var string
*/
private $mimeType;
private int $filesize;
private string $mimeType;

public function __construct(string $filePath)
{
Expand Down
22 changes: 11 additions & 11 deletions src/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@

namespace Ostrolucky\Stdinho;

use function Amp\asyncCoroutine;
use Amp\ByteStream\ResourceInputStream;
use Amp\ByteStream\ResourceOutputStream;
use Amp\Deferred;
use Amp\Loop;
use Amp\Promise;
use function Amp\Socket\listen;
use Amp\Socket\Server;
use Ostrolucky\Stdinho\Bufferer\AbstractBufferer;
use Ostrolucky\Stdinho\Bufferer\PipeBufferer;
Expand All @@ -23,6 +21,7 @@
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;
use function Amp\asyncCoroutine;

class Command extends \Symfony\Component\Console\Command\Command
{
Expand Down Expand Up @@ -111,15 +110,16 @@ protected function initialize(InputInterface $input, OutputInterface $output): v
*/
protected function execute(InputInterface $input, OutputInterface $output): int
{
$addressPort = $input->getArgument('addressPort');
$bufferSize = $input->getOption('buffer-size');
$connectionsLimit = (float)$input->getOption('connections-limit');
$filePath = $input->getOption('file');

$newConnDefer = new Deferred();
$server = listen($addressPort);
$logger = new ConsoleLogger($firstSection = $output->section());
$bufferer = $this->createBufferer($output, $logger, $server, $newConnDefer->promise(), $filePath, $bufferSize);
$bufferer = $this->createBufferer(
$output,
$logger = new ConsoleLogger($firstSection = $output->section()),
$server = Server::listen($input->getArgument('addressPort')),
$newConnDefer->promise(),
$input->getOption('file'),
$input->getOption('buffer-size'),
);

$firstSection->writeln(
"<info>Connection opened at http://{$server->getAddress()}\nPress CTRL+C to exit.</info>\n"
Expand Down Expand Up @@ -157,10 +157,10 @@ private function createBufferer(
}

return new PipeBufferer(
$logger,
new ResourceInputStream(STDIN),
new ResourceOutputStream($filePath ? fopen($filePath, 'wb') : tmpfile()),
$output->section(),
$logger,
new ResourceOutputStream($filePath ? fopen($filePath, 'wb') : tmpfile()),
$server,
$promiseThatIsResolvedWhenSomebodyConnects,
(int)($bufferSize ?? disk_free_space($filePath ?: sys_get_temp_dir()) * .9)
Expand Down
13 changes: 2 additions & 11 deletions src/ConsoleLogger.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,11 @@

class ConsoleLogger extends AbstractLogger
{
/**
* @var OutputInterface
*/
private $output;

public function __construct(OutputInterface $output)
public function __construct(private OutputInterface $output)
{
$this->output = $output;
}

/**
* {@inheritdoc}
*/
public function log($level, $message, array $context = []): void
public function log($level, string|\Stringable $message, array $context = []): void
{
$this->output->writeln(
sprintf('%s <comment>[%s]</comment> <fg=white>%s</>', date('H:i:s'), $level, $message),
Expand Down
7 changes: 2 additions & 5 deletions src/ProgressBar.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
return $bar->getMaxSteps() >= $bar->getProgress() ? '<info>Finished</info> in' : 'Elapsed';
});
SymfonyProgressBar::setPlaceholderFormatterDefinition('speed', function(SymfonyProgressBar $bar) {
return Helper::formatMemory($bar->getProgress() / max(1, time() - $bar->getStartTime())).'/s';
return Helper::formatMemory((int)($bar->getProgress() / max(1, time() - $bar->getStartTime()))).'/s';
});
SymfonyProgressBar::setPlaceholderFormatterDefinition('max_volume', function(SymfonyProgressBar $bar) {
return Helper::formatMemory($bar->getMaxSteps());
Expand All @@ -37,10 +37,7 @@

class ProgressBar
{
/**
* @var SymfonyProgressBar
*/
private $wrappedProgressBar;
private SymfonyProgressBar $wrappedProgressBar;

public function __construct(ConsoleSectionOutput $output, int $max, string $format, string $host = null)
{
Expand Down
43 changes: 6 additions & 37 deletions src/Responder.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,48 +15,17 @@

class Responder
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var AbstractBufferer
*/
private $bufferer;
/**
* @var ConsoleOutput
*/
private $consoleOutput;
/**
* @var string[]
*/
private $customHttpHeaders = [];
/**
* @var InputStream
*/
private $inputStream;
/**
* @var Deferred
*/
private $defererThatIsResolvedWhenSomebodyConnects;

/**
* @param string[] $customHttpHeaders
*/
public function __construct(
LoggerInterface $logger,
AbstractBufferer $bufferer,
ConsoleOutput $consoleOutput,
array $customHttpHeaders,
InputStream $inputStream,
Deferred $defererThatIsResolvedWhenSomebodyConnects
private LoggerInterface $logger,
private AbstractBufferer $bufferer,
private ConsoleOutput $consoleOutput,
private array $customHttpHeaders,
private InputStream $inputStream,
private Deferred $defererThatIsResolvedWhenSomebodyConnects
) {
$this->logger = $logger;
$this->bufferer = $bufferer;
$this->consoleOutput = $consoleOutput;
$this->customHttpHeaders = $customHttpHeaders;
$this->inputStream = $inputStream;
$this->defererThatIsResolvedWhenSomebodyConnects = $defererThatIsResolvedWhenSomebodyConnects;
}

public function __invoke(Socket $socket): \Generator
Expand Down
4 changes: 1 addition & 3 deletions tests/FunctionalTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ public static function setUpBeforeClass(): void
protected function setUp(): void
{
Loop::run(function(): void {
$isCoverageEnabled = array_filter($_SERVER['argv'], function(string $arg) {
return strpos($arg, '--coverage') === 0;
});
$isCoverageEnabled = array_filter($_SERVER['argv'], fn(string $arg) => str_starts_with($arg, '--coverage'));
$executable = $isCoverageEnabled ? 'coverage-enabling-bin-wrapper.php' : '../bin/stdinho';
$this->command = "php '".__DIR__."/$executable' --connections-limit=1 localhost:1338 ";
$this->httpClient = HttpClientBuilder::buildDefault();
Expand Down
10 changes: 6 additions & 4 deletions tests/IntegrationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Ostrolucky\Stdinho\Tests;

use Psr\Log\LoggerInterface;
use function Amp\asyncCoroutine;
use Amp\ByteStream\InputStream;
use Amp\ByteStream\OutputStream;
Expand All @@ -18,7 +19,6 @@
use Ostrolucky\Stdinho\Responder;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\TestCase;
use Psr\Log\Test\TestLogger;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
Expand All @@ -35,15 +35,16 @@ public function testBufferOverflow(): void
$outputFormatter = $this->createMock(OutputFormatterInterface::class);
$resource = fopen('php://memory', 'rw');
$server = new Server($resource);
$logger = new TestLogger();
$logger = $this->createMock(LoggerInterface::class);

$bufferer = new PipeBufferer($logger, $buffererInput, $buffererOutput, $section, $server, new Success(), 3);
$bufferer = new PipeBufferer($buffererInput, $section, $logger, $buffererOutput, $server, new Success(), 3);
$responder = new Responder($logger, $bufferer, $consoleOutput, [], $responderInputStream, new Deferred());

$socket = $this->createMock(Socket::class);

$consoleOutput->method('section')->willReturn($section);
$outputFormatter->method('isDecorated')->willReturn(false);
$outputFormatter->method('format')->willReturn('');
$section->method('getFormatter')->willReturn($outputFormatter);
$socket->method('read')->willReturn(new Success(''));
$socket->method('getRemoteAddress')->willReturn(new SocketAddress(''));
Expand Down Expand Up @@ -74,12 +75,13 @@ public function testBufferOverflow(): void
->willReturn(new Success())
;

$logger->expects(self::once())->method('warning')->with(self::stringStartsWith('Max buffer size reached'));

Loop::run(function() use ($socket, $bufferer, $responder): void {
asyncCoroutine($bufferer)();
asyncCoroutine($responder)($socket);
});

static::assertTrue($logger->hasWarningThatContains('Max buffer size reached'));
static::assertFalse(is_resource($resource));
}
}
Loading

0 comments on commit 43c8965

Please sign in to comment.